aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/e320/e320.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/e320/e320.v')
-rw-r--r--fpga/usrp3/top/e320/e320.v1739
1 files changed, 1739 insertions, 0 deletions
diff --git a/fpga/usrp3/top/e320/e320.v b/fpga/usrp3/top/e320/e320.v
new file mode 100644
index 000000000..8d766e325
--- /dev/null
+++ b/fpga/usrp3/top/e320/e320.v
@@ -0,0 +1,1739 @@
+/////////////////////////////////////////////////////////////////////
+//
+// Copyright 2018 Ettus Research, A National Instruments Company
+//
+// SPDX-License-Identifier: LGPL-3.0-or-later
+//
+// Module: e320
+// Description:
+// E320 Top Level
+//
+/////////////////////////////////////////////////////////////////////
+
+`default_nettype none
+module e320 (
+
+ // 5V Power Enable
+ output wire ENA_PAPWR,
+
+ // GPIO
+ output wire EN_GPIO_2V5,
+ output wire EN_GPIO_3V3,
+ output wire EN_GPIO_VAR_SUPPLY,
+ inout wire [7:0] GPIO_PREBUFF,
+ inout wire [7:0] GPIO_DIR,
+ output wire GPIO_OE_N,
+
+ // GPS
+ output wire CLK_GPS_PWR_EN,
+ output wire GPS_INITSURV_N,
+ output wire GPS_RST_N,
+ input wire GPS_ALARM,
+ input wire GPS_LOCK,
+ input wire GPS_PHASELOCK,
+ input wire GPS_SURVEY,
+ input wire GPS_WARMUP,
+
+ // SFP
+ input wire SFP1_RX_P,
+ input wire SFP1_RX_N,
+ output wire SFP1_TX_P,
+ output wire SFP1_TX_N,
+ input wire SFP1_RXLOS,
+ input wire SFP1_TXFAULT,
+ input wire SFP1_MOD_ABS, // Unused
+ output wire SFP1_RS0,
+ output wire SFP1_RS1,
+ output wire SFP1_TXDISABLE,
+
+ // MGT Clocks
+
+ output wire CLK_PLL_SCLK,
+ output wire CLK_PLL_SDATA,
+ output wire CLK_PLL_SLE,
+
+ input wire CLK_MGT_125M_P,
+ input wire CLK_MGT_125M_N,
+ input wire CLK_MGT_156_25M_P,
+ input wire CLK_MGT_156_25M_N,
+
+ // PS Connections
+ inout wire [53:0] PS_MIO,
+ inout wire PS_CLK,
+ inout wire PS_SRST_B,
+ inout wire PS_POR_B,
+ inout wire DDR_MODCLK_P,
+ inout wire DDR_MODCLK_N,
+ inout wire PS_DDR3_CKE,
+ inout wire PS_DDR3_RESET_N,
+ inout wire [31:0] PS_DDR3_DQ,
+ inout wire [14:0] PS_DDR3_ADDR,
+ inout wire [3:0] PS_DDR3_DM,
+ inout wire [2:0] PS_DDR3_BA,
+ inout wire [3:0] PS_DDR3_DQS_P,
+ inout wire [3:0] PS_DDR3_DQS_N,
+ inout wire PS_DDR3_ODT,
+ inout wire PS_DDR3_VRN,
+ inout wire PS_DDR3_VRP,
+ inout wire PS_DDR3_WE_N,
+ inout wire PS_DDR3_CS_N,
+ inout wire PS_DDR3_CAS_N,
+ inout wire PS_DDR3_RAS_N,
+
+ // PL DRAM Interface
+ input wire sys_clk_p,
+ input wire sys_clk_n,
+ //
+ inout wire [31:0] ddr3_dq,
+ inout wire [3:0] ddr3_dqs_n,
+ inout wire [3:0] ddr3_dqs_p,
+ output wire [3:0] ddr3_dm,
+ //
+ output wire [2:0] ddr3_ba,
+ output wire [15:0] ddr3_addr,
+ output wire ddr3_ras_n,
+ output wire ddr3_cas_n,
+ output wire ddr3_we_n,
+ //
+ output wire [0:0] ddr3_cs_n,
+ output wire [0:0] ddr3_cke,
+ output wire [0:0] ddr3_odt,
+ //
+ output wire [0:0] ddr3_ck_p,
+ output wire [0:0] ddr3_ck_n,
+ //
+ output wire ddr3_reset_n,
+
+ // LEDs
+ output wire LED_LINK1,
+ output wire LED_ACT1,
+
+ // PPS, REFCLK
+ input wire CLK_SYNC_INT, // PPS from GPS
+ input wire CLK_SYNC_INT_RAW, // PPS_RAW from GPS (Unused)
+ input wire CLK_SYNC_EXT, // PPS from external connector
+ input wire CLK_REF_RAW, // FPGA reference clock (GPS or external)
+ output wire CLK_REF_SEL, // Select for GPS or external reference clock
+ input wire CLK_MUX_OUT, // RF clock locked status
+
+ // RF LVDS Data Interface
+ //
+ // Receive
+ input wire RX_CLK_P,
+ input wire RX_CLK_N,
+ input wire RX_FRAME_P,
+ input wire RX_FRAME_N,
+ input wire [5:0] RX_DATA_P,
+ input wire [5:0] RX_DATA_N,
+ //
+ // TraNSMIT
+ output wire TX_CLK_P,
+ output wire TX_CLK_N,
+ output wire TX_FRAME_P,
+ output wire TX_FRAME_N,
+ output wire [5:0] TX_DATA_P,
+ output wire [5:0] TX_DATA_N,
+
+ // Switches
+ output wire [2:0] FE1_SEL,
+ output wire [2:0] FE2_SEL,
+ output wire [1:0] RX1_SEL,
+ output wire [1:0] RX2_SEL,
+ output wire [5:0] RX1_BSEL,
+ output wire [5:0] RX2_BSEL,
+ output wire [5:0] TX1_BSEL,
+ output wire [5:0] TX2_BSEL,
+
+ // SPI
+ input wire XCVR_SPI_MISO,
+ output wire XCVR_SPI_MOSI,
+ output wire XCVR_SPI_CLK,
+ output wire XCVR_SPI_CS_N,
+
+ // AD9361
+ output wire XCVR_ENABLE,
+ output wire XCVR_SYNC,
+ output wire XCVR_TXNRX,
+ output wire XCVR_ENA_AGC,
+ output wire XCVR_RESET_N,
+ input wire [7:0] XCVR_CTRL_OUT,
+
+ // Amplifiers
+ output wire TX_HFAMP1_ENA,
+ output wire TX_HFAMP2_ENA,
+ output wire TX_LFAMP1_ENA,
+ output wire TX_LFAMP2_ENA,
+
+ // LEDs
+ output wire RX1_GRN_ENA,
+ output wire RX2_GRN_ENA,
+ output wire TX1_RED_ENA,
+ output wire TX2_RED_ENA,
+ output wire TXRX1_GRN_ENA,
+ output wire TXRX2_GRN_ENA
+
+);
+
+ `ifdef SFP_1GBE
+ parameter PROTOCOL = "1GbE";
+ parameter MDIO_EN = 1'b1;
+ parameter MDIO_PHYADDR = 5'd4;
+ `elsif SFP_10GBE
+ parameter PROTOCOL = "10GbE";
+ parameter MDIO_EN = 1'b1;
+ parameter MDIO_PHYADDR = 5'd4;
+ `elsif SFP_AURORA
+ parameter PROTOCOL = "Aurora";
+ parameter MDIO_EN = 1'b0;
+ parameter MDIO_PHYADDR = 5'd0;
+ `else
+ parameter PROTOCOL = "Disabled";
+ parameter MDIO_EN = 1'b0;
+ parameter MDIO_PHYADDR = 5'd0;
+ `endif
+
+ // Constants
+ localparam REG_AWIDTH = 14; // log2(0x4000)
+ localparam REG_DWIDTH = 32;
+ localparam DB_GPIO_WIDTH = 32;
+ localparam FP_GPIO_OFFSET = 32; // Offset within ps_gpio_*
+ localparam FP_GPIO_WIDTH = 8;
+
+ //If bus_clk freq ever changes, update this parameter accordingly.
+ localparam BUS_CLK_RATE = 32'd200000000; //200 MHz bus_clk rate.
+ localparam SFP_PORTNUM = 8'b0; // Only one SFP port
+ localparam NUM_RADIOS = 1;
+ localparam NUM_CHANNELS_PER_RADIO = 2;
+ localparam NUM_DBOARDS = 1;
+ localparam NUM_CHANNELS = NUM_RADIOS * NUM_CHANNELS_PER_RADIO;
+ localparam [15:0] RFNOC_PROTOVER = {8'd1, 8'd0};
+
+ // Clocks
+ wire xgige_clk156;
+ wire bus_clk;
+ wire radio_clk;
+ wire reg_clk;
+ wire clk40;
+ wire ddr3_dma_clk;
+ wire FCLK_CLK0;
+ wire FCLK_CLK1;
+ wire FCLK_CLK2;
+ wire FCLK_CLK3;
+
+ // Resets
+ wire global_rst;
+ wire bus_rst;
+ wire radio_rst;
+ wire reg_rstn;
+ wire clk40_rst;
+ wire clk40_rstn;
+ wire FCLK_RESET0_N;
+
+ // Regport for SFP
+ wire m_axi_net_arvalid;
+ wire m_axi_net_awvalid;
+ wire m_axi_net_bready;
+ wire m_axi_net_rready;
+ wire m_axi_net_wvalid;
+ wire [11:0] m_axi_net_arid;
+ wire [11:0] m_axi_net_awid;
+ wire [11:0] m_axi_net_wid;
+ wire [31:0] m_axi_net_araddr;
+ wire [31:0] m_axi_net_awaddr;
+ wire [31:0] m_axi_net_wdata;
+ wire [3:0] m_axi_net_wstrb;
+ wire m_axi_net_arready;
+ wire m_axi_net_awready;
+ wire m_axi_net_bvalid;
+ wire m_axi_net_rlast;
+ wire m_axi_net_rvalid;
+ wire m_axi_net_wready;
+ wire [1:0] m_axi_net_bresp;
+ wire [1:0] m_axi_net_rresp;
+ wire [31:0] m_axi_net_rdata;
+
+ // Crossbar
+ wire m_axi_xbar_arvalid;
+ wire m_axi_xbar_awvalid;
+ wire m_axi_xbar_bready;
+ wire m_axi_xbar_rready;
+ wire m_axi_xbar_wvalid;
+ wire [11:0] m_axi_xbar_arid;
+ wire [11:0] m_axi_xbar_awid;
+ wire [11:0] m_axi_xbar_wid;
+ wire [31:0] m_axi_xbar_araddr;
+ wire [31:0] m_axi_xbar_awaddr;
+ wire [31:0] m_axi_xbar_wdata;
+ wire [3:0] m_axi_xbar_wstrb;
+ wire m_axi_xbar_arready;
+ wire m_axi_xbar_awready;
+ wire m_axi_xbar_bvalid;
+ wire m_axi_xbar_rlast;
+ wire m_axi_xbar_rvalid;
+ wire m_axi_xbar_wready;
+ wire [1:0] m_axi_xbar_bresp;
+ wire [1:0] m_axi_xbar_rresp;
+ wire [31:0] m_axi_xbar_rdata;
+
+ // ETH DMA
+ wire m_axi_eth_dma_arvalid;
+ wire m_axi_eth_dma_awvalid;
+ wire m_axi_eth_dma_bready;
+ wire m_axi_eth_dma_rready;
+ wire m_axi_eth_dma_wvalid;
+ wire [11:0] m_axi_eth_dma_arid;
+ wire [11:0] m_axi_eth_dma_awid;
+ wire [11:0] m_axi_eth_dma_wid;
+ wire [31:0] m_axi_eth_dma_araddr;
+ wire [31:0] m_axi_eth_dma_awaddr;
+ wire [31:0] m_axi_eth_dma_wdata;
+ wire [3:0] m_axi_eth_dma_wstrb;
+ wire m_axi_eth_dma_arready;
+ wire m_axi_eth_dma_awready;
+ wire m_axi_eth_dma_bvalid;
+ wire m_axi_eth_dma_rlast;
+ wire m_axi_eth_dma_rvalid;
+ wire m_axi_eth_dma_wready;
+ wire [1:0] m_axi_eth_dma_bresp;
+ wire [1:0] m_axi_eth_dma_rresp;
+ wire [31:0] m_axi_eth_dma_rdata;
+
+ // Processing System
+ wire [15:0] IRQ_F2P;
+
+ // DMA xport adapter to PS
+ wire [63:0] m_axis_dma_tdata;
+ wire [3:0] m_axis_dma_tuser;
+ wire m_axis_dma_tlast;
+ wire m_axis_dma_tready;
+ wire m_axis_dma_tvalid;
+
+ wire [63:0] s_axis_dma_tdata;
+ wire [3:0] s_axis_dma_tdest;
+ wire s_axis_dma_tlast;
+ wire s_axis_dma_tready;
+ wire s_axis_dma_tvalid;
+
+ // HP0 -- High Performance port 0
+ wire [5:0] s_axi_hp0_awid;
+ wire [31:0] s_axi_hp0_awaddr;
+ wire [2:0] s_axi_hp0_awprot;
+ wire s_axi_hp0_awvalid;
+ wire s_axi_hp0_awready;
+ wire [63:0] s_axi_hp0_wdata;
+ wire [7:0] s_axi_hp0_wstrb;
+ wire s_axi_hp0_wvalid;
+ wire s_axi_hp0_wready;
+ wire [1:0] s_axi_hp0_bresp;
+ wire s_axi_hp0_bvalid;
+ wire s_axi_hp0_bready;
+ wire [5:0] s_axi_hp0_arid;
+ wire [31:0] s_axi_hp0_araddr;
+ wire [2:0] s_axi_hp0_arprot;
+ wire s_axi_hp0_arvalid;
+ wire s_axi_hp0_arready;
+ wire [63:0] s_axi_hp0_rdata;
+ wire [1:0] s_axi_hp0_rresp;
+ wire s_axi_hp0_rvalid;
+ wire s_axi_hp0_rready;
+ wire s_axi_hp0_rlast;
+ wire [3:0] s_axi_hp0_arcache;
+ wire [7:0] s_axi_hp0_awlen;
+ wire [2:0] s_axi_hp0_awsize;
+ wire [1:0] s_axi_hp0_awburst;
+ wire [3:0] s_axi_hp0_awcache;
+ wire s_axi_hp0_wlast;
+ wire [7:0] s_axi_hp0_arlen;
+ wire [1:0] s_axi_hp0_arburst;
+ wire [2:0] s_axi_hp0_arsize;
+
+ wire [4:0] s_axi_eth_descriptor_awid;
+ wire [31:0] s_axi_eth_descriptor_awaddr;
+ wire [2:0] s_axi_eth_descriptor_awprot;
+ wire s_axi_eth_descriptor_awvalid;
+ wire s_axi_eth_descriptor_awready;
+ wire [31:0] s_axi_eth_descriptor_wdata;
+ wire [3:0] s_axi_eth_descriptor_wstrb;
+ wire s_axi_eth_descriptor_wvalid;
+ wire s_axi_eth_descriptor_wready;
+ wire [1:0] s_axi_eth_descriptor_bresp;
+ wire s_axi_eth_descriptor_bvalid;
+ wire s_axi_eth_descriptor_bready;
+ wire [4:0] s_axi_eth_descriptor_arid;
+ wire [31:0] s_axi_eth_descriptor_araddr;
+ wire [2:0] s_axi_eth_descriptor_arprot;
+ wire s_axi_eth_descriptor_arvalid;
+ wire s_axi_eth_descriptor_arready;
+ wire [31:0] s_axi_eth_descriptor_rdata;
+ wire [1:0] s_axi_eth_descriptor_rresp;
+ wire s_axi_eth_descriptor_rvalid;
+ wire s_axi_eth_descriptor_rready;
+ wire s_axi_eth_descriptor_rlast;
+ wire [3:0] s_axi_eth_descriptor_arcache;
+ wire [7:0] s_axi_eth_descriptor_awlen;
+ wire [2:0] s_axi_eth_descriptor_awsize;
+ wire [1:0] s_axi_eth_descriptor_awburst;
+ wire [3:0] s_axi_eth_descriptor_awcache;
+ wire s_axi_eth_descriptor_wlast;
+ wire [7:0] s_axi_eth_descriptor_arlen;
+ wire [1:0] s_axi_eth_descriptor_arburst;
+ wire [2:0] s_axi_eth_descriptor_arsize;
+
+ // ARM ethernet dma clock crossing
+ wire [63:0] arm_eth_tx_tdata;
+ wire arm_eth_tx_tvalid;
+ wire arm_eth_tx_tlast;
+ wire arm_eth_tx_tready;
+ wire [3:0] arm_eth_tx_tuser;
+ wire [7:0] arm_eth_tx_tkeep;
+
+ wire [63:0] arm_eth_tx_tdata_b;
+ wire arm_eth_tx_tvalid_b;
+ wire arm_eth_tx_tlast_b;
+ wire arm_eth_tx_tready_b;
+ wire [3:0] arm_eth_tx_tuser_b;
+ wire [7:0] arm_eth_tx_tkeep_b;
+
+ wire [63:0] arm_eth_rx_tdata;
+ wire arm_eth_rx_tvalid;
+ wire arm_eth_rx_tlast;
+ wire arm_eth_rx_tready;
+ wire [3:0] arm_eth_rx_tuser;
+ wire [7:0] arm_eth_rx_tkeep;
+
+ wire [63:0] arm_eth_rx_tdata_b;
+ wire arm_eth_rx_tvalid_b;
+ wire arm_eth_rx_tlast_b;
+ wire arm_eth_rx_tready_b;
+ wire [3:0] arm_eth_rx_tuser_b;
+ wire [7:0] arm_eth_rx_tkeep_b;
+
+ wire arm_eth_rx_irq;
+ wire arm_eth_tx_irq;
+
+ // Vita to Ethernet
+ wire [63:0] v2e_tdata;
+ wire v2e_tlast;
+ wire v2e_tvalid;
+ wire v2e_tready;
+
+ // Ethernet to Vita
+ wire [63:0] e2v_tdata;
+ wire e2v_tlast;
+ wire e2v_tvalid;
+ wire e2v_tready;
+
+ // Misc
+ wire [31:0] sfp_port_info;
+ wire sfp_link_up;
+ wire [15:0] device_id;
+ wire clocks_locked;
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // Resets:
+ // - PL - Global Reset --> Bus Reset
+ // --> Radio Reset
+ // - PS - FCLK_RESET0_N --> clk40_rst(n)
+ //
+ //////////////////////////////////////////////////////////////////////
+
+ // Global synchronous reset, on the bus_clk domain. De-asserts after 85
+ // bus_clk cycles. Asserted by default.
+ por_gen por_gen (
+ .clk(bus_clk),
+ .reset_out(global_rst)
+ );
+
+ // Synchronous reset for the radio_clk domain
+ reset_sync radio_reset_gen (
+ .clk(radio_clk),
+ .reset_in(~clocks_locked),
+ .reset_out(radio_rst)
+ );
+
+ // Synchronous reset for the bus_clk domain
+ reset_sync bus_reset_gen (
+ .clk(bus_clk),
+ .reset_in(~clocks_locked),
+ .reset_out(bus_rst)
+ );
+
+
+ // PS-based Resets //
+ //
+ // Synchronous reset for the clk40 domain. This is derived from the PS reset 0.
+ reset_sync clk40_reset_gen (
+ .clk(clk40),
+ .reset_in(~FCLK_RESET0_N),
+ .reset_out(clk40_rst)
+ );
+ // Invert for various modules.
+ assign clk40_rstn = ~clk40_rst;
+ assign reg_rstn = clk40_rstn;
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // Clocks and PPS
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ wire pps_refclk;
+ wire [1:0] pps_select;
+ wire ref_select;
+ wire refclk_locked_busclk;
+
+ assign clk40 = FCLK_CLK1; // 40 MHz
+ assign bus_clk = FCLK_CLK3; // 200 MHz
+ assign reg_clk = clk40;
+
+ e320_clocking e320_clocking_i (
+ .global_rst(global_rst),
+ .ref_clk_from_pin(CLK_REF_RAW),
+ .ref_clk(),
+ .clk156(xgige_clk156),
+ .ddr3_dma_clk(ddr3_dma_clk),
+ .clocks_locked(clocks_locked),
+ .ext_pps_from_pin(CLK_SYNC_EXT),
+ .gps_pps_from_pin(CLK_SYNC_INT),
+ .pps_select(pps_select),
+ .pps_refclk(pps_refclk)
+ );
+
+ assign CLK_REF_SEL = ref_select;
+
+ synchronizer synchronize_rf_clk_lock (
+ .clk(bus_clk), .rst(1'b0), .in(CLK_MUX_OUT), .out(refclk_locked_busclk)
+ );
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // PL DDR3 Memory Interface
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ wire ddr3_axi_clk; // 1/4 DDR external clock rate
+ wire ddr3_axi_rst; // Synchronized to ddr_sys_clk
+ wire ddr3_running; // DRAM calibration complete.
+ wire [11:0] device_temp;
+
+ // Slave Interface Write Address Ports
+ wire [3:0] ddr3_axi_awid;
+ wire [31:0] ddr3_axi_awaddr;
+ wire [7:0] ddr3_axi_awlen;
+ wire [2:0] ddr3_axi_awsize;
+ wire [1:0] ddr3_axi_awburst;
+ wire [0:0] ddr3_axi_awlock;
+ wire [3:0] ddr3_axi_awcache;
+ wire [2:0] ddr3_axi_awprot;
+ wire [3:0] ddr3_axi_awqos;
+ wire ddr3_axi_awvalid;
+ wire ddr3_axi_awready;
+ // Slave Interface Write Data Ports
+ wire [255:0] ddr3_axi_wdata;
+ wire [31:0] ddr3_axi_wstrb;
+ wire ddr3_axi_wlast;
+ wire ddr3_axi_wvalid;
+ wire ddr3_axi_wready;
+ // Slave Interface Write Response Ports
+ wire ddr3_axi_bready;
+ wire [3:0] ddr3_axi_bid;
+ wire [1:0] ddr3_axi_bresp;
+ wire ddr3_axi_bvalid;
+ // Slave Interface Read Address Ports
+ wire [3:0] ddr3_axi_arid;
+ wire [31:0] ddr3_axi_araddr;
+ wire [7:0] ddr3_axi_arlen;
+ wire [2:0] ddr3_axi_arsize;
+ wire [1:0] ddr3_axi_arburst;
+ wire [0:0] ddr3_axi_arlock;
+ wire [3:0] ddr3_axi_arcache;
+ wire [2:0] ddr3_axi_arprot;
+ wire [3:0] ddr3_axi_arqos;
+ wire ddr3_axi_arvalid;
+ wire ddr3_axi_arready;
+ // Slave Interface Read Data Ports
+ wire ddr3_axi_rready;
+ wire [3:0] ddr3_axi_rid;
+ wire [255:0] ddr3_axi_rdata;
+ wire [1:0] ddr3_axi_rresp;
+ wire ddr3_axi_rlast;
+ wire ddr3_axi_rvalid;
+
+ reg ddr3_axi_rst_reg_n;
+
+ // Copied this reset circuit from example design.
+ always @(posedge ddr3_axi_clk)
+ ddr3_axi_rst_reg_n <= ~ddr3_axi_rst;
+
+ ddr3_32bit u_ddr3_32bit (
+ // Memory interface ports
+ .ddr3_addr (ddr3_addr),
+ .ddr3_ba (ddr3_ba),
+ .ddr3_cas_n (ddr3_cas_n),
+ .ddr3_ck_n (ddr3_ck_n),
+ .ddr3_ck_p (ddr3_ck_p),
+ .ddr3_cke (ddr3_cke),
+ .ddr3_ras_n (ddr3_ras_n),
+ .ddr3_reset_n (ddr3_reset_n),
+ .ddr3_we_n (ddr3_we_n),
+ .ddr3_dq (ddr3_dq),
+ .ddr3_dqs_n (ddr3_dqs_n),
+ .ddr3_dqs_p (ddr3_dqs_p),
+ .init_calib_complete (ddr3_running),
+ .device_temp_i (device_temp),
+ .ddr3_cs_n (ddr3_cs_n),
+ .ddr3_dm (ddr3_dm),
+ .ddr3_odt (ddr3_odt),
+ // Application interface ports
+ .ui_clk (ddr3_axi_clk),
+ .ui_clk_sync_rst (ddr3_axi_rst),
+ .aresetn (ddr3_axi_rst_reg_n),
+ .app_sr_req (1'b0),
+ .app_sr_active (),
+ .app_ref_req (1'b0),
+ .app_ref_ack (),
+ .app_zq_req (1'b0),
+ .app_zq_ack (),
+ // Slave Interface Write Address Ports
+ .s_axi_awid (ddr3_axi_awid),
+ .s_axi_awaddr (ddr3_axi_awaddr[30:0]),
+ .s_axi_awlen (ddr3_axi_awlen),
+ .s_axi_awsize (ddr3_axi_awsize),
+ .s_axi_awburst (ddr3_axi_awburst),
+ .s_axi_awlock (ddr3_axi_awlock),
+ .s_axi_awcache (ddr3_axi_awcache),
+ .s_axi_awprot (ddr3_axi_awprot),
+ .s_axi_awqos (ddr3_axi_awqos),
+ .s_axi_awvalid (ddr3_axi_awvalid),
+ .s_axi_awready (ddr3_axi_awready),
+ // Slave Interface Write Data Ports
+ .s_axi_wdata (ddr3_axi_wdata),
+ .s_axi_wstrb (ddr3_axi_wstrb),
+ .s_axi_wlast (ddr3_axi_wlast),
+ .s_axi_wvalid (ddr3_axi_wvalid),
+ .s_axi_wready (ddr3_axi_wready),
+ // Slave Interface Write Response Ports
+ .s_axi_bid (ddr3_axi_bid),
+ .s_axi_bresp (ddr3_axi_bresp),
+ .s_axi_bvalid (ddr3_axi_bvalid),
+ .s_axi_bready (ddr3_axi_bready),
+ // Slave Interface Read Address Ports
+ .s_axi_arid (ddr3_axi_arid),
+ .s_axi_araddr (ddr3_axi_araddr[30:0]),
+ .s_axi_arlen (ddr3_axi_arlen),
+ .s_axi_arsize (ddr3_axi_arsize),
+ .s_axi_arburst (ddr3_axi_arburst),
+ .s_axi_arlock (ddr3_axi_arlock),
+ .s_axi_arcache (ddr3_axi_arcache),
+ .s_axi_arprot (ddr3_axi_arprot),
+ .s_axi_arqos (ddr3_axi_arqos),
+ .s_axi_arvalid (ddr3_axi_arvalid),
+ .s_axi_arready (ddr3_axi_arready),
+ // Slave Interface Read Data Ports
+ .s_axi_rid (ddr3_axi_rid),
+ .s_axi_rdata (ddr3_axi_rdata),
+ .s_axi_rresp (ddr3_axi_rresp),
+ .s_axi_rlast (ddr3_axi_rlast),
+ .s_axi_rvalid (ddr3_axi_rvalid),
+ .s_axi_rready (ddr3_axi_rready),
+ // System Clock Ports
+ .sys_clk_p (sys_clk_p),
+ .sys_clk_n (sys_clk_n),
+ .clk_ref_i (bus_clk),
+ .sys_rst (bus_rst)
+ );
+
+ // Temperature monitor module
+ mig_7series_v4_2_tempmon #(
+ .TEMP_MON_CONTROL ("INTERNAL"),
+ .XADC_CLK_PERIOD (5000) // In ps, should match xadc_clk period
+ ) tempmon_i (
+ .clk (bus_clk),
+ .xadc_clk (bus_clk),
+ .rst (bus_rst),
+ .device_temp_i (12'd0), // Not used for "INTERNAL"
+ .device_temp (device_temp)
+ );
+
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // Front-Panel GPIO
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ wire [31:0] fp_gpio_ctrl;
+ wire [FP_GPIO_WIDTH-1:0] fp_gpio_in;
+ wire [FP_GPIO_WIDTH-1:0] fp_gpio_out;
+ wire [FP_GPIO_WIDTH-1:0] fp_gpio_tri;
+
+ // Turn on GPIO buffers
+ assign GPIO_OE_N = fp_gpio_ctrl[0];
+
+ // Enable GPIO supply
+ assign EN_GPIO_VAR_SUPPLY = fp_gpio_ctrl[1];
+
+ // GPIO Voltage (1.8V, 2.5V, or 3.3V)
+ //
+ // 3V3 2V5 | Voltage
+ // -----------------
+ // 0 0 | 1.8 V
+ // 0 1 | 2.5 V
+ // 1 0 | 3.3 V
+ assign EN_GPIO_2V5 = fp_gpio_ctrl[2];
+ assign EN_GPIO_3V3 = fp_gpio_ctrl[3];
+
+ genvar i;
+ generate
+ for (i = 0; i < FP_GPIO_WIDTH; i = i+1) begin : gen_gpio_iobuf
+ assign fp_gpio_in[i] = GPIO_PREBUFF[i];
+ assign GPIO_PREBUFF[i] = fp_gpio_tri[i] ? 1'bZ : fp_gpio_out[i];
+ assign GPIO_DIR[i] = ~fp_gpio_tri[i];
+ end
+ endgenerate
+
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // GPIO Interface
+ // - Control Filter Banks
+ // - LEDs
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ // Flattened Radio GPIO control
+ wire [DB_GPIO_WIDTH*NUM_CHANNELS-1:0] db_gpio_out_flat;
+ wire [DB_GPIO_WIDTH*NUM_CHANNELS-1:0] db_gpio_ddr_flat;
+ wire [DB_GPIO_WIDTH*NUM_CHANNELS-1:0] db_gpio_in_flat;
+ wire [32*NUM_CHANNELS-1:0] leds_flat;
+
+ // Radio GPIO control
+ wire [DB_GPIO_WIDTH-1:0] db_gpio_in[0:NUM_CHANNELS-1];
+ wire [DB_GPIO_WIDTH-1:0] db_gpio_out[0:NUM_CHANNELS-1];
+ wire [DB_GPIO_WIDTH-1:0] db_gpio_ddr[0:NUM_CHANNELS-1];
+ wire [DB_GPIO_WIDTH-1:0] db_gpio_pins[0:NUM_CHANNELS-1];
+ wire [31:0] leds[0:NUM_CHANNELS-1];
+
+ generate
+ for (i = 0; i < NUM_CHANNELS; i = i + 1) begin
+
+ assign db_gpio_in_flat[DB_GPIO_WIDTH*i +: DB_GPIO_WIDTH] = db_gpio_in[i];
+ assign db_gpio_out[i] = db_gpio_out_flat[DB_GPIO_WIDTH*i +: DB_GPIO_WIDTH];
+ assign db_gpio_ddr[i] = db_gpio_ddr_flat[DB_GPIO_WIDTH*i +: DB_GPIO_WIDTH];
+ assign leds[i] = leds_flat[32*i +: 32];
+
+ gpio_atr_io #(
+ .WIDTH(DB_GPIO_WIDTH)
+ ) gpio_atr_db_inst (
+ .clk(radio_clk),
+ .gpio_pins(db_gpio_pins[i]),
+ .gpio_ddr(db_gpio_ddr[i]),
+ .gpio_out(db_gpio_out[i]),
+ .gpio_in(db_gpio_in[i])
+ );
+ end
+ endgenerate
+
+ // DB_GPIO and LED pin assignments with software mapping
+
+ // Channel 1
+ assign {TX_HFAMP1_ENA, // HF TX AMP
+ TX_LFAMP1_ENA, // LF TX AMP
+ FE1_SEL[2:0], // TRX Switch
+ TX1_BSEL[5:3], // TX_SW2
+ TX1_BSEL[2:0], // TX_SW1
+ RX1_SEL[1:0], // RX_SW3
+ RX1_BSEL[5:3], // RX_SW2
+ RX1_BSEL[2:0] // RX_SW1
+ } = db_gpio_pins[0];
+
+ assign {RX1_GRN_ENA, //TX/RX led
+ TX1_RED_ENA, //TX/RX led
+ TXRX1_GRN_ENA //RX2 led
+ } = leds[0];
+
+ // Channel 2
+ assign {TX_HFAMP2_ENA, // HF TX AMP
+ TX_LFAMP2_ENA, // LF TX AMP
+ FE2_SEL[2:0], // TRX Switch
+ TX2_BSEL[5:3], // TX_SW2
+ TX2_BSEL[2:0], // TX_SW1
+ RX2_SEL[1:0], // RX_SW3
+ RX2_BSEL[5:3], // RX_SW2
+ RX2_BSEL[2:0] // RX_SW1
+ } = db_gpio_pins[1];
+
+ assign {RX2_GRN_ENA,
+ TX2_RED_ENA,
+ TXRX2_GRN_ENA
+ } = leds[1];
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // 5V Power Supply (TX Amplifier)
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ assign ENA_PAPWR = 1'b1;
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // AD9361 Interface
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ wire [NUM_CHANNELS*32-1:0] rx_flat, tx_flat;
+
+ wire [11:0] rx_i0, rx_q0, tx_i0, tx_q0;
+ wire [11:0] rx_i1, rx_q1, tx_i1, tx_q1;
+
+ wire [NUM_CHANNELS-1:0] rx_stb, tx_stb;
+ wire [NUM_CHANNELS-1:0] rx_atr, tx_atr;
+
+ wire [REG_DWIDTH-1:0] dboard_ctrl;
+ wire [REG_DWIDTH-1:0] dboard_status;
+ wire mimo_busclk, mimo_radioclk;
+ wire tx_chan_sel_busclk, tx_chan_sel_radioclk;
+ wire rx_aligned;
+
+ wire tx_pll_lock_busclk, rx_pll_lock_busclk;
+
+ synchronizer synchronizer_tx_pll_lock (
+ .clk(bus_clk), .rst(1'b0), .in(XCVR_CTRL_OUT[7]), .out(tx_pll_lock_busclk)
+ );
+
+ synchronizer synchronizer_rx_pll_lock (
+ .clk(bus_clk), .rst(1'b0), .in(XCVR_CTRL_OUT[6]), .out(rx_pll_lock_busclk)
+ );
+
+ assign dboard_status = {
+ 24'b0,
+ tx_pll_lock_busclk, // TX PLL Lock
+ rx_pll_lock_busclk, // RX PLL Lock
+ 6'b0
+ };
+
+ assign mimo_busclk = dboard_ctrl[0];
+ assign tx_chan_sel_busclk = dboard_ctrl[1];
+
+ synchronizer synchronizer_mimo_radioclk (
+ .clk(radio_clk), .rst(1'b0), .in(mimo_busclk), .out(mimo_radioclk)
+ );
+
+ synchronizer synchronizer_tx_chan_sel_radioclk (
+ .clk(radio_clk), .rst(1'b0), .in(tx_chan_sel_busclk), .out(tx_chan_sel_radioclk)
+ );
+
+ assign rx_flat = {rx_i1, 4'b0, rx_q1, 4'b0,
+ rx_i0, 4'b0, rx_q0, 4'b0};
+
+ assign tx_q0 = tx_flat[15:4];
+ assign tx_i0 = tx_flat[31:20];
+ assign tx_q1 = tx_flat[47:36];
+ assign tx_i1 = tx_flat[63:52];
+
+ // Tx and Rx have samples on every clock, so keep stb asserted
+ assign rx_stb = { 1'b1, 1'b1 };
+ assign tx_stb = { 1'b1, 1'b1 };
+
+ // These delays depend on the internal clock routing delays of the FPGA.
+ // Valid timing constraints are required to confirm that setup/hold are met
+ // at both the input and output interfaces.
+ localparam INPUT_DATA_DELAY = 27;
+ localparam OUTPUT_DATA_DELAY = 19;
+
+ assign XCVR_ENABLE = 1'b1;
+ assign XCVR_SYNC = 1'b0;
+ assign XCVR_TXNRX = 1'b1;
+ assign XCVR_ENA_AGC = 1'b1;
+ assign XCVR_RESET_N = ~bus_rst;
+
+ cat_io_lvds_dual_mode #(
+ .INVERT_FRAME_RX (0),
+ .INVERT_DATA_RX (6'b00_0000),
+ .INVERT_FRAME_TX (0),
+ .INVERT_DATA_TX (6'b00_0000),
+ .USE_CLOCK_IDELAY (0),
+ .USE_DATA_IDELAY (1),
+ .DATA_IDELAY_MODE ("FIXED"),
+ .CLOCK_IDELAY_MODE ("FIXED"),
+ .INPUT_CLOCK_DELAY (0),
+ .INPUT_DATA_DELAY (INPUT_DATA_DELAY),
+ .USE_CLOCK_ODELAY (1),
+ .USE_DATA_ODELAY (1),
+ .DATA_ODELAY_MODE ("FIXED"),
+ .CLOCK_ODELAY_MODE ("FIXED"),
+ .OUTPUT_CLOCK_DELAY (0),
+ .OUTPUT_DATA_DELAY (OUTPUT_DATA_DELAY)
+ ) cat_io_lvds_dual_mode_i0 (
+ .rst (radio_rst),
+ .clk200 (bus_clk), // 200 MHz clock
+
+ // Data and frame timing
+ .a_mimo (mimo_busclk),
+ .a_tx_ch (tx_chan_sel_busclk),
+
+ // Delay control interface (not used)
+ .ctrl_clk (bus_clk),
+ //
+ .ctrl_in_data_delay (5'b00000),
+ .ctrl_in_clk_delay (5'b00000),
+ .ctrl_ld_in_data_delay (1'b0),
+ .ctrl_ld_in_clk_delay (1'b0),
+ //
+ .ctrl_out_data_delay (5'b00000),
+ .ctrl_out_clk_delay (5'b00000),
+ .ctrl_ld_out_data_delay (1'b0),
+ .ctrl_ld_out_clk_delay (1'b0),
+
+ // Sample interface
+ .radio_clk (radio_clk),
+ .rx_aligned (rx_aligned),
+ //
+ .rx_i0 (rx_i0),
+ .rx_q0 (rx_q0),
+ .rx_i1 (rx_i1),
+ .rx_q1 (rx_q1),
+ //
+ .tx_i0 (tx_i0),
+ .tx_q0 (tx_q0),
+ .tx_i1 (tx_i1),
+ .tx_q1 (tx_q1),
+
+ // AD9361 interface
+ .rx_clk_p (RX_CLK_P),
+ .rx_clk_n (RX_CLK_N),
+ .rx_frame_p (RX_FRAME_P),
+ .rx_frame_n (RX_FRAME_N),
+ .rx_d_p (RX_DATA_P),
+ .rx_d_n (RX_DATA_N),
+ //
+ .tx_clk_p (TX_CLK_P),
+ .tx_clk_n (TX_CLK_N),
+ .tx_frame_p (TX_FRAME_P),
+ .tx_frame_n (TX_FRAME_N),
+ .tx_d_p (TX_DATA_P),
+ .tx_d_n (TX_DATA_N)
+ );
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // SFP Connections:
+ // - 1G
+ // - 10G
+ // - Aurora
+ //
+ //////////////////////////////////////////////////////////////////////
+
+ //--------------------------------------------------------------
+ // SFP Reference Clocks:
+ // 1G requires 125 MHz reference clock
+ //--------------------------------------------------------------
+
+ wire gige_refclk;
+ wire gige_refclk_bufg;
+
+ // dont_touch required for good SI on clock
+ (* dont_touch = "true" *) IBUFDS_GTE2 gige_refclk_ibuf (
+ .ODIV2(),
+ .CEB (1'b0),
+ .I (CLK_MGT_125M_P),
+ .IB(CLK_MGT_125M_N),
+ .O (gige_refclk)
+ );
+
+ BUFG bufg_gige_refclk_i (
+ .I(gige_refclk),
+ .O(gige_refclk_bufg)
+ );
+
+ //--------------------------------------------------------------
+ // SFP Reference Clocks:
+ // XG requires 156.25 MHz reference clock
+ //--------------------------------------------------------------
+
+ wire xgige_refclk;
+ wire xgige_dclk;
+
+ // dont_touch required for good SI on clock
+ (* dont_touch = "true" *) IBUFDS_GTE2 ten_gige_refclk_ibuf (
+ .ODIV2(),
+ .CEB (1'b0),
+ .I (CLK_MGT_156_25M_P),
+ .IB(CLK_MGT_156_25M_N),
+ .O (xgige_refclk)
+ );
+
+ ten_gige_phy_clk_gen xgige_clk_gen_i (
+ .refclk_ibuf(xgige_refclk),
+ .clk156(xgige_clk156),
+ .dclk(xgige_dclk)
+ );
+
+ //--------------------------------------------------------------
+ // SFP Reference Clocks:
+ // XG requires 156.25 MHz reference clock
+ //--------------------------------------------------------------
+
+ wire aurora_refclk;
+ wire aurora_clk156;
+ wire aurora_init_clk;
+
+ // Use the 156.25MHz reference clock for Aurora
+ assign aurora_refclk = xgige_refclk;
+ assign aurora_clk156 = xgige_clk156;
+ assign aurora_init_clk = xgige_dclk;
+
+ wire sfp_gt_refclk;
+ wire sfp_gb_refclk;
+ wire sfp_misc_clk;
+
+ // Make SFP1_RS1 open drain to avoid a short circuit when it is connected to
+ // ground by the SFP module (per the SFP+ specification).
+ wire SFP1_RS1_t;
+ assign SFP1_RS1 = SFP1_RS1_t ? 1'bZ : 1'b0;
+
+ // Select Reference Clock according to Protocol
+ generate
+ if (PROTOCOL == "10GbE") begin
+
+ assign sfp_gt_refclk = xgige_refclk;
+ assign sfp_gb_refclk = xgige_clk156;
+ assign sfp_misc_clk = xgige_dclk;
+ assign SFP1_RS0 = 1'b1;
+ assign SFP1_RS1_t = 1'b1;
+
+ end else if (PROTOCOL == "1GbE") begin
+
+ assign sfp_gt_refclk = gige_refclk;
+ assign sfp_gb_refclk = gige_refclk_bufg;
+ assign sfp_misc_clk = gige_refclk_bufg;
+ assign SFP1_RS0 = 1'b0;
+ assign SFP1_RS1_t = 1'b0;
+
+ end else if (PROTOCOL == "Aurora") begin
+
+ assign sfp_gt_refclk = aurora_refclk;
+ assign sfp_gb_refclk = aurora_clk156;
+ assign sfp_misc_clk = aurora_init_clk;
+ assign SFP1_RS0 = 1'b1;
+ assign SFP1_RS1_t = 1'b1;
+
+ end else begin
+
+ assign sfp_gt_refclk = 1'b0;
+ assign sfp_gb_refclk = 1'b0;
+ assign sfp_misc_clk = 1'b0;
+ assign SFP1_RS0 = 1'b0;
+ assign SFP1_RS1_t = 1'b0;
+
+ end
+ endgenerate
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // SFP Wrapper: All protocols (1G/XG/AA) + eth_switch
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ n3xx_sfp_wrapper #(
+ .PROTOCOL(PROTOCOL),
+ .MDIO_EN(MDIO_EN),
+ .MDIO_PHYADDR(MDIO_PHYADDR),
+ .DWIDTH(REG_DWIDTH), // Width of the AXI4-Lite data bus (must be 32 or 64)
+ .AWIDTH(REG_AWIDTH), // Width of the address bus
+ .PORTNUM(SFP_PORTNUM)
+ ) sfp_wrapper_i (
+ .areset(bus_rst),
+ .gt_refclk(sfp_gt_refclk),
+ .gb_refclk(sfp_gb_refclk),
+ .misc_clk(sfp_misc_clk),
+
+ .bus_rst(bus_rst),
+ .bus_clk(bus_clk),
+ .user_clk(),
+ .sync_clk(),
+
+ // GT_COMMON
+ .qpllreset(),
+ .qplllock(1'b0),
+ .qplloutclk(1'b0),
+ .qplloutrefclk(1'b0),
+ .qpllrefclklost(),
+
+ .mmcm_locked(1'b0),
+ .gt_pll_lock(),
+
+ .txp(SFP1_TX_P),
+ .txn(SFP1_TX_N),
+ .rxp(SFP1_RX_P),
+ .rxn(SFP1_RX_N),
+
+ .sfpp_rxlos(SFP1_RXLOS),
+ .sfpp_tx_fault(SFP1_TXFAULT),
+ .sfpp_tx_disable(SFP1_TXDISABLE),
+
+ // Clock and reset
+ .s_axi_aclk(reg_clk),
+ .s_axi_aresetn(reg_rstn),
+ // AXI4-Lite: Write address port (domain: s_axi_aclk)
+ .s_axi_awaddr(m_axi_net_awaddr[REG_AWIDTH-1:0]),
+ .s_axi_awvalid(m_axi_net_awvalid),
+ .s_axi_awready(m_axi_net_awready),
+ // AXI4-Lite: Write data port (domain: s_axi_aclk)
+ .s_axi_wdata(m_axi_net_wdata),
+ .s_axi_wstrb(m_axi_net_wstrb),
+ .s_axi_wvalid(m_axi_net_wvalid),
+ .s_axi_wready(m_axi_net_wready),
+ // AXI4-Lite: Write response port (domain: s_axi_aclk)
+ .s_axi_bresp(m_axi_net_bresp),
+ .s_axi_bvalid(m_axi_net_bvalid),
+ .s_axi_bready(m_axi_net_bready),
+ // AXI4-Lite: Read address port (domain: s_axi_aclk)
+ .s_axi_araddr(m_axi_net_araddr[REG_AWIDTH-1:0]),
+ .s_axi_arvalid(m_axi_net_arvalid),
+ .s_axi_arready(m_axi_net_arready),
+ // AXI4-Lite: Read data port (domain: s_axi_aclk)
+ .s_axi_rdata(m_axi_net_rdata),
+ .s_axi_rresp(m_axi_net_rresp),
+ .s_axi_rvalid(m_axi_net_rvalid),
+ .s_axi_rready(m_axi_net_rready),
+
+ // Ethernet to Vita
+ .e2v_tdata(e2v_tdata),
+ .e2v_tlast(e2v_tlast),
+ .e2v_tvalid(e2v_tvalid),
+ .e2v_tready(e2v_tready),
+
+ // Vita to Ethernet
+ .v2e_tdata(v2e_tdata),
+ .v2e_tlast(v2e_tlast),
+ .v2e_tvalid(v2e_tvalid),
+ .v2e_tready(v2e_tready),
+
+ // Ethernet to CPU
+ .e2c_tdata(arm_eth_rx_tdata_b),
+ .e2c_tkeep(arm_eth_rx_tkeep_b),
+ .e2c_tlast(arm_eth_rx_tlast_b),
+ .e2c_tvalid(arm_eth_rx_tvalid_b),
+ .e2c_tready(arm_eth_rx_tready_b),
+
+ // CPU to Ethernet
+ .c2e_tdata(arm_eth_tx_tdata_b),
+ .c2e_tkeep(arm_eth_tx_tkeep_b),
+ .c2e_tlast(arm_eth_tx_tlast_b),
+ .c2e_tvalid(arm_eth_tx_tvalid_b),
+ .c2e_tready(arm_eth_tx_tready_b),
+
+ // Misc
+ .port_info(sfp_port_info),
+ .device_id(device_id),
+
+ // LED
+ .link_up(sfp_link_up),
+ .activity(LED_ACT1)
+ );
+
+ assign ps_gpio_in[60] = ps_gpio_tri[60] ? sfp_link_up : ps_gpio_out[60];
+ assign LED_LINK1 = sfp_link_up;
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // Ethernet DMA (SFP to ARM)
+ //
+ //////////////////////////////////////////////////////////////////////
+
+ assign IRQ_F2P[0] = arm_eth_rx_irq;
+ assign IRQ_F2P[1] = arm_eth_tx_irq;
+
+ assign {s_axi_hp0_awid, s_axi_hp0_arid} = 12'd0;
+ assign {s_axi_eth_descriptor_awid, s_axi_eth_descriptor_arid} = 10'd0;
+
+ axi_eth_dma inst_axi_eth_dma (
+ .s_axi_lite_aclk(clk40),
+ .m_axi_sg_aclk(clk40),
+ .m_axi_mm2s_aclk(clk40),
+ .m_axi_s2mm_aclk(clk40),
+ .axi_resetn(clk40_rstn),
+
+ .s_axi_lite_awaddr(m_axi_eth_dma_awaddr), //FIXME: Synthesis Warning: port width(10) doesn't match 32
+ .s_axi_lite_awvalid(m_axi_eth_dma_awvalid),
+ .s_axi_lite_awready(m_axi_eth_dma_awready),
+
+ .s_axi_lite_wdata(m_axi_eth_dma_wdata),
+ .s_axi_lite_wvalid(m_axi_eth_dma_wvalid),
+ .s_axi_lite_wready(m_axi_eth_dma_wready),
+
+ .s_axi_lite_bresp(m_axi_eth_dma_bresp),
+ .s_axi_lite_bvalid(m_axi_eth_dma_bvalid),
+ .s_axi_lite_bready(m_axi_eth_dma_bready),
+
+ .s_axi_lite_araddr(m_axi_eth_dma_araddr), //FIXME: Synthesis Warning: port width(10) doesn't match 32
+ .s_axi_lite_arvalid(m_axi_eth_dma_arvalid),
+ .s_axi_lite_arready(m_axi_eth_dma_arready),
+
+ .s_axi_lite_rdata(m_axi_eth_dma_rdata),
+ .s_axi_lite_rresp(m_axi_eth_dma_rresp),
+ .s_axi_lite_rvalid(m_axi_eth_dma_rvalid),
+ .s_axi_lite_rready(m_axi_eth_dma_rready),
+
+ .m_axi_sg_awaddr(s_axi_eth_descriptor_awaddr),
+ .m_axi_sg_awlen(s_axi_eth_descriptor_awlen),
+ .m_axi_sg_awsize(s_axi_eth_descriptor_awsize),
+ .m_axi_sg_awburst(s_axi_eth_descriptor_awburst),
+ .m_axi_sg_awprot(s_axi_eth_descriptor_awprot),
+ .m_axi_sg_awcache(s_axi_eth_descriptor_awcache),
+ .m_axi_sg_awvalid(s_axi_eth_descriptor_awvalid),
+ .m_axi_sg_awready(s_axi_eth_descriptor_awready),
+ .m_axi_sg_wdata(s_axi_eth_descriptor_wdata),
+ .m_axi_sg_wstrb(s_axi_eth_descriptor_wstrb),
+ .m_axi_sg_wlast(s_axi_eth_descriptor_wlast),
+ .m_axi_sg_wvalid(s_axi_eth_descriptor_wvalid),
+ .m_axi_sg_wready(s_axi_eth_descriptor_wready),
+ .m_axi_sg_bresp(s_axi_eth_descriptor_bresp),
+ .m_axi_sg_bvalid(s_axi_eth_descriptor_bvalid),
+ .m_axi_sg_bready(s_axi_eth_descriptor_bready),
+ .m_axi_sg_araddr(s_axi_eth_descriptor_araddr),
+ .m_axi_sg_arlen(s_axi_eth_descriptor_arlen),
+ .m_axi_sg_arsize(s_axi_eth_descriptor_arsize),
+ .m_axi_sg_arburst(s_axi_eth_descriptor_arburst),
+ .m_axi_sg_arprot(s_axi_eth_descriptor_arprot),
+ .m_axi_sg_arcache(s_axi_eth_descriptor_arcache),
+ .m_axi_sg_arvalid(s_axi_eth_descriptor_arvalid),
+ .m_axi_sg_arready(s_axi_eth_descriptor_arready),
+ .m_axi_sg_rdata(s_axi_eth_descriptor_rdata),
+ .m_axi_sg_rresp(s_axi_eth_descriptor_rresp),
+ .m_axi_sg_rlast(s_axi_eth_descriptor_rlast),
+ .m_axi_sg_rvalid(s_axi_eth_descriptor_rvalid),
+ .m_axi_sg_rready(s_axi_eth_descriptor_rready),
+
+ .m_axi_mm2s_araddr(s_axi_hp0_araddr),
+ .m_axi_mm2s_arlen(s_axi_hp0_arlen),
+ .m_axi_mm2s_arsize(s_axi_hp0_arsize),
+ .m_axi_mm2s_arburst(s_axi_hp0_arburst),
+ .m_axi_mm2s_arprot(s_axi_hp0_arprot),
+ .m_axi_mm2s_arcache(s_axi_hp0_arcache),
+ .m_axi_mm2s_arvalid(s_axi_hp0_arvalid),
+ .m_axi_mm2s_arready(s_axi_hp0_arready),
+ .m_axi_mm2s_rdata(s_axi_hp0_rdata),
+ .m_axi_mm2s_rresp(s_axi_hp0_rresp),
+ .m_axi_mm2s_rlast(s_axi_hp0_rlast),
+ .m_axi_mm2s_rvalid(s_axi_hp0_rvalid),
+ .m_axi_mm2s_rready(s_axi_hp0_rready),
+
+ .mm2s_prmry_reset_out_n(),
+ .m_axis_mm2s_tdata(arm_eth_tx_tdata),
+ .m_axis_mm2s_tkeep(arm_eth_tx_tkeep),
+ .m_axis_mm2s_tvalid(arm_eth_tx_tvalid),
+ .m_axis_mm2s_tready(arm_eth_tx_tready),
+ .m_axis_mm2s_tlast(arm_eth_tx_tlast),
+
+ .m_axi_s2mm_awaddr(s_axi_hp0_awaddr),
+ .m_axi_s2mm_awlen(s_axi_hp0_awlen),
+ .m_axi_s2mm_awsize(s_axi_hp0_awsize),
+ .m_axi_s2mm_awburst(s_axi_hp0_awburst),
+ .m_axi_s2mm_awprot(s_axi_hp0_awprot),
+ .m_axi_s2mm_awcache(s_axi_hp0_awcache),
+ .m_axi_s2mm_awvalid(s_axi_hp0_awvalid),
+ .m_axi_s2mm_awready(s_axi_hp0_awready),
+ .m_axi_s2mm_wdata(s_axi_hp0_wdata),
+ .m_axi_s2mm_wstrb(s_axi_hp0_wstrb),
+ .m_axi_s2mm_wlast(s_axi_hp0_wlast),
+ .m_axi_s2mm_wvalid(s_axi_hp0_wvalid),
+ .m_axi_s2mm_wready(s_axi_hp0_wready),
+ .m_axi_s2mm_bresp(s_axi_hp0_bresp),
+ .m_axi_s2mm_bvalid(s_axi_hp0_bvalid),
+ .m_axi_s2mm_bready(s_axi_hp0_bready),
+
+ .s2mm_prmry_reset_out_n(),
+ .s_axis_s2mm_tdata(arm_eth_rx_tdata),
+ .s_axis_s2mm_tkeep(arm_eth_rx_tkeep),
+ .s_axis_s2mm_tvalid(arm_eth_rx_tvalid),
+ .s_axis_s2mm_tready(arm_eth_rx_tready),
+ .s_axis_s2mm_tlast(arm_eth_rx_tlast),
+
+ .mm2s_introut(arm_eth_tx_irq),
+ .s2mm_introut(arm_eth_rx_irq),
+ .axi_dma_tstvec()
+ );
+
+ // Clock crossing fifo from dma(clk40) to sfp(bus_clk)
+ axi_fifo_2clk #(.WIDTH(1+8+64), .SIZE(5)) eth_tx_fifo_2clk_i (
+ .reset(clk40_rst),
+ .i_aclk(clk40),
+ .i_tdata({arm_eth_tx_tlast, arm_eth_tx_tkeep, arm_eth_tx_tdata}),
+ .i_tvalid(arm_eth_tx_tvalid),
+ .i_tready(arm_eth_tx_tready),
+ .o_aclk(bus_clk),
+ .o_tdata({arm_eth_tx_tlast_b, arm_eth_tx_tkeep_b, arm_eth_tx_tdata_b}),
+ .o_tvalid(arm_eth_tx_tvalid_b),
+ .o_tready(arm_eth_tx_tready_b)
+ );
+
+ // Clock crossing fifo from sfp(bus_clk) to dma(clk40)
+ axi_fifo_2clk #(.WIDTH(1+8+64), .SIZE(5)) eth_rx_fifo_2clk_i (
+ .reset(bus_rst),
+ .i_aclk(bus_clk),
+ .i_tdata({arm_eth_rx_tlast_b, arm_eth_rx_tkeep_b, arm_eth_rx_tdata_b}),
+ .i_tvalid(arm_eth_rx_tvalid_b),
+ .i_tready(arm_eth_rx_tready_b),
+ .o_aclk(clk40),
+ .o_tdata({arm_eth_rx_tlast, arm_eth_rx_tkeep, arm_eth_rx_tdata}),
+ .o_tvalid(arm_eth_rx_tvalid),
+ .o_tready(arm_eth_rx_tready)
+ );
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // PS Connections
+ //
+ //////////////////////////////////////////////////////////////////////
+
+ wire [63:0] ps_gpio_in;
+ wire [63:0] ps_gpio_out;
+ wire [63:0] ps_gpio_tri;
+
+ e320_ps_bd e320_ps_bd_i (
+ // DDR Interface
+ .DDR_VRN(PS_DDR3_VRN),
+ .DDR_VRP(PS_DDR3_VRP),
+ .DDR_addr(PS_DDR3_ADDR),
+ .DDR_ba(PS_DDR3_BA),
+ .DDR_cas_n(PS_DDR3_CAS_N),
+ .DDR_ck_n(DDR_MODCLK_N),
+ .DDR_ck_p(DDR_MODCLK_P),
+ .DDR_cke(PS_DDR3_CKE),
+ .DDR_cs_n(PS_DDR3_CS_N),
+ .DDR_dm(PS_DDR3_DM),
+ .DDR_dq(PS_DDR3_DQ),
+ .DDR_dqs_n(PS_DDR3_DQS_N),
+ .DDR_dqs_p(PS_DDR3_DQS_P),
+ .DDR_odt(PS_DDR3_ODT),
+ .DDR_ras_n(PS_DDR3_RAS_N),
+ .DDR_reset_n(PS_DDR3_RESET_N),
+ .DDR_we_n(PS_DDR3_WE_N),
+
+ // Clocks
+ .FCLK_CLK0(FCLK_CLK0),
+ .FCLK_CLK1(FCLK_CLK1),
+ .FCLK_CLK2(FCLK_CLK2),
+ .FCLK_CLK3(FCLK_CLK3),
+
+ // Resets
+ .FCLK_RESET0_N(FCLK_RESET0_N),
+
+ // GPIO
+ .GPIO_0_tri_i(ps_gpio_in),
+ .GPIO_0_tri_o(ps_gpio_out),
+ .GPIO_0_tri_t(ps_gpio_tri),
+
+ // Interrupts
+ .IRQ_F2P(IRQ_F2P),
+
+ // MIO
+ .MIO(PS_MIO),
+
+ .PS_CLK(PS_CLK),
+ .PS_PORB(PS_POR_B),
+ .PS_SRSTB(PS_SRST_B),
+
+ // SPI
+ .SPI0_MISO_I(XCVR_SPI_MISO),
+ .SPI0_MISO_O(),
+ .SPI0_MISO_T(),
+ .SPI0_MOSI_I(1'b0),
+ .SPI0_MOSI_O(XCVR_SPI_MOSI),
+ .SPI0_MOSI_T(),
+ .SPI0_SCLK_I(1'b0),
+ .SPI0_SCLK_O(XCVR_SPI_CLK),
+ .SPI0_SCLK_T(),
+ .SPI0_SS1_O(),
+ .SPI0_SS2_O(),
+ .SPI0_SS_I(1'b1),
+ .SPI0_SS_O(XCVR_SPI_CS_N),
+ .SPI0_SS_T(),
+
+ .SPI1_MISO_I(1'b0),
+ .SPI1_MISO_O(),
+ .SPI1_MISO_T(),
+ .SPI1_MOSI_I(1'b0),
+ .SPI1_MOSI_O(CLK_PLL_SDATA),
+ .SPI1_MOSI_T(),
+ .SPI1_SCLK_I(1'b0),
+ .SPI1_SCLK_O(CLK_PLL_SCLK),
+ .SPI1_SCLK_T(),
+ .SPI1_SS1_O(),
+ .SPI1_SS2_O(),
+ .SPI1_SS_I(1'b1),
+ .SPI1_SS_O(CLK_PLL_SLE),
+ .SPI1_SS_T(),
+
+ // Eth DMA Descriptor
+ .s_axi_eth_descriptor_araddr(s_axi_eth_descriptor_araddr),
+ .s_axi_eth_descriptor_arburst(s_axi_eth_descriptor_arburst),
+ .s_axi_eth_descriptor_arcache(s_axi_eth_descriptor_arcache),
+ .s_axi_eth_descriptor_arid(s_axi_eth_descriptor_arid),
+ .s_axi_eth_descriptor_arlen(s_axi_eth_descriptor_arlen),
+ .s_axi_eth_descriptor_arlock(1'b0),
+ .s_axi_eth_descriptor_arprot(s_axi_eth_descriptor_arprot),
+ .s_axi_eth_descriptor_arqos(4'b0),
+ .s_axi_eth_descriptor_arready(s_axi_eth_descriptor_arready),
+ .s_axi_eth_descriptor_arsize(s_axi_eth_descriptor_arsize),
+ .s_axi_eth_descriptor_arvalid(s_axi_eth_descriptor_arvalid),
+ .s_axi_eth_descriptor_awaddr(s_axi_eth_descriptor_awaddr),
+ .s_axi_eth_descriptor_awburst(s_axi_eth_descriptor_awburst),
+ .s_axi_eth_descriptor_awcache(s_axi_eth_descriptor_awcache),
+ .s_axi_eth_descriptor_awid(s_axi_eth_descriptor_awid),
+ .s_axi_eth_descriptor_awlen(s_axi_eth_descriptor_awlen),
+ .s_axi_eth_descriptor_awlock(1'b0),
+ .s_axi_eth_descriptor_awprot(s_axi_eth_descriptor_awprot),
+ .s_axi_eth_descriptor_awqos(4'b0),
+ .s_axi_eth_descriptor_awready(s_axi_eth_descriptor_awready),
+ .s_axi_eth_descriptor_awsize(s_axi_eth_descriptor_awsize),
+ .s_axi_eth_descriptor_awvalid(s_axi_eth_descriptor_awvalid),
+ .s_axi_eth_descriptor_bid(),
+ .s_axi_eth_descriptor_bready(s_axi_eth_descriptor_bready),
+ .s_axi_eth_descriptor_bresp(s_axi_eth_descriptor_bresp),
+ .s_axi_eth_descriptor_bvalid(s_axi_eth_descriptor_bvalid),
+ .s_axi_eth_descriptor_rdata(s_axi_eth_descriptor_rdata),
+ .s_axi_eth_descriptor_rid(),
+ .s_axi_eth_descriptor_rlast(s_axi_eth_descriptor_rlast),
+ .s_axi_eth_descriptor_rready(s_axi_eth_descriptor_rready),
+ .s_axi_eth_descriptor_rresp(s_axi_eth_descriptor_rresp),
+ .s_axi_eth_descriptor_rvalid(s_axi_eth_descriptor_rvalid),
+ .s_axi_eth_descriptor_wdata(s_axi_eth_descriptor_wdata),
+ .s_axi_eth_descriptor_wlast(s_axi_eth_descriptor_wlast),
+ .s_axi_eth_descriptor_wready(s_axi_eth_descriptor_wready),
+ .s_axi_eth_descriptor_wstrb(s_axi_eth_descriptor_wstrb),
+ .s_axi_eth_descriptor_wvalid(s_axi_eth_descriptor_wvalid),
+
+ // HP0 - Eth DMA
+ .S_AXI_HP0_ACLK(clk40),
+ .S_AXI_HP0_ARESETN(clk40_rstn),
+ .S_AXI_HP0_araddr(s_axi_hp0_araddr),
+ .S_AXI_HP0_arburst(s_axi_hp0_arburst),
+ .S_AXI_HP0_arcache(s_axi_hp0_arcache),
+ .S_AXI_HP0_arid(s_axi_hp0_arid),
+ .S_AXI_HP0_arlen(s_axi_hp0_arlen),
+ .S_AXI_HP0_arlock(1'b0),
+ .S_AXI_HP0_arprot(s_axi_hp0_arprot),
+ .S_AXI_HP0_arqos(4'b0),
+ .S_AXI_HP0_arready(s_axi_hp0_arready),
+ .S_AXI_HP0_arsize(s_axi_hp0_arsize),
+ .S_AXI_HP0_arvalid(s_axi_hp0_arvalid),
+ .S_AXI_HP0_awaddr(s_axi_hp0_awaddr),
+ .S_AXI_HP0_awburst(s_axi_hp0_awburst),
+ .S_AXI_HP0_awcache(s_axi_hp0_awcache),
+ .S_AXI_HP0_awid(s_axi_hp0_awid),
+ .S_AXI_HP0_awlen(s_axi_hp0_awlen),
+ .S_AXI_HP0_awlock(1'b0),
+ .S_AXI_HP0_awprot(s_axi_hp0_awprot),
+ .S_AXI_HP0_awqos(4'b0),
+ .S_AXI_HP0_awready(s_axi_hp0_awready),
+ .S_AXI_HP0_awsize(s_axi_hp0_awsize),
+ .S_AXI_HP0_awvalid(s_axi_hp0_awvalid),
+ .S_AXI_HP0_bid(),
+ .S_AXI_HP0_bready(s_axi_hp0_bready),
+ .S_AXI_HP0_bresp(s_axi_hp0_bresp),
+ .S_AXI_HP0_bvalid(s_axi_hp0_bvalid),
+ .S_AXI_HP0_rdata(s_axi_hp0_rdata),
+ .S_AXI_HP0_rid(),
+ .S_AXI_HP0_rlast(s_axi_hp0_rlast),
+ .S_AXI_HP0_rready(s_axi_hp0_rready),
+ .S_AXI_HP0_rresp(s_axi_hp0_rresp),
+ .S_AXI_HP0_rvalid(s_axi_hp0_rvalid),
+ .S_AXI_HP0_wdata(s_axi_hp0_wdata),
+ .S_AXI_HP0_wlast(s_axi_hp0_wlast),
+ .S_AXI_HP0_wready(s_axi_hp0_wready),
+ .S_AXI_HP0_wstrb(s_axi_hp0_wstrb),
+ .S_AXI_HP0_wvalid(s_axi_hp0_wvalid),
+ .m_axi_eth_dma_araddr(m_axi_eth_dma_araddr),
+ .m_axi_eth_dma_arprot(),
+ .m_axi_eth_dma_arready(m_axi_eth_dma_arready),
+ .m_axi_eth_dma_arvalid(m_axi_eth_dma_arvalid),
+ .m_axi_eth_dma_awaddr(m_axi_eth_dma_awaddr),
+ .m_axi_eth_dma_awprot(),
+ .m_axi_eth_dma_awready(m_axi_eth_dma_awready),
+ .m_axi_eth_dma_awvalid(m_axi_eth_dma_awvalid),
+ .m_axi_eth_dma_bready(m_axi_eth_dma_bready),
+ .m_axi_eth_dma_bresp(m_axi_eth_dma_bresp),
+ .m_axi_eth_dma_bvalid(m_axi_eth_dma_bvalid),
+ .m_axi_eth_dma_rdata(m_axi_eth_dma_rdata),
+ .m_axi_eth_dma_rready(m_axi_eth_dma_rready),
+ .m_axi_eth_dma_rresp(m_axi_eth_dma_rresp),
+ .m_axi_eth_dma_rvalid(m_axi_eth_dma_rvalid),
+ .m_axi_eth_dma_wdata(m_axi_eth_dma_wdata),
+ .m_axi_eth_dma_wready(m_axi_eth_dma_wready),
+ .m_axi_eth_dma_wstrb(m_axi_eth_dma_wstrb),
+ .m_axi_eth_dma_wvalid(m_axi_eth_dma_wvalid),
+
+ // MGT IO Regport
+ .m_axi_net_araddr(m_axi_net_araddr),
+ .m_axi_net_arprot(),
+ .m_axi_net_arready(m_axi_net_arready),
+ .m_axi_net_arvalid(m_axi_net_arvalid),
+ .m_axi_net_awaddr(m_axi_net_awaddr),
+ .m_axi_net_awprot(),
+ .m_axi_net_awready(m_axi_net_awready),
+ .m_axi_net_awvalid(m_axi_net_awvalid),
+ .m_axi_net_bready(m_axi_net_bready),
+ .m_axi_net_bresp(m_axi_net_bresp),
+ .m_axi_net_bvalid(m_axi_net_bvalid),
+ .m_axi_net_rdata(m_axi_net_rdata),
+ .m_axi_net_rready(m_axi_net_rready),
+ .m_axi_net_rresp(m_axi_net_rresp),
+ .m_axi_net_rvalid(m_axi_net_rvalid),
+ .m_axi_net_wdata(m_axi_net_wdata),
+ .m_axi_net_wready(m_axi_net_wready),
+ .m_axi_net_wstrb(m_axi_net_wstrb),
+ .m_axi_net_wvalid(m_axi_net_wvalid),
+
+ // XBAR Regport
+ .m_axi_xbar_araddr(m_axi_xbar_araddr),
+ .m_axi_xbar_arprot(),
+ .m_axi_xbar_arready(m_axi_xbar_arready),
+ .m_axi_xbar_arvalid(m_axi_xbar_arvalid),
+ .m_axi_xbar_awaddr(m_axi_xbar_awaddr),
+ .m_axi_xbar_awprot(),
+ .m_axi_xbar_awready(m_axi_xbar_awready),
+ .m_axi_xbar_awvalid(m_axi_xbar_awvalid),
+ .m_axi_xbar_bready(m_axi_xbar_bready),
+ .m_axi_xbar_bresp(m_axi_xbar_bresp),
+ .m_axi_xbar_bvalid(m_axi_xbar_bvalid),
+ .m_axi_xbar_rdata(m_axi_xbar_rdata),
+ .m_axi_xbar_rready(m_axi_xbar_rready),
+ .m_axi_xbar_rresp(m_axi_xbar_rresp),
+ .m_axi_xbar_rvalid(m_axi_xbar_rvalid),
+ .m_axi_xbar_wdata(m_axi_xbar_wdata),
+ .m_axi_xbar_wready(m_axi_xbar_wready),
+ .m_axi_xbar_wstrb(m_axi_xbar_wstrb),
+ .m_axi_xbar_wvalid(m_axi_xbar_wvalid),
+
+ // USB
+ .USBIND_0_port_indctl(),
+ .USBIND_0_vbus_pwrfault(),
+ .USBIND_0_vbus_pwrselect(),
+
+ .bus_clk(bus_clk),
+ .bus_rstn(~bus_rst),
+ .clk40(clk40),
+ .clk40_rstn(clk40_rstn),
+ .S_AXI_GP0_ACLK(clk40),
+ .S_AXI_GP0_ARESETN(clk40_rstn),
+
+ // DMA
+ .s_axis_dma_tdata(s_axis_dma_tdata),
+ .s_axis_dma_tdest(s_axis_dma_tdest),
+ .s_axis_dma_tlast(s_axis_dma_tlast),
+ .s_axis_dma_tready(s_axis_dma_tready),
+ .s_axis_dma_tvalid(s_axis_dma_tvalid),
+ .m_axis_dma_tdata(m_axis_dma_tdata),
+ .m_axis_dma_tuser(m_axis_dma_tuser),
+ .m_axis_dma_tlast(m_axis_dma_tlast),
+ .m_axis_dma_tready(m_axis_dma_tready),
+ .m_axis_dma_tvalid(m_axis_dma_tvalid)
+ );
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // GPSDO Control and Status
+ //
+ /////////////////////////////////////////////////////////////////////
+
+ wire [31:0] gps_ctrl;
+ wire [31:0] gps_status;
+
+ assign CLK_GPS_PWR_EN = gps_ctrl[0];
+ assign GPS_RST_N = gps_ctrl[1];
+ assign GPS_INITSURV_N = gps_ctrl[2];
+ assign gps_status[0] = GPS_LOCK;
+ assign gps_status[1] = GPS_ALARM;
+ assign gps_status[2] = GPS_PHASELOCK;
+ assign gps_status[3] = GPS_SURVEY;
+ assign gps_status[4] = GPS_WARMUP;
+ assign gps_status[31:5] = 'd0;
+
+ /////////////////////////////////////////////////////////////////////
+ //
+ // E320 Core:
+ // - xbar
+ // - Radio
+ // - DMA
+ // - DRAM
+ // - CEs
+ //
+ //////////////////////////////////////////////////////////////////////
+
+ wire [31:0] build_datestamp;
+
+ USR_ACCESSE2 usr_access_i (
+ .DATA(build_datestamp), .CFGCLK(), .DATAVALID()
+ );
+
+ e320_core #(
+ .REG_AWIDTH(REG_AWIDTH),
+ .BUS_CLK_RATE(BUS_CLK_RATE),
+ .NUM_RADIOS(NUM_RADIOS),
+ .NUM_CHANNELS(NUM_CHANNELS),
+ .NUM_DBOARDS(NUM_DBOARDS),
+ .FP_GPIO_WIDTH(FP_GPIO_WIDTH),
+ .DB_GPIO_WIDTH(DB_GPIO_WIDTH)
+ ) e320_core_i (
+
+ //Clocks and resets
+ .radio_clk(radio_clk),
+ .radio_rst(radio_rst),
+ .bus_clk(bus_clk),
+ .bus_rst(bus_rst),
+ .ddr3_dma_clk(ddr3_dma_clk),
+ .clk40(clk40),
+
+ // Clocking and PPS Controls/Indicators
+ .pps_refclk(pps_refclk),
+ .refclk_locked(refclk_locked_busclk),
+ .pps_select(pps_select),
+ .ref_select(ref_select),
+
+ .s_axi_aclk(clk40),
+ .s_axi_aresetn(clk40_rstn),
+ // AXI4-Lite: Write address port (domain: s_axi_aclk)
+ .s_axi_awaddr(m_axi_xbar_awaddr),
+ .s_axi_awvalid(m_axi_xbar_awvalid),
+ .s_axi_awready(m_axi_xbar_awready),
+ // AXI4-Lite: Write data port (domain: s_axi_aclk)
+ .s_axi_wdata(m_axi_xbar_wdata),
+ .s_axi_wstrb(m_axi_xbar_wstrb),
+ .s_axi_wvalid(m_axi_xbar_wvalid),
+ .s_axi_wready(m_axi_xbar_wready),
+ // AXI4-Lite: Write response port (domain: s_axi_aclk)
+ .s_axi_bresp(m_axi_xbar_bresp),
+ .s_axi_bvalid(m_axi_xbar_bvalid),
+ .s_axi_bready(m_axi_xbar_bready),
+ // AXI4-Lite: Read address port (domain: s_axi_aclk)
+ .s_axi_araddr(m_axi_xbar_araddr),
+ .s_axi_arvalid(m_axi_xbar_arvalid),
+ .s_axi_arready(m_axi_xbar_arready),
+ // AXI4-Lite: Read data port (domain: s_axi_aclk)
+ .s_axi_rdata(m_axi_xbar_rdata),
+ .s_axi_rresp(m_axi_xbar_rresp),
+ .s_axi_rvalid(m_axi_xbar_rvalid),
+ .s_axi_rready(m_axi_xbar_rready),
+
+ // DRAM signals
+ .ddr3_axi_clk (ddr3_axi_clk),
+ .ddr3_axi_rst (ddr3_axi_rst),
+ .ddr3_running (ddr3_running),
+ // Slave Interface Write Address Ports
+ .ddr3_axi_awid (ddr3_axi_awid),
+ .ddr3_axi_awaddr (ddr3_axi_awaddr),
+ .ddr3_axi_awlen (ddr3_axi_awlen),
+ .ddr3_axi_awsize (ddr3_axi_awsize),
+ .ddr3_axi_awburst (ddr3_axi_awburst),
+ .ddr3_axi_awlock (ddr3_axi_awlock),
+ .ddr3_axi_awcache (ddr3_axi_awcache),
+ .ddr3_axi_awprot (ddr3_axi_awprot),
+ .ddr3_axi_awqos (ddr3_axi_awqos),
+ .ddr3_axi_awvalid (ddr3_axi_awvalid),
+ .ddr3_axi_awready (ddr3_axi_awready),
+ // Slave Interface Write Data Ports
+ .ddr3_axi_wdata (ddr3_axi_wdata),
+ .ddr3_axi_wstrb (ddr3_axi_wstrb),
+ .ddr3_axi_wlast (ddr3_axi_wlast),
+ .ddr3_axi_wvalid (ddr3_axi_wvalid),
+ .ddr3_axi_wready (ddr3_axi_wready),
+ // Slave Interface Write Response Ports
+ .ddr3_axi_bid (ddr3_axi_bid),
+ .ddr3_axi_bresp (ddr3_axi_bresp),
+ .ddr3_axi_bvalid (ddr3_axi_bvalid),
+ .ddr3_axi_bready (ddr3_axi_bready),
+ // Slave Interface Read Address Ports
+ .ddr3_axi_arid (ddr3_axi_arid),
+ .ddr3_axi_araddr (ddr3_axi_araddr),
+ .ddr3_axi_arlen (ddr3_axi_arlen),
+ .ddr3_axi_arsize (ddr3_axi_arsize),
+ .ddr3_axi_arburst (ddr3_axi_arburst),
+ .ddr3_axi_arlock (ddr3_axi_arlock),
+ .ddr3_axi_arcache (ddr3_axi_arcache),
+ .ddr3_axi_arprot (ddr3_axi_arprot),
+ .ddr3_axi_arqos (ddr3_axi_arqos),
+ .ddr3_axi_arvalid (ddr3_axi_arvalid),
+ .ddr3_axi_arready (ddr3_axi_arready),
+ // Slave Interface Read Data Ports
+ .ddr3_axi_rid (ddr3_axi_rid),
+ .ddr3_axi_rdata (ddr3_axi_rdata),
+ .ddr3_axi_rresp (ddr3_axi_rresp),
+ .ddr3_axi_rlast (ddr3_axi_rlast),
+ .ddr3_axi_rvalid (ddr3_axi_rvalid),
+ .ddr3_axi_rready (ddr3_axi_rready),
+
+
+ // Radio ATR
+ .rx_atr(rx_atr),
+ .tx_atr(tx_atr),
+
+ // Front-Panel GPIO
+ .fp_gpio_in(fp_gpio_in),
+ .fp_gpio_tri(fp_gpio_tri),
+ .fp_gpio_out(fp_gpio_out),
+
+ // PS GPIO Connection
+ .ps_gpio_tri(ps_gpio_tri[FP_GPIO_WIDTH+FP_GPIO_OFFSET-1: FP_GPIO_OFFSET]),
+ .ps_gpio_out(ps_gpio_out[FP_GPIO_WIDTH+FP_GPIO_OFFSET-1: FP_GPIO_OFFSET]),
+ .ps_gpio_in(ps_gpio_in[FP_GPIO_WIDTH+FP_GPIO_OFFSET-1: FP_GPIO_OFFSET]),
+
+ // DB GPIO
+ .db_gpio_out_flat(db_gpio_out_flat),
+ .db_gpio_ddr_flat(db_gpio_ddr_flat),
+ .db_gpio_in_flat(db_gpio_in_flat),
+ .db_gpio_fab_flat(32'b0), // FIXME: Incorrect width
+
+ // TX/RX LEDs
+ .leds_flat(leds_flat),
+
+ // Radio Strobes
+ .rx_stb(rx_stb),
+ .tx_stb(tx_stb),
+
+ // Radio Data
+ .rx(rx_flat),
+ .tx(tx_flat),
+
+ // DMA to PS
+ .m_dma_tdata(s_axis_dma_tdata),
+ .m_dma_tdest(s_axis_dma_tdest),
+ .m_dma_tlast(s_axis_dma_tlast),
+ .m_dma_tready(s_axis_dma_tready),
+ .m_dma_tvalid(s_axis_dma_tvalid),
+
+ .s_dma_tdata(m_axis_dma_tdata),
+ .s_dma_tuser(m_axis_dma_tuser),
+ .s_dma_tlast(m_axis_dma_tlast),
+ .s_dma_tready(m_axis_dma_tready),
+ .s_dma_tvalid(m_axis_dma_tvalid),
+
+ // VITA to Ethernet
+ .v2e_tdata(v2e_tdata),
+ .v2e_tvalid(v2e_tvalid),
+ .v2e_tlast(v2e_tlast),
+ .v2e_tready(v2e_tready),
+
+ // Ethernet to VITA
+ .e2v_tdata(e2v_tdata),
+ .e2v_tlast(e2v_tlast),
+ .e2v_tvalid(e2v_tvalid),
+ .e2v_tready(e2v_tready),
+
+ .build_datestamp(build_datestamp),
+ .sfp_ports_info(sfp_port_info),
+ .gps_status(gps_status),
+ .gps_ctrl(gps_ctrl),
+ .dboard_status(dboard_status),
+ .xadc_readback({20'h0, device_temp}),
+ .fp_gpio_ctrl(fp_gpio_ctrl),
+ .dboard_ctrl(dboard_ctrl),
+ .device_id(device_id)
+ );
+
+endmodule // e320
+`default_nettype wire