diff options
Diffstat (limited to 'fpga/usrp3/top/x400/x4xx.v')
-rw-r--r-- | fpga/usrp3/top/x400/x4xx.v | 2232 |
1 files changed, 2232 insertions, 0 deletions
diff --git a/fpga/usrp3/top/x400/x4xx.v b/fpga/usrp3/top/x400/x4xx.v new file mode 100644 index 000000000..4b1ffd11c --- /dev/null +++ b/fpga/usrp3/top/x400/x4xx.v @@ -0,0 +1,2232 @@ +// +// Copyright 2021 Ettus Research, A National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Module: x4xx +// +// Description: Top-level module for X410 devices. +// + +`default_nettype none + + +module x4xx ( + + //----------------------------------- + // RF block signals + //----------------------------------- + + // Clocking and sync + input wire SYSREF_RF_P, + input wire SYSREF_RF_N, + input wire [3:0] ADC_CLK_P, + input wire [3:0] ADC_CLK_N, + input wire [1:0] DAC_CLK_P, + input wire [1:0] DAC_CLK_N, + + // Analog ports + input wire [1:0] DB0_RX_P, + input wire [1:0] DB0_RX_N, + input wire [1:0] DB1_RX_P, + input wire [1:0] DB1_RX_N, + output wire [1:0] DB0_TX_P, + output wire [1:0] DB0_TX_N, + output wire [1:0] DB1_TX_P, + output wire [1:0] DB1_TX_N, + + + //----------------------------------- + // MGTs (Quad 128-131) + //----------------------------------- + // + // Quad | Connector + // Bank 128 | QSFP28 (1) + // Bank 129 | iPass+zHD (1) + // Bank 130 | iPass+zHD (0) + // Bank 131 | QSFP28 (0) + // + //----------------------------------- + + // Clock references + input wire MGT_REFCLK_LMK0_P, + input wire MGT_REFCLK_LMK0_N, + input wire MGT_REFCLK_LMK1_P, + input wire MGT_REFCLK_LMK1_N, + input wire MGT_REFCLK_LMK2_P, + input wire MGT_REFCLK_LMK2_N, + input wire MGT_REFCLK_LMK3_P, + input wire MGT_REFCLK_LMK3_N, + + // Quad 128 transceivers: QSFP28 (1) + `ifdef QSFP1_0 + input wire QSFP1_0_RX_P, + input wire QSFP1_0_RX_N, + output wire QSFP1_0_TX_P, + output wire QSFP1_0_TX_N, + `endif + `ifdef QSFP1_1 + input wire QSFP1_1_RX_P, + input wire QSFP1_1_RX_N, + output wire QSFP1_1_TX_P, + output wire QSFP1_1_TX_N, + `endif + `ifdef QSFP1_2 + input wire QSFP1_2_RX_P, + input wire QSFP1_2_RX_N, + output wire QSFP1_2_TX_P, + output wire QSFP1_2_TX_N, + `endif + `ifdef QSFP1_3 + input wire QSFP1_3_RX_P, + input wire QSFP1_3_RX_N, + output wire QSFP1_3_TX_P, + output wire QSFP1_3_TX_N, + `endif + + // Quad 129 transceivers: iPass+zHD (1) + `ifdef IPASS1_LANES + input wire [`IPASS1_LANES-1:0] IPASS1_RX_P, + input wire [`IPASS1_LANES-1:0] IPASS1_RX_N, + output wire [`IPASS1_LANES-1:0] IPASS1_TX_P, + output wire [`IPASS1_LANES-1:0] IPASS1_TX_N, + `endif + + // Quad 130 transceivers: iPass+zHD (0) + `ifdef IPASS0_LANES + input wire [`IPASS0_LANES-1:0] IPASS0_RX_P, + input wire [`IPASS0_LANES-1:0] IPASS0_RX_N, + output wire [`IPASS0_LANES-1:0] IPASS0_TX_P, + output wire [`IPASS0_LANES-1:0] IPASS0_TX_N, + `endif + + // Quad 131 transceivers: QSFP28 (0) + `ifdef QSFP0_0 + input wire QSFP0_0_RX_P, + input wire QSFP0_0_RX_N, + output wire QSFP0_0_TX_P, + output wire QSFP0_0_TX_N, + `endif + `ifdef QSFP0_1 + input wire QSFP0_1_RX_P, + input wire QSFP0_1_RX_N, + output wire QSFP0_1_TX_P, + output wire QSFP0_1_TX_N, + `endif + `ifdef QSFP0_2 + input wire QSFP0_2_RX_P, + input wire QSFP0_2_RX_N, + output wire QSFP0_2_TX_P, + output wire QSFP0_2_TX_N, + `endif + `ifdef QSFP0_3 + input wire QSFP0_3_RX_P, + input wire QSFP0_3_RX_N, + output wire QSFP0_3_TX_P, + output wire QSFP0_3_TX_N, + `endif + + + //----------------------------------- + // HD banks + //----------------------------------- + + inout wire [19:0] DB0_GPIO, + output wire DB0_SYNTH_SYNC, + inout wire [19:0] DB1_GPIO, + output wire DB1_SYNTH_SYNC, + + output wire LMK_SYNC, + input wire PPS_IN, + output wire PL_CPLD_SCLK, // Dual-purpose CPLD JTAG TCK + output wire PL_CPLD_MOSI, // Dual-purpose CPLD JTAG TDI + input wire PL_CPLD_MISO, // Dual-purpose CPLD JTAG TDO + + + //----------------------------------- + // eCPRI + //----------------------------------- + + input wire FPGA_AUX_REF, + + `ifdef QSFP1_0 + output wire GTY_RCV_CLK_P, + output wire GTY_RCV_CLK_N, + `endif + + output wire FABRIC_CLK_OUT_P, + output wire FABRIC_CLK_OUT_N, + + + //----------------------------------- + // Misc HP banks + //----------------------------------- + + input wire PLL_REFCLK_FPGA_P, + input wire PLL_REFCLK_FPGA_N, + input wire BASE_REFCLK_FPGA_P, + input wire BASE_REFCLK_FPGA_N, + + input wire SYSREF_FABRIC_P, + input wire SYSREF_FABRIC_N, + + input wire QSFP0_MODPRS_n, + output wire QSFP0_RESET_n, + output wire QSFP0_LPMODE_n, + input wire QSFP1_MODPRS_n, + output wire QSFP1_RESET_n, + output wire QSFP1_LPMODE_n, + + inout wire [11:0] DIOA_FPGA, + inout wire [11:0] DIOB_FPGA, + + output wire CPLD_JTAG_OE_n, + + output wire PPS_LED, + inout wire TRIG_IO, + output wire PL_CPLD_JTAGEN, + output wire PL_CPLD_CS0_n, // Dual-purpose CPLD JTAG TMS + output wire PL_CPLD_CS1_n + + + //----------------------------------- + // Unused pins + //----------------------------------- + + // DRAM Controller 0 + // input wire DRAM0_REFCLK_P, + // input wire DRAM0_REFCLK_N, + // output wire DRAM0_ACT_n, + // output wire [16:0] DRAM0_ADDR, + // output wire [ 1:0] DRAM0_BA, + // output wire [ 0:0] DRAM0_BG, + // output wire [ 0:0] DRAM0_CKE, + // output wire [ 0:0] DRAM0_ODT, + // output wire [ 0:0] DRAM0_CS_n, + // output wire [ 0:0] DRAM0_CLK_P, + // output wire [ 0:0] DRAM0_CLK_N, + // output wire DRAM0_RESET_n, + // inout wire [ 7:0] DRAM0_DM_n, + // inout wire [63:0] DRAM0_DQ, + // inout wire [ 7:0] DRAM0_DQS_p, + // inout wire [ 7:0] DRAM0_DQS_n, + + // DRAM Controller 1 + // input wire DRAM1_REFCLK_P, + // input wire DRAM1_REFCLK_N, + // output wire DRAM1_ACT_n, + // output wire [16:0] DRAM1_ADDR, + // output wire [ 1:0] DRAM1_BA, + // output wire [ 0:0] DRAM1_BG, + // output wire [ 0:0] DRAM1_CKE, + // output wire [ 0:0] DRAM1_ODT, + // output wire [ 0:0] DRAM1_CS_n, + // output wire [ 0:0] DRAM1_CLK_P, + // output wire [ 0:0] DRAM1_CLK_N, + // output wire DRAM1_RESET_n, + // inout wire [ 7:0] DRAM1_DM_n, + // inout wire [63:0] DRAM1_DQ, + // inout wire [ 7:0] DRAM1_DQS_p, + // inout wire [ 7:0] DRAM1_DQS_n, + + // input wire [1:0] IPASS_SIDEBAND, + // input wire PCIE_RESET, + // input wire PL_CPLD_IRQ, + // output wire FPGA_TEST, + // output wire TDC_SPARE_0, + // output wire TDC_SPARE_1 + +); + + `include "regmap/global_regs_regmap_utils.vh" + `include "regmap/versioning_regs_regmap_utils.vh" + `include "regmap/versioning_utils.vh" + `include "x4xx_mgt_types.vh" + + + //--------------------------------------------------------------------------- + // Build Configuration + //--------------------------------------------------------------------------- + + // Include the RFNoC image core header file + `ifdef RFNOC_IMAGE_CORE_HDR + `include `"`RFNOC_IMAGE_CORE_HDR`" + `else + ERROR_RFNOC_IMAGE_CORE_HDR_not_defined(); + `define CHDR_WIDTH 64 + `define RFNOC_PROTOVER { 8'd1, 8'd0 } + `endif + + // Check the requested bandwidth + `ifdef RFBW_100M + localparam RF_BANDWIDTH = 100; // RF Bandwidth (MHz) + localparam RADIO_SPC = 1; // Number of samples per cycle + `elsif RFBW_200M + localparam RF_BANDWIDTH = 200; // RF Bandwidth (MHz) + localparam RADIO_SPC = 2; // Number of samples per cycle + `elsif RFBW_400M + localparam RF_BANDWIDTH = 400; // RF Bandwidth (MHz) + localparam RADIO_SPC = 4; // Number of samples per cycle + `else + ERROR_RF_bandwidth_must_be_defined(); + localparam RF_BANDWIDTH = 100; // RF Bandwidth (MHz) + localparam RADIO_SPC = 1; // Number of samples per cycle + `endif + + // See global_regs_regmap_utils.vh for definition of CHDR_CLK_VALUE. + localparam CHDR_CLK_RATE = CHDR_CLK_VALUE[CHDR_CLK_SIZE-1:0]; + localparam RFNOC_PROTOVER = `RFNOC_PROTOVER; + localparam CHDR_W = `CHDR_WIDTH; + localparam CPU_W = 64; + + localparam REG_AWIDTH = 15; + localparam REG_DWIDTH = 32; + + // Log2 of the maximum transmission unit (MTU) + localparam BYTE_MTU = $clog2(8192); // MTU in bytes + localparam CHDR_MTU = BYTE_MTU - $clog2(CHDR_W/8); // MTU in CHDR words + + + //--------------------------------------------------------------------------- + // Clocks and Resets + //--------------------------------------------------------------------------- + + // Clocking and sync signals for RFDC + wire pll_ref_clk_in, pll_ref_clk; + wire sysref_pl; + wire base_ref_clk; + + // Buffer the incoming RFDC PLL clock + IBUFGDS ibufgds_pll_ref_clk ( + .O (pll_ref_clk_in), + .I (PLL_REFCLK_FPGA_P), + .IB (PLL_REFCLK_FPGA_N) + ); + + assign DB0_SYNTH_SYNC = 1'b0; + assign DB1_SYNTH_SYNC = 1'b0; + + // Buffer the incoming RFDC PL SYSREF + IBUFGDS ibufgds_pl_sysref ( + .O (sysref_pl), + .I (SYSREF_FABRIC_P), + .IB (SYSREF_FABRIC_N) + ); + + // Buffer the incoming base reference clock + IBUFGDS ibufgds_base_ref_clk ( + .O (base_ref_clk), + .I (BASE_REFCLK_FPGA_P), + .IB (BASE_REFCLK_FPGA_N) + ); + + // Clocking signals for RF data processing/moving + wire rfdc_clk, rfdc_clk_2x; + wire data_clk; + wire data_clk_2x; + wire radio_clk; + wire radio_clk_2x; + + // Low-power output clocks from PS to PL + wire clk40; // 40.000 MHz + wire clk100; // 100.000 MHz + wire clk200; // 200.000 MHz + + // Asynchronous resets from PS to PL + wire pl_resetn0; + wire areset; + + assign areset = ~pl_resetn0; + + // Synchronous resets derived from the reset coming from the PS + wire clk40_rst, clk40_rstn; + wire clk200_rst, clk200_rstn; + wire radio_rst; + wire brc_rst; + wire prc_rst; + + reset_sync reset_sync_clk40 ( + .clk (clk40), + .reset_in (areset), + .reset_out (clk40_rst) + ); + + reset_sync reset_sync_clk200 ( + .clk (clk200), + .reset_in (areset), + .reset_out (clk200_rst) + ); + + reset_sync reset_sync_radio ( + .clk (radio_clk), + .reset_in (areset), + .reset_out (radio_rst) + ); + + reset_sync reset_sync_brc ( + .clk (base_ref_clk), + .reset_in (areset), + .reset_out (brc_rst) + ); + + reset_sync reset_sync_prc ( + .clk (pll_ref_clk), + .reset_in (areset), + .reset_out (prc_rst) + ); + + // Invert reset for various modules. + assign clk40_rstn = ~clk40_rst; + assign clk200_rstn = ~clk200_rst; + + + //--------------------------------------------------------------------------- + // PPS Handling + //--------------------------------------------------------------------------- + + wire pps_refclk; + wire pps_radioclk; + wire [ 1:0] pps_select; + wire pll_sync_trigger; + wire pll_sync_done; + wire [ 7:0] pll_sync_delay; + wire [ 7:0] pps_brc_delay; + wire [25:0] pps_prc_delay; + wire [ 1:0] prc_rc_divider; + wire pps_rc_enabled; + + x4xx_pps_sync x4xx_pps_sync_i ( + .base_ref_clk (base_ref_clk), + .pll_ref_clk (pll_ref_clk), + .ctrl_clk (clk40), + .radio_clk (data_clk), + .brc_rst (brc_rst), + .pps_in (PPS_IN), + .pps_out_brc (pps_refclk), + .pps_out_rc (pps_radioclk), + .sync (LMK_SYNC), + .pps_select (pps_select), + .pll_sync_trigger (pll_sync_trigger), + .pll_sync_delay (pll_sync_delay), + .pll_sync_done (pll_sync_done), + .pps_brc_delay (pps_brc_delay), + .pps_prc_delay (pps_prc_delay), + .prc_rc_divider (prc_rc_divider), + .pps_rc_enabled (pps_rc_enabled), + .debug () + ); + + // IMPORTANT! Trigger I/O tri-sate buffer is controlled through a SW API that + // also switches external buffers on the X410 mboard and clocking aux board. + // + // SW must ensure that any downstream device receiving TRIG_IO ignores or + // re-synchronizes after enabling this port. + wire [1:0] trig_io_select; + assign TRIG_IO = (trig_io_select == TRIG_IO_PPS_OUTPUT) ? pps_refclk : 1'bz; + assign PPS_LED = pps_refclk; + + + //--------------------------------------------------------------------------- + // Processor System (PS) + RF Data Converter (RFDC) + //--------------------------------------------------------------------------- + + wire [ 48:0] axi_hp0_araddr; + wire [ 1:0] axi_hp0_arburst; + wire [ 3:0] axi_hp0_arcache; + wire [ 5:0] axi_hp0_arid; + wire [ 7:0] axi_hp0_arlen; + wire axi_hp0_arlock; + wire [ 2:0] axi_hp0_arprot; + wire [ 3:0] axi_hp0_arqos; + wire axi_hp0_arready; + wire [ 2:0] axi_hp0_arsize; + wire axi_hp0_aruser; + wire axi_hp0_arvalid; + wire [ 48:0] axi_hp0_awaddr; + wire [ 1:0] axi_hp0_awburst; + wire [ 3:0] axi_hp0_awcache; + wire [ 5:0] axi_hp0_awid; + wire [ 7:0] axi_hp0_awlen; + wire axi_hp0_awlock; + wire [ 2:0] axi_hp0_awprot; + wire [ 3:0] axi_hp0_awqos; + wire axi_hp0_awready; + wire [ 2:0] axi_hp0_awsize; + wire axi_hp0_awuser; + wire axi_hp0_awvalid; + wire axi_hp0_bready; + wire [ 1:0] axi_hp0_bresp; + wire axi_hp0_bvalid; + wire [127:0] axi_hp0_rdata; + wire axi_hp0_rlast; + wire axi_hp0_rready; + wire [ 1:0] axi_hp0_rresp; + wire axi_hp0_rvalid; + wire [127:0] axi_hp0_wdata; + wire axi_hp0_wlast; + wire axi_hp0_wready; + wire [ 15:0] axi_hp0_wstrb; + wire axi_hp0_wvalid; + + wire [ 48:0] axi_hp1_araddr; + wire [ 1:0] axi_hp1_arburst; + wire [ 3:0] axi_hp1_arcache; + wire [ 5:0] axi_hp1_arid; + wire [ 7:0] axi_hp1_arlen; + wire axi_hp1_arlock; + wire [ 2:0] axi_hp1_arprot; + wire [ 3:0] axi_hp1_arqos; + wire axi_hp1_arready; + wire [ 2:0] axi_hp1_arsize; + wire axi_hp1_aruser; + wire axi_hp1_arvalid; + wire [ 48:0] axi_hp1_awaddr; + wire [ 1:0] axi_hp1_awburst; + wire [ 3:0] axi_hp1_awcache; + wire [ 5:0] axi_hp1_awid; + wire [ 7:0] axi_hp1_awlen; + wire axi_hp1_awlock; + wire [ 2:0] axi_hp1_awprot; + wire [ 3:0] axi_hp1_awqos; + wire axi_hp1_awready; + wire [ 2:0] axi_hp1_awsize; + wire axi_hp1_awuser; + wire axi_hp1_awvalid; + wire axi_hp1_bready; + wire [ 1:0] axi_hp1_bresp; + wire axi_hp1_bvalid; + wire [127:0] axi_hp1_rdata; + wire axi_hp1_rlast; + wire axi_hp1_rready; + wire [ 1:0] axi_hp1_rresp; + wire axi_hp1_rvalid; + wire [127:0] axi_hp1_wdata; + wire axi_hp1_wlast; + wire axi_hp1_wready; + wire [ 15:0] axi_hp1_wstrb; + wire axi_hp1_wvalid; + + wire [ 39:0] m_axi_app_araddr; + wire [ 2:0] m_axi_app_arprot; + wire [ 0:0] m_axi_app_arready; + wire [ 0:0] m_axi_app_arvalid; + wire [ 39:0] m_axi_app_awaddr; + wire [ 2:0] m_axi_app_awprot; + wire [ 0:0] m_axi_app_awready; + wire [ 0:0] m_axi_app_awvalid; + wire [ 0:0] m_axi_app_bready; + wire [ 1:0] m_axi_app_bresp; + wire [ 0:0] m_axi_app_bvalid; + wire [ 31:0] m_axi_app_rdata; + wire [ 0:0] m_axi_app_rready; + wire [ 1:0] m_axi_app_rresp; + wire [ 0:0] m_axi_app_rvalid; + wire [ 31:0] m_axi_app_wdata; + wire [ 0:0] m_axi_app_wready; + wire [ 3:0] m_axi_app_wstrb; + wire [ 0:0] m_axi_app_wvalid; + wire [ 39:0] m_axi_mpm_ep_araddr; + wire [ 0:0] m_axi_mpm_ep_arready; + wire [ 0:0] m_axi_mpm_ep_arvalid; + wire [ 39:0] m_axi_mpm_ep_awaddr; + wire [ 0:0] m_axi_mpm_ep_awready; + wire [ 0:0] m_axi_mpm_ep_awvalid; + wire [ 0:0] m_axi_mpm_ep_bready; + wire [ 1:0] m_axi_mpm_ep_bresp; + wire [ 0:0] m_axi_mpm_ep_bvalid; + wire [ 31:0] m_axi_mpm_ep_rdata; + wire [ 0:0] m_axi_mpm_ep_rready; + wire [ 1:0] m_axi_mpm_ep_rresp; + wire [ 0:0] m_axi_mpm_ep_rvalid; + wire [ 31:0] m_axi_mpm_ep_wdata; + wire [ 0:0] m_axi_mpm_ep_wready; + wire [ 3:0] m_axi_mpm_ep_wstrb; + wire [ 0:0] m_axi_mpm_ep_wvalid; + + wire adc_data_out_resetn_dclk; + wire adc_enable_data_rclk; + wire adc_rfdc_axi_resetn_rclk; + + wire dac_data_in_resetn_dclk; + wire dac_data_in_resetn_dclk2x; + wire dac_data_in_resetn_rclk; + wire dac_data_in_resetn_rclk2x; + + wire fir_resetn_rclk2x; + + wire [3:0] eth0_link_up, eth0_activity; + wire [3:0] eth1_link_up, eth1_activity; + + wire [31:0] gpio_0_tri_i; + wire [31:0] gpio_0_tri_o; + + // RFDC AXI4-Stream interfaces + // + // All these signals/vectors are in the rfdc_clk domain. + // + // ADC: + // + // I/Q data comes from the RFDC in two vectors: I and Q. Each vector contains + // up to 8 SPC depending upon the decimation performed by the RFDC. When + // lower data rates are used (higher decimation), the LSBs will contain the + // valid samples. The data is packed in each vector as follows: + // + // ____________ ____________ _ + // rfdc_clk _| |____________| |____________| + // _ _________________________ _________________________ _ + // *_i_tdata _X_i7,i6,i5,i4,i3,i2,i1,i0_X_______i15,...,i8________X_ + // _ _________________________ _________________________ _ + // *_q_tdata _X_q7,q6,q5,q4,q3,q2,q1,q0_X_______q15,...,q8________X_ + // + wire [127:0] adc_tile_dout_i_tdata [0:3]; // Up to 8 SPC (I) + wire [127:0] adc_tile_dout_q_tdata [0:3]; // Up to 8 SPC (Q) + wire [3:0] adc_tile_dout_i_tready; + wire [3:0] adc_tile_dout_q_tready; + wire [3:0] adc_tile_dout_i_tvalid; + wire [3:0] adc_tile_dout_q_tvalid; + // + // DAC: + // + // I/Q data is interleaved to the RFDC in a single vector. This vector + // contains up to 8 SPC depending upon the interpolation performed by the + // RFDC. When lower data rates are used (higher interpolation), valid samples + // need to be in the LSBs. The data is packed in the vector as follows: + // + // ____________ ____________ _ + // rfdc_clk _| |____________| |____________| + // _ _________________________ _________________________ _ + // *_tdata _X__q7,i7,q6,i6,...,q0,i0__X____q15,i15,...,q8,i8____X_ + // + wire [255:0] dac_tile_din_tdata [0:3]; // Up to 8 SPC (I + Q) + wire [3:0] dac_tile_din_tready; + wire [3:0] dac_tile_din_tvalid; + + // Control/status vectors to rf_core (clk40 domain) + wire [31:0] rf_dsp_info_clk40; + wire [31:0] rf_axi_status_clk40; + // Invert controls to rf_core_100m (rfdc_clk_2x domain) + wire [7:0] invert_adc_iq_rclk2; + wire [7:0] invert_dac_iq_rclk2; + + // AXI4-Lite control bus in the clk40 domain + wire [ 39:0] axi_core_awaddr; + wire axi_core_awvalid; + wire axi_core_awready; + wire [ REG_DWIDTH-1:0] axi_core_wdata; + wire [REG_DWIDTH/8-1:0] axi_core_wstrb; + wire axi_core_wvalid; + wire axi_core_wready; + wire [ 1:0] axi_core_bresp; + wire axi_core_bvalid; + wire axi_core_bready; + wire [ 39:0] axi_core_araddr; + wire axi_core_arvalid; + wire axi_core_arready; + wire [ REG_DWIDTH-1:0] axi_core_rdata; + wire [ 1:0] axi_core_rresp; + wire axi_core_rvalid; + wire axi_core_rready; + + // AXI4-Lite Ethernet internal control bus (clk40 domain) + wire [ 39:0] axi_eth_internal_awaddr; + wire axi_eth_internal_awvalid; + wire axi_eth_internal_awready; + wire [ REG_DWIDTH-1:0] axi_eth_internal_wdata; + wire [REG_DWIDTH/8-1:0] axi_eth_internal_wstrb; + wire axi_eth_internal_wvalid; + wire axi_eth_internal_wready; + wire [ 1:0] axi_eth_internal_bresp; + wire axi_eth_internal_bvalid; + wire axi_eth_internal_bready; + wire [ 39:0] axi_eth_internal_araddr; + wire axi_eth_internal_arvalid; + wire axi_eth_internal_arready; + wire [ REG_DWIDTH-1:0] axi_eth_internal_rdata; + wire [ 1:0] axi_eth_internal_rresp; + wire axi_eth_internal_rvalid; + wire axi_eth_internal_rready; + + // Internal Ethernet xport adapter to PS (clk200 domain) + wire [63:0] e2h_dma_tdata; + wire [ 7:0] e2h_dma_tkeep; + wire e2h_dma_tlast; + wire e2h_dma_tready; + wire e2h_dma_tvalid; + wire [63:0] h2e_dma_tdata; + wire [ 7:0] h2e_dma_tkeep; + wire h2e_dma_tlast; + wire h2e_dma_tready; + wire h2e_dma_tvalid; + + wire [3:0] eth0_rx_irq; + wire [3:0] eth0_tx_irq; + wire [3:0] eth1_rx_irq; + wire [3:0] eth1_tx_irq; + + // RF reset control + wire nco_reset_done; + wire start_nco_reset; + wire adc_reset_pulse; + wire dac_reset_pulse; + + // Rear panel LEDs control + // + // Each LED is comprised of a green (LSB) and a red (MSB) LED which the user + // can control through a 2-bit vector once fabric LED control is configured + // on the X410's Linux shell. + localparam LED_OFF = 2'b00; + localparam LED_GREEN = 2'b01; + localparam LED_RED = 2'b10; + localparam LED_AMBER = 2'b11; + + wire [1:0] user_led_ctrl [0:2]; + assign user_led_ctrl[0] = LED_GREEN; + assign user_led_ctrl[1] = LED_RED; + assign user_led_ctrl[2] = LED_AMBER; + + // Unused AXI signals + assign axi_hp0_arid = 0; + assign axi_hp0_aruser = 0; + assign axi_hp0_awid = 0; + assign axi_hp0_awuser = 0; + assign axi_hp1_arid = 0; + assign axi_hp1_aruser = 0; + assign axi_hp1_awid = 0; + assign axi_hp1_awuser = 0; + + // Interrupt mapping + wire [7:0] pl_ps_irq0; + wire [7:2] pl_ps_irq1; + + assign pl_ps_irq0 = 8'b0; + + assign pl_ps_irq1[2] = 1'b0; + assign pl_ps_irq1[3] = 1'b0; + assign pl_ps_irq1[4] = eth0_rx_irq[0] || eth0_rx_irq[1] || eth0_rx_irq[2] || eth0_rx_irq[3]; + assign pl_ps_irq1[5] = eth0_tx_irq[0] || eth0_tx_irq[1] || eth0_tx_irq[2] || eth0_tx_irq[3]; + assign pl_ps_irq1[6] = eth1_rx_irq[0] || eth1_rx_irq[1] || eth1_rx_irq[2] || eth1_rx_irq[3]; + assign pl_ps_irq1[7] = eth1_tx_irq[0] || eth1_tx_irq[1] || eth1_tx_irq[2] || eth1_tx_irq[3]; + + // GPIO inputs (assigned from 31 decreasing) + // + // Make the current PPS signal available to the PS. + assign gpio_0_tri_i[31] = pps_refclk; + assign gpio_0_tri_i[30] = 0; //unused + //QSFP+ module present signals + assign gpio_0_tri_i[29] = QSFP1_MODPRS_n; + assign gpio_0_tri_i[28] = QSFP0_MODPRS_n; + assign gpio_0_tri_i[27:24] = 4'b0; // unused + assign gpio_0_tri_i[23] = eth1_link_up[3]; + assign gpio_0_tri_i[22] = eth1_link_up[2]; + assign gpio_0_tri_i[21] = eth1_link_up[1]; + assign gpio_0_tri_i[20] = eth1_link_up[0]; + assign gpio_0_tri_i[19] = eth0_link_up[3]; + assign gpio_0_tri_i[18] = eth0_link_up[2]; + assign gpio_0_tri_i[17] = eth0_link_up[1]; + assign gpio_0_tri_i[16] = eth0_link_up[0]; + assign gpio_0_tri_i[15:14] = 2'b0; + assign gpio_0_tri_i[13:12] = user_led_ctrl[2]; + assign gpio_0_tri_i[11:10] = user_led_ctrl[1]; + assign gpio_0_tri_i[9:8] = user_led_ctrl[0]; + assign gpio_0_tri_i[7:0] = 8'b0; // unused + + // GPIO outputs (assigned from 0 increasing) + // + // Drive the JTAG level translator enable line (active low) with GPIO[0] from + // the PS. + assign CPLD_JTAG_OE_n = gpio_0_tri_o[0]; + // Drive the CPLD JTAG enable line (active high) with GPIO[1] from the PS. + assign PL_CPLD_JTAGEN = gpio_0_tri_o[1]; + + x4xx_ps_rfdc_bd x4xx_ps_rfdc_bd_i ( + .adc_data_out_resetn_dclk (adc_data_out_resetn_dclk), + .adc_enable_data_rclk (adc_enable_data_rclk), + .adc_reset_pulse_dclk (adc_reset_pulse), + .adc_rfdc_axi_resetn_rclk (adc_rfdc_axi_resetn_rclk), + .bus_clk (clk200), + .bus_rstn (clk200_rstn), + .clk40 (clk40), + .clk40_rstn (clk40_rstn), + .dac_data_in_resetn_dclk (dac_data_in_resetn_dclk), + .dac_data_in_resetn_dclk2x (dac_data_in_resetn_dclk2x), + .dac_data_in_resetn_rclk (dac_data_in_resetn_rclk), + .dac_data_in_resetn_rclk2x (dac_data_in_resetn_rclk2x), + .dac_reset_pulse_dclk (dac_reset_pulse), + .data_clk (data_clk), + .data_clk_2x (data_clk_2x), + .data_clock_locked (), + .enable_gated_clocks_clk40 (1'b1), + .enable_sysref_rclk (1'b1), + .fir_resetn_rclk2x (fir_resetn_rclk2x), + .gated_base_clks_valid_clk40 (), + .invert_adc_iq_rclk2 (invert_adc_iq_rclk2), + .invert_dac_iq_rclk2 (invert_dac_iq_rclk2), + .irq0_lpd_rpu_n (1'b1), + .irq1_lpd_rpu_n (1'b1), + .jtag0_tck (), + .jtag0_tdi (), + .jtag0_tdo (), + .jtag0_tms (), + .nco_reset_done_dclk (nco_reset_done), + .pl_clk40 (clk40), + .pl_clk100 (clk100), + .pl_clk166 (), + .pl_clk200 (clk200), + .pl_ps_irq0 (pl_ps_irq0), + .pl_ps_irq1 (pl_ps_irq1), + .pl_resetn0 (pl_resetn0), + .pl_resetn1 (), + .pl_resetn2 (), + .pl_resetn3 (), + .pll_ref_clk_in (pll_ref_clk_in), + .pll_ref_clk_out (pll_ref_clk), + .rf_axi_status_clk40 (rf_axi_status_clk40), + .rf_dsp_info_clk40 (rf_dsp_info_clk40), + .rfdc_clk (rfdc_clk), + .rfdc_clk_2x (rfdc_clk_2x), + .rfdc_irq (), + .s_axi_hp0_aclk (clk40), + .s_axi_hp1_aclk (clk40), + .s_axi_hpc0_aclk (), + .start_nco_reset_dclk (start_nco_reset), + .sysref_out_pclk (), + .sysref_out_rclk (), + .sysref_pl_in (sysref_pl), + .s_axi_hp0_aruser (axi_hp0_aruser), + .s_axi_hp0_awuser (axi_hp0_awuser), + .s_axi_hp0_awid (axi_hp0_awid), + .s_axi_hp0_awaddr (axi_hp0_awaddr), + .s_axi_hp0_awlen (axi_hp0_awlen), + .s_axi_hp0_awsize (axi_hp0_awsize), + .s_axi_hp0_awburst (axi_hp0_awburst), + .s_axi_hp0_awlock (axi_hp0_awlock), + .s_axi_hp0_awcache (axi_hp0_awcache), + .s_axi_hp0_awprot (axi_hp0_awprot), + .s_axi_hp0_awvalid (axi_hp0_awvalid), + .s_axi_hp0_awready (axi_hp0_awready), + .s_axi_hp0_wdata (axi_hp0_wdata), + .s_axi_hp0_wstrb (axi_hp0_wstrb), + .s_axi_hp0_wlast (axi_hp0_wlast), + .s_axi_hp0_wvalid (axi_hp0_wvalid), + .s_axi_hp0_wready (axi_hp0_wready), + .s_axi_hp0_bid (), + .s_axi_hp0_bresp (axi_hp0_bresp), + .s_axi_hp0_bvalid (axi_hp0_bvalid), + .s_axi_hp0_bready (axi_hp0_bready), + .s_axi_hp0_arid (axi_hp0_arid), + .s_axi_hp0_araddr (axi_hp0_araddr), + .s_axi_hp0_arlen (axi_hp0_arlen), + .s_axi_hp0_arsize (axi_hp0_arsize), + .s_axi_hp0_arburst (axi_hp0_arburst), + .s_axi_hp0_arlock (axi_hp0_arlock), + .s_axi_hp0_arcache (axi_hp0_arcache), + .s_axi_hp0_arprot (axi_hp0_arprot), + .s_axi_hp0_arvalid (axi_hp0_arvalid), + .s_axi_hp0_arready (axi_hp0_arready), + .s_axi_hp0_rid (), + .s_axi_hp0_rdata (axi_hp0_rdata), + .s_axi_hp0_rresp (axi_hp0_rresp), + .s_axi_hp0_rlast (axi_hp0_rlast), + .s_axi_hp0_rvalid (axi_hp0_rvalid), + .s_axi_hp0_rready (axi_hp0_rready), + .s_axi_hp0_awqos (axi_hp0_awqos), + .s_axi_hp0_arqos (axi_hp0_arqos), + .s_axis_eth_dma_tdata (e2h_dma_tdata), + .s_axis_eth_dma_tkeep (e2h_dma_tkeep), + .s_axis_eth_dma_tlast (e2h_dma_tlast), + .s_axis_eth_dma_tready (e2h_dma_tready), + .s_axis_eth_dma_tvalid (e2h_dma_tvalid), + .s_axi_hp1_aruser (axi_hp1_aruser), + .s_axi_hp1_awuser (axi_hp1_awuser), + .s_axi_hp1_awid (axi_hp1_awid), + .s_axi_hp1_awaddr (axi_hp1_awaddr), + .s_axi_hp1_awlen (axi_hp1_awlen), + .s_axi_hp1_awsize (axi_hp1_awsize), + .s_axi_hp1_awburst (axi_hp1_awburst), + .s_axi_hp1_awlock (axi_hp1_awlock), + .s_axi_hp1_awcache (axi_hp1_awcache), + .s_axi_hp1_awprot (axi_hp1_awprot), + .s_axi_hp1_awvalid (axi_hp1_awvalid), + .s_axi_hp1_awready (axi_hp1_awready), + .s_axi_hp1_wdata (axi_hp1_wdata), + .s_axi_hp1_wstrb (axi_hp1_wstrb), + .s_axi_hp1_wlast (axi_hp1_wlast), + .s_axi_hp1_wvalid (axi_hp1_wvalid), + .s_axi_hp1_wready (axi_hp1_wready), + .s_axi_hp1_bid (), + .s_axi_hp1_bresp (axi_hp1_bresp), + .s_axi_hp1_bvalid (axi_hp1_bvalid), + .s_axi_hp1_bready (axi_hp1_bready), + .s_axi_hp1_arid (axi_hp1_arid), + .s_axi_hp1_araddr (axi_hp1_araddr), + .s_axi_hp1_arlen (axi_hp1_arlen), + .s_axi_hp1_arsize (axi_hp1_arsize), + .s_axi_hp1_arburst (axi_hp1_arburst), + .s_axi_hp1_arlock (axi_hp1_arlock), + .s_axi_hp1_arcache (axi_hp1_arcache), + .s_axi_hp1_arprot (axi_hp1_arprot), + .s_axi_hp1_arvalid (axi_hp1_arvalid), + .s_axi_hp1_arready (axi_hp1_arready), + .s_axi_hp1_rid (), + .s_axi_hp1_rdata (axi_hp1_rdata), + .s_axi_hp1_rresp (axi_hp1_rresp), + .s_axi_hp1_rlast (axi_hp1_rlast), + .s_axi_hp1_rvalid (axi_hp1_rvalid), + .s_axi_hp1_rready (axi_hp1_rready), + .s_axi_hp1_awqos (axi_hp1_awqos), + .s_axi_hp1_arqos (axi_hp1_arqos), + .s_axi_hpc0_aruser (), + .s_axi_hpc0_awuser (), + .s_axi_hpc0_awid (), + .s_axi_hpc0_awaddr (), + .s_axi_hpc0_awlen (), + .s_axi_hpc0_awsize (), + .s_axi_hpc0_awburst (), + .s_axi_hpc0_awlock (), + .s_axi_hpc0_awcache (), + .s_axi_hpc0_awprot (), + .s_axi_hpc0_awvalid (), + .s_axi_hpc0_awready (), + .s_axi_hpc0_wdata (), + .s_axi_hpc0_wstrb (), + .s_axi_hpc0_wlast (), + .s_axi_hpc0_wvalid (), + .s_axi_hpc0_wready (), + .s_axi_hpc0_bid (), + .s_axi_hpc0_bresp (), + .s_axi_hpc0_bvalid (), + .s_axi_hpc0_bready (), + .s_axi_hpc0_arid (), + .s_axi_hpc0_araddr (), + .s_axi_hpc0_arlen (), + .s_axi_hpc0_arsize (), + .s_axi_hpc0_arburst (), + .s_axi_hpc0_arlock (), + .s_axi_hpc0_arcache (), + .s_axi_hpc0_arprot (), + .s_axi_hpc0_arvalid (), + .s_axi_hpc0_arready (), + .s_axi_hpc0_rid (), + .s_axi_hpc0_rdata (), + .s_axi_hpc0_rresp (), + .s_axi_hpc0_rlast (), + .s_axi_hpc0_rvalid (), + .s_axi_hpc0_rready (), + .s_axi_hpc0_awqos (), + .s_axi_hpc0_arqos (), + .adc0_clk_clk_n (ADC_CLK_N[0]), + .adc0_clk_clk_p (ADC_CLK_P[0]), + .adc2_clk_clk_n (ADC_CLK_N[2]), + .adc2_clk_clk_p (ADC_CLK_P[2]), + .m_axi_app_awaddr (m_axi_app_awaddr), + .m_axi_app_awprot (m_axi_app_awprot), + .m_axi_app_awvalid (m_axi_app_awvalid), + .m_axi_app_awready (m_axi_app_awready), + .m_axi_app_wdata (m_axi_app_wdata), + .m_axi_app_wstrb (m_axi_app_wstrb), + .m_axi_app_wvalid (m_axi_app_wvalid), + .m_axi_app_wready (m_axi_app_wready), + .m_axi_app_bresp (m_axi_app_bresp), + .m_axi_app_bvalid (m_axi_app_bvalid), + .m_axi_app_bready (m_axi_app_bready), + .m_axi_app_araddr (m_axi_app_araddr), + .m_axi_app_arprot (m_axi_app_arprot), + .m_axi_app_arvalid (m_axi_app_arvalid), + .m_axi_app_arready (m_axi_app_arready), + .m_axi_app_rdata (m_axi_app_rdata), + .m_axi_app_rresp (m_axi_app_rresp), + .m_axi_app_rvalid (m_axi_app_rvalid), + .m_axi_app_rready (m_axi_app_rready), + .dac0_clk_clk_n (DAC_CLK_N[0]), + .dac0_clk_clk_p (DAC_CLK_P[0]), + .dac1_clk_clk_n (DAC_CLK_N[1]), + .dac1_clk_clk_p (DAC_CLK_P[1]), + .gpio_0_tri_i (gpio_0_tri_i), + .gpio_0_tri_o (gpio_0_tri_o), + .gpio_0_tri_t (), + .m_axi_eth_internal_awaddr (axi_eth_internal_awaddr), + .m_axi_eth_internal_awprot (), + .m_axi_eth_internal_awvalid (axi_eth_internal_awvalid), + .m_axi_eth_internal_awready (axi_eth_internal_awready), + .m_axi_eth_internal_wdata (axi_eth_internal_wdata), + .m_axi_eth_internal_wstrb (axi_eth_internal_wstrb), + .m_axi_eth_internal_wvalid (axi_eth_internal_wvalid), + .m_axi_eth_internal_wready (axi_eth_internal_wready), + .m_axi_eth_internal_bresp (axi_eth_internal_bresp), + .m_axi_eth_internal_bvalid (axi_eth_internal_bvalid), + .m_axi_eth_internal_bready (axi_eth_internal_bready), + .m_axi_eth_internal_araddr (axi_eth_internal_araddr), + .m_axi_eth_internal_arprot (), + .m_axi_eth_internal_arvalid (axi_eth_internal_arvalid), + .m_axi_eth_internal_arready (axi_eth_internal_arready), + .m_axi_eth_internal_rdata (axi_eth_internal_rdata), + .m_axi_eth_internal_rresp (axi_eth_internal_rresp), + .m_axi_eth_internal_rvalid (axi_eth_internal_rvalid), + .m_axi_eth_internal_rready (axi_eth_internal_rready), + .m_axis_eth_dma_tdata (h2e_dma_tdata), + .m_axis_eth_dma_tkeep (h2e_dma_tkeep), + .m_axis_eth_dma_tlast (h2e_dma_tlast), + .m_axis_eth_dma_tready (h2e_dma_tready), + .m_axis_eth_dma_tvalid (h2e_dma_tvalid), + .m_axi_rpu_awaddr (), + .m_axi_rpu_awprot (), + .m_axi_rpu_awvalid (), + .m_axi_rpu_awready (), + .m_axi_rpu_wdata (), + .m_axi_rpu_wstrb (), + .m_axi_rpu_wvalid (), + .m_axi_rpu_wready (), + .m_axi_rpu_bresp (), + .m_axi_rpu_bvalid (), + .m_axi_rpu_bready (), + .m_axi_rpu_araddr (), + .m_axi_rpu_arprot (), + .m_axi_rpu_arvalid (), + .m_axi_rpu_arready (), + .m_axi_rpu_rdata (), + .m_axi_rpu_rresp (), + .m_axi_rpu_rvalid (), + .m_axi_rpu_rready (), + .m_axi_core_awaddr (axi_core_awaddr), + .m_axi_core_awprot (), + .m_axi_core_awvalid (axi_core_awvalid), + .m_axi_core_awready (axi_core_awready), + .m_axi_core_wdata (axi_core_wdata), + .m_axi_core_wstrb (axi_core_wstrb), + .m_axi_core_wvalid (axi_core_wvalid), + .m_axi_core_wready (axi_core_wready), + .m_axi_core_bresp (axi_core_bresp), + .m_axi_core_bvalid (axi_core_bvalid), + .m_axi_core_bready (axi_core_bready), + .m_axi_core_araddr (axi_core_araddr), + .m_axi_core_arprot (), + .m_axi_core_arvalid (axi_core_arvalid), + .m_axi_core_arready (axi_core_arready), + .m_axi_core_rdata (axi_core_rdata), + .m_axi_core_rresp (axi_core_rresp), + .m_axi_core_rvalid (axi_core_rvalid), + .m_axi_core_rready (axi_core_rready), + .m_axi_mpm_ep_awaddr (m_axi_mpm_ep_awaddr), + .m_axi_mpm_ep_awprot (), + .m_axi_mpm_ep_awvalid (m_axi_mpm_ep_awvalid), + .m_axi_mpm_ep_awready (m_axi_mpm_ep_awready), + .m_axi_mpm_ep_wdata (m_axi_mpm_ep_wdata), + .m_axi_mpm_ep_wstrb (m_axi_mpm_ep_wstrb), + .m_axi_mpm_ep_wvalid (m_axi_mpm_ep_wvalid), + .m_axi_mpm_ep_wready (m_axi_mpm_ep_wready), + .m_axi_mpm_ep_bresp (m_axi_mpm_ep_bresp), + .m_axi_mpm_ep_bvalid (m_axi_mpm_ep_bvalid), + .m_axi_mpm_ep_bready (m_axi_mpm_ep_bready), + .m_axi_mpm_ep_araddr (m_axi_mpm_ep_araddr), + .m_axi_mpm_ep_arprot (), + .m_axi_mpm_ep_arvalid (m_axi_mpm_ep_arvalid), + .m_axi_mpm_ep_arready (m_axi_mpm_ep_arready), + .m_axi_mpm_ep_rdata (m_axi_mpm_ep_rdata), + .m_axi_mpm_ep_rresp (m_axi_mpm_ep_rresp), + .m_axi_mpm_ep_rvalid (m_axi_mpm_ep_rvalid), + .m_axi_mpm_ep_rready (m_axi_mpm_ep_rready), + .adc_tile224_ch0_dout_i_tdata (adc_tile_dout_i_tdata[0]), + .adc_tile224_ch0_dout_i_tready (adc_tile_dout_i_tready[0]), + .adc_tile224_ch0_dout_i_tvalid (adc_tile_dout_i_tvalid[0]), + .adc_tile224_ch0_dout_q_tdata (adc_tile_dout_q_tdata[0]), + .adc_tile224_ch0_dout_q_tready (adc_tile_dout_q_tready[0]), + .adc_tile224_ch0_dout_q_tvalid (adc_tile_dout_q_tvalid[0]), + .adc_tile224_ch1_dout_i_tdata (adc_tile_dout_i_tdata[1]), + .adc_tile224_ch1_dout_i_tready (adc_tile_dout_i_tready[1]), + .adc_tile224_ch1_dout_i_tvalid (adc_tile_dout_i_tvalid[1]), + .adc_tile224_ch1_dout_q_tdata (adc_tile_dout_q_tdata[1]), + .adc_tile224_ch1_dout_q_tready (adc_tile_dout_q_tready[1]), + .adc_tile224_ch1_dout_q_tvalid (adc_tile_dout_q_tvalid[1]), + .adc_tile226_ch0_dout_i_tdata (adc_tile_dout_i_tdata[2]), + .adc_tile226_ch0_dout_i_tready (adc_tile_dout_i_tready[2]), + .adc_tile226_ch0_dout_i_tvalid (adc_tile_dout_i_tvalid[2]), + .adc_tile226_ch0_dout_q_tdata (adc_tile_dout_q_tdata[2]), + .adc_tile226_ch0_dout_q_tready (adc_tile_dout_q_tready[2]), + .adc_tile226_ch0_dout_q_tvalid (adc_tile_dout_q_tvalid[2]), + .adc_tile226_ch1_dout_i_tdata (adc_tile_dout_i_tdata[3]), + .adc_tile226_ch1_dout_i_tready (adc_tile_dout_i_tready[3]), + .adc_tile226_ch1_dout_i_tvalid (adc_tile_dout_i_tvalid[3]), + .adc_tile226_ch1_dout_q_tdata (adc_tile_dout_q_tdata[3]), + .adc_tile226_ch1_dout_q_tready (adc_tile_dout_q_tready[3]), + .adc_tile226_ch1_dout_q_tvalid (adc_tile_dout_q_tvalid[3]), + .dac_tile228_ch0_vout_v_n (DB0_TX_N[0]), + .dac_tile228_ch0_vout_v_p (DB0_TX_P[0]), + .dac_tile228_ch1_vout_v_n (DB0_TX_N[1]), + .dac_tile228_ch1_vout_v_p (DB0_TX_P[1]), + .dac_tile229_ch0_vout_v_n (DB1_TX_N[0]), + .dac_tile229_ch0_vout_v_p (DB1_TX_P[0]), + .dac_tile229_ch1_vout_v_n (DB1_TX_N[1]), + .dac_tile229_ch1_vout_v_p (DB1_TX_P[1]), + .dac_tile228_ch0_din_tdata (dac_tile_din_tdata[0]), + .dac_tile228_ch0_din_tvalid (dac_tile_din_tvalid[0]), + .dac_tile228_ch0_din_tready (dac_tile_din_tready[0]), + .dac_tile228_ch1_din_tdata (dac_tile_din_tdata[1]), + .dac_tile228_ch1_din_tvalid (dac_tile_din_tvalid[1]), + .dac_tile228_ch1_din_tready (dac_tile_din_tready[1]), + .dac_tile229_ch0_din_tdata (dac_tile_din_tdata[2]), + .dac_tile229_ch0_din_tvalid (dac_tile_din_tvalid[2]), + .dac_tile229_ch0_din_tready (dac_tile_din_tready[2]), + .dac_tile229_ch1_din_tdata (dac_tile_din_tdata[3]), + .dac_tile229_ch1_din_tvalid (dac_tile_din_tvalid[3]), + .dac_tile229_ch1_din_tready (dac_tile_din_tready[3]), + .s_axi_hpc1_awid (), + .s_axi_hpc1_awaddr (), + .s_axi_hpc1_awlen (), + .s_axi_hpc1_awsize (), + .s_axi_hpc1_awburst (), + .s_axi_hpc1_awlock (), + .s_axi_hpc1_awcache (), + .s_axi_hpc1_awprot (), + .s_axi_hpc1_awqos (), + .s_axi_hpc1_awvalid (), + .s_axi_hpc1_awready (), + .s_axi_hpc1_wdata (), + .s_axi_hpc1_wstrb (), + .s_axi_hpc1_wlast (), + .s_axi_hpc1_wvalid (), + .s_axi_hpc1_wready (), + .s_axi_hpc1_bid (), + .s_axi_hpc1_bresp (), + .s_axi_hpc1_bvalid (), + .s_axi_hpc1_bready (), + .s_axi_hpc1_arid (), + .s_axi_hpc1_araddr (), + .s_axi_hpc1_arlen (), + .s_axi_hpc1_arsize (), + .s_axi_hpc1_arburst (), + .s_axi_hpc1_arlock (), + .s_axi_hpc1_arcache (), + .s_axi_hpc1_arprot (), + .s_axi_hpc1_arqos (), + .s_axi_hpc1_arvalid (), + .s_axi_hpc1_arready (), + .s_axi_hpc1_rid (), + .s_axi_hpc1_rdata (), + .s_axi_hpc1_rresp (), + .s_axi_hpc1_rlast (), + .s_axi_hpc1_rvalid (), + .s_axi_hpc1_rready (), + .sysref_rf_in_diff_n (SYSREF_RF_N), + .sysref_rf_in_diff_p (SYSREF_RF_P), + .adc_tile224_ch0_vin_v_n (DB0_RX_N[0]), + .adc_tile224_ch0_vin_v_p (DB0_RX_P[0]), + .adc_tile224_ch1_vin_v_n (DB0_RX_N[1]), + .adc_tile224_ch1_vin_v_p (DB0_RX_P[1]), + .adc_tile226_ch0_vin_v_n (DB1_RX_N[0]), + .adc_tile226_ch0_vin_v_p (DB1_RX_P[0]), + .adc_tile226_ch1_vin_v_n (DB1_RX_N[1]), + .adc_tile226_ch1_vin_v_p (DB1_RX_P[1]), + .s_axi_hpc1_aruser (), + .s_axi_hpc1_awuser () + ); + + + //--------------------------------------------------------------------------- + // AXI Interconnect + //--------------------------------------------------------------------------- + + wire [ 39:0] axi_qsfp0_araddr; + wire [ 0:0] axi_qsfp0_arready; + wire [ 0:0] axi_qsfp0_arvalid; + wire [ 39:0] axi_qsfp0_awaddr; + wire [ 0:0] axi_qsfp0_awready; + wire [ 0:0] axi_qsfp0_awvalid; + wire [ 0:0] axi_qsfp0_bready; + wire [ 1:0] axi_qsfp0_bresp; + wire [ 0:0] axi_qsfp0_bvalid; + wire [ 31:0] axi_qsfp0_rdata; + wire [ 0:0] axi_qsfp0_rready; + wire [ 1:0] axi_qsfp0_rresp; + wire [ 0:0] axi_qsfp0_rvalid; + wire [ 31:0] axi_qsfp0_wdata; + wire [ 0:0] axi_qsfp0_wready; + wire [ 3:0] axi_qsfp0_wstrb; + wire [ 0:0] axi_qsfp0_wvalid; + + wire [ 39:0] axi_qsfp1_araddr; + wire [ 0:0] axi_qsfp1_arready; + wire [ 0:0] axi_qsfp1_arvalid; + wire [ 39:0] axi_qsfp1_awaddr; + wire [ 0:0] axi_qsfp1_awready; + wire [ 0:0] axi_qsfp1_awvalid; + wire [ 0:0] axi_qsfp1_bready; + wire [ 1:0] axi_qsfp1_bresp; + wire [ 0:0] axi_qsfp1_bvalid; + wire [ 31:0] axi_qsfp1_rdata; + wire [ 0:0] axi_qsfp1_rready; + wire [ 1:0] axi_qsfp1_rresp; + wire [ 0:0] axi_qsfp1_rvalid; + wire [ 31:0] axi_qsfp1_wdata; + wire [ 0:0] axi_qsfp1_wready; + wire [ 3:0] axi_qsfp1_wstrb; + wire [ 0:0] axi_qsfp1_wvalid; + + axi_interconnect_app_bd axi_interconnect_app_bd_i ( + .clk40 (clk40), + .clk40_rstn (clk40_rstn), + .m_axi_qsfp0_araddr (axi_qsfp0_araddr), + .m_axi_qsfp0_arprot (), + .m_axi_qsfp0_arready (axi_qsfp0_arready), + .m_axi_qsfp0_arvalid (axi_qsfp0_arvalid), + .m_axi_qsfp0_awaddr (axi_qsfp0_awaddr), + .m_axi_qsfp0_awprot (), + .m_axi_qsfp0_awready (axi_qsfp0_awready), + .m_axi_qsfp0_awvalid (axi_qsfp0_awvalid), + .m_axi_qsfp0_bready (axi_qsfp0_bready), + .m_axi_qsfp0_bresp (axi_qsfp0_bresp), + .m_axi_qsfp0_bvalid (axi_qsfp0_bvalid), + .m_axi_qsfp0_rdata (axi_qsfp0_rdata), + .m_axi_qsfp0_rready (axi_qsfp0_rready), + .m_axi_qsfp0_rresp (axi_qsfp0_rresp), + .m_axi_qsfp0_rvalid (axi_qsfp0_rvalid), + .m_axi_qsfp0_wdata (axi_qsfp0_wdata), + .m_axi_qsfp0_wready (axi_qsfp0_wready), + .m_axi_qsfp0_wstrb (axi_qsfp0_wstrb), + .m_axi_qsfp0_wvalid (axi_qsfp0_wvalid), + .m_axi_qsfp1_araddr (axi_qsfp1_araddr), + .m_axi_qsfp1_arprot (), + .m_axi_qsfp1_arready (axi_qsfp1_arready), + .m_axi_qsfp1_arvalid (axi_qsfp1_arvalid), + .m_axi_qsfp1_awaddr (axi_qsfp1_awaddr), + .m_axi_qsfp1_awprot (), + .m_axi_qsfp1_awready (axi_qsfp1_awready), + .m_axi_qsfp1_awvalid (axi_qsfp1_awvalid), + .m_axi_qsfp1_bready (axi_qsfp1_bready), + .m_axi_qsfp1_bresp (axi_qsfp1_bresp), + .m_axi_qsfp1_bvalid (axi_qsfp1_bvalid), + .m_axi_qsfp1_rdata (axi_qsfp1_rdata), + .m_axi_qsfp1_rready (axi_qsfp1_rready), + .m_axi_qsfp1_rresp (axi_qsfp1_rresp), + .m_axi_qsfp1_rvalid (axi_qsfp1_rvalid), + .m_axi_qsfp1_wdata (axi_qsfp1_wdata), + .m_axi_qsfp1_wready (axi_qsfp1_wready), + .m_axi_qsfp1_wstrb (axi_qsfp1_wstrb), + .m_axi_qsfp1_wvalid (axi_qsfp1_wvalid), + .s_axi_app_araddr (m_axi_app_araddr), + .s_axi_app_arprot (m_axi_app_arprot), + .s_axi_app_arready (m_axi_app_arready), + .s_axi_app_arvalid (m_axi_app_arvalid), + .s_axi_app_awaddr (m_axi_app_awaddr), + .s_axi_app_awprot (m_axi_app_awprot), + .s_axi_app_awready (m_axi_app_awready), + .s_axi_app_awvalid (m_axi_app_awvalid), + .s_axi_app_bready (m_axi_app_bready), + .s_axi_app_bresp (m_axi_app_bresp), + .s_axi_app_bvalid (m_axi_app_bvalid), + .s_axi_app_rdata (m_axi_app_rdata), + .s_axi_app_rready (m_axi_app_rready), + .s_axi_app_rresp (m_axi_app_rresp), + .s_axi_app_rvalid (m_axi_app_rvalid), + .s_axi_app_wdata (m_axi_app_wdata), + .s_axi_app_wready (m_axi_app_wready), + .s_axi_app_wstrb (m_axi_app_wstrb), + .s_axi_app_wvalid (m_axi_app_wvalid) + ); + + + //--------------------------------------------------------------------------- + // RF + Control Daughterboard Cores + //--------------------------------------------------------------------------- + + localparam NUM_DBOARDS = 2; + localparam NUM_CHANNELS_PER_DBOARD = 2; + localparam NUM_CHANNELS = NUM_DBOARDS*NUM_CHANNELS_PER_DBOARD; + + // Radio timestamp + wire [ 63:0] radio_time; + wire radio_time_stb; + wire [ 3:0] time_ignore_bits; + + // User data interfaces (data_clk domain) + // + // ADC (note no tready signal, ADC data can't be throttled) + wire [RADIO_SPC*32-1:0] adc_data_out_tdata [0:3]; // 32-bit samples (I + Q) + wire [3:0] adc_data_out_tvalid; + // DAC + wire [RADIO_SPC*32-1:0] dac_data_in_tdata [0:3]; // 32-bit samples (I + Q) + wire [3:0] dac_data_in_tready; + wire [3:0] dac_data_in_tvalid; + + // GPIO ctrlport interface + wire db_ctrlport_req_rd [0:1]; + wire db_ctrlport_req_wr [0:1]; + wire [19:0] db_ctrlport_req_addr [0:1]; + wire [31:0] db_ctrlport_req_data [0:1]; + wire [ 3:0] db_ctrlport_req_byte_en [0:1]; + wire db_ctrlport_req_has_time [0:1]; + wire [63:0] db_ctrlport_req_time [0:1]; + wire db_ctrlport_resp_ack [0:1]; + wire [31:0] db_ctrlport_resp_data [0:1]; + wire [ 1:0] db_ctrlport_resp_status [0:1]; + + // GPIO interface + wire [19:0] db_gpio_in_int [0:1]; + wire [19:0] db_gpio_out_int [0:1]; + wire [19:0] db_gpio_out_en_int[0:1]; + wire [19:0] db_gpio_out_ext [0:1]; + wire [19:0] db_gpio_out_en_ext[0:1]; + + // GPIO states + wire [ 3:0] rx_running; + wire [ 3:0] tx_running; + wire [ 3:0] db_state [0:1]; + + assign db_state[0] = { tx_running[1], rx_running[1], + tx_running[0], rx_running[0] }; + assign db_state[1] = { tx_running[3], rx_running[3], + tx_running[2], rx_running[2] }; + + // Version info + // These wires only convey constant data. + wire [COMPONENT_VERSIONS_SIZE-1:0] rf_core_version [0:1]; + wire [COMPONENT_VERSIONS_SIZE-1:0] db_gpio_ifc_version [0:1]; + + genvar dboard_num; + generate + for (dboard_num=0; dboard_num < (NUM_DBOARDS); dboard_num = dboard_num + 1) begin : gen_rf_cores + if (RF_BANDWIDTH == 100) begin : gen_rf_core_100m + localparam ADC_AXIS_W = 32; + localparam DAC_AXIS_W = 64; + rf_core_100m rf_core_100m_i ( + .rfdc_clk (rfdc_clk), + .rfdc_clk_2x (rfdc_clk_2x), + .data_clk (data_clk), + .data_clk_2x (data_clk_2x), + .s_axi_config_clk (clk40), + .adc_data_in_i_tdata_0 (adc_tile_dout_i_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][ADC_AXIS_W-1:0]), + .adc_data_in_i_tready_0 (adc_tile_dout_i_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_i_tvalid_0 (adc_tile_dout_i_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_q_tdata_0 (adc_tile_dout_q_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][ADC_AXIS_W-1:0]), + .adc_data_in_q_tready_0 (adc_tile_dout_q_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_q_tvalid_0 (adc_tile_dout_q_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_i_tdata_1 (adc_tile_dout_i_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][ADC_AXIS_W-1:0]), + .adc_data_in_i_tready_1 (adc_tile_dout_i_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_i_tvalid_1 (adc_tile_dout_i_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_q_tdata_1 (adc_tile_dout_q_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][ADC_AXIS_W-1:0]), + .adc_data_in_q_tready_1 (adc_tile_dout_q_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_q_tvalid_1 (adc_tile_dout_q_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_out_tdata_0 (dac_tile_din_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][DAC_AXIS_W-1:0]), + .dac_data_out_tready_0 (dac_tile_din_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_out_tvalid_0 (dac_tile_din_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_out_tdata_1 (dac_tile_din_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][DAC_AXIS_W-1:0]), + .dac_data_out_tready_1 (dac_tile_din_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_out_tvalid_1 (dac_tile_din_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_out_tdata_0 (adc_data_out_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_out_tvalid_0 (adc_data_out_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_out_tdata_1 (adc_data_out_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_out_tvalid_1 (adc_data_out_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tdata_0 (dac_data_in_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tready_0 (dac_data_in_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tvalid_0 (dac_data_in_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tdata_1 (dac_data_in_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tready_1 (dac_data_in_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tvalid_1 (dac_data_in_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .invert_adc_iq_rclk2 (invert_adc_iq_rclk2[4*dboard_num+3:4*dboard_num]), + .invert_dac_iq_rclk2 (invert_dac_iq_rclk2[4*dboard_num+3:4*dboard_num]), + .dsp_info_sclk (rf_dsp_info_clk40[16*dboard_num+15:16*dboard_num]), + .axi_status_sclk (rf_axi_status_clk40[16*dboard_num+15:16*dboard_num]), + .adc_data_out_resetn_dclk (adc_data_out_resetn_dclk), + .adc_enable_data_rclk (adc_enable_data_rclk), + .adc_rfdc_axi_resetn_rclk (adc_rfdc_axi_resetn_rclk), + .dac_data_in_resetn_dclk (dac_data_in_resetn_dclk), + .dac_data_in_resetn_rclk (dac_data_in_resetn_rclk), + .dac_data_in_resetn_rclk2x (dac_data_in_resetn_rclk2x), + .fir_resetn_rclk2x (fir_resetn_rclk2x), + .version_info (rf_core_version[dboard_num]) + ); + end else if (RF_BANDWIDTH == 200) begin : gen_rf_core_200m + localparam ADC_AXIS_W = 128; + localparam DAC_AXIS_W = 256; + rf_core_200m rf_core_200m_i ( + .rfdc_clk (rfdc_clk), + .rfdc_clk_2x (rfdc_clk_2x), + .data_clk (data_clk), + .data_clk_2x (data_clk_2x), + .s_axi_config_clk (clk40), + .adc_data_in_i_tdata_0 (adc_tile_dout_i_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][ADC_AXIS_W-1:0]), + .adc_data_in_i_tready_0 (adc_tile_dout_i_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_i_tvalid_0 (adc_tile_dout_i_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_q_tdata_0 (adc_tile_dout_q_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][ADC_AXIS_W-1:0]), + .adc_data_in_q_tready_0 (adc_tile_dout_q_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_q_tvalid_0 (adc_tile_dout_q_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_i_tdata_1 (adc_tile_dout_i_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][ADC_AXIS_W-1:0]), + .adc_data_in_i_tready_1 (adc_tile_dout_i_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_i_tvalid_1 (adc_tile_dout_i_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_q_tdata_1 (adc_tile_dout_q_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][ADC_AXIS_W-1:0]), + .adc_data_in_q_tready_1 (adc_tile_dout_q_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_q_tvalid_1 (adc_tile_dout_q_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_out_tdata_0 (dac_tile_din_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][DAC_AXIS_W-1:0]), + .dac_data_out_tready_0 (dac_tile_din_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_out_tvalid_0 (dac_tile_din_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_out_tdata_1 (dac_tile_din_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][DAC_AXIS_W-1:0]), + .dac_data_out_tready_1 (dac_tile_din_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_out_tvalid_1 (dac_tile_din_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_out_tdata_0 (adc_data_out_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_out_tvalid_0 (adc_data_out_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_out_tdata_1 (adc_data_out_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_out_tvalid_1 (adc_data_out_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tdata_0 (dac_data_in_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tready_0 (dac_data_in_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tvalid_0 (dac_data_in_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tdata_1 (dac_data_in_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tready_1 (dac_data_in_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tvalid_1 (dac_data_in_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .invert_adc_iq_rclk2 (invert_adc_iq_rclk2[4*dboard_num+3:4*dboard_num]), + .invert_dac_iq_rclk2 (invert_dac_iq_rclk2[4*dboard_num+3:4*dboard_num]), + .dsp_info_sclk (rf_dsp_info_clk40[16*dboard_num+15:16*dboard_num]), + .axi_status_sclk (rf_axi_status_clk40[16*dboard_num+15:16*dboard_num]), + .adc_data_out_resetn_dclk (adc_data_out_resetn_dclk), + .adc_enable_data_rclk (adc_enable_data_rclk), + .adc_rfdc_axi_resetn_rclk (adc_rfdc_axi_resetn_rclk), + .dac_data_in_resetn_dclk (dac_data_in_resetn_dclk), + .dac_data_in_resetn_dclk2x (dac_data_in_resetn_dclk2x), + .dac_data_in_resetn_rclk (dac_data_in_resetn_rclk), + .fir_resetn_rclk2x (fir_resetn_rclk2x), + .version_info (rf_core_version[dboard_num]) + ); + end else if (RF_BANDWIDTH == 400) begin : gen_rf_core_400m + localparam ADC_AXIS_W = 128; + localparam DAC_AXIS_W = 256; + rf_core_400m rf_core_400m_i ( + .rfdc_clk (rfdc_clk), + .rfdc_clk_2x (rfdc_clk_2x), + .data_clk (data_clk), + .data_clk_2x (data_clk_2x), + .s_axi_config_clk (clk40), + .adc_data_in_i_tdata_0 (adc_tile_dout_i_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][ADC_AXIS_W-1:0]), + .adc_data_in_i_tready_0 (adc_tile_dout_i_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_i_tvalid_0 (adc_tile_dout_i_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_q_tdata_0 (adc_tile_dout_q_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][ADC_AXIS_W-1:0]), + .adc_data_in_q_tready_0 (adc_tile_dout_q_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_q_tvalid_0 (adc_tile_dout_q_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_in_i_tdata_1 (adc_tile_dout_i_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][ADC_AXIS_W-1:0]), + .adc_data_in_i_tready_1 (adc_tile_dout_i_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_i_tvalid_1 (adc_tile_dout_i_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_q_tdata_1 (adc_tile_dout_q_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][ADC_AXIS_W-1:0]), + .adc_data_in_q_tready_1 (adc_tile_dout_q_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_in_q_tvalid_1 (adc_tile_dout_q_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_out_tdata_0 (dac_tile_din_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0][DAC_AXIS_W-1:0]), + .dac_data_out_tready_0 (dac_tile_din_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_out_tvalid_0 (dac_tile_din_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_out_tdata_1 (dac_tile_din_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1][DAC_AXIS_W-1:0]), + .dac_data_out_tready_1 (dac_tile_din_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_out_tvalid_1 (dac_tile_din_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_out_tdata_0 (adc_data_out_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_out_tvalid_0 (adc_data_out_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .adc_data_out_tdata_1 (adc_data_out_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .adc_data_out_tvalid_1 (adc_data_out_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tdata_0 (dac_data_in_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tready_0 (dac_data_in_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tvalid_0 (dac_data_in_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+0]), + .dac_data_in_tdata_1 (dac_data_in_tdata[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tready_1 (dac_data_in_tready[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .dac_data_in_tvalid_1 (dac_data_in_tvalid[NUM_CHANNELS_PER_DBOARD*dboard_num+1]), + .invert_adc_iq_rclk2 (invert_adc_iq_rclk2[4*dboard_num+3:4*dboard_num]), + .invert_dac_iq_rclk2 (invert_dac_iq_rclk2[4*dboard_num+3:4*dboard_num]), + .dsp_info_sclk (rf_dsp_info_clk40[16*dboard_num+15:16*dboard_num]), + .axi_status_sclk (rf_axi_status_clk40[16*dboard_num+15:16*dboard_num]), + .adc_data_out_resetn_dclk (adc_data_out_resetn_dclk), + .adc_enable_data_rclk (adc_enable_data_rclk), + .adc_rfdc_axi_resetn_rclk (adc_rfdc_axi_resetn_rclk), + .dac_data_in_resetn_dclk (dac_data_in_resetn_dclk), + .dac_data_in_resetn_dclk2x (dac_data_in_resetn_dclk2x), + .dac_data_in_resetn_rclk (dac_data_in_resetn_rclk), + .fir_resetn_rclk2x (fir_resetn_rclk2x), + .version_info (rf_core_version[dboard_num]) + ); + end // gen_rf_core_400m + end // gen_rf_cores + + for (dboard_num=0; dboard_num < (NUM_DBOARDS); dboard_num = dboard_num + 1) begin : db_gpio_gen + db_gpio_interface db_gpio_interface_i ( + .radio_clk (radio_clk), + .pll_ref_clk (pll_ref_clk), + .db_state (db_state[dboard_num]), + .radio_time (radio_time), + .radio_time_stb (radio_time_stb), + .time_ignore_bits (time_ignore_bits), + .ctrlport_rst (radio_rst), + .s_ctrlport_req_wr (db_ctrlport_req_wr[dboard_num]), + .s_ctrlport_req_rd (db_ctrlport_req_rd[dboard_num]), + .s_ctrlport_req_addr (db_ctrlport_req_addr[dboard_num]), + .s_ctrlport_req_data (db_ctrlport_req_data[dboard_num]), + .s_ctrlport_req_byte_en (db_ctrlport_req_byte_en[dboard_num]), + .s_ctrlport_req_has_time (db_ctrlport_req_has_time[dboard_num]), + .s_ctrlport_req_time (db_ctrlport_req_time[dboard_num]), + .s_ctrlport_resp_ack (db_ctrlport_resp_ack[dboard_num]), + .s_ctrlport_resp_status (db_ctrlport_resp_status[dboard_num]), + .s_ctrlport_resp_data (db_ctrlport_resp_data[dboard_num]), + .gpio_in (db_gpio_in_int[dboard_num]), + .gpio_out (db_gpio_out_int[dboard_num]), + .gpio_out_en (db_gpio_out_en_int[dboard_num]), + .version_info (db_gpio_ifc_version[dboard_num]) + ); + end + endgenerate + + db_gpio_reordering db_gpio_reordering_i ( + .db0_gpio_in_int (db_gpio_in_int[0]), + .db0_gpio_out_int (db_gpio_out_int[0]), + .db0_gpio_out_en_int (db_gpio_out_en_int[0]), + .db1_gpio_in_int (db_gpio_in_int[1]), + .db1_gpio_out_int (db_gpio_out_int[1]), + .db1_gpio_out_en_int (db_gpio_out_en_int[1]), + .db0_gpio_in_ext (DB0_GPIO), + .db0_gpio_out_ext (db_gpio_out_ext[0]), + .db0_gpio_out_en_ext (db_gpio_out_en_ext[0]), + .db1_gpio_in_ext (DB1_GPIO), + .db1_gpio_out_ext (db_gpio_out_ext[1]), + .db1_gpio_out_en_ext (db_gpio_out_en_ext[1]) + ); + + // DB GPIO tristate buffers + genvar j; + generate for (j=0; j<20; j=j+1) begin: db_gpio_tristate_gen + assign DB0_GPIO[j] = (db_gpio_out_en_ext[0][j]) ? db_gpio_out_ext[0][j] : 1'bz; + assign DB1_GPIO[j] = (db_gpio_out_en_ext[1][j]) ? db_gpio_out_ext[1][j] : 1'bz; + end endgenerate + + + //--------------------------------------------------------------------------- + // QSFP Interfaces + //--------------------------------------------------------------------------- + + // Misc QSFP signals are currently unused + assign QSFP0_RESET_n = 1'b1; // Module reset + assign QSFP0_LPMODE_n = 1'b0; // Low-power Mode + assign QSFP1_RESET_n = 1'b1; // Module reset + assign QSFP1_LPMODE_n = 1'b0; // Low-power Mode + + wire [31:0] qsfp_port_0_0_info; + wire [31:0] qsfp_port_0_1_info; + wire [31:0] qsfp_port_0_2_info; + wire [31:0] qsfp_port_0_3_info; + wire [31:0] qsfp_port_1_0_info; + wire [31:0] qsfp_port_1_1_info; + wire [31:0] qsfp_port_1_2_info; + wire [31:0] qsfp_port_1_3_info; + + wire [3:0] qsfp0_tx_p; + wire [3:0] qsfp0_tx_n; + wire [3:0] qsfp0_rx_p; + wire [3:0] qsfp0_rx_n; + + wire [3:0] qsfp1_tx_p; + wire [3:0] qsfp1_tx_n; + wire [3:0] qsfp1_rx_p; + wire [3:0] qsfp1_rx_n; + + + wire [15:0] device_id; + wire rx_rec_clk_out1; // output GTY on QSFP1 + + // e2v and v2e are flattened arrays, where e2v_tdata[CHDR_W*N +: CHDR_W] is + // the data for RFNoC port N. RFNoC ports 0-3 map to QSFP0 and ports 4-7 map + // to QSFP1. + wire [CHDR_W*8-1:0] e2v_tdata; + wire [ 8-1:0] e2v_tlast; + wire [ 8-1:0] e2v_tready; + wire [ 8-1:0] e2v_tvalid; + + wire [CHDR_W*8-1:0] v2e_tdata; + wire [ 8-1:0] v2e_tlast; + wire [ 8-1:0] v2e_tready; + wire [ 8-1:0] v2e_tvalid; + + `ifdef QSFP0_0 + assign QSFP0_0_TX_P = qsfp0_tx_p[0]; + assign QSFP0_0_TX_N = qsfp0_tx_n[0]; + assign qsfp0_rx_p[0] = QSFP0_0_RX_P; + assign qsfp0_rx_n[0] = QSFP0_0_RX_N; + `else + assign qsfp0_rx_p[0] = 1'b0; + assign qsfp0_rx_n[0] = 1'b1; + `endif + `ifdef QSFP0_1 + assign QSFP0_1_TX_P = qsfp0_tx_p[1]; + assign QSFP0_1_TX_N = qsfp0_tx_n[1]; + assign qsfp0_rx_p[1] = QSFP0_1_RX_P; + assign qsfp0_rx_n[1] = QSFP0_1_RX_N; + `else + assign qsfp0_rx_p[1] = 1'b0; + assign qsfp0_rx_n[1] = 1'b1; + `endif + `ifdef QSFP0_2 + assign QSFP0_2_TX_P = qsfp0_tx_p[2]; + assign QSFP0_2_TX_N = qsfp0_tx_n[2]; + assign qsfp0_rx_p[2] = QSFP0_2_RX_P; + assign qsfp0_rx_n[2] = QSFP0_2_RX_N; + `else + assign qsfp0_rx_p[2] = 1'b0; + assign qsfp0_rx_n[2] = 1'b1; + `endif + `ifdef QSFP0_3 + assign QSFP0_3_TX_P = qsfp0_tx_p[3]; + assign QSFP0_3_TX_N = qsfp0_tx_n[3]; + assign qsfp0_rx_p[3] = QSFP0_3_RX_P; + assign qsfp0_rx_n[3] = QSFP0_3_RX_N; + `else + assign qsfp0_rx_p[3] = 1'b0; + assign qsfp0_rx_n[3] = 1'b1; + `endif + + `ifdef QSFP1_0 + assign QSFP1_0_TX_P = qsfp1_tx_p[0]; + assign QSFP1_0_TX_N = qsfp1_tx_n[0]; + assign qsfp1_rx_p[0] = QSFP1_0_RX_P; + assign qsfp1_rx_n[0] = QSFP1_0_RX_N; + `else + assign qsfp1_rx_p[0] = 1'b0; + assign qsfp1_rx_n[0] = 1'b1; + `endif + `ifdef QSFP1_1 + assign QSFP1_1_TX_P = qsfp1_tx_p[1]; + assign QSFP1_1_TX_N = qsfp1_tx_n[1]; + assign qsfp1_rx_p[1] = QSFP1_1_RX_P; + assign qsfp1_rx_n[1] = QSFP1_1_RX_N; + `else + assign qsfp1_rx_p[1] = 1'b0; + assign qsfp1_rx_n[1] = 1'b1; + `endif + `ifdef QSFP1_2 + assign QSFP1_2_TX_P = qsfp1_tx_p[2]; + assign QSFP1_2_TX_N = qsfp1_tx_n[2]; + assign qsfp1_rx_p[2] = QSFP1_2_RX_P; + assign qsfp1_rx_n[2] = QSFP1_2_RX_N; + `else + assign qsfp1_rx_p[2] = 1'b0; + assign qsfp1_rx_n[2] = 1'b1; + `endif + `ifdef QSFP1_3 + assign QSFP1_3_TX_P = qsfp1_tx_p[3]; + assign QSFP1_3_TX_N = qsfp1_tx_n[3]; + assign qsfp1_rx_p[3] = QSFP1_3_RX_P; + assign qsfp1_rx_n[3] = QSFP1_3_RX_N; + `else + assign qsfp1_rx_p[3] = 1'b0; + assign qsfp1_rx_n[3] = 1'b1; + `endif + + x4xx_qsfp_wrapper_temp #( + `ifdef QSFP0_0 + .PROTOCOL0 (`QSFP0_0), + `endif + `ifdef QSFP0_1 + .PROTOCOL1 (`QSFP0_1), + `endif + `ifdef QSFP0_2 + .PROTOCOL2 (`QSFP0_2), + `endif + `ifdef QSFP0_3 + .PROTOCOL3 (`QSFP0_3), + `endif + .CPU_W (CPU_W), + .CHDR_W (CHDR_W), + .BYTE_MTU (BYTE_MTU), + .PORTNUM (0) + ) x4xx_qsfp_wrapper_0 ( + .areset (areset), + .refclk_p (MGT_REFCLK_LMK0_P), + .refclk_n (MGT_REFCLK_LMK0_N), + .clk100 (clk100), // IP configured for 100 MHz DClk + .bus_rst (clk200_rst), + .bus_clk (clk200), + .clk40_rst (clk40_rst), + .clk40 (clk40), + // Register Access + .s_axi_awaddr (axi_qsfp0_awaddr), + .s_axi_awvalid (axi_qsfp0_awvalid), + .s_axi_awready (axi_qsfp0_awready), + .s_axi_wdata (axi_qsfp0_wdata), + .s_axi_wstrb (axi_qsfp0_wstrb), + .s_axi_wvalid (axi_qsfp0_wvalid), + .s_axi_wready (axi_qsfp0_wready), + .s_axi_bresp (axi_qsfp0_bresp), + .s_axi_bvalid (axi_qsfp0_bvalid), + .s_axi_bready (axi_qsfp0_bready), + .s_axi_araddr (axi_qsfp0_araddr), + .s_axi_arvalid (axi_qsfp0_arvalid), + .s_axi_arready (axi_qsfp0_arready), + .s_axi_rdata (axi_qsfp0_rdata), + .s_axi_rresp (axi_qsfp0_rresp), + .s_axi_rvalid (axi_qsfp0_rvalid), + .s_axi_rready (axi_qsfp0_rready), + // DMA Access + .axi_hp_araddr (axi_hp0_araddr), + .axi_hp_arburst (axi_hp0_arburst), + .axi_hp_arcache (axi_hp0_arcache), + .axi_hp_arlen (axi_hp0_arlen), + .axi_hp_arlock (axi_hp0_arlock), + .axi_hp_arprot (axi_hp0_arprot), + .axi_hp_arqos (axi_hp0_arqos), + .axi_hp_arready (axi_hp0_arready), + .axi_hp_arsize (axi_hp0_arsize), + .axi_hp_arvalid (axi_hp0_arvalid), + .axi_hp_awaddr (axi_hp0_awaddr), + .axi_hp_awburst (axi_hp0_awburst), + .axi_hp_awcache (axi_hp0_awcache), + .axi_hp_awlen (axi_hp0_awlen), + .axi_hp_awlock (axi_hp0_awlock), + .axi_hp_awprot (axi_hp0_awprot), + .axi_hp_awqos (axi_hp0_awqos), + .axi_hp_awready (axi_hp0_awready), + .axi_hp_awsize (axi_hp0_awsize), + .axi_hp_awvalid (axi_hp0_awvalid), + .axi_hp_bready (axi_hp0_bready), + .axi_hp_bresp (axi_hp0_bresp), + .axi_hp_bvalid (axi_hp0_bvalid), + .axi_hp_rdata (axi_hp0_rdata), + .axi_hp_rlast (axi_hp0_rlast), + .axi_hp_rready (axi_hp0_rready), + .axi_hp_rresp (axi_hp0_rresp), + .axi_hp_rvalid (axi_hp0_rvalid), + .axi_hp_wdata (axi_hp0_wdata), + .axi_hp_wlast (axi_hp0_wlast), + .axi_hp_wready (axi_hp0_wready), + .axi_hp_wstrb (axi_hp0_wstrb), + .axi_hp_wvalid (axi_hp0_wvalid), + // Transceivers + .tx_p (qsfp0_tx_p), + .tx_n (qsfp0_tx_n), + .rx_p (qsfp0_rx_p), + .rx_n (qsfp0_rx_n), + // Ethernet to CHDR + .e2v_tdata (e2v_tdata [0*CHDR_W*4 +: CHDR_W*4]), + .e2v_tlast (e2v_tlast [0* 4 +: 4]), + .e2v_tvalid (e2v_tvalid [0* 4 +: 4]), + .e2v_tready (e2v_tready [0* 4 +: 4]), + // CHDR to Ethernet + .v2e_tdata (v2e_tdata [0*CHDR_W*4 +: CHDR_W*4]), + .v2e_tlast (v2e_tlast [0* 4 +: 4]), + .v2e_tvalid (v2e_tvalid [0* 4 +: 4]), + .v2e_tready (v2e_tready [0* 4 +: 4]), + + // Misc + .eth_rx_irq (eth0_rx_irq), + .eth_tx_irq (eth0_tx_irq), + .device_id (device_id), + .rx_rec_clk_out (), + .port_info_0 (qsfp_port_0_0_info), + .port_info_1 (qsfp_port_0_1_info), + .port_info_2 (qsfp_port_0_2_info), + .port_info_3 (qsfp_port_0_3_info), + .link_up (eth0_link_up), + .activity (eth0_activity) + ); + + + x4xx_qsfp_wrapper_temp #( + `ifdef QSFP1_0 + .PROTOCOL0 (`QSFP1_0), + `endif + `ifdef QSFP1_1 + .PROTOCOL1 (`QSFP1_1), + `endif + `ifdef QSFP1_2 + .PROTOCOL2 (`QSFP1_2), + `endif + `ifdef QSFP1_3 + .PROTOCOL3 (`QSFP1_3), + `endif + .CPU_W (CPU_W), + .CHDR_W (CHDR_W), + .BYTE_MTU (BYTE_MTU), + .PORTNUM (1) + ) x4xx_qsfp_wrapper_1 ( + .areset (areset), + .refclk_p (MGT_REFCLK_LMK3_P), + .refclk_n (MGT_REFCLK_LMK3_N), + .clk100 (clk100), // IP configured for 100 MHz DClk + .bus_rst (clk200_rst), + .bus_clk (clk200), + .clk40_rst (clk40_rst), + .clk40 (clk40), + //Register Access + .s_axi_awaddr (axi_qsfp1_awaddr), + .s_axi_awvalid (axi_qsfp1_awvalid), + .s_axi_awready (axi_qsfp1_awready), + .s_axi_wdata (axi_qsfp1_wdata), + .s_axi_wstrb (axi_qsfp1_wstrb), + .s_axi_wvalid (axi_qsfp1_wvalid), + .s_axi_wready (axi_qsfp1_wready), + .s_axi_bresp (axi_qsfp1_bresp), + .s_axi_bvalid (axi_qsfp1_bvalid), + .s_axi_bready (axi_qsfp1_bready), + .s_axi_araddr (axi_qsfp1_araddr), + .s_axi_arvalid (axi_qsfp1_arvalid), + .s_axi_arready (axi_qsfp1_arready), + .s_axi_rdata (axi_qsfp1_rdata), + .s_axi_rresp (axi_qsfp1_rresp), + .s_axi_rvalid (axi_qsfp1_rvalid), + .s_axi_rready (axi_qsfp1_rready), + // DMA Access + .axi_hp_araddr (axi_hp1_araddr), + .axi_hp_arburst (axi_hp1_arburst), + .axi_hp_arcache (axi_hp1_arcache), + .axi_hp_arlen (axi_hp1_arlen), + .axi_hp_arlock (axi_hp1_arlock), + .axi_hp_arprot (axi_hp1_arprot), + .axi_hp_arqos (axi_hp1_arqos), + .axi_hp_arready (axi_hp1_arready), + .axi_hp_arsize (axi_hp1_arsize), + .axi_hp_arvalid (axi_hp1_arvalid), + .axi_hp_awaddr (axi_hp1_awaddr), + .axi_hp_awburst (axi_hp1_awburst), + .axi_hp_awcache (axi_hp1_awcache), + .axi_hp_awlen (axi_hp1_awlen), + .axi_hp_awlock (axi_hp1_awlock), + .axi_hp_awprot (axi_hp1_awprot), + .axi_hp_awqos (axi_hp1_awqos), + .axi_hp_awready (axi_hp1_awready), + .axi_hp_awsize (axi_hp1_awsize), + .axi_hp_awvalid (axi_hp1_awvalid), + .axi_hp_bready (axi_hp1_bready), + .axi_hp_bresp (axi_hp1_bresp), + .axi_hp_bvalid (axi_hp1_bvalid), + .axi_hp_rdata (axi_hp1_rdata), + .axi_hp_rlast (axi_hp1_rlast), + .axi_hp_rready (axi_hp1_rready), + .axi_hp_rresp (axi_hp1_rresp), + .axi_hp_rvalid (axi_hp1_rvalid), + .axi_hp_wdata (axi_hp1_wdata), + .axi_hp_wlast (axi_hp1_wlast), + .axi_hp_wready (axi_hp1_wready), + .axi_hp_wstrb (axi_hp1_wstrb), + .axi_hp_wvalid (axi_hp1_wvalid), + // Transceivers + .tx_p (qsfp1_tx_p), + .tx_n (qsfp1_tx_n), + .rx_p (qsfp1_rx_p), + .rx_n (qsfp1_rx_n), + // Ethernet to CHDR + .e2v_tdata (e2v_tdata [1*CHDR_W*4 +: CHDR_W*4]), + .e2v_tlast (e2v_tlast [1* 4 +: 4]), + .e2v_tvalid (e2v_tvalid [1* 4 +: 4]), + .e2v_tready (e2v_tready [1* 4 +: 4]), + // CHDR to Ethernet + .v2e_tdata (v2e_tdata [1*CHDR_W*4 +: CHDR_W*4]), + .v2e_tlast (v2e_tlast [1* 4 +: 4]), + .v2e_tvalid (v2e_tvalid [1* 4 +: 4]), + .v2e_tready (v2e_tready [1* 4 +: 4]), + // Misc + .eth_rx_irq (eth1_rx_irq), + .eth_tx_irq (eth1_tx_irq), + .device_id (device_id), + .rx_rec_clk_out (rx_rec_clk_out1), + .port_info_0 (qsfp_port_1_0_info), + .port_info_1 (qsfp_port_1_1_info), + .port_info_2 (qsfp_port_1_2_info), + .port_info_3 (qsfp_port_1_3_info), + .link_up (eth1_link_up), + .activity (eth1_activity) + ); + + + //--------------------------------------------------------------------------- + // Internal Ethernet Interface + //--------------------------------------------------------------------------- + + // CHDR DMA bus (clk200 domain) + wire [CHDR_W-1:0] e2v_dma_tdata; + wire e2v_dma_tlast; + wire e2v_dma_tready; + wire e2v_dma_tvalid; + wire [CHDR_W-1:0] v2e_dma_tdata; + wire v2e_dma_tlast; + wire v2e_dma_tready; + wire v2e_dma_tvalid; + + eth_ipv4_internal #( + .CHDR_W (CHDR_W), + .BYTE_MTU (BYTE_MTU), + .DWIDTH (REG_DWIDTH), + .AWIDTH (REG_AWIDTH), + .PORTNUM (8'd0), + .RFNOC_PROTOVER (RFNOC_PROTOVER) + ) eth_ipv4_internal_i ( + .bus_clk (clk200), + .bus_rst (clk200_rst), + .s_axi_aclk (clk40), + .s_axi_aresetn (clk40_rstn), + .s_axi_awaddr (axi_eth_internal_awaddr[REG_AWIDTH-1:0]), + .s_axi_awvalid (axi_eth_internal_awvalid), + .s_axi_awready (axi_eth_internal_awready), + .s_axi_wdata (axi_eth_internal_wdata), + .s_axi_wstrb (axi_eth_internal_wstrb), + .s_axi_wvalid (axi_eth_internal_wvalid), + .s_axi_wready (axi_eth_internal_wready), + .s_axi_bresp (axi_eth_internal_bresp), + .s_axi_bvalid (axi_eth_internal_bvalid), + .s_axi_bready (axi_eth_internal_bready), + .s_axi_araddr (axi_eth_internal_araddr[REG_AWIDTH-1:0]), + .s_axi_arvalid (axi_eth_internal_arvalid), + .s_axi_arready (axi_eth_internal_arready), + .s_axi_rdata (axi_eth_internal_rdata), + .s_axi_rresp (axi_eth_internal_rresp), + .s_axi_rvalid (axi_eth_internal_rvalid), + .s_axi_rready (axi_eth_internal_rready), + .e2h_tdata (e2h_dma_tdata), + .e2h_tkeep (e2h_dma_tkeep), + .e2h_tlast (e2h_dma_tlast), + .e2h_tvalid (e2h_dma_tvalid), + .e2h_tready (e2h_dma_tready), + .h2e_tdata (h2e_dma_tdata), + .h2e_tkeep (h2e_dma_tkeep), + .h2e_tlast (h2e_dma_tlast), + .h2e_tvalid (h2e_dma_tvalid), + .h2e_tready (h2e_dma_tready), + .e2v_tdata (e2v_dma_tdata), + .e2v_tlast (e2v_dma_tlast), + .e2v_tvalid (e2v_dma_tvalid), + .e2v_tready (e2v_dma_tready), + .v2e_tdata (v2e_dma_tdata), + .v2e_tlast (v2e_dma_tlast), + .v2e_tvalid (v2e_dma_tvalid), + .v2e_tready (v2e_dma_tready), + .device_id (device_id) + ); + + + //--------------------------------------------------------------------------- + // CPLD Interface + //--------------------------------------------------------------------------- + + wire [COMPONENT_VERSIONS_SIZE-1:0] cpld_ifc_version; + + // Because time increments by SPC, we can ignore the least-significant bits + // that don't change in the radio's timestamp. + assign time_ignore_bits = $clog2(RADIO_SPC); + + cpld_interface cpld_interface_i ( + .s_axi_aclk (clk40), + .s_axi_aresetn (clk40_rstn), + .pll_ref_clk (pll_ref_clk), + .radio_clk (data_clk), + .ctrlport_rst (prc_rst), + .radio_time (radio_time), + .radio_time_stb (radio_time_stb), + .time_ignore_bits (time_ignore_bits), + .s_axi_awaddr (m_axi_mpm_ep_awaddr[16:0]), + .s_axi_awvalid (m_axi_mpm_ep_awvalid), + .s_axi_awready (m_axi_mpm_ep_awready), + .s_axi_wdata (m_axi_mpm_ep_wdata), + .s_axi_wstrb (m_axi_mpm_ep_wstrb), + .s_axi_wvalid (m_axi_mpm_ep_wvalid), + .s_axi_wready (m_axi_mpm_ep_wready), + .s_axi_bresp (m_axi_mpm_ep_bresp), + .s_axi_bvalid (m_axi_mpm_ep_bvalid), + .s_axi_bready (m_axi_mpm_ep_bready), + .s_axi_araddr (m_axi_mpm_ep_araddr[16:0]), + .s_axi_arvalid (m_axi_mpm_ep_arvalid), + .s_axi_arready (m_axi_mpm_ep_arready), + .s_axi_rdata (m_axi_mpm_ep_rdata), + .s_axi_rresp (m_axi_mpm_ep_rresp), + .s_axi_rvalid (m_axi_mpm_ep_rvalid), + .s_axi_rready (m_axi_mpm_ep_rready), + .s_ctrlport_req_wr (), + .s_ctrlport_req_rd (), + .s_ctrlport_req_addr (), + .s_ctrlport_req_data (), + .s_ctrlport_req_byte_en (), + .s_ctrlport_req_has_time (), + .s_ctrlport_req_time (), + .s_ctrlport_resp_ack (), + .s_ctrlport_resp_status (), + .s_ctrlport_resp_data (), + .ss ({PL_CPLD_CS1_n, PL_CPLD_CS0_n}), + .sclk (PL_CPLD_SCLK), + .mosi (PL_CPLD_MOSI), + .miso (PL_CPLD_MISO), + .qsfp0_led_active (eth0_activity), + .qsfp0_led_link (eth0_link_up), + .qsfp1_led_active (eth1_activity), + .qsfp1_led_link (eth1_link_up), + .ipass_present_n (2'b11), + .version_info (cpld_ifc_version) + ); + + + //--------------------------------------------------------------------------- + // X4XX Core + //--------------------------------------------------------------------------- + + wire [32*RADIO_SPC*NUM_CHANNELS-1:0] rx_data_iq, rx_data_qi; + wire [ NUM_CHANNELS-1:0] rx_stb; + wire [32*RADIO_SPC*NUM_CHANNELS-1:0] tx_data_iq, tx_data_qi; + wire [ NUM_CHANNELS-1:0] tx_stb; + wire [ 11:0] gpio_out_a; + wire [ 11:0] gpio_out_b; + wire [ 11:0] gpio_en_a; + wire [ 11:0] gpio_en_b; + + wire mfg_test_en_fabric_clk; + wire mfg_test_en_gty_rcv_clk; + + // Map RFDC ports to x4xx_core ports + // IMPORTANT! For ZBX RevB, there is a RX channel swap in layout + // that we need to correct for here in HDL. + assign radio_clk = data_clk; + assign radio_clk_2x = data_clk_2x; + + assign rx_data_qi = { adc_data_out_tdata [2], adc_data_out_tdata [3], + adc_data_out_tdata [0], adc_data_out_tdata [1] }; + assign rx_stb = { adc_data_out_tvalid[2], adc_data_out_tvalid[3], + adc_data_out_tvalid[0], adc_data_out_tvalid[1] }; + + assign { dac_data_in_tdata[3], dac_data_in_tdata[2], + dac_data_in_tdata[1], dac_data_in_tdata[0] } = tx_data_qi; + + // Tie flow control signals (not existent in downstream logic). TX chain + // always provides valid data when the rf_core is ready to receive. + assign dac_data_in_tvalid = {NUM_CHANNELS{1'b1}}; + assign tx_stb = dac_data_in_tready; + + // DIO tristate buffers + genvar i; + generate for (i=0; i<12; i=i+1) begin: dio_tristate_gen + assign DIOA_FPGA[i] = (gpio_en_a[i]) ? gpio_out_a[i] : 1'bz; + assign DIOB_FPGA[i] = (gpio_en_b[i]) ? gpio_out_b[i] : 1'bz; + end endgenerate + + // The RFNoC HDL assumes the data to be ordered with I in the MSBs and Q in + // the LSBs, whereas the interface of rf_core assumes that Q is in MSBs and I + // is in the LSBs. Here we swap I and Q to match the ordering of each + // interface. + generate for (i=0; i < RADIO_SPC*NUM_CHANNELS; i=i+1) begin : gen_iq_swap + assign rx_data_iq[i*32 +: 32] = { rx_data_qi[i*32 +: 16], rx_data_qi[i*32+16 +: 16] }; + assign tx_data_qi[i*32 +: 32] = { tx_data_iq[i*32 +: 16], tx_data_iq[i*32+16 +: 16] }; + end endgenerate + + // Version information mapping + // Each component consists of a 96-bit vector (refer to versioning_utils.vh) + // + // Build FPGA version + wire [COMPONENT_VERSIONS_SIZE-1:0] fpga_version; + assign fpga_version = build_component_versions( + FPGA_VERSION_LAST_MODIFIED_TIME, + build_version( + FPGA_OLDEST_COMPATIBLE_VERSION_MAJOR, + FPGA_OLDEST_COMPATIBLE_VERSION_MINOR, + FPGA_OLDEST_COMPATIBLE_VERSION_BUILD + ), + build_version( + FPGA_CURRENT_VERSION_MAJOR, + FPGA_CURRENT_VERSION_MINOR, + FPGA_CURRENT_VERSION_BUILD + ) + ); + // + wire [64*COMPONENT_VERSIONS_SIZE-1:0] x4xx_core_version_info; + assign x4xx_core_version_info[COMPONENT_VERSIONS_SIZE*FPGA_VERSION_INDEX +: COMPONENT_VERSIONS_SIZE] = fpga_version; + assign x4xx_core_version_info[COMPONENT_VERSIONS_SIZE*CPLD_IFC_INDEX +: COMPONENT_VERSIONS_SIZE] = cpld_ifc_version; + assign x4xx_core_version_info[COMPONENT_VERSIONS_SIZE*DB0_RF_CORE_INDEX +: COMPONENT_VERSIONS_SIZE] = rf_core_version[0]; + assign x4xx_core_version_info[COMPONENT_VERSIONS_SIZE*DB1_RF_CORE_INDEX +: COMPONENT_VERSIONS_SIZE] = rf_core_version[1]; + assign x4xx_core_version_info[COMPONENT_VERSIONS_SIZE*DB0_GPIO_IFC_INDEX +: COMPONENT_VERSIONS_SIZE] = db_gpio_ifc_version[0]; + assign x4xx_core_version_info[COMPONENT_VERSIONS_SIZE*DB1_GPIO_IFC_INDEX +: COMPONENT_VERSIONS_SIZE] = db_gpio_ifc_version[1]; + + x4xx_core #( + .NUM_DBOARDS (NUM_DBOARDS), + .REG_DWIDTH (REG_DWIDTH), + .REG_AWIDTH (REG_AWIDTH), + .CHDR_CLK_RATE (CHDR_CLK_RATE), + .NUM_CHANNELS (NUM_CHANNELS), + .CHDR_W (CHDR_W), + .MTU (CHDR_MTU), + .RFNOC_PROTOVER (RFNOC_PROTOVER), + .RADIO_SPC (RADIO_SPC) + ) x4xx_core_i ( + .radio_clk (radio_clk), + .radio_rst (radio_rst), + .radio_clk_2x (radio_clk_2x), + .rfnoc_chdr_clk (clk200), + .rfnoc_chdr_rst (clk200_rst), + .rfnoc_ctrl_clk (clk40), + .rfnoc_ctrl_rst (clk40_rst), + .s_axi_aclk (clk40), + .s_axi_aresetn (clk40_rstn), + .s_axi_awaddr (axi_core_awaddr[REG_AWIDTH-1:0]), + .s_axi_awvalid (axi_core_awvalid), + .s_axi_awready (axi_core_awready), + .s_axi_wdata (axi_core_wdata), + .s_axi_wstrb (axi_core_wstrb), + .s_axi_wvalid (axi_core_wvalid), + .s_axi_wready (axi_core_wready), + .s_axi_bresp (axi_core_bresp), + .s_axi_bvalid (axi_core_bvalid), + .s_axi_bready (axi_core_bready), + .s_axi_araddr (axi_core_araddr[REG_AWIDTH-1:0]), + .s_axi_arvalid (axi_core_arvalid), + .s_axi_arready (axi_core_arready), + .s_axi_rdata (axi_core_rdata), + .s_axi_rresp (axi_core_rresp), + .s_axi_rvalid (axi_core_rvalid), + .s_axi_rready (axi_core_rready), + .pps_radioclk (pps_radioclk), + .pps_select (pps_select), + .trig_io_select (trig_io_select), + .pll_sync_trigger (pll_sync_trigger), + .pll_sync_delay (pll_sync_delay), + .pll_sync_done (pll_sync_done), + .pps_brc_delay (pps_brc_delay), + .pps_prc_delay (pps_prc_delay), + .prc_rc_divider (prc_rc_divider), + .pps_rc_enabled (pps_rc_enabled), + .rx_data (rx_data_iq), + .rx_stb (rx_stb), + .rx_running (rx_running), + .tx_data (tx_data_iq), + .tx_stb (tx_stb), + .tx_running (tx_running), + .dmao_tdata (v2e_dma_tdata), + .dmao_tlast (v2e_dma_tlast), + .dmao_tvalid (v2e_dma_tvalid), + .dmao_tready (v2e_dma_tready), + .dmai_tdata (e2v_dma_tdata), + .dmai_tlast (e2v_dma_tlast), + .dmai_tvalid (e2v_dma_tvalid), + .dmai_tready (e2v_dma_tready), + .e2v_tdata (e2v_tdata), + .e2v_tlast (e2v_tlast), + .e2v_tvalid (e2v_tvalid), + .e2v_tready (e2v_tready), + .v2e_tdata (v2e_tdata), + .v2e_tlast (v2e_tlast), + .v2e_tvalid (v2e_tvalid), + .v2e_tready (v2e_tready), + .gpio_in_a (DIOA_FPGA), + .gpio_in_b (DIOB_FPGA), + .gpio_out_a (gpio_out_a), + .gpio_out_b (gpio_out_b), + .gpio_en_a (gpio_en_a), + .gpio_en_b (gpio_en_b), + .qsfp_port_0_0_info (qsfp_port_0_0_info), + .qsfp_port_0_1_info (qsfp_port_0_1_info), + .qsfp_port_0_2_info (qsfp_port_0_2_info), + .qsfp_port_0_3_info (qsfp_port_0_3_info), + .qsfp_port_1_0_info (qsfp_port_1_0_info), + .qsfp_port_1_1_info (qsfp_port_1_1_info), + .qsfp_port_1_2_info (qsfp_port_1_2_info), + .qsfp_port_1_3_info (qsfp_port_1_3_info), + .radio_time (radio_time), + .radio_time_stb (radio_time_stb), + .device_id (device_id), + .mfg_test_en_fabric_clk (mfg_test_en_fabric_clk), + .mfg_test_en_gty_rcv_clk (mfg_test_en_gty_rcv_clk), + .fpga_aux_ref (FPGA_AUX_REF), + .m_ctrlport_radio_req_wr ({ db_ctrlport_req_wr [1], db_ctrlport_req_wr [0] }), + .m_ctrlport_radio_req_rd ({ db_ctrlport_req_rd [1], db_ctrlport_req_rd [0] }), + .m_ctrlport_radio_req_addr ({ db_ctrlport_req_addr [1], db_ctrlport_req_addr [0] }), + .m_ctrlport_radio_req_data ({ db_ctrlport_req_data [1], db_ctrlport_req_data [0] }), + .m_ctrlport_radio_req_byte_en ({ db_ctrlport_req_byte_en [1], db_ctrlport_req_byte_en [0] }), + .m_ctrlport_radio_req_has_time ({ db_ctrlport_req_has_time [1], db_ctrlport_req_has_time [0] }), + .m_ctrlport_radio_req_time ({ db_ctrlport_req_time [1], db_ctrlport_req_time [0] }), + .m_ctrlport_radio_resp_ack ({ db_ctrlport_resp_ack [1], db_ctrlport_resp_ack [0] }), + .m_ctrlport_radio_resp_status ({ db_ctrlport_resp_status [1], db_ctrlport_resp_status [0] }), + .m_ctrlport_radio_resp_data ({ db_ctrlport_resp_data [1], db_ctrlport_resp_data [0] }), + .start_nco_reset (start_nco_reset), + .nco_reset_done (nco_reset_done), + .adc_reset_pulse (adc_reset_pulse), + .dac_reset_pulse (dac_reset_pulse), + .version_info (x4xx_core_version_info) + ); + + + //--------------------------------------------------------------------------- + // eCPRI Clock Output Test + //--------------------------------------------------------------------------- + + wire fabric_clk_oddr; + + wire mfg_test_en_fabric_clk_dc; + wire mfg_test_en_gty_rcv_clk_dc; + + synchronizer #( + .STAGES (2), + .WIDTH (1), + .INITIAL_VAL (1'h0) + ) synchronizer_mfg_test_en_fabric_clk ( + .clk (data_clk), + .rst (1'b0), + .in (mfg_test_en_fabric_clk), + .out (mfg_test_en_fabric_clk_dc) + ); + + synchronizer #( + .STAGES (2), + .WIDTH (1), + .INITIAL_VAL (1'h0) + ) synchronizer_mfg_test_en_gty_rcv_clk ( + .clk (data_clk), + .rst (1'b0), + .in (mfg_test_en_gty_rcv_clk), + .out (mfg_test_en_gty_rcv_clk_dc) + ); + + ODDRE1 #( + .SRVAL (1'b0) // Initializes the ODDRE1 Flip-Flops to 1'b0 + ) oddre1_fabric_clk ( + .Q (fabric_clk_oddr), // 1-bit output: Data output to IOB + .C (data_clk), // 1-bit input: High-speed clock input + .D1 (1'b0), // 1-bit input: Parallel data input 1 + .D2 (mfg_test_en_fabric_clk_dc), // 1-bit input: Parallel data input 2 + .SR (1'b0) // 1-bit input: Active High Async Reset + ); + + OBUFDS obufds_fabric_clk ( + .O (FABRIC_CLK_OUT_P), // 1-bit output: Diff_p output (connect directly to top-level port) + .OB (FABRIC_CLK_OUT_N), // 1-bit output: Diff_n output (connect directly to top-level port) + .I (fabric_clk_oddr) // 1-bit input: Buffer input + ); + + // Requires QSFP1_0 because of limited input options for this buffer. + // This output on (MGTREFCLK1 128)(QUAD128 is QSFP1). + // The input is MGT_REFCLK_LMK3_P (MGT_REFCLK1 129)(QUAD 129 not used). + `ifdef QSFP1_0 + OBUFDS_GTE4 #( + .REFCLK_EN_TX_PATH (1'b1), + .REFCLK_ICNTL_TX (5'b00111) + ) gty_rcv_clk_OBUFDS ( + .O (GTY_RCV_CLK_P), // 1-bit output: Diff_p output (connect directly to top-level port) + .OB (GTY_RCV_CLK_N), // 1-bit output: Diff_n output (connect directly to top-level port) + .I (rx_rec_clk_out1), // 1-bit input: Buffer input + .CEB (!mfg_test_en_gty_rcv_clk_dc) // 1-bit input: Clock Enable + ); + `endif + +endmodule + + +`default_nettype wire + + +//XmlParse xml_on +//<top name="X4XX_FPGA"> +// <info> +// This documentation provides a description of the different register spaces available +// for the USRP X4xx Open-Source FPGA target implementation, accessible through the +// embedded ARM A53 processor in the RFSoC chip, and other UHD hosts. +// </info> +//</top> +// +//<regmap name="VERSIONING_REGS_REGMAP"> +// <group name="VERSIONING_CONSTANTS"> +// <enumeratedtype name="FPGA_VERSION" showhex="true"> +// <info> +// FPGA version.{BR/} +// For guidance on when to update these revision numbers, +// please refer to the register map documentation accordingly: +// <li> Current version: @.VERSIONING_REGS_REGMAP..CURRENT_VERSION +// <li> Oldest compatible version: @.VERSIONING_REGS_REGMAP..OLDEST_COMPATIBLE_VERSION +// <li> Version last modified: @.VERSIONING_REGS_REGMAP..VERSION_LAST_MODIFIED +// </info> +// <value name="FPGA_CURRENT_VERSION_MAJOR" integer="7"/> +// <value name="FPGA_CURRENT_VERSION_MINOR" integer="3"/> +// <value name="FPGA_CURRENT_VERSION_BUILD" integer="0"/> +// <value name="FPGA_OLDEST_COMPATIBLE_VERSION_MAJOR" integer="7"/> +// <value name="FPGA_OLDEST_COMPATIBLE_VERSION_MINOR" integer="0"/> +// <value name="FPGA_OLDEST_COMPATIBLE_VERSION_BUILD" integer="0"/> +// <value name="FPGA_VERSION_LAST_MODIFIED_TIME" integer="0x21041616"/> +// </enumeratedtype> +// </group> +//</regmap> +//XmlParse xml_off |