Files
b210-k7-fpga/top/n3xx/dboards/mg/n3xx.v
T
Wade Fife 2612487d43 fpga: n3xx: Add CE clock
Adds a 266.667 MHz compute engine clock and uses it instead of the
radio clock for the DDC and DUC. Using a faster clock than the radio
allows the DDC and DUC to drain after a stall in the data flow.


Original-commit: ff55d406a02cc934a5c238d22c836bea08ade3d1
2023-10-18 22:23:55 -05:00

4065 lines
131 KiB
Verilog
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////
///
// Copyright 2016-2019 Ettus Research, A National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: n3xx
// Description:
// Top Level for N3xx devices
//
//////////////////////////////////////////////////////////////////////
module n3xx (
inout [11:0] FPGA_GPIO,
input FPGA_REFCLK_P,
input FPGA_REFCLK_N,
input REF_1PPS_IN,
input NETCLK_REF_P,
input NETCLK_REF_N,
//input REF_1PPS_IN_MGMT,
output REF_1PPS_OUT,
//TDC
inout UNUSED_PIN_TDCA_0,
inout UNUSED_PIN_TDCA_1,
inout UNUSED_PIN_TDCA_2,
inout UNUSED_PIN_TDCA_3,
inout UNUSED_PIN_TDCB_0,
inout UNUSED_PIN_TDCB_1,
inout UNUSED_PIN_TDCB_2,
inout UNUSED_PIN_TDCB_3,
`ifdef NPIO_LANES
input NPIO_RX0_P,
input NPIO_RX0_N,
output NPIO_TX0_P,
output NPIO_TX0_N,
input NPIO_RX1_P,
input NPIO_RX1_N,
output NPIO_TX1_P,
output NPIO_TX1_N,
`endif
`ifdef QSFP_LANES
input [`QSFP_LANES-1:0] QSFP_RX_P,
input [`QSFP_LANES-1:0] QSFP_RX_N,
output [`QSFP_LANES-1:0] QSFP_TX_P,
output [`QSFP_LANES-1:0] QSFP_TX_N,
output QSFP_RESET_B,
output QSFP_LED,
output QSFP_MODSEL_B,
output QSFP_LPMODE,
input QSFP_PRESENT_B,
input QSFP_INT_B,
inout QSFP_I2C_SCL,
inout QSFP_I2C_SDA,
`endif
//TODO: Uncomment when connected here
//input NPIO_0_RXSYNC_0_P, NPIO_0_RXSYNC_1_P,
//input NPIO_0_RXSYNC_0_N, NPIO_0_RXSYNC_1_N,
//output NPIO_0_TXSYNC_0_P, NPIO_0_TXSYNC_1_P,
//output NPIO_0_TXSYNC_0_N, NPIO_0_TXSYNC_1_N,
//input NPIO_1_RXSYNC_0_P, NPIO_1_RXSYNC_1_P,
//input NPIO_1_RXSYNC_0_N, NPIO_1_RXSYNC_1_N,
//output NPIO_1_TXSYNC_0_P, NPIO_1_TXSYNC_1_P,
//output NPIO_1_TXSYNC_0_N, NPIO_1_TXSYNC_1_N,
//input NPIO_2_RXSYNC_0_P, NPIO_2_RXSYNC_1_P,
//input NPIO_2_RXSYNC_0_N, NPIO_2_RXSYNC_1_N,
//output NPIO_2_TXSYNC_0_P, NPIO_2_TXSYNC_1_P,
//output NPIO_2_TXSYNC_0_N, NPIO_2_TXSYNC_1_N,
//GPS
input GPS_1PPS,
//input GPS_1PPS_RAW,
//Misc
input ENET0_CLK125,
//inout ENET0_PTP,
//output ENET0_PTP_DIR,
//inout ATSHA204_SDA,
input FPGA_PL_RESETN, // TODO: Add to reset logic
// output reg [1:0] FPGA_TEST,
//input PWR_CLK_FPGA, // TODO: check direction
input FPGA_PUDC_B,
//White Rabbit
input WB_20MHZ_P,
input WB_20MHZ_N,
output WB_DAC_DIN,
output WB_DAC_NCLR,
output WB_DAC_NLDAC,
output WB_DAC_NSYNC,
output WB_DAC_SCLK,
//LEDS
output PANEL_LED_GPS,
output PANEL_LED_LINK,
output PANEL_LED_PPS,
output PANEL_LED_REF,
// ARM Connections (PS)
inout [53:0] MIO,
inout PS_SRSTB,
inout PS_CLK,
inout PS_PORB,
inout DDR_Clk,
inout DDR_Clk_n,
inout DDR_CKE,
inout DDR_CS_n,
inout DDR_RAS_n,
inout DDR_CAS_n,
inout DDR_WEB,
inout [2:0] DDR_BankAddr,
inout [14:0] DDR_Addr,
inout DDR_ODT,
inout DDR_DRSTB,
inout [31:0] DDR_DQ,
inout [3:0] DDR_DM,
inout [3:0] DDR_DQS,
inout [3:0] DDR_DQS_n,
inout DDR_VRP,
inout DDR_VRN,
///////////////////////////////////
//
// High Speed SPF+ signals and clocking
//
///////////////////////////////////
// These clock inputs must always be enabled with a buffer regardless of the build
// target to avoid damage to the FPGA.
input NETCLK_P,
input NETCLK_N,
input MGT156MHZ_CLK1_P,
input MGT156MHZ_CLK1_N,
input SFP_0_RX_P, input SFP_0_RX_N,
output SFP_0_TX_P, output SFP_0_TX_N,
input SFP_1_RX_P, input SFP_1_RX_N,
output SFP_1_TX_P, output SFP_1_TX_N,
///////////////////////////////////
//
// DRAM Interface
//
///////////////////////////////////
inout [31:0] ddr3_dq, // Data pins. Input for Reads, Output for Writes.
inout [3:0] ddr3_dqs_n, // Data Strobes. Input for Reads, Output for Writes.
inout [3:0] ddr3_dqs_p,
//
output [15:0] ddr3_addr, // Address
output [2:0] ddr3_ba, // Bank Address
output ddr3_ras_n, // Row Address Strobe.
output ddr3_cas_n, // Column address select
output ddr3_we_n, // Write Enable
output ddr3_reset_n, // SDRAM reset pin.
output [0:0] ddr3_ck_p, // Differential clock
output [0:0] ddr3_ck_n,
output [0:0] ddr3_cke, // Clock Enable
output [0:0] ddr3_cs_n, // Chip Select
output [3:0] ddr3_dm, // Data Mask [3] = UDM.U26, [2] = LDM.U26, ...
output [0:0] ddr3_odt, // On-Die termination enable.
//
input sys_clk_p, // Differential
input sys_clk_n, // 100MHz clock source to generate DDR3 clocking.
///////////////////////////////////
//
// Supporting I/O for SPF+ interfaces
// (non high speed stuff)
//
///////////////////////////////////
//SFP+ 0, Slow Speed, Bank 13 3.3V
input SFP_0_I2C_NPRESENT,
output SFP_0_LED_A,
output SFP_0_LED_B,
input SFP_0_LOS,
output SFP_0_RS0,
output SFP_0_RS1,
output SFP_0_TXDISABLE,
input SFP_0_TXFAULT,
//SFP+ 1, Slow Speed, Bank 13 3.3V
//input SFP_1_I2C_NPRESENT,
output SFP_1_LED_A,
output SFP_1_LED_B,
input SFP_1_LOS,
output SFP_1_RS0,
output SFP_1_RS1,
output SFP_1_TXDISABLE,
input SFP_1_TXFAULT,
//USRP IO A
output DBA_CPLD_PS_SPI_SCLK,
output DBA_CPLD_PS_SPI_LE,
output DBA_CPLD_PS_SPI_SDI,
input DBA_CPLD_PS_SPI_SDO,
output [1:0] DBA_CPLD_PS_SPI_ADDR,
output DBA_ATR_RX_1,
output DBA_ATR_RX_2,
output DBA_ATR_TX_1,
output DBA_ATR_TX_2,
output [5:0] DBA_CH1_TX_DSA_DATA,
output [5:0] DBA_CH1_RX_DSA_DATA,
output [5:0] DBA_CH2_TX_DSA_DATA,
output [5:0] DBA_CH2_RX_DSA_DATA,
output DBA_CPLD_PL_SPI_SCLK,
output DBA_CPLD_PL_SPI_LE,
output DBA_CPLD_PL_SPI_SDI,
input DBA_CPLD_PL_SPI_SDO,
output [2:0] DBA_CPLD_PL_SPI_ADDR,
output DBA_MYK_SPI_SCLK,
output DBA_MYK_SPI_CS_n,
input DBA_MYK_SPI_SDO,
output DBA_MYK_SPI_SDIO,
input DBA_MYK_INTRQ,
output DBA_MYK_SYNC_IN_n,
input DBA_MYK_SYNC_OUT_n,
inout DBA_CPLD_JTAG_TCK,
inout DBA_CPLD_JTAG_TMS,
inout DBA_CPLD_JTAG_TDI,
input DBA_CPLD_JTAG_TDO,
output DBA_MYK_GPIO_0,
output DBA_MYK_GPIO_1,
output DBA_MYK_GPIO_3,
output DBA_MYK_GPIO_4,
output DBA_MYK_GPIO_12,
output DBA_MYK_GPIO_13,
output DBA_MYK_GPIO_14,
output DBA_MYK_GPIO_15,
input DBA_FPGA_CLK_P,
input DBA_FPGA_CLK_N,
input DBA_FPGA_SYSREF_P,
input DBA_FPGA_SYSREF_N,
input USRPIO_A_MGTCLK_P,
input USRPIO_A_MGTCLK_N,
input [3:0] USRPIO_A_RX_P,
input [3:0] USRPIO_A_RX_N,
output [3:0] USRPIO_A_TX_P,
output [3:0] USRPIO_A_TX_N
`ifndef N300
//USRP IO B
,output DBB_CPLD_PS_SPI_SCLK,
output DBB_CPLD_PS_SPI_LE,
output DBB_CPLD_PS_SPI_SDI,
input DBB_CPLD_PS_SPI_SDO,
output [1:0] DBB_CPLD_PS_SPI_ADDR,
output DBB_ATR_RX_1,
output DBB_ATR_RX_2,
output DBB_ATR_TX_1,
output DBB_ATR_TX_2,
output [5:0] DBB_CH1_TX_DSA_DATA,
output [5:0] DBB_CH1_RX_DSA_DATA,
output [5:0] DBB_CH2_TX_DSA_DATA,
output [5:0] DBB_CH2_RX_DSA_DATA,
output DBB_CPLD_PL_SPI_SCLK,
output DBB_CPLD_PL_SPI_LE,
output DBB_CPLD_PL_SPI_SDI,
input DBB_CPLD_PL_SPI_SDO,
output [2:0] DBB_CPLD_PL_SPI_ADDR,
output DBB_MYK_SPI_SCLK,
output DBB_MYK_SPI_CS_n,
input DBB_MYK_SPI_SDO,
output DBB_MYK_SPI_SDIO,
input DBB_MYK_INTRQ,
output DBB_MYK_SYNC_IN_n,
input DBB_MYK_SYNC_OUT_n,
inout DBB_CPLD_JTAG_TCK,
inout DBB_CPLD_JTAG_TMS,
inout DBB_CPLD_JTAG_TDI,
input DBB_CPLD_JTAG_TDO,
output DBB_MYK_GPIO_0,
output DBB_MYK_GPIO_1,
output DBB_MYK_GPIO_3,
output DBB_MYK_GPIO_4,
output DBB_MYK_GPIO_12,
output DBB_MYK_GPIO_13,
output DBB_MYK_GPIO_14,
output DBB_MYK_GPIO_15,
input DBB_FPGA_CLK_P,
input DBB_FPGA_CLK_N,
input DBB_FPGA_SYSREF_P,
input DBB_FPGA_SYSREF_N,
input USRPIO_B_MGTCLK_P,
input USRPIO_B_MGTCLK_N,
input [3:0] USRPIO_B_RX_P,
input [3:0] USRPIO_B_RX_N,
output [3:0] USRPIO_B_TX_P,
output [3:0] USRPIO_B_TX_N
`endif
);
// 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
localparam CHDR_W = `CHDR_WIDTH;
localparam RFNOC_PROTOVER = `RFNOC_PROTOVER;
// This USRP currently only supports 64-bit CHDR width
if (CHDR_W != 64) begin : gen_chdr_w_error
CHDR_W_must_be_64_for_this_USRP();
end
// Log base 2 of the maximum transmission unit (MTU) in bytes
localparam BYTE_MTU = $clog2(8192);
localparam N_AXILITE_SLAVES = 4;
localparam REG_AWIDTH = 14; // log2(0x4000)
localparam QSFP_REG_AWIDTH = 17; // log2(0x20000)
localparam REG_DWIDTH = 32;
localparam FP_GPIO_OFFSET = 32;
localparam FP_GPIO_WIDTH = 12;
`ifdef N310
localparam NUM_RADIOS = 2;
localparam NUM_CHANNELS_PER_RADIO = 2;
localparam NUM_DBOARDS = 2;
`elsif N300
localparam NUM_RADIOS = 1;
localparam NUM_CHANNELS_PER_RADIO = 2;
localparam NUM_DBOARDS = 1;
`endif
localparam NUM_CHANNELS = NUM_RADIOS * NUM_CHANNELS_PER_RADIO;
// Internal connections to PS
// HP0 -- High Performance port 0, FPGA is the master
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 [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;
// GP0 -- General Purpose port 0, FPGA is the master
wire [31:0] S_AXI_GP0_AWADDR;
wire [2:0] S_AXI_GP0_AWPROT;
wire S_AXI_GP0_AWVALID;
wire S_AXI_GP0_AWREADY;
wire [31:0] S_AXI_GP0_WDATA;
wire [3:0] S_AXI_GP0_WSTRB;
wire S_AXI_GP0_WVALID;
wire S_AXI_GP0_WREADY;
wire [1:0] S_AXI_GP0_BRESP;
wire S_AXI_GP0_BVALID;
wire S_AXI_GP0_BREADY;
wire [31:0] S_AXI_GP0_ARADDR;
wire [2:0] S_AXI_GP0_ARPROT;
wire S_AXI_GP0_ARVALID;
wire S_AXI_GP0_ARREADY;
wire [31:0] S_AXI_GP0_RDATA;
wire [1:0] S_AXI_GP0_RRESP;
wire S_AXI_GP0_RVALID;
wire S_AXI_GP0_RREADY;
wire S_AXI_GP0_RLAST;
wire [3:0] S_AXI_GP0_ARCACHE;
wire [7:0] S_AXI_GP0_AWLEN;
wire [2:0] S_AXI_GP0_AWSIZE;
wire [1:0] S_AXI_GP0_AWBURST;
wire [3:0] S_AXI_GP0_AWCACHE;
wire S_AXI_GP0_WLAST;
wire [7:0] S_AXI_GP0_ARLEN;
wire [1:0] S_AXI_GP0_ARBURST;
wire [2:0] S_AXI_GP0_ARSIZE;
// HP1 -- High Performance port 1, FPGA is the master
wire [5:0] S_AXI_HP1_AWID;
wire [31:0] S_AXI_HP1_AWADDR;
wire [2:0] S_AXI_HP1_AWPROT;
wire S_AXI_HP1_AWVALID;
wire S_AXI_HP1_AWREADY;
wire [63:0] S_AXI_HP1_WDATA;
wire [7:0] S_AXI_HP1_WSTRB;
wire S_AXI_HP1_WVALID;
wire S_AXI_HP1_WREADY;
wire [1:0] S_AXI_HP1_BRESP;
wire S_AXI_HP1_BVALID;
wire S_AXI_HP1_BREADY;
wire [5:0] S_AXI_HP1_ARID;
wire [31:0] S_AXI_HP1_ARADDR;
wire [2:0] S_AXI_HP1_ARPROT;
wire S_AXI_HP1_ARVALID;
wire S_AXI_HP1_ARREADY;
wire [63:0] S_AXI_HP1_RDATA;
wire [1:0] S_AXI_HP1_RRESP;
wire S_AXI_HP1_RVALID;
wire S_AXI_HP1_RREADY;
wire S_AXI_HP1_RLAST;
wire [3:0] S_AXI_HP1_ARCACHE;
wire [7:0] S_AXI_HP1_AWLEN;
wire [2:0] S_AXI_HP1_AWSIZE;
wire [1:0] S_AXI_HP1_AWBURST;
wire [3:0] S_AXI_HP1_AWCACHE;
wire S_AXI_HP1_WLAST;
wire [7:0] S_AXI_HP1_ARLEN;
wire [1:0] S_AXI_HP1_ARBURST;
wire [2:0] S_AXI_HP1_ARSIZE;
// GP1 -- General Purpose port 1, FPGA is the master
wire [4:0] S_AXI_GP1_AWID;
wire [31:0] S_AXI_GP1_AWADDR;
wire [2:0] S_AXI_GP1_AWPROT;
wire S_AXI_GP1_AWVALID;
wire S_AXI_GP1_AWREADY;
wire [31:0] S_AXI_GP1_WDATA;
wire [3:0] S_AXI_GP1_WSTRB;
wire S_AXI_GP1_WVALID;
wire S_AXI_GP1_WREADY;
wire [1:0] S_AXI_GP1_BRESP;
wire S_AXI_GP1_BVALID;
wire S_AXI_GP1_BREADY;
wire [4:0] S_AXI_GP1_ARID;
wire [31:0] S_AXI_GP1_ARADDR;
wire [2:0] S_AXI_GP1_ARPROT;
wire S_AXI_GP1_ARVALID;
wire S_AXI_GP1_ARREADY;
wire [31:0] S_AXI_GP1_RDATA;
wire [1:0] S_AXI_GP1_RRESP;
wire S_AXI_GP1_RVALID;
wire S_AXI_GP1_RREADY;
wire S_AXI_GP1_RLAST;
wire [3:0] S_AXI_GP1_ARCACHE;
wire [7:0] S_AXI_GP1_AWLEN;
wire [2:0] S_AXI_GP1_AWSIZE;
wire [1:0] S_AXI_GP1_AWBURST;
wire [3:0] S_AXI_GP1_AWCACHE;
wire S_AXI_GP1_WLAST;
wire [7:0] S_AXI_GP1_ARLEN;
wire [1:0] S_AXI_GP1_ARBURST;
wire [2:0] S_AXI_GP1_ARSIZE;
// GP0 -- General Purpose port 0, FPGA is the slave
wire M_AXI_GP0_ARVALID;
wire M_AXI_GP0_AWVALID;
wire M_AXI_GP0_BREADY;
wire M_AXI_GP0_RREADY;
wire M_AXI_GP0_WVALID;
wire [11:0] M_AXI_GP0_ARID;
wire [11:0] M_AXI_GP0_AWID;
wire [11:0] M_AXI_GP0_WID;
wire [31:0] M_AXI_GP0_ARADDR;
wire [31:0] M_AXI_GP0_AWADDR;
wire [31:0] M_AXI_GP0_WDATA;
wire [3:0] M_AXI_GP0_WSTRB;
wire M_AXI_GP0_ARREADY;
wire M_AXI_GP0_AWREADY;
wire M_AXI_GP0_BVALID;
wire M_AXI_GP0_RLAST;
wire M_AXI_GP0_RVALID;
wire M_AXI_GP0_WREADY;
wire [1:0] M_AXI_GP0_BRESP;
wire [1:0] M_AXI_GP0_RRESP;
wire [31:0] M_AXI_GP0_RDATA;
// ETH DMA
wire M_AXI_ETH_DMA0_ARVALID;
wire M_AXI_ETH_DMA0_AWVALID;
wire M_AXI_ETH_DMA0_BREADY;
wire M_AXI_ETH_DMA0_RREADY;
wire M_AXI_ETH_DMA0_WVALID;
wire [11:0] M_AXI_ETH_DMA0_ARID;
wire [11:0] M_AXI_ETH_DMA0_AWID;
wire [11:0] M_AXI_ETH_DMA0_WID;
wire [31:0] M_AXI_ETH_DMA0_ARADDR;
wire [31:0] M_AXI_ETH_DMA0_AWADDR;
wire [31:0] M_AXI_ETH_DMA0_WDATA;
wire [3:0] M_AXI_ETH_DMA0_WSTRB;
wire M_AXI_ETH_DMA0_ARREADY;
wire M_AXI_ETH_DMA0_AWREADY;
wire M_AXI_ETH_DMA0_BVALID;
wire M_AXI_ETH_DMA0_RLAST;
wire M_AXI_ETH_DMA0_RVALID;
wire M_AXI_ETH_DMA0_WREADY;
wire [1:0] M_AXI_ETH_DMA0_BRESP;
wire [1:0] M_AXI_ETH_DMA0_RRESP;
wire [31:0] M_AXI_ETH_DMA0_RDATA;
wire m_axi_eth_internal_arvalid;
wire m_axi_eth_internal_awvalid;
wire m_axi_eth_internal_bready;
wire m_axi_eth_internal_rready;
wire m_axi_eth_internal_wvalid;
wire [31:0] m_axi_eth_internal_araddr;
wire [31:0] m_axi_eth_internal_awaddr;
wire [31:0] m_axi_eth_internal_wdata;
wire [3:0] m_axi_eth_internal_wstrb;
wire m_axi_eth_internal_arready;
wire m_axi_eth_internal_awready;
wire m_axi_eth_internal_bvalid;
wire m_axi_eth_internal_rvalid;
wire m_axi_eth_internal_wready;
wire [1:0] m_axi_eth_internal_bresp;
wire [1:0] m_axi_eth_internal_rresp;
wire [31:0] m_axi_eth_internal_rdata;
wire M_AXI_NET0_ARVALID;
wire M_AXI_NET0_AWVALID;
wire M_AXI_NET0_BREADY;
wire M_AXI_NET0_RREADY;
wire M_AXI_NET0_WVALID;
wire [11:0] M_AXI_NET0_ARID;
wire [11:0] M_AXI_NET0_AWID;
wire [11:0] M_AXI_NET0_WID;
wire [31:0] M_AXI_NET0_ARADDR;
wire [31:0] M_AXI_NET0_AWADDR;
wire [31:0] M_AXI_NET0_WDATA;
wire [3:0] M_AXI_NET0_WSTRB;
wire M_AXI_NET0_ARREADY;
wire M_AXI_NET0_AWREADY;
wire M_AXI_NET0_BVALID;
wire M_AXI_NET0_RLAST;
wire M_AXI_NET0_RVALID;
wire M_AXI_NET0_WREADY;
wire [1:0] M_AXI_NET0_BRESP;
wire [1:0] M_AXI_NET0_RRESP;
wire [31:0] M_AXI_NET0_RDATA;
wire M_AXI_ETH_DMA1_ARVALID;
wire M_AXI_ETH_DMA1_AWVALID;
wire M_AXI_ETH_DMA1_BREADY;
wire M_AXI_ETH_DMA1_RREADY;
wire M_AXI_ETH_DMA1_WVALID;
wire [11:0] M_AXI_ETH_DMA1_ARID;
wire [11:0] M_AXI_ETH_DMA1_AWID;
wire [11:0] M_AXI_ETH_DMA1_WID;
wire [31:0] M_AXI_ETH_DMA1_ARADDR;
wire [31:0] M_AXI_ETH_DMA1_AWADDR;
wire [31:0] M_AXI_ETH_DMA1_WDATA;
wire [3:0] M_AXI_ETH_DMA1_WSTRB;
wire M_AXI_ETH_DMA1_ARREADY;
wire M_AXI_ETH_DMA1_AWREADY;
wire M_AXI_ETH_DMA1_BVALID;
wire M_AXI_ETH_DMA1_RLAST;
wire M_AXI_ETH_DMA1_RVALID;
wire M_AXI_ETH_DMA1_WREADY;
wire [1:0] M_AXI_ETH_DMA1_BRESP;
wire [1:0] M_AXI_ETH_DMA1_RRESP;
wire [31:0] M_AXI_ETH_DMA1_RDATA;
wire M_AXI_NET1_ARVALID;
wire M_AXI_NET1_AWVALID;
wire M_AXI_NET1_BREADY;
wire M_AXI_NET1_RREADY;
wire M_AXI_NET1_WVALID;
wire [11:0] M_AXI_NET1_ARID;
wire [11:0] M_AXI_NET1_AWID;
wire [11:0] M_AXI_NET1_WID;
wire [31:0] M_AXI_NET1_ARADDR;
wire [31:0] M_AXI_NET1_AWADDR;
wire [31:0] M_AXI_NET1_WDATA;
wire [3:0] M_AXI_NET1_WSTRB;
wire M_AXI_NET1_ARREADY;
wire M_AXI_NET1_AWREADY;
wire M_AXI_NET1_BVALID;
wire M_AXI_NET1_RLAST;
wire M_AXI_NET1_RVALID;
wire M_AXI_NET1_WREADY;
wire [1:0] M_AXI_NET1_BRESP;
wire [1:0] M_AXI_NET1_RRESP;
wire [31:0] M_AXI_NET1_RDATA;
wire M_AXI_NET2_ARVALID;
wire M_AXI_NET2_AWVALID;
wire M_AXI_NET2_BREADY;
wire M_AXI_NET2_RREADY;
wire M_AXI_NET2_WVALID;
wire [11:0] M_AXI_NET2_ARID;
wire [11:0] M_AXI_NET2_AWID;
wire [11:0] M_AXI_NET2_WID;
wire [31:0] M_AXI_NET2_ARADDR;
wire [31:0] M_AXI_NET2_AWADDR;
wire [31:0] M_AXI_NET2_WDATA;
wire [3:0] M_AXI_NET2_WSTRB;
wire M_AXI_NET2_ARREADY;
wire M_AXI_NET2_AWREADY;
wire M_AXI_NET2_BVALID;
wire M_AXI_NET2_RLAST;
wire M_AXI_NET2_RVALID;
wire M_AXI_NET2_WREADY;
wire [1:0] M_AXI_NET2_BRESP;
wire [1:0] M_AXI_NET2_RRESP;
wire [31:0] M_AXI_NET2_RDATA;
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;
wire M_AXI_JESD0_ARVALID;
wire M_AXI_JESD0_AWVALID;
wire M_AXI_JESD0_BREADY;
wire M_AXI_JESD0_RREADY;
wire M_AXI_JESD0_WVALID;
wire [11:0] M_AXI_JESD0_ARID;
wire [11:0] M_AXI_JESD0_AWID;
wire [11:0] M_AXI_JESD0_WID;
wire [31:0] M_AXI_JESD0_ARADDR;
wire [31:0] M_AXI_JESD0_AWADDR;
wire [31:0] M_AXI_JESD0_WDATA;
wire [3:0] M_AXI_JESD0_WSTRB;
wire M_AXI_JESD0_ARREADY;
wire M_AXI_JESD0_AWREADY;
wire M_AXI_JESD0_BVALID;
wire M_AXI_JESD0_RLAST;
wire M_AXI_JESD0_RVALID;
wire M_AXI_JESD0_WREADY;
wire [1:0] M_AXI_JESD0_BRESP;
wire [1:0] M_AXI_JESD0_RRESP;
wire [31:0] M_AXI_JESD0_RDATA;
wire M_AXI_JESD1_ARVALID;
wire M_AXI_JESD1_AWVALID;
wire M_AXI_JESD1_BREADY;
wire M_AXI_JESD1_RREADY;
wire M_AXI_JESD1_WVALID;
wire [11:0] M_AXI_JESD1_ARID;
wire [11:0] M_AXI_JESD1_AWID;
wire [11:0] M_AXI_JESD1_WID;
wire [31:0] M_AXI_JESD1_ARADDR;
wire [31:0] M_AXI_JESD1_AWADDR;
wire [31:0] M_AXI_JESD1_WDATA;
wire [3:0] M_AXI_JESD1_WSTRB;
wire M_AXI_JESD1_ARREADY;
wire M_AXI_JESD1_AWREADY;
wire M_AXI_JESD1_BVALID;
wire M_AXI_JESD1_RLAST;
wire M_AXI_JESD1_RVALID;
wire M_AXI_JESD1_WREADY;
wire [1:0] M_AXI_JESD1_BRESP;
wire [1:0] M_AXI_JESD1_RRESP;
wire [31:0] M_AXI_JESD1_RDATA;
// White Rabbit
wire wr_uart_txd;
wire wr_uart_rxd;
wire pps_wr_refclk;
wire wr_ref_clk;
// AXI bus from PS to WR Core
wire m_axi_wr_clk;
wire [31:0] m_axi_wr_araddr;
wire [0:0] m_axi_wr_arready;
wire [0:0] m_axi_wr_arvalid;
wire [31:0] m_axi_wr_awaddr;
wire [0:0] m_axi_wr_awready;
wire [0:0] m_axi_wr_awvalid;
wire [0:0] m_axi_wr_bready;
wire [1:0] m_axi_wr_bresp;
wire [0:0] m_axi_wr_bvalid;
wire [31:0] m_axi_wr_rdata;
wire [0:0] m_axi_wr_rready;
wire [1:0] m_axi_wr_rresp;
wire [0:0] m_axi_wr_rvalid;
wire [31:0] m_axi_wr_wdata;
wire [0:0] m_axi_wr_wready;
wire [3:0] m_axi_wr_wstrb;
wire [0:0] m_axi_wr_wvalid;
wire [63:0] ps_gpio_out;
wire [63:0] ps_gpio_in;
wire [63:0] ps_gpio_tri;
wire [15:0] IRQ_F2P;
wire FCLK_CLK0;
wire FCLK_CLK1;
wire FCLK_CLK2;
wire FCLK_CLK3;
wire clk100;
wire clk40;
wire meas_clk_ref;
wire bus_clk;
wire ce_clk;
wire gige_refclk;
wire gige_refclk_bufg;
wire xgige_refclk;
wire xgige_clk156;
wire xgige_dclk;
wire global_rst;
wire radio_rst;
wire bus_rst;
wire FCLK_RESET0_N;
wire clk40_rst;
wire clk40_rstn;
wire [1:0] USB0_PORT_INDCTL;
wire USB0_VBUS_PWRSELECT;
wire USB0_VBUS_PWRFAULT;
wire ref_clk;
wire wr_refclk_buf;
wire netclk_buf;
wire meas_clk;
wire ddr3_dma_clk;
wire meas_clk_reset;
wire meas_clk_locked;
wire enable_ref_clk_async;
wire pps_radioclk1x_iob;
wire pps_radioclk1x;
wire [3:0] pps_select;
wire pps_out_enb;
wire [1:0] pps_select_sfp;
wire pps_refclk;
wire export_pps_radioclk;
wire radio_clk;
wire radio_clk_2x;
wire qsfp_sda_i;
wire qsfp_sda_o;
wire qsfp_sda_t;
wire qsfp_scl_i;
wire qsfp_scl_o;
wire qsfp_scl_t;
/////////////////////////////////////////////////////////////////////
//
// Resets
//
//////////////////////////////////////////////////////////////////////
// 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, based on the global_rst.
reset_sync radio_reset_gen (
.clk(radio_clk),
.reset_in(global_rst),
.reset_out(radio_rst)
);
// Synchronous reset for the bus_clk domain, based on the global_rst.
reset_sync bus_reset_gen (
.clk(bus_clk),
.reset_in(global_rst),
.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;
/////////////////////////////////////////////////////////////////////
//
// Timing
//
//////////////////////////////////////////////////////////////////////
// Clocks from the PS
//
// These clocks appear to have BUFGs already instantiated by the ip generator.
// Simply rename them here for clarity.
// FCLK_CLK0 : 100 MHz
// FCLK_CLK1 : 40 MHz
// FCLK_CLK2 : 166.6667 MHz
// FCLK_CLK3 : 200 MHz
assign clk100 = FCLK_CLK0;
assign clk40 = FCLK_CLK1;
assign meas_clk_ref = FCLK_CLK2;
assign bus_clk = FCLK_CLK3;
//If bus_clk freq ever changes, update this paramter accordingly.
localparam BUS_CLK_RATE = 32'd200000000; //200 MHz bus_clk rate.
n3xx_clocking n3xx_clocking_i (
.enable_ref_clk_async(enable_ref_clk_async),
.FPGA_REFCLK_P(FPGA_REFCLK_P),
.FPGA_REFCLK_N(FPGA_REFCLK_N),
.ref_clk(ref_clk),
.WB_20MHz_P(WB_20MHZ_P),
.WB_20MHz_N(WB_20MHZ_N),
.wr_refclk_buf(wr_refclk_buf),
.NETCLK_REF_P(NETCLK_REF_P),
.NETCLK_REF_N(NETCLK_REF_N),
.netclk_buf(netclk_buf),
.NETCLK_P(NETCLK_P),
.NETCLK_N(NETCLK_N),
.gige_refclk_buf(gige_refclk),
.MGT156MHZ_CLK1_P(MGT156MHZ_CLK1_P),
.MGT156MHZ_CLK1_N(MGT156MHZ_CLK1_N),
.xgige_refclk_buf(xgige_refclk),
.misc_clks_ref(meas_clk_ref),
.meas_clk(meas_clk),
.ddr3_dma_clk(ddr3_dma_clk),
.misc_clks_reset(meas_clk_reset),
.misc_clks_locked(meas_clk_locked),
.clk200(bus_clk),
.ce_clk(ce_clk),
.ext_pps_from_pin(REF_1PPS_IN),
.gps_pps_from_pin(GPS_1PPS),
.pps_select(pps_select),
.pps_refclk(pps_refclk)
);
// Drive the rear panel connector with another controllable copy of the post-TDC PPS
// that SW can enable/disable. The user is free to hack this to be whatever
// they desire. Flop the PPS signal one more time in order that it can be packed into
// an IOB. This extra flop stage matches the additional flop inside DbCore to allow
// pps_radioclk1x and pps_out_radioclk to be in sync with one another.
synchronizer #(
.FALSE_PATH_TO_IN(0)
) pps_export_dsync (
.clk(radio_clk), .rst(1'b0), .in(pps_out_enb), .out(export_pps_radioclk)
);
// The radio_clk rate is between [122.88M, 250M] for all known N3xx variants,
// resulting in approximately [8ns, 4ns] periods. To pulse-extend the PPS output,
// we create a 25 bit-wide counter, creating ~[.262s, .131s] long output high pulses,
// variable depending on our radio_clk rate. Create two of the same output signal
// in order that the PPS_OUT gets packed into an IOB for tight timing.
reg [24:0] pps_out_count = 'b0;
reg pps_out_radioclk = 1'b0;
reg pps_led_radioclk = 1'b0;
always @(posedge radio_clk) begin
if (export_pps_radioclk) begin
if (pps_radioclk1x_iob) begin
pps_out_radioclk <= 1'b1;
pps_led_radioclk <= 1'b1;
pps_out_count <= {25{1'b1}};
end else begin
if (pps_out_count > 0) begin
pps_out_count <= pps_out_count - 1'b1;
end else begin
pps_out_radioclk <= 1'b0;
pps_led_radioclk <= 1'b0;
end
end
end else begin
pps_out_radioclk <= 1'b0;
pps_led_radioclk <= 1'b0;
end
end
// Local to output.
assign REF_1PPS_OUT = pps_out_radioclk;
assign PANEL_LED_PPS = pps_led_radioclk;
/////////////////////////////////////////////////////////////////////
//
// SFP, QSFP and NPIO MGT Connections
//
//////////////////////////////////////////////////////////////////////
wire reg_wr_req_npio;
wire [REG_AWIDTH-1:0] reg_wr_addr_npio;
wire [REG_DWIDTH-1:0] reg_wr_data_npio;
wire reg_rd_req_npio;
wire [REG_AWIDTH-1:0] reg_rd_addr_npio;
wire reg_rd_resp_npio, reg_rd_resp_npio0, reg_rd_resp_npio1;
wire [REG_DWIDTH-1:0] reg_rd_data_npio, reg_rd_data_npio0, reg_rd_data_npio1;
regport_resp_mux #(
.WIDTH (REG_DWIDTH),
.NUM_SLAVES (2)
) npio_resp_mux_i(
.clk(bus_clk), .reset(bus_rst),
.sla_rd_resp({reg_rd_resp_npio0, reg_rd_resp_npio1}),
.sla_rd_data({reg_rd_data_npio0, reg_rd_data_npio1}),
.mst_rd_resp(reg_rd_resp_npio), .mst_rd_data(reg_rd_data_npio)
);
//--------------------------------------------------------------
// SFP/MGT Reference Clocks
//--------------------------------------------------------------
// We support the HG, XG, XA, AA targets, all of which require
// the 156.25MHz reference clock. Instantiate it here.
ten_gige_phy_clk_gen xgige_clk_gen_i (
.refclk_ibuf(xgige_refclk),
.clk156(xgige_clk156),
.dclk(xgige_dclk)
);
wire qpllreset;
wire qpllreset_sfp0, qpllreset_sfp1, qpllreset_npio0, qpllreset_npio1;
wire qplllock;
wire qplloutclk;
wire qplloutrefclk;
// We reuse this GT_COMMON wrapper for both ethernet and Aurora because
// the behavior is identical
ten_gig_eth_pcs_pma_gt_common # (
.WRAPPER_SIM_GTRESET_SPEEDUP("TRUE") //Does not affect hardware
) ten_gig_eth_pcs_pma_gt_common_block (
.refclk(xgige_refclk),
.qpllreset(qpllreset), //from 2nd sfp
.qplllock(qplllock),
.qplloutclk(qplloutclk),
.qplloutrefclk(qplloutrefclk),
.qpllrefclksel(3'b101 /*GTSOUTHREFCLK0*/)
);
// The quad's QPLL should reset if any of the channels request it
// This should never really happen because we are not changing the reference clock
// source for the QPLL.
assign qpllreset = qpllreset_sfp0 | qpllreset_sfp1 | qpllreset_npio0 | qpllreset_npio1;
// Use the 156.25MHz reference clock for Aurora
wire aurora_refclk = xgige_refclk;
wire aurora_clk156 = xgige_clk156;
wire aurora_init_clk = xgige_dclk;
// White Rabbit and 1GbE both use the same clocking
`ifdef SFP0_1GBE
`define SFP0_WR_1GBE
`endif
`ifdef SFP0_WR
`define SFP0_WR_1GBE
`endif
`ifdef SFP0_WR_1GBE
// HG and WX targets require the 1GbE clock support
BUFG bufg_gige_refclk_i (
.I(gige_refclk),
.O(gige_refclk_bufg)
);
assign SFP_0_RS0 = 1'b0;
assign SFP_0_RS1 = 1'b0;
`else
assign SFP_0_RS0 = 1'b1;
assign SFP_0_RS1 = 1'b1;
`endif
// SFP 1 is always set to run at ~10Gbps rates.
assign SFP_1_RS0 = 1'b1;
assign SFP_1_RS1 = 1'b1;
// SFP port specific reference clocks
wire sfp0_gt_refclk, sfp1_gt_refclk;
wire sfp0_gb_refclk, sfp1_gb_refclk;
wire sfp0_misc_clk, sfp1_misc_clk;
`ifdef SFP0_10GBE
assign sfp0_gt_refclk = xgige_refclk;
assign sfp0_gb_refclk = xgige_clk156;
assign sfp0_misc_clk = xgige_dclk;
`endif
`ifdef SFP0_WR_1GBE
assign sfp0_gt_refclk = gige_refclk;
assign sfp0_gb_refclk = gige_refclk_bufg;
assign sfp0_misc_clk = gige_refclk_bufg;
`endif
`ifdef SFP0_AURORA
assign sfp0_gt_refclk = aurora_refclk;
assign sfp0_gb_refclk = aurora_clk156;
assign sfp0_misc_clk = aurora_init_clk;
`endif
`ifdef SFP1_10GBE
assign sfp1_gt_refclk = xgige_refclk;
assign sfp1_gb_refclk = xgige_clk156;
assign sfp1_misc_clk = xgige_dclk;
`endif
`ifdef SFP1_1GBE
assign sfp1_gt_refclk = gige_refclk;
assign sfp1_gb_refclk = gige_refclk_bufg;
assign sfp1_misc_clk = gige_refclk_bufg;
`endif
`ifdef SFP1_AURORA
assign sfp1_gt_refclk = aurora_refclk;
assign sfp1_gb_refclk = aurora_clk156;
assign sfp1_misc_clk = aurora_init_clk;
`endif
// Instantiate Aurora MMCM if either of the SFPs
// or NPIOs are Aurora
wire au_tx_clk;
wire au_mmcm_reset;
wire au_user_clk;
wire au_sync_clk;
wire au_mmcm_locked;
wire sfp0_tx_out_clk, sfp1_tx_out_clk;
wire sfp0_gt_pll_lock, sfp1_gt_pll_lock;
wire npio0_tx_out_clk, npio1_tx_out_clk;
wire npio0_gt_pll_lock, npio1_gt_pll_lock;
//NOTE: need to declare one of these defines in order to enable Aurora on
//any SFP or NPIO lane.
`ifdef SFP1_AURORA
`define SFP_AU_MMCM
assign au_tx_clk = sfp1_tx_out_clk;
assign au_mmcm_reset = ~sfp1_gt_pll_lock;
`elsif NPIO0
`define SFP_AU_MMCM
assign au_tx_clk = npio0_tx_out_clk;
assign au_mmcm_reset = ~npio0_gt_pll_lock;
`elsif NPIO1
`define SFP_AU_MMCM
assign au_tx_clk = npio1_tx_out_clk;
assign au_mmcm_reset = ~npio1_gt_pll_lock;
`endif
`ifdef SFP_AU_MMCM
aurora_phy_mmcm au_phy_mmcm_i (
.aurora_tx_clk_unbuf(au_tx_clk),
.mmcm_reset(au_mmcm_reset),
.user_clk(au_user_clk),
.sync_clk(au_sync_clk),
.mmcm_locked(au_mmcm_locked)
);
`else
assign au_user_clk = 1'b0;
assign au_sync_clk = 1'b0;
assign au_mmcm_locked = 1'b0;
`endif
//--------------------------------------------------------------
// NPIO-QSFP MGT Lanes (Example loopback config)
//--------------------------------------------------------------
`ifdef QSFP_LANES
localparam NUM_QSFP_LANES = `QSFP_LANES;
// QSFP wires to the ARM core and the crossbar
// These will only be connected if QSFP is 2x10 GbE
wire [NUM_QSFP_LANES*64-1:0] arm_eth_qsfp_tx_tdata_b;
wire [NUM_QSFP_LANES-1:0] arm_eth_qsfp_tx_tvalid_b;
wire [NUM_QSFP_LANES-1:0] arm_eth_qsfp_tx_tlast_b;
wire [NUM_QSFP_LANES-1:0] arm_eth_qsfp_tx_tready_b;
wire [NUM_QSFP_LANES*4-1:0] arm_eth_qsfp_tx_tuser_b;
wire [NUM_QSFP_LANES*8-1:0] arm_eth_qsfp_tx_tkeep_b;
wire [NUM_QSFP_LANES*64-1:0] arm_eth_qsfp_rx_tdata_b;
wire [NUM_QSFP_LANES-1:0] arm_eth_qsfp_rx_tvalid_b;
wire [NUM_QSFP_LANES-1:0] arm_eth_qsfp_rx_tlast_b;
wire [NUM_QSFP_LANES-1:0] arm_eth_qsfp_rx_tready_b;
wire [NUM_QSFP_LANES*4-1:0] arm_eth_qsfp_rx_tuser_b;
wire [NUM_QSFP_LANES*8-1:0] arm_eth_qsfp_rx_tkeep_b;
wire [NUM_QSFP_LANES*64-1:0] v2e_qsfp_tdata;
wire [NUM_QSFP_LANES-1:0] v2e_qsfp_tlast;
wire [NUM_QSFP_LANES-1:0] v2e_qsfp_tvalid;
wire [NUM_QSFP_LANES-1:0] v2e_qsfp_tready;
wire [NUM_QSFP_LANES*64-1:0] e2v_qsfp_tdata;
wire [NUM_QSFP_LANES-1:0] e2v_qsfp_tlast;
wire [NUM_QSFP_LANES-1:0] e2v_qsfp_tvalid;
wire [NUM_QSFP_LANES-1:0] e2v_qsfp_tready;
wire [NUM_QSFP_LANES-1:0] qsfp_link_up;
// QSFP quad's specific reference clocks
wire qsfp_gt_refclk;
wire qsfp_gb_refclk;
wire qsfp_misc_clk;
wire qsfp_qplloutclk;
wire qsfp_qplloutrefclk;
wire qsfp_qplllock;
wire qsfp_qpllreset;
wire qsfp_gt_tx_out_clk;
wire qsfp_gt_pll_lock;
wire qsfp_au_user_clk;
wire qsfp_au_sync_clk;
wire qsfp_au_mmcm_locked;
`ifdef QSFP_10GBE
assign qsfp_gt_refclk = xgige_refclk;
assign qsfp_gb_refclk = xgige_clk156;
assign qsfp_misc_clk = xgige_dclk;
`endif
`ifdef QSFP_AURORA
assign qsfp_gt_refclk = aurora_refclk;
assign qsfp_gb_refclk = aurora_clk156;
assign qsfp_misc_clk = aurora_init_clk;
`endif
// We reuse this GT_COMMON wrapper for both ethernet and Aurora because
// the behavior is identical
ten_gig_eth_pcs_pma_gt_common # (
.WRAPPER_SIM_GTRESET_SPEEDUP("TRUE") //Does not affect hardware
) qsfp_gt_common_block (
.refclk(xgige_refclk),
.qpllreset(qsfp_qpllreset),
.qplllock(qsfp_qplllock),
.qplloutclk(qsfp_qplloutclk),
.qplloutrefclk(qsfp_qplloutrefclk),
.qpllrefclksel(3'b001 /*GTREFCLK0*/)
);
`ifdef QSFP_AURORA
aurora_phy_mmcm aurora_phy_mmcm (
.aurora_tx_clk_unbuf(qsfp_gt_tx_out_clk),
.mmcm_reset(~qsfp_gt_pll_lock),
.user_clk(qsfp_au_user_clk),
.sync_clk(qsfp_au_sync_clk),
.mmcm_locked(qsfp_au_mmcm_locked)
);
`else
assign qsfp_au_user_clk = 1'b0;
assign qsfp_au_sync_clk = 1'b0;
assign qsfp_au_mmcm_locked = 1'b0;
`endif
n3xx_mgt_channel_wrapper #(
`ifdef QSFP_10GBE
.PROTOCOL ("10GbE"),
.MDIO_EN (1'b1),
.MDIO_PHYADDR (5'd4),
`elsif QSFP_AURORA
.PROTOCOL ("Aurora"),
.MDIO_EN (1'b0),
`endif
.LANES (NUM_QSFP_LANES),
.PORTNUM_BASE (4),
.REG_DWIDTH (REG_DWIDTH),
.REG_AWIDTH (QSFP_REG_AWIDTH),
.BYTE_MTU (BYTE_MTU),
.RFNOC_PROTOVER (RFNOC_PROTOVER),
.NODE_INST_BASE (0)
) qsfp_wrapper_i (
.areset (global_rst),
.gt_refclk (qsfp_gt_refclk),
.gb_refclk (qsfp_gb_refclk),
.misc_clk (qsfp_misc_clk),
.user_clk (qsfp_au_user_clk),
.sync_clk (qsfp_au_sync_clk),
.gt_tx_out_clk_unbuf(qsfp_gt_tx_out_clk),
.bus_clk (bus_clk),
.bus_rst (bus_rst),
// GT Common
.qpllrefclklost (),
.qplllock (qsfp_qplllock),
.qplloutclk (qsfp_qplloutclk),
.qplloutrefclk (qsfp_qplloutrefclk),
.qpllreset (qsfp_qpllreset),
// Aurora MMCM
.mmcm_locked (qsfp_au_mmcm_locked),
.gt_pll_lock (qsfp_gt_pll_lock),
.txp (QSFP_TX_P),
.txn (QSFP_TX_N),
.rxp (QSFP_RX_P),
.rxn (QSFP_RX_N),
.mod_present_n (QSFP_PRESENT_B),
.mod_rxlos (1'b0),
.mod_tx_fault (1'b0),
.mod_tx_disable (),
.mod_int_n (QSFP_INT_B),
.mod_reset_n (QSFP_RESET_B),
.mod_lpmode (QSFP_LPMODE),
.mod_sel_n (QSFP_MODSEL_B),
// Clock and reset
.s_axi_aclk (clk40),
.s_axi_aresetn (clk40_rstn),
// AXI4-Lite: Write address port (domain: s_axi_aclk)
.s_axi_awaddr (M_AXI_NET2_AWADDR[QSFP_REG_AWIDTH-1:0]),
.s_axi_awvalid (M_AXI_NET2_AWVALID),
.s_axi_awready (M_AXI_NET2_AWREADY),
// AXI4-Lite: Write data port (domain: s_axi_aclk)
.s_axi_wdata (M_AXI_NET2_WDATA),
.s_axi_wstrb (M_AXI_NET2_WSTRB),
.s_axi_wvalid (M_AXI_NET2_WVALID),
.s_axi_wready (M_AXI_NET2_WREADY),
// AXI4-Lite: Write response port (domain: s_axi_aclk)
.s_axi_bresp (M_AXI_NET2_BRESP),
.s_axi_bvalid (M_AXI_NET2_BVALID),
.s_axi_bready (M_AXI_NET2_BREADY),
// AXI4-Lite: Read address port (domain: s_axi_aclk)
.s_axi_araddr (M_AXI_NET2_ARADDR[QSFP_REG_AWIDTH-1:0]),
.s_axi_arvalid (M_AXI_NET2_ARVALID),
.s_axi_arready (M_AXI_NET2_ARREADY),
// AXI4-Lite: Read data port (domain: s_axi_aclk)
.s_axi_rdata (M_AXI_NET2_RDATA),
.s_axi_rresp (M_AXI_NET2_RRESP),
.s_axi_rvalid (M_AXI_NET2_RVALID),
.s_axi_rready (M_AXI_NET2_RREADY),
// Ethernet to Vita
.e2v_tdata (e2v_qsfp_tdata),
.e2v_tlast (e2v_qsfp_tlast),
.e2v_tvalid (e2v_qsfp_tvalid),
.e2v_tready (e2v_qsfp_tready),
// Vita to Ethernet
.v2e_tdata (v2e_qsfp_tdata),
.v2e_tlast (v2e_qsfp_tlast),
.v2e_tvalid (v2e_qsfp_tvalid),
.v2e_tready (v2e_qsfp_tready),
// Ethernet to CPU
.e2c_tdata (arm_eth_qsfp_rx_tdata_b),
.e2c_tkeep (arm_eth_qsfp_rx_tkeep_b),
.e2c_tlast (arm_eth_qsfp_rx_tlast_b),
.e2c_tvalid (arm_eth_qsfp_rx_tvalid_b),
.e2c_tready (arm_eth_qsfp_rx_tready_b),
// CPU to Ethernet
.c2e_tdata (arm_eth_qsfp_tx_tdata_b),
.c2e_tkeep (arm_eth_qsfp_tx_tkeep_b),
.c2e_tlast (arm_eth_qsfp_tx_tlast_b),
.c2e_tvalid (arm_eth_qsfp_tx_tvalid_b),
.c2e_tready (arm_eth_qsfp_tx_tready_b),
// Sideband White Rabbit Control
.wr_reset_n (1'b1),
.wr_refclk (1'b0),
.wr_dac_sclk (),
.wr_dac_din (),
.wr_dac_clr_n (),
.wr_dac_cs_n (),
.wr_dac_ldac_n (),
.wr_eeprom_scl_o(),
.wr_eeprom_scl_i(1'b0),
.wr_eeprom_sda_o(),
.wr_eeprom_sda_i(1'b0),
.wr_uart_rx (1'b0),
.wr_uart_tx (),
.mod_pps (),
.mod_refclk (),
// WR AXI Control
.wr_axi_aclk (),
.wr_axi_aresetn (1'b1),
.wr_axi_awaddr (),
.wr_axi_awvalid (),
.wr_axi_awready (),
.wr_axi_wdata (),
.wr_axi_wstrb (),
.wr_axi_wvalid (),
.wr_axi_wready (),
.wr_axi_bresp (),
.wr_axi_bvalid (),
.wr_axi_bready (),
.wr_axi_araddr (),
.wr_axi_arvalid (),
.wr_axi_arready (),
.wr_axi_rdata (),
.wr_axi_rresp (),
.wr_axi_rvalid (),
.wr_axi_rready (),
.wr_axi_rlast (),
.port_info (),
.device_id (device_id),
.link_up (qsfp_link_up),
.activity ()
);
assign QSFP_I2C_SCL = qsfp_scl_t ? 1'bz : qsfp_scl_o;
assign qsfp_scl_i = QSFP_I2C_SCL;
assign QSFP_I2C_SDA = qsfp_sda_t ? 1'bz : qsfp_sda_o;
assign qsfp_sda_i = QSFP_I2C_SDA;
assign QSFP_LED = |qsfp_link_up;
`else
axi_dummy #(
.DEC_ERR(1'b0)
) inst_axi_dummy_qsfp (
.s_axi_aclk(bus_clk),
.s_axi_areset(bus_rst),
.s_axi_awaddr(M_AXI_NET2_AWADDR),
.s_axi_awvalid(M_AXI_NET2_AWVALID),
.s_axi_awready(M_AXI_NET2_AWREADY),
.s_axi_wdata(M_AXI_NET2_WDATA),
.s_axi_wvalid(M_AXI_NET2_WVALID),
.s_axi_wready(M_AXI_NET2_WREADY),
.s_axi_bresp(M_AXI_NET2_BRESP),
.s_axi_bvalid(M_AXI_NET2_BVALID),
.s_axi_bready(M_AXI_NET2_BREADY),
.s_axi_araddr(M_AXI_NET2_ARADDR),
.s_axi_arvalid(M_AXI_NET2_ARVALID),
.s_axi_arready(M_AXI_NET2_ARREADY),
.s_axi_rdata(M_AXI_NET2_RDATA),
.s_axi_rresp(M_AXI_NET2_RRESP),
.s_axi_rvalid(M_AXI_NET2_RVALID),
.s_axi_rready(M_AXI_NET2_RREADY)
);
assign qsfp_scl_i = qsfp_scl_t ? 1'b1 : qsfp_scl_o;
assign qsfp_sda_i = qsfp_sda_t ? 1'b1 : qsfp_sda_o;
`endif
//--------------------------------------------------------------
// NPIO MGT Lanes (Example loopback config)
//--------------------------------------------------------------
`ifdef NPIO_LANES
wire [127:0] npio_loopback_tdata;
wire [1:0] npio_loopback_tvalid;
wire [1:0] npio_loopback_tready;
wire [1:0] npio_loopback_tlast;
n3xx_mgt_io_core #(
.PROTOCOL ("Aurora"),
.REG_BASE (14'h00), // Base offset removed by n3xx_core
.REG_DWIDTH (REG_DWIDTH), // Width of the AXI4-Lite data bus (must be 32 or 64)
.REG_AWIDTH (REG_AWIDTH), // Width of the address bus
.PORTNUM (8'd2),
.MDIO_EN (0)
) npio_ln_0_i (
.areset (global_rst),
.gt_refclk (aurora_refclk),
.gb_refclk (aurora_clk156),
.misc_clk (aurora_init_clk),
.user_clk (au_user_clk),
.sync_clk (au_sync_clk),
.gt_tx_out_clk_unbuf(npio0_tx_out_clk),
.bus_clk (bus_clk),//clk for status reg reads to mdio interface
.bus_rst (bus_rst),
.qpllreset (qpllreset_npio0),
.qplloutclk (qplloutclk),
.qplloutrefclk (qplloutrefclk),
.qplllock (qplllock),
.qpllrefclklost (),
.rxp (NPIO_RX0_P),
.rxn (NPIO_RX0_N),
.txp (NPIO_TX0_P),
.txn (NPIO_TX0_N),
.sfpp_rxlos (1'b0),
.sfpp_tx_fault (1'b0),
//RegPort
.reg_wr_req (reg_wr_req_npio),
.reg_wr_addr (reg_wr_addr_npio),
.reg_wr_data (reg_wr_data_npio),
.reg_rd_req (reg_rd_req_npio),
.reg_rd_addr (reg_rd_addr_npio),
.reg_rd_resp (reg_rd_resp_npio0),
.reg_rd_data (reg_rd_data_npio0),
//DATA (loopback mode)
.s_axis_tdata (npio_loopback_tdata[63:0]), //Data to aurora core
.s_axis_tuser (4'b0),
.s_axis_tvalid (npio_loopback_tvalid[0]),
.s_axis_tlast (npio_loopback_tlast[0]),
.s_axis_tready (npio_loopback_tready[0]),
.m_axis_tdata (npio_loopback_tdata[63:0]), //Data from aurora core
.m_axis_tuser (),
.m_axis_tvalid (npio_loopback_tvalid[0]),
.m_axis_tlast (npio_loopback_tlast[0]),
.m_axis_tready (npio_loopback_tready[0]),
.mmcm_locked (au_mmcm_locked),
.gt_pll_lock (npio0_gt_pll_lock)
);
n3xx_mgt_io_core #(
.PROTOCOL ("Aurora"),
.REG_BASE (14'h40), // Base offset removed by n3xx_core
.REG_DWIDTH (REG_DWIDTH), // Width of the AXI4-Lite data bus (must be 32 or 64)
.REG_AWIDTH (REG_AWIDTH), // Width of the address bus
.PORTNUM (8'd3),
.MDIO_EN (0)
) npio_ln_1_i (
.areset (global_rst),
.gt_refclk (aurora_refclk),
.gb_refclk (aurora_clk156),
.misc_clk (aurora_init_clk),
.user_clk (au_user_clk),
.sync_clk (au_sync_clk),
.gt_tx_out_clk_unbuf(npio1_tx_out_clk),
.bus_clk (bus_clk),//clk for status reg reads to mdio interface
.bus_rst (bus_rst),
.qpllreset (qpllreset_npio1),
.qplloutclk (qplloutclk),
.qplloutrefclk (qplloutrefclk),
.qplllock (qplllock),
.qpllrefclklost (),
.rxp (NPIO_RX1_P),
.rxn (NPIO_RX1_N),
.txp (NPIO_TX1_P),
.txn (NPIO_TX1_N),
.sfpp_rxlos (1'b0),
.sfpp_tx_fault (1'b0),
//RegPort
.reg_wr_req (reg_wr_req_npio),
.reg_wr_addr (reg_wr_addr_npio),
.reg_wr_data (reg_wr_data_npio),
.reg_rd_req (reg_rd_req_npio),
.reg_rd_addr (reg_rd_addr_npio),
.reg_rd_resp (reg_rd_resp_npio1),
.reg_rd_data (reg_rd_data_npio1),
//DATA (loopback mode)
.s_axis_tdata (npio_loopback_tdata[127:64]), //Data to aurora core
.s_axis_tuser (4'b0),
.s_axis_tvalid (npio_loopback_tvalid[1]),
.s_axis_tlast (npio_loopback_tlast[1]),
.s_axis_tready (npio_loopback_tready[1]),
.m_axis_tdata (npio_loopback_tdata[127:64]), //Data from aurora core
.m_axis_tuser (),
.m_axis_tvalid (npio_loopback_tvalid[1]),
.m_axis_tlast (npio_loopback_tlast[1]),
.m_axis_tready (npio_loopback_tready[1]),
.mmcm_locked (au_mmcm_locked),
.gt_pll_lock (npio1_gt_pll_lock)
);
`else
assign reg_rd_resp_npio0 = 1'b0;
assign reg_rd_data_npio0 = 'h0;
assign reg_rd_resp_npio1 = 1'b0;
assign reg_rd_data_npio1 = 'h0;
assign npio0_gt_pll_lock = 1'b1;
assign npio1_gt_pll_lock = 1'b1;
assign qpllreset_npio0 = 1'b0;
assign qpllreset_npio1 = 1'b0;
`endif
// ARM ethernet 0 bridge signals
wire [63:0] arm_eth0_tx_tdata;
wire arm_eth0_tx_tvalid;
wire arm_eth0_tx_tlast;
wire arm_eth0_tx_tready;
wire [3:0] arm_eth0_tx_tuser;
wire [7:0] arm_eth0_tx_tkeep;
wire [63:0] arm_eth0_tx_tdata_b;
wire arm_eth0_tx_tvalid_b;
wire arm_eth0_tx_tlast_b;
wire arm_eth0_tx_tready_b;
wire [3:0] arm_eth0_tx_tuser_b;
wire [7:0] arm_eth0_tx_tkeep_b;
wire [63:0] arm_eth_sfp0_tx_tdata_b;
wire arm_eth_sfp0_tx_tvalid_b;
wire arm_eth_sfp0_tx_tlast_b;
wire arm_eth_sfp0_tx_tready_b;
wire [3:0] arm_eth_sfp0_tx_tuser_b;
wire [7:0] arm_eth_sfp0_tx_tkeep_b;
wire [63:0] arm_eth0_rx_tdata;
wire arm_eth0_rx_tvalid;
wire arm_eth0_rx_tlast;
wire arm_eth0_rx_tready;
wire [3:0] arm_eth0_rx_tuser;
wire [7:0] arm_eth0_rx_tkeep;
wire [63:0] arm_eth0_rx_tdata_b;
wire arm_eth0_rx_tvalid_b;
wire arm_eth0_rx_tlast_b;
wire arm_eth0_rx_tready_b;
wire [3:0] arm_eth0_rx_tuser_b;
wire [7:0] arm_eth0_rx_tkeep_b;
wire [63:0] arm_eth_sfp0_rx_tdata_b;
wire arm_eth_sfp0_rx_tvalid_b;
wire arm_eth_sfp0_rx_tlast_b;
wire arm_eth_sfp0_rx_tready_b;
wire [3:0] arm_eth_sfp0_rx_tuser_b;
wire [7:0] arm_eth_sfp0_rx_tkeep_b;
wire arm_eth0_rx_irq;
wire arm_eth0_tx_irq;
// ARM ethernet 1 bridge signals
wire [63:0] arm_eth1_tx_tdata;
wire arm_eth1_tx_tvalid;
wire arm_eth1_tx_tlast;
wire arm_eth1_tx_tready;
wire [3:0] arm_eth1_tx_tuser;
wire [7:0] arm_eth1_tx_tkeep;
wire [63:0] arm_eth1_tx_tdata_b;
wire arm_eth1_tx_tvalid_b;
wire arm_eth1_tx_tlast_b;
wire arm_eth1_tx_tready_b;
wire [3:0] arm_eth1_tx_tuser_b;
wire [7:0] arm_eth1_tx_tkeep_b;
wire [63:0] arm_eth_sfp1_tx_tdata_b;
wire arm_eth_sfp1_tx_tvalid_b;
wire arm_eth_sfp1_tx_tlast_b;
wire arm_eth_sfp1_tx_tready_b;
wire [3:0] arm_eth_sfp1_tx_tuser_b;
wire [7:0] arm_eth_sfp1_tx_tkeep_b;
wire [63:0] arm_eth1_rx_tdata;
wire arm_eth1_rx_tvalid;
wire arm_eth1_rx_tlast;
wire arm_eth1_rx_tready;
wire [3:0] arm_eth1_rx_tuser;
wire [7:0] arm_eth1_rx_tkeep;
wire [63:0] arm_eth1_rx_tdata_b;
wire arm_eth1_rx_tvalid_b;
wire arm_eth1_rx_tlast_b;
wire arm_eth1_rx_tready_b;
wire [3:0] arm_eth1_rx_tuser_b;
wire [7:0] arm_eth1_rx_tkeep_b;
wire [63:0] arm_eth_sfp1_rx_tdata_b;
wire arm_eth_sfp1_rx_tvalid_b;
wire arm_eth_sfp1_rx_tlast_b;
wire arm_eth_sfp1_rx_tready_b;
wire [3:0] arm_eth_sfp1_rx_tuser_b;
wire [7:0] arm_eth_sfp1_rx_tkeep_b;
wire arm_eth1_tx_irq;
wire arm_eth1_rx_irq;
// Vita to Ethernet
wire [63:0] v2e0_tdata;
wire v2e0_tlast;
wire v2e0_tvalid;
wire v2e0_tready;
wire [63:0] v2e1_tdata;
wire v2e1_tlast;
wire v2e1_tvalid;
wire v2e1_tready;
wire [63:0] v2e_sfp0_tdata;
wire v2e_sfp0_tlast;
wire v2e_sfp0_tvalid;
wire v2e_sfp0_tready;
wire [63:0] v2e_sfp1_tdata;
wire v2e_sfp1_tlast;
wire v2e_sfp1_tvalid;
wire v2e_sfp1_tready;
// Ethernet to Vita
wire [63:0] e2v0_tdata;
wire e2v0_tlast;
wire e2v0_tvalid;
wire e2v0_tready;
wire [63:0] e2v1_tdata;
wire e2v1_tlast;
wire e2v1_tvalid;
wire e2v1_tready;
wire [63:0] e2v_sfp0_tdata;
wire e2v_sfp0_tlast;
wire e2v_sfp0_tvalid;
wire e2v_sfp0_tready;
wire [63:0] e2v_sfp1_tdata;
wire e2v_sfp1_tlast;
wire e2v_sfp1_tvalid;
wire e2v_sfp1_tready;
// Ethernet crossover
wire [63:0] e01_tdata, e10_tdata;
wire [3:0] e01_tuser, e10_tuser;
wire e01_tlast, e01_tvalid, e01_tready;
wire e10_tlast, e10_tvalid, e10_tready;
// Internal Ethernet xport adapter to PS
wire [63:0] h2e_tdata;
wire [7:0] h2e_tkeep;
wire h2e_tlast;
wire h2e_tready;
wire h2e_tvalid;
wire [63:0] e2h_tdata;
wire [7:0] e2h_tkeep;
wire e2h_tlast;
wire e2h_tready;
wire e2h_tvalid;
wire [63:0] m_axis_dma_tdata;
wire m_axis_dma_tlast;
wire m_axis_dma_tready;
wire m_axis_dma_tvalid;
wire [63:0] s_axis_dma_tdata;
wire s_axis_dma_tlast;
wire s_axis_dma_tready;
wire s_axis_dma_tvalid;
// Misc
wire [31:0] sfp_port0_info;
wire [31:0] sfp_port1_info;
wire sfp0_link_up, sfp1_link_up;
wire [15:0] device_id;
/////////////////////////////////////////////////////////////////////
//
// SFP Wrapper 0: Network Interface (1/10G or Aurora)
//
//////////////////////////////////////////////////////////////////////
n3xx_mgt_channel_wrapper #(
.LANES(1),
`ifdef SFP0_10GBE
.PROTOCOL("10GbE"),
.MDIO_EN(1'b1),
.MDIO_PHYADDR(5'd4), // PHYADDR must match the "reg" property for PHY in DTS file
`elsif SFP0_AURORA
.PROTOCOL("Aurora"),
.MDIO_EN(1'b0),
`elsif SFP0_1GBE
.PROTOCOL("1GbE"),
.MDIO_EN(1'b1),
.MDIO_PHYADDR(5'd4), // PHYADDR must match the "reg" property for PHY in DTS file
`elsif SFP0_WR
.PROTOCOL("WhiteRabbit"),
.MDIO_EN(1'b0),
`endif
.REG_DWIDTH(REG_DWIDTH), // Width of the AXI4-Lite data bus (must be 32 or 64)
.REG_AWIDTH(REG_AWIDTH), // Width of the address bus
.PORTNUM_BASE(8'd0),
.BYTE_MTU(BYTE_MTU),
.RFNOC_PROTOVER(RFNOC_PROTOVER),
.NODE_INST_BASE(0)
) sfp_wrapper_0 (
.areset(global_rst),
.gt_refclk(sfp0_gt_refclk),
.gb_refclk(sfp0_gb_refclk),
.misc_clk(sfp0_misc_clk),
.user_clk(au_user_clk),
.sync_clk(au_sync_clk),
.gt_tx_out_clk_unbuf(sfp0_tx_out_clk),
.bus_rst(bus_rst),
.bus_clk(bus_clk),
.qpllreset(qpllreset_sfp0),
.qplllock(qplllock),
.qplloutclk(qplloutclk),
.qplloutrefclk(qplloutrefclk),
.qpllrefclklost(),
.mmcm_locked(au_mmcm_locked),
.gt_pll_lock(sfp0_gt_pll_lock),
.txp(SFP_0_TX_P),
.txn(SFP_0_TX_N),
.rxp(SFP_0_RX_P),
.rxn(SFP_0_RX_N),
.mod_present_n(SFP_0_I2C_NPRESENT),
.mod_rxlos(SFP_0_LOS),
.mod_tx_fault(SFP_0_TXFAULT),
.mod_tx_disable(SFP_0_TXDISABLE),
// Clock and reset
.s_axi_aclk(clk40),
.s_axi_aresetn(clk40_rstn),
// AXI4-Lite: Write address port (domain: s_axi_aclk)
.s_axi_awaddr(M_AXI_NET0_AWADDR[REG_AWIDTH-1:0]),
.s_axi_awvalid(M_AXI_NET0_AWVALID),
.s_axi_awready(M_AXI_NET0_AWREADY),
// AXI4-Lite: Write data port (domain: s_axi_aclk)
.s_axi_wdata(M_AXI_NET0_WDATA),
.s_axi_wstrb(M_AXI_NET0_WSTRB),
.s_axi_wvalid(M_AXI_NET0_WVALID),
.s_axi_wready(M_AXI_NET0_WREADY),
// AXI4-Lite: Write response port (domain: s_axi_aclk)
.s_axi_bresp(M_AXI_NET0_BRESP),
.s_axi_bvalid(M_AXI_NET0_BVALID),
.s_axi_bready(M_AXI_NET0_BREADY),
// AXI4-Lite: Read address port (domain: s_axi_aclk)
.s_axi_araddr(M_AXI_NET0_ARADDR[REG_AWIDTH-1:0]),
.s_axi_arvalid(M_AXI_NET0_ARVALID),
.s_axi_arready(M_AXI_NET0_ARREADY),
// AXI4-Lite: Read data port (domain: s_axi_aclk)
.s_axi_rdata(M_AXI_NET0_RDATA),
.s_axi_rresp(M_AXI_NET0_RRESP),
.s_axi_rvalid(M_AXI_NET0_RVALID),
.s_axi_rready(M_AXI_NET0_RREADY),
// Ethernet to Vita
.e2v_tdata(e2v_sfp0_tdata),
.e2v_tlast(e2v_sfp0_tlast),
.e2v_tvalid(e2v_sfp0_tvalid),
.e2v_tready(e2v_sfp0_tready),
// Vita to Ethernet
.v2e_tdata(v2e_sfp0_tdata),
.v2e_tlast(v2e_sfp0_tlast),
.v2e_tvalid(v2e_sfp0_tvalid),
.v2e_tready(v2e_sfp0_tready),
// Ethernet to CPU
.e2c_tdata(arm_eth_sfp0_rx_tdata_b),
.e2c_tkeep(arm_eth_sfp0_rx_tkeep_b),
.e2c_tlast(arm_eth_sfp0_rx_tlast_b),
.e2c_tvalid(arm_eth_sfp0_rx_tvalid_b),
.e2c_tready(arm_eth_sfp0_rx_tready_b),
// CPU to Ethernet
.c2e_tdata(arm_eth_sfp0_tx_tdata_b),
.c2e_tkeep(arm_eth_sfp0_tx_tkeep_b),
.c2e_tlast(arm_eth_sfp0_tx_tlast_b),
.c2e_tvalid(arm_eth_sfp0_tx_tvalid_b),
.c2e_tready(arm_eth_sfp0_tx_tready_b),
// White Rabbit Specific
`ifdef SFP0_WR
.wr_reset_n (~ps_gpio_out[48]), // reset for WR only
.wr_refclk (wr_refclk_buf),
.wr_dac_sclk (WB_DAC_SCLK),
.wr_dac_din (WB_DAC_DIN),
.wr_dac_clr_n (WB_DAC_NCLR),
.wr_dac_cs_n (WB_DAC_NSYNC),
.wr_dac_ldac_n(WB_DAC_NLDAC),
.wr_eeprom_scl_o(), // storage for delay characterization
.wr_eeprom_scl_i(1'b0), // temp
.wr_eeprom_sda_o(),
.wr_eeprom_sda_i(1'b0), // temp
.wr_uart_rx(wr_uart_rxd), // to/from PS
.wr_uart_tx(wr_uart_txd),
.mod_pps(pps_wr_refclk), // out, reference clock and pps
.mod_refclk(wr_ref_clk),
// WR Slave Port to PS
.wr_axi_aclk(m_axi_wr_clk), // out to PS
.wr_axi_aresetn(1'b1), // in
.wr_axi_awaddr(m_axi_wr_awaddr),
.wr_axi_awvalid(m_axi_wr_awvalid),
.wr_axi_awready(m_axi_wr_awready),
.wr_axi_wdata(m_axi_wr_wdata),
.wr_axi_wstrb(m_axi_wr_wstrb),
.wr_axi_wvalid(m_axi_wr_wvalid),
.wr_axi_wready(m_axi_wr_wready),
.wr_axi_bresp(m_axi_wr_bresp),
.wr_axi_bvalid(m_axi_wr_bvalid),
.wr_axi_bready(m_axi_wr_bready),
.wr_axi_araddr(m_axi_wr_araddr),
.wr_axi_arvalid(m_axi_wr_arvalid),
.wr_axi_arready(m_axi_wr_arready),
.wr_axi_rdata(m_axi_wr_rdata),
.wr_axi_rresp(m_axi_wr_rresp),
.wr_axi_rvalid(m_axi_wr_rvalid),
.wr_axi_rready(m_axi_wr_rready),
.wr_axi_rlast(),
`else
.wr_reset_n(1'b1),
.wr_refclk(1'b0),
.wr_eeprom_scl_i(1'b0),
.wr_eeprom_sda_i(1'b0),
.wr_uart_rx(1'b0),
`endif
// Misc
.port_info(sfp_port0_info),
.device_id(device_id),
// LED
.link_up(sfp0_link_up),
.activity(SFP_0_LED_A)
);
assign ps_gpio_in[60] = ps_gpio_tri[60] ? sfp0_link_up : ps_gpio_out[60];
assign SFP_0_LED_B = sfp0_link_up;
`ifndef SFP0_WR
assign WB_DAC_SCLK = 1'b0;
assign WB_DAC_DIN = 1'b0;
assign WB_DAC_NCLR = 1'b1;
assign WB_DAC_NSYNC = 1'b1;
assign WB_DAC_NLDAC = 1'b1;
assign pps_wr_refclk = 1'b0;
assign wr_ref_clk = 1'b0;
`endif
/////////////////////////////////////////////////////////////////////
//
// SFP Wrapper 1: Network Interface (1/10G or Aurora)
//
//////////////////////////////////////////////////////////////////////
n3xx_mgt_channel_wrapper #(
.LANES(1),
`ifdef SFP1_10GBE
.PROTOCOL("10GbE"),
.MDIO_EN(1'b1),
.MDIO_PHYADDR(5'd4), // PHYADDR must match the "reg" property for PHY in DTS file
`elsif SFP1_AURORA
.PROTOCOL("Aurora"),
.MDIO_EN(1'b0),
`endif
.REG_DWIDTH(REG_DWIDTH), // Width of the AXI4-Lite data bus (must be 32 or 64)
.REG_AWIDTH(REG_AWIDTH), // Width of the address bus
.PORTNUM_BASE(8'd1),
.BYTE_MTU(BYTE_MTU),
.RFNOC_PROTOVER(RFNOC_PROTOVER),
.NODE_INST_BASE(1)
) sfp_wrapper_1 (
.areset(global_rst),
.gt_refclk(sfp1_gt_refclk),
.gb_refclk(sfp1_gb_refclk),
.misc_clk(sfp1_misc_clk),
.user_clk(au_user_clk),
.sync_clk(au_sync_clk),
.gt_tx_out_clk_unbuf(sfp1_tx_out_clk),
.bus_rst(bus_rst),
.bus_clk(bus_clk),
.qpllreset(qpllreset_sfp1),
.qplllock(qplllock),
.qplloutclk(qplloutclk),
.qplloutrefclk(qplloutrefclk),
.qpllrefclklost(),
.mmcm_locked(au_mmcm_locked),
.gt_pll_lock(sfp1_gt_pll_lock),
.txp(SFP_1_TX_P),
.txn(SFP_1_TX_N),
.rxp(SFP_1_RX_P),
.rxn(SFP_1_RX_N),
.mod_rxlos(SFP_1_LOS),
.mod_tx_fault(SFP_1_TXFAULT),
.mod_tx_disable(SFP_1_TXDISABLE),
// Clock and reset
.s_axi_aclk(clk40),
.s_axi_aresetn(clk40_rstn),
// AXI4-Lite: Write address port (domain: s_axi_aclk)
.s_axi_awaddr(M_AXI_NET1_AWADDR[REG_AWIDTH-1:0]),
.s_axi_awvalid(M_AXI_NET1_AWVALID),
.s_axi_awready(M_AXI_NET1_AWREADY),
// AXI4-Lite: Write data port (domain: s_axi_aclk)
.s_axi_wdata(M_AXI_NET1_WDATA),
.s_axi_wstrb(M_AXI_NET1_WSTRB),
.s_axi_wvalid(M_AXI_NET1_WVALID),
.s_axi_wready(M_AXI_NET1_WREADY),
// AXI4-Lite: Write response port (domain: s_axi_aclk)
.s_axi_bresp(M_AXI_NET1_BRESP),
.s_axi_bvalid(M_AXI_NET1_BVALID),
.s_axi_bready(M_AXI_NET1_BREADY),
// AXI4-Lite: Read address port (domain: s_axi_aclk)
.s_axi_araddr(M_AXI_NET1_ARADDR[REG_AWIDTH-1:0]),
.s_axi_arvalid(M_AXI_NET1_ARVALID),
.s_axi_arready(M_AXI_NET1_ARREADY),
// AXI4-Lite: Read data port (domain: s_axi_aclk)
.s_axi_rdata(M_AXI_NET1_RDATA),
.s_axi_rresp(M_AXI_NET1_RRESP),
.s_axi_rvalid(M_AXI_NET1_RVALID),
.s_axi_rready(M_AXI_NET1_RREADY),
// Ethernet to Vita
.e2v_tdata(e2v_sfp1_tdata),
.e2v_tlast(e2v_sfp1_tlast),
.e2v_tvalid(e2v_sfp1_tvalid),
.e2v_tready(e2v_sfp1_tready),
// Vita to Ethernet
.v2e_tdata(v2e_sfp1_tdata),
.v2e_tlast(v2e_sfp1_tlast),
.v2e_tvalid(v2e_sfp1_tvalid),
.v2e_tready(v2e_sfp1_tready),
// Ethernet to CPU
.e2c_tdata(arm_eth_sfp1_rx_tdata_b),
.e2c_tkeep(arm_eth_sfp1_rx_tkeep_b),
.e2c_tlast(arm_eth_sfp1_rx_tlast_b),
.e2c_tvalid(arm_eth_sfp1_rx_tvalid_b),
.e2c_tready(arm_eth_sfp1_rx_tready_b),
// CPU to Ethernet
.c2e_tdata(arm_eth_sfp1_tx_tdata_b),
.c2e_tkeep(arm_eth_sfp1_tx_tkeep_b),
.c2e_tlast(arm_eth_sfp1_tx_tlast_b),
.c2e_tvalid(arm_eth_sfp1_tx_tvalid_b),
.c2e_tready(arm_eth_sfp1_tx_tready_b),
// Misc
.port_info(sfp_port1_info),
.device_id(device_id),
// LED
.link_up(sfp1_link_up),
.activity(SFP_1_LED_A)
);
assign ps_gpio_in[61] = ps_gpio_tri[61] ? sfp1_link_up : ps_gpio_out[61];
assign SFP_1_LED_B = sfp1_link_up;
/////////////////////////////////////////////////////////////////////
//
// Ethernet DMA 0
//
//////////////////////////////////////////////////////////////////////
assign IRQ_F2P[0] = arm_eth0_rx_irq;
assign IRQ_F2P[1] = arm_eth0_tx_irq;
`ifdef QSFP_10GBE
// QSFP+ lanes connect to DMA engines and crossbar
// Connect first QSFP+ 10 GbE port to a DMA engine (and the PS/ARM)
assign arm_eth_qsfp_tx_tdata_b[0*64 +: 64] = arm_eth0_tx_tdata_b;
assign arm_eth_qsfp_tx_tvalid_b[0] = arm_eth0_tx_tvalid_b;
assign arm_eth_qsfp_tx_tlast_b[0] = arm_eth0_tx_tlast_b;
assign arm_eth0_tx_tready_b = arm_eth_qsfp_tx_tready_b[0];
assign arm_eth_qsfp_tx_tuser_b[0*4 +: 4] = arm_eth0_tx_tuser_b;
assign arm_eth_qsfp_tx_tkeep_b[0*8 +: 8] = arm_eth0_tx_tkeep_b;
assign arm_eth0_rx_tdata_b = arm_eth_qsfp_rx_tdata_b[0*64 +: 64];
assign arm_eth0_rx_tvalid_b = arm_eth_qsfp_rx_tvalid_b[0];
assign arm_eth0_rx_tlast_b = arm_eth_qsfp_rx_tlast_b[0];
assign arm_eth_qsfp_rx_tready_b[0] = arm_eth0_rx_tready_b;
assign arm_eth0_rx_tuser_b = arm_eth_qsfp_rx_tuser_b[0*4 +: 4];
assign arm_eth0_rx_tkeep_b = arm_eth_qsfp_rx_tkeep_b[0*8 +: 8];
// Connect first QSFP+ 10 GbE port to the crossbar
assign v2e_qsfp_tdata[0*64 +: 64] = v2e0_tdata;
assign v2e_qsfp_tlast[0] = v2e0_tlast;
assign v2e_qsfp_tvalid[0] = v2e0_tvalid;
assign v2e0_tready = v2e_qsfp_tready[0];
assign e2v0_tdata = e2v_qsfp_tdata[0*64 +: 64];
assign e2v0_tlast = e2v_qsfp_tlast[0];
assign e2v0_tvalid = e2v_qsfp_tvalid[0];
assign e2v_qsfp_tready[0] = e2v0_tready;
// Connect second QSFP+ 10 GbE port to a DMA engine (and the PS/ARM)
assign arm_eth_qsfp_tx_tdata_b[1*64 +: 64] = arm_eth1_tx_tdata_b;
assign arm_eth_qsfp_tx_tvalid_b[1] = arm_eth1_tx_tvalid_b;
assign arm_eth_qsfp_tx_tlast_b[1] = arm_eth1_tx_tlast_b;
assign arm_eth1_tx_tready_b = arm_eth_qsfp_tx_tready_b[1];
assign arm_eth_qsfp_tx_tuser_b[1*4 +: 4] = arm_eth1_tx_tuser_b;
assign arm_eth_qsfp_tx_tkeep_b[1*8 +: 8] = arm_eth1_tx_tkeep_b;
assign arm_eth1_rx_tdata_b = arm_eth_qsfp_rx_tdata_b[1*64 +: 64];
assign arm_eth1_rx_tvalid_b = arm_eth_qsfp_rx_tvalid_b[1];
assign arm_eth1_rx_tlast_b = arm_eth_qsfp_rx_tlast_b[1];
assign arm_eth_qsfp_rx_tready_b[1] = arm_eth1_rx_tready_b;
assign arm_eth1_rx_tuser_b = arm_eth_qsfp_rx_tuser_b[1*4 +: 4];
assign arm_eth1_rx_tkeep_b = arm_eth_qsfp_rx_tkeep_b[1*8 +: 8];
// Connect second QSFP+ 10 GbE port to the crossbar
assign v2e_qsfp_tdata[1*64 +: 64] = v2e1_tdata;
assign v2e_qsfp_tlast[1] = v2e1_tlast;
assign v2e_qsfp_tvalid[1] = v2e1_tvalid;
assign v2e1_tready = v2e_qsfp_tready[1];
assign e2v1_tdata = e2v_qsfp_tdata[1*64 +: 64];
assign e2v1_tlast = e2v_qsfp_tlast[1];
assign e2v1_tvalid = e2v_qsfp_tvalid[1];
assign e2v_qsfp_tready[1] = e2v1_tready;
`else
// SFP+ ports connects to DMA engines and crossbar
// Connect first SFP+ 10 GbE port to a DMA engine (and the PS/ARM)
assign arm_eth_sfp0_tx_tdata_b = arm_eth0_tx_tdata_b;
assign arm_eth_sfp0_tx_tvalid_b = arm_eth0_tx_tvalid_b;
assign arm_eth_sfp0_tx_tlast_b = arm_eth0_tx_tlast_b;
assign arm_eth0_tx_tready_b = arm_eth_sfp0_tx_tready_b;
assign arm_eth_sfp0_tx_tuser_b = arm_eth0_tx_tuser_b;
assign arm_eth_sfp0_tx_tkeep_b = arm_eth0_tx_tkeep_b;
assign arm_eth0_rx_tdata_b = arm_eth_sfp0_rx_tdata_b;
assign arm_eth0_rx_tvalid_b = arm_eth_sfp0_rx_tvalid_b;
assign arm_eth0_rx_tlast_b = arm_eth_sfp0_rx_tlast_b;
assign arm_eth_sfp0_rx_tready_b = arm_eth0_rx_tready_b;
assign arm_eth0_rx_tuser_b = arm_eth_sfp0_rx_tuser_b;
assign arm_eth0_rx_tkeep_b = arm_eth_sfp0_rx_tkeep_b;
// Connect first SFP+ 10 GbE port to the crossbar
assign v2e_sfp0_tdata = v2e0_tdata;
assign v2e_sfp0_tlast = v2e0_tlast;
assign v2e_sfp0_tvalid = v2e0_tvalid;
assign v2e0_tready = v2e_sfp0_tready;
assign e2v0_tdata = e2v_sfp0_tdata;
assign e2v0_tlast = e2v_sfp0_tlast;
assign e2v0_tvalid = e2v_sfp0_tvalid;
assign e2v_sfp0_tready = e2v0_tready;
// Connect second SFP+ 10 GbE port to a DMA engine (and the PS/ARM)
assign arm_eth_sfp1_tx_tdata_b = arm_eth1_tx_tdata_b;
assign arm_eth_sfp1_tx_tvalid_b = arm_eth1_tx_tvalid_b;
assign arm_eth_sfp1_tx_tlast_b = arm_eth1_tx_tlast_b;
assign arm_eth1_tx_tready_b = arm_eth_sfp1_tx_tready_b;
assign arm_eth_sfp1_tx_tuser_b = arm_eth1_tx_tuser_b;
assign arm_eth_sfp1_tx_tkeep_b = arm_eth1_tx_tkeep_b;
assign arm_eth1_rx_tdata_b = arm_eth_sfp1_rx_tdata_b;
assign arm_eth1_rx_tvalid_b = arm_eth_sfp1_rx_tvalid_b;
assign arm_eth1_rx_tlast_b = arm_eth_sfp1_rx_tlast_b;
assign arm_eth_sfp1_rx_tready_b = arm_eth1_rx_tready_b;
assign arm_eth1_rx_tuser_b = arm_eth_sfp1_rx_tuser_b;
assign arm_eth1_rx_tkeep_b = arm_eth_sfp1_rx_tkeep_b;
// Connect first SFP+ 10 GbE port to the crossbar
assign v2e_sfp1_tdata = v2e1_tdata;
assign v2e_sfp1_tlast = v2e1_tlast;
assign v2e_sfp1_tvalid = v2e1_tvalid;
assign v2e1_tready = v2e_sfp1_tready;
assign e2v1_tdata = e2v_sfp1_tdata;
assign e2v1_tlast = e2v_sfp1_tlast;
assign e2v1_tvalid = e2v_sfp1_tvalid;
assign e2v_sfp1_tready = e2v1_tready;
// Don't actually instantiate DMA engines if protocols can't use them
`ifdef SFP0_AURORA
`define NO_ETH_DMA_0
`elsif SFP0_WR
`define NO_ETH_DMA_0
`endif
`ifdef SFP1_AURORA
`define NO_ETH_DMA_1
`endif
`endif
`ifdef NO_ETH_DMA_0
//If inst Aurora, tie off each axi/axi-lite interface
axi_dummy #(
.DEC_ERR(1'b0)
) inst_axi_dummy_sfp0_eth_dma (
.s_axi_aclk(bus_clk),
.s_axi_areset(bus_rst),
.s_axi_awaddr(M_AXI_ETH_DMA0_AWADDR),
.s_axi_awvalid(M_AXI_ETH_DMA0_AWVALID),
.s_axi_awready(M_AXI_ETH_DMA0_AWREADY),
.s_axi_wdata(M_AXI_ETH_DMA0_WDATA),
.s_axi_wvalid(M_AXI_ETH_DMA0_WVALID),
.s_axi_wready(M_AXI_ETH_DMA0_WREADY),
.s_axi_bresp(M_AXI_ETH_DMA0_BRESP),
.s_axi_bvalid(M_AXI_ETH_DMA0_BVALID),
.s_axi_bready(M_AXI_ETH_DMA0_BREADY),
.s_axi_araddr(M_AXI_ETH_DMA0_ARADDR),
.s_axi_arvalid(M_AXI_ETH_DMA0_ARVALID),
.s_axi_arready(M_AXI_ETH_DMA0_ARREADY),
.s_axi_rdata(M_AXI_ETH_DMA0_RDATA),
.s_axi_rresp(M_AXI_ETH_DMA0_RRESP),
.s_axi_rvalid(M_AXI_ETH_DMA0_RVALID),
.s_axi_rready(M_AXI_ETH_DMA0_RREADY)
);
//S_AXI_GP0 outputs from axi_eth_dma, so needs some sort of controller/tie off
assign S_AXI_GP0_AWADDR = 32'h0;
assign S_AXI_GP0_AWLEN = 8'h0;
assign S_AXI_GP0_AWSIZE = 4'h0;
assign S_AXI_GP0_AWBURST = 3'h0;
assign S_AXI_GP0_AWPROT = 3'h0;
assign S_AXI_GP0_AWCACHE = 4'h0;
assign S_AXI_GP0_AWVALID = 1'b0;
//S_AXI_GP0_AWREADY output from PS
assign S_AXI_GP0_WDATA = 32'h0;
assign S_AXI_GP0_WSTRB = 4'h0;
assign S_AXI_GP0_WLAST = 1'b0;
assign S_AXI_GP0_WVALID = 1'b0;
//S_AXI_GP0_WREADY output from PS
//S_AXI_GP0_BRESP
//S_AXI_GP0_BVALID
assign S_AXI_GP0_BREADY = 1'b1;
assign S_AXI_GP0_ARADDR = 32'h0;
assign S_AXI_GP0_ARLEN = 8'h0;
assign S_AXI_GP0_ARSIZE = 3'h0;
assign S_AXI_GP0_ARBURST = 2'h0;
assign S_AXI_GP0_ARPROT = 3'h0;
assign S_AXI_GP0_ARCACHE = 4'h0;
assign S_AXI_GP0_ARVALID = 1'b0;
//S_AXI_GP0_ARREADY
//S_AXI_GP0_RDATA
//S_AXI_GP0_RRESP
//S_AXI_GP0_RLAST
//S_AXI_GP0_RVALID
assign S_AXI_GP0_RREADY = 1'b1;
//S_AXI_HP0 from axi_eth_dma
assign S_AXI_HP0_ARADDR = 32'h0;
assign S_AXI_HP0_ARLEN = 8'h0;
assign S_AXI_HP0_ARSIZE = 3'h0;
assign S_AXI_HP0_ARBURST = 2'h0;
assign S_AXI_HP0_ARPROT = 3'h0;
assign S_AXI_HP0_ARCACHE = 4'h0;
assign S_AXI_HP0_ARVALID = 1'b0;
//S_AXI_HP0_ARREADY
//S_AXI_HP0_RDATA
//S_AXI_HP0_RRESP
//S_AXI_HP0_RLAST
//S_AXI_HP0_RVALID
assign S_AXI_HP0_RREADY = 1'b1;
assign S_AXI_HP0_AWADDR = 32'h0;
assign S_AXI_HP0_AWLEN = 8'h0;
assign S_AXI_HP0_AWSIZE = 3'h0;
assign S_AXI_HP0_AWBURST = 2'h0;
assign S_AXI_HP0_AWPROT = 3'h0;
assign S_AXI_HP0_AWCACHE = 4'h0;
assign S_AXI_HP0_AWVALID = 1'b0;
//S_AXI_HP0_AWREADY
assign S_AXI_HP0_WDATA = 64'h0;
assign S_AXI_HP0_WSTRB = 8'h0;
assign S_AXI_HP0_WLAST = 1'b0;
assign S_AXI_HP0_WVALID = 1'b0;
//S_AXI_HP0_WREADY
//S_AXI_HP0_BRESP
//S_AXI_HP0_BVALID
assign S_AXI_HP0_BREADY = 1'b1;
`else
axi_eth_dma inst_axi_eth_dma0 (
.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_DMA0_AWADDR),
.s_axi_lite_awvalid(M_AXI_ETH_DMA0_AWVALID),
.s_axi_lite_awready(M_AXI_ETH_DMA0_AWREADY),
.s_axi_lite_wdata(M_AXI_ETH_DMA0_WDATA),
.s_axi_lite_wvalid(M_AXI_ETH_DMA0_WVALID),
.s_axi_lite_wready(M_AXI_ETH_DMA0_WREADY),
.s_axi_lite_bresp(M_AXI_ETH_DMA0_BRESP),
.s_axi_lite_bvalid(M_AXI_ETH_DMA0_BVALID),
.s_axi_lite_bready(M_AXI_ETH_DMA0_BREADY),
.s_axi_lite_araddr(M_AXI_ETH_DMA0_ARADDR),
.s_axi_lite_arvalid(M_AXI_ETH_DMA0_ARVALID),
.s_axi_lite_arready(M_AXI_ETH_DMA0_ARREADY),
.s_axi_lite_rdata(M_AXI_ETH_DMA0_RDATA),
.s_axi_lite_rresp(M_AXI_ETH_DMA0_RRESP),
.s_axi_lite_rvalid(M_AXI_ETH_DMA0_RVALID),
.s_axi_lite_rready(M_AXI_ETH_DMA0_RREADY),
.m_axi_sg_awaddr(S_AXI_GP0_AWADDR),
.m_axi_sg_awlen(S_AXI_GP0_AWLEN),
.m_axi_sg_awsize(S_AXI_GP0_AWSIZE),
.m_axi_sg_awburst(S_AXI_GP0_AWBURST),
.m_axi_sg_awprot(S_AXI_GP0_AWPROT),
.m_axi_sg_awcache(S_AXI_GP0_AWCACHE),
.m_axi_sg_awvalid(S_AXI_GP0_AWVALID),
.m_axi_sg_awready(S_AXI_GP0_AWREADY),
.m_axi_sg_wdata(S_AXI_GP0_WDATA),
.m_axi_sg_wstrb(S_AXI_GP0_WSTRB),
.m_axi_sg_wlast(S_AXI_GP0_WLAST),
.m_axi_sg_wvalid(S_AXI_GP0_WVALID),
.m_axi_sg_wready(S_AXI_GP0_WREADY),
.m_axi_sg_bresp(S_AXI_GP0_BRESP),
.m_axi_sg_bvalid(S_AXI_GP0_BVALID),
.m_axi_sg_bready(S_AXI_GP0_BREADY),
.m_axi_sg_araddr(S_AXI_GP0_ARADDR),
.m_axi_sg_arlen(S_AXI_GP0_ARLEN),
.m_axi_sg_arsize(S_AXI_GP0_ARSIZE),
.m_axi_sg_arburst(S_AXI_GP0_ARBURST),
.m_axi_sg_arprot(S_AXI_GP0_ARPROT),
.m_axi_sg_arcache(S_AXI_GP0_ARCACHE),
.m_axi_sg_arvalid(S_AXI_GP0_ARVALID),
.m_axi_sg_arready(S_AXI_GP0_ARREADY),
.m_axi_sg_rdata(S_AXI_GP0_RDATA),
.m_axi_sg_rresp(S_AXI_GP0_RRESP),
.m_axi_sg_rlast(S_AXI_GP0_RLAST),
.m_axi_sg_rvalid(S_AXI_GP0_RVALID),
.m_axi_sg_rready(S_AXI_GP0_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_eth0_tx_tdata),
.m_axis_mm2s_tkeep(arm_eth0_tx_tkeep),
.m_axis_mm2s_tvalid(arm_eth0_tx_tvalid),
.m_axis_mm2s_tready(arm_eth0_tx_tready),
.m_axis_mm2s_tlast(arm_eth0_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_eth0_rx_tdata),
.s_axis_s2mm_tkeep(arm_eth0_rx_tkeep),
.s_axis_s2mm_tvalid(arm_eth0_rx_tvalid),
.s_axis_s2mm_tready(arm_eth0_rx_tready),
.s_axis_s2mm_tlast(arm_eth0_rx_tlast),
.mm2s_introut(arm_eth0_tx_irq),
.s2mm_introut(arm_eth0_rx_irq),
.axi_dma_tstvec()
);
axi_fifo_2clk #(
.WIDTH(1+8+64),
.SIZE(5)
) eth_tx_0_fifo_2clk_i (
.reset(clk40_rst),
.i_aclk(clk40),
.i_tdata({arm_eth0_tx_tlast, arm_eth0_tx_tkeep, arm_eth0_tx_tdata}),
.i_tvalid(arm_eth0_tx_tvalid),
.i_tready(arm_eth0_tx_tready),
.o_aclk(bus_clk),
.o_tdata({arm_eth0_tx_tlast_b, arm_eth0_tx_tkeep_b, arm_eth0_tx_tdata_b}),
.o_tvalid(arm_eth0_tx_tvalid_b),
.o_tready(arm_eth0_tx_tready_b)
);
axi_fifo_2clk #(
.WIDTH(1+8+64),
.SIZE(5)
) eth_rx_0_fifo_2clk_i (
.reset(bus_rst),
.i_aclk(bus_clk),
.i_tdata({arm_eth0_rx_tlast_b, arm_eth0_rx_tkeep_b, arm_eth0_rx_tdata_b}),
.i_tvalid(arm_eth0_rx_tvalid_b),
.i_tready(arm_eth0_rx_tready_b),
.o_aclk(clk40),
.o_tdata({arm_eth0_rx_tlast, arm_eth0_rx_tkeep, arm_eth0_rx_tdata}),
.o_tvalid(arm_eth0_rx_tvalid),
.o_tready(arm_eth0_rx_tready)
);
`endif
/////////////////////////////////////////////////////////////////////
//
// Ethernet DMA 1
//
//////////////////////////////////////////////////////////////////////
assign IRQ_F2P[2] = arm_eth1_rx_irq;
assign IRQ_F2P[3] = arm_eth1_tx_irq;
assign {S_AXI_HP1_AWID, S_AXI_HP1_ARID} = 12'd0;
assign {S_AXI_GP1_AWID, S_AXI_GP1_ARID} = 10'd0;
`ifdef NO_ETH_DMA_1
//If inst Aurora, tie off each axi/axi-lite interface
axi_dummy #(.DEC_ERR(1'b0)) inst_axi_dummy_sfp1_eth_dma
(
.s_axi_aclk(bus_clk),
.s_axi_areset(bus_rst),
.s_axi_awaddr(M_AXI_ETH_DMA1_AWADDR),
.s_axi_awvalid(M_AXI_ETH_DMA1_AWVALID),
.s_axi_awready(M_AXI_ETH_DMA1_AWREADY),
.s_axi_wdata(M_AXI_ETH_DMA1_WDATA),
.s_axi_wvalid(M_AXI_ETH_DMA1_WVALID),
.s_axi_wready(M_AXI_ETH_DMA1_WREADY),
.s_axi_bresp(M_AXI_ETH_DMA1_BRESP),
.s_axi_bvalid(M_AXI_ETH_DMA1_BVALID),
.s_axi_bready(M_AXI_ETH_DMA1_BREADY),
.s_axi_araddr(M_AXI_ETH_DMA1_ARADDR),
.s_axi_arvalid(M_AXI_ETH_DMA1_ARVALID),
.s_axi_arready(M_AXI_ETH_DMA1_ARREADY),
.s_axi_rdata(M_AXI_ETH_DMA1_RDATA),
.s_axi_rresp(M_AXI_ETH_DMA1_RRESP),
.s_axi_rvalid(M_AXI_ETH_DMA1_RVALID),
.s_axi_rready(M_AXI_ETH_DMA1_RREADY)
);
//S_AXI_GP0 outputs from axi_eth_dma, so needs some sort of controller/tie off
assign S_AXI_GP1_AWADDR = 32'h0;
assign S_AXI_GP1_AWLEN = 8'h0;
assign S_AXI_GP1_AWSIZE = 4'h0;
assign S_AXI_GP1_AWBURST = 3'h0;
assign S_AXI_GP1_AWPROT = 3'h0;
assign S_AXI_GP1_AWCACHE = 4'h0;
assign S_AXI_GP1_AWVALID = 1'b0;
//S_AXI_GP1_AWREADY output from PS
assign S_AXI_GP1_WDATA = 32'h0;
assign S_AXI_GP1_WSTRB = 4'h0;
assign S_AXI_GP1_WLAST = 1'b0;
assign S_AXI_GP1_WVALID = 1'b0;
//S_AXI_GP1_WREADY output from PS
//S_AXI_GP1_BRESP
//S_AXI_GP1_BVALID
assign S_AXI_GP1_BREADY = 1'b1;
assign S_AXI_GP1_ARADDR = 32'h0;
assign S_AXI_GP1_ARLEN = 8'h0;
assign S_AXI_GP1_ARSIZE = 3'h0;
assign S_AXI_GP1_ARBURST = 2'h0;
assign S_AXI_GP1_ARPROT = 3'h0;
assign S_AXI_GP1_ARCACHE = 4'h0;
assign S_AXI_GP1_ARVALID = 1'b0;
//S_AXI_GP1_ARREADY
//S_AXI_GP1_RDATA
//S_AXI_GP1_RRESP
//S_AXI_GP1_RLAST
//S_AXI_GP1_RVALID
assign S_AXI_GP1_RREADY = 1'b1;
//S_AXI_HP0 from axi_eth_dma
assign S_AXI_HP1_ARADDR = 32'h0;
assign S_AXI_HP1_ARLEN = 8'h0;
assign S_AXI_HP1_ARSIZE = 3'h0;
assign S_AXI_HP1_ARBURST = 2'h0;
assign S_AXI_HP1_ARPROT = 3'h0;
assign S_AXI_HP1_ARCACHE = 4'h0;
assign S_AXI_HP1_ARVALID = 1'b0;
//S_AXI_HP1_ARREADY
//S_AXI_HP1_RDATA
//S_AXI_HP1_RRESP
//S_AXI_HP1_RLAST
//S_AXI_HP1_RVALID
assign S_AXI_HP1_RREADY = 1'b1;
assign S_AXI_HP1_AWADDR = 32'h0;
assign S_AXI_HP1_AWLEN = 8'h0;
assign S_AXI_HP1_AWSIZE = 3'h0;
assign S_AXI_HP1_AWBURST = 2'h0;
assign S_AXI_HP1_AWPROT = 3'h0;
assign S_AXI_HP1_AWCACHE = 4'h0;
assign S_AXI_HP1_AWVALID = 1'b0;
//S_AXI_HP1_AWREADY
assign S_AXI_HP1_WDATA = 64'h0;
assign S_AXI_HP1_WSTRB = 8'h0;
assign S_AXI_HP1_WLAST = 1'b0;
assign S_AXI_HP1_WVALID = 1'b0;
//S_AXI_HP1_WREADY
//S_AXI_HP1_BRESP
//S_AXI_HP1_BVALID
assign S_AXI_HP1_BREADY = 1'b1;
`else
axi_eth_dma inst_axi_eth_dma1 (
.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_DMA1_AWADDR),
.s_axi_lite_awvalid(M_AXI_ETH_DMA1_AWVALID),
.s_axi_lite_awready(M_AXI_ETH_DMA1_AWREADY),
.s_axi_lite_wdata(M_AXI_ETH_DMA1_WDATA),
.s_axi_lite_wvalid(M_AXI_ETH_DMA1_WVALID),
.s_axi_lite_wready(M_AXI_ETH_DMA1_WREADY),
.s_axi_lite_bresp(M_AXI_ETH_DMA1_BRESP),
.s_axi_lite_bvalid(M_AXI_ETH_DMA1_BVALID),
.s_axi_lite_bready(M_AXI_ETH_DMA1_BREADY),
.s_axi_lite_araddr(M_AXI_ETH_DMA1_ARADDR),
.s_axi_lite_arvalid(M_AXI_ETH_DMA1_ARVALID),
.s_axi_lite_arready(M_AXI_ETH_DMA1_ARREADY),
.s_axi_lite_rdata(M_AXI_ETH_DMA1_RDATA),
.s_axi_lite_rresp(M_AXI_ETH_DMA1_RRESP),
.s_axi_lite_rvalid(M_AXI_ETH_DMA1_RVALID),
.s_axi_lite_rready(M_AXI_ETH_DMA1_RREADY),
.m_axi_sg_awaddr(S_AXI_GP1_AWADDR),
.m_axi_sg_awlen(S_AXI_GP1_AWLEN),
.m_axi_sg_awsize(S_AXI_GP1_AWSIZE),
.m_axi_sg_awburst(S_AXI_GP1_AWBURST),
.m_axi_sg_awprot(S_AXI_GP1_AWPROT),
.m_axi_sg_awcache(S_AXI_GP1_AWCACHE),
.m_axi_sg_awvalid(S_AXI_GP1_AWVALID),
.m_axi_sg_awready(S_AXI_GP1_AWREADY),
.m_axi_sg_wdata(S_AXI_GP1_WDATA),
.m_axi_sg_wstrb(S_AXI_GP1_WSTRB),
.m_axi_sg_wlast(S_AXI_GP1_WLAST),
.m_axi_sg_wvalid(S_AXI_GP1_WVALID),
.m_axi_sg_wready(S_AXI_GP1_WREADY),
.m_axi_sg_bresp(S_AXI_GP1_BRESP),
.m_axi_sg_bvalid(S_AXI_GP1_BVALID),
.m_axi_sg_bready(S_AXI_GP1_BREADY),
.m_axi_sg_araddr(S_AXI_GP1_ARADDR),
.m_axi_sg_arlen(S_AXI_GP1_ARLEN),
.m_axi_sg_arsize(S_AXI_GP1_ARSIZE),
.m_axi_sg_arburst(S_AXI_GP1_ARBURST),
.m_axi_sg_arprot(S_AXI_GP1_ARPROT),
.m_axi_sg_arcache(S_AXI_GP1_ARCACHE),
.m_axi_sg_arvalid(S_AXI_GP1_ARVALID),
.m_axi_sg_arready(S_AXI_GP1_ARREADY),
.m_axi_sg_rdata(S_AXI_GP1_RDATA),
.m_axi_sg_rresp(S_AXI_GP1_RRESP),
.m_axi_sg_rlast(S_AXI_GP1_RLAST),
.m_axi_sg_rvalid(S_AXI_GP1_RVALID),
.m_axi_sg_rready(S_AXI_GP1_RREADY),
.m_axi_mm2s_araddr(S_AXI_HP1_ARADDR),
.m_axi_mm2s_arlen(S_AXI_HP1_ARLEN),
.m_axi_mm2s_arsize(S_AXI_HP1_ARSIZE),
.m_axi_mm2s_arburst(S_AXI_HP1_ARBURST),
.m_axi_mm2s_arprot(S_AXI_HP1_ARPROT),
.m_axi_mm2s_arcache(S_AXI_HP1_ARCACHE),
.m_axi_mm2s_arvalid(S_AXI_HP1_ARVALID),
.m_axi_mm2s_arready(S_AXI_HP1_ARREADY),
.m_axi_mm2s_rdata(S_AXI_HP1_RDATA),
.m_axi_mm2s_rresp(S_AXI_HP1_RRESP),
.m_axi_mm2s_rlast(S_AXI_HP1_RLAST),
.m_axi_mm2s_rvalid(S_AXI_HP1_RVALID),
.m_axi_mm2s_rready(S_AXI_HP1_RREADY),
.mm2s_prmry_reset_out_n(),
.m_axis_mm2s_tdata(arm_eth1_tx_tdata),
.m_axis_mm2s_tkeep(arm_eth1_tx_tkeep),
.m_axis_mm2s_tvalid(arm_eth1_tx_tvalid),
.m_axis_mm2s_tready(arm_eth1_tx_tready),
.m_axis_mm2s_tlast(arm_eth1_tx_tlast),
.m_axi_s2mm_awaddr(S_AXI_HP1_AWADDR),
.m_axi_s2mm_awlen(S_AXI_HP1_AWLEN),
.m_axi_s2mm_awsize(S_AXI_HP1_AWSIZE),
.m_axi_s2mm_awburst(S_AXI_HP1_AWBURST),
.m_axi_s2mm_awprot(S_AXI_HP1_AWPROT),
.m_axi_s2mm_awcache(S_AXI_HP1_AWCACHE),
.m_axi_s2mm_awvalid(S_AXI_HP1_AWVALID),
.m_axi_s2mm_awready(S_AXI_HP1_AWREADY),
.m_axi_s2mm_wdata(S_AXI_HP1_WDATA),
.m_axi_s2mm_wstrb(S_AXI_HP1_WSTRB),
.m_axi_s2mm_wlast(S_AXI_HP1_WLAST),
.m_axi_s2mm_wvalid(S_AXI_HP1_WVALID),
.m_axi_s2mm_wready(S_AXI_HP1_WREADY),
.m_axi_s2mm_bresp(S_AXI_HP1_BRESP),
.m_axi_s2mm_bvalid(S_AXI_HP1_BVALID),
.m_axi_s2mm_bready(S_AXI_HP1_BREADY),
.s2mm_prmry_reset_out_n(),
.s_axis_s2mm_tdata(arm_eth1_rx_tdata),
.s_axis_s2mm_tkeep(arm_eth1_rx_tkeep),
.s_axis_s2mm_tvalid(arm_eth1_rx_tvalid),
.s_axis_s2mm_tready(arm_eth1_rx_tready),
.s_axis_s2mm_tlast(arm_eth1_rx_tlast),
.mm2s_introut(arm_eth1_tx_irq),
.s2mm_introut(arm_eth1_rx_irq),
.axi_dma_tstvec()
);
axi_fifo_2clk #(
.WIDTH(1+8+64),
.SIZE(5)
) eth_tx_1_fifo_2clk_i (
.reset(clk40_rst),
.i_aclk(clk40),
.i_tdata({arm_eth1_tx_tlast, arm_eth1_tx_tkeep, arm_eth1_tx_tdata}),
.i_tvalid(arm_eth1_tx_tvalid),
.i_tready(arm_eth1_tx_tready),
.o_aclk(bus_clk),
.o_tdata({arm_eth1_tx_tlast_b, arm_eth1_tx_tkeep_b, arm_eth1_tx_tdata_b}),
.o_tvalid(arm_eth1_tx_tvalid_b),
.o_tready(arm_eth1_tx_tready_b)
);
axi_fifo_2clk #(
.WIDTH(1+8+64),
.SIZE(5)
) eth_rx_1_fifo_2clk_i (
.reset(bus_rst),
.i_aclk(bus_clk),
.i_tdata({arm_eth1_rx_tlast_b, arm_eth1_rx_tkeep_b, arm_eth1_rx_tdata_b}),
.i_tvalid(arm_eth1_rx_tvalid_b),
.i_tready(arm_eth1_rx_tready_b),
.o_aclk(clk40),
.o_tdata({arm_eth1_rx_tlast, arm_eth1_rx_tkeep, arm_eth1_rx_tdata}),
.o_tvalid(arm_eth1_rx_tvalid),
.o_tready(arm_eth1_rx_tready)
);
`endif
/////////////////////////////////////////////////////////////////////
//
// Internal Ethernet Interface
//
//////////////////////////////////////////////////////////////////////
eth_internal #(
.DWIDTH(REG_DWIDTH),
.AWIDTH(REG_AWIDTH),
.PORTNUM(8'd1),
.BYTE_MTU(BYTE_MTU),
.RFNOC_PROTOVER(RFNOC_PROTOVER),
.NODE_INST(2)
) eth_internal_i (
// Resets
.bus_rst (bus_rst),
// Clocks
.bus_clk (bus_clk),
//Axi-lite
.s_axi_aclk (clk40),
.s_axi_aresetn (clk40_rstn),
.s_axi_awaddr (m_axi_eth_internal_awaddr),
.s_axi_awvalid (m_axi_eth_internal_awvalid),
.s_axi_awready (m_axi_eth_internal_awready),
.s_axi_wdata (m_axi_eth_internal_wdata),
.s_axi_wstrb (m_axi_eth_internal_wstrb),
.s_axi_wvalid (m_axi_eth_internal_wvalid),
.s_axi_wready (m_axi_eth_internal_wready),
.s_axi_bresp (m_axi_eth_internal_bresp),
.s_axi_bvalid (m_axi_eth_internal_bvalid),
.s_axi_bready (m_axi_eth_internal_bready),
.s_axi_araddr (m_axi_eth_internal_araddr),
.s_axi_arvalid (m_axi_eth_internal_arvalid),
.s_axi_arready (m_axi_eth_internal_arready),
.s_axi_rdata (m_axi_eth_internal_rdata),
.s_axi_rresp (m_axi_eth_internal_rresp),
.s_axi_rvalid (m_axi_eth_internal_rvalid),
.s_axi_rready (m_axi_eth_internal_rready),
// Host-Ethernet DMA interface
.e2h_tdata (e2h_tdata),
.e2h_tkeep (e2h_tkeep),
.e2h_tlast (e2h_tlast),
.e2h_tvalid (e2h_tvalid),
.e2h_tready (e2h_tready),
.h2e_tdata (h2e_tdata),
.h2e_tkeep (h2e_tkeep),
.h2e_tlast (h2e_tlast),
.h2e_tvalid (h2e_tvalid),
.h2e_tready (h2e_tready),
// Vita router interface
.e2v_tdata (m_axis_dma_tdata),
.e2v_tlast (m_axis_dma_tlast),
.e2v_tvalid (m_axis_dma_tvalid),
.e2v_tready (m_axis_dma_tready),
.v2e_tdata (s_axis_dma_tdata),
.v2e_tlast (s_axis_dma_tlast),
.v2e_tvalid (s_axis_dma_tvalid),
.v2e_tready (s_axis_dma_tready),
// MISC
.port_info (),
.device_id (device_id),
.link_up (),
.activity ()
);
/////////////////////////////////////////////////////////////////////
//
// Processing System
//
//////////////////////////////////////////////////////////////////////
wire spi0_sclk;
wire spi0_mosi;
wire spi0_miso;
wire spi0_ss0;
wire spi0_ss1;
wire spi0_ss2;
wire spi1_sclk;
wire spi1_mosi;
wire spi1_miso;
wire spi1_ss0;
wire spi1_ss1;
wire spi1_ss2;
assign ps_gpio_in[10] = DBA_MYK_INTRQ;
`ifndef N300
assign ps_gpio_in[11] = DBB_MYK_INTRQ;
`else
assign ps_gpio_in[11] = 1'b0;
`endif
// Processing System
n310_ps_bd inst_n310_ps (
.SPI0_SCLK_I(1'b0),
.SPI0_SCLK_O(spi0_sclk),
.SPI0_SCLK_T(),
.SPI0_MOSI_I(1'b0),
.SPI0_MOSI_O(spi0_mosi),
.SPI0_MOSI_T(),
.SPI0_MISO_I(spi0_miso),
.SPI0_MISO_O(),
.SPI0_MISO_T(),
.SPI0_SS_I(1'b1),
.SPI0_SS_O(spi0_ss0),
.SPI0_SS1_O(spi0_ss1),
.SPI0_SS2_O(spi0_ss2),
.SPI0_SS_T(),
`ifndef N300
.SPI1_SCLK_I(1'b0),
.SPI1_SCLK_O(spi1_sclk),
.SPI1_SCLK_T(),
.SPI1_MOSI_I(1'b0),
.SPI1_MOSI_O(spi1_mosi),
.SPI1_MOSI_T(),
.SPI1_MISO_I(spi1_miso),
.SPI1_MISO_O(),
.SPI1_MISO_T(),
.SPI1_SS_I(1'b1),
.SPI1_SS_O(spi1_ss0),
.SPI1_SS1_O(spi1_ss1),
.SPI1_SS2_O(spi1_ss2),
.SPI1_SS_T(),
`else
.SPI1_SCLK_I(1'b0),
.SPI1_SCLK_O(),
.SPI1_SCLK_T(),
.SPI1_MOSI_I(1'b0),
.SPI1_MOSI_O(),
.SPI1_MOSI_T(),
.SPI1_MISO_I(1'b0),
.SPI1_MISO_O(),
.SPI1_MISO_T(),
.SPI1_SS_I(1'b1),
.SPI1_SS_O(),
.SPI1_SS1_O(),
.SPI1_SS2_O(),
.SPI1_SS_T(),
`endif
.bus_clk(bus_clk),
.bus_rstn(~bus_rst),
.clk40(clk40),
.clk40_rstn(clk40_rstn),
.M_AXI_ETH_DMA0_araddr(M_AXI_ETH_DMA0_ARADDR),
.M_AXI_ETH_DMA0_arprot(),
.M_AXI_ETH_DMA0_arready(M_AXI_ETH_DMA0_ARREADY),
.M_AXI_ETH_DMA0_arvalid(M_AXI_ETH_DMA0_ARVALID),
.M_AXI_ETH_DMA0_awaddr(M_AXI_ETH_DMA0_AWADDR),
.M_AXI_ETH_DMA0_awprot(),
.M_AXI_ETH_DMA0_awready(M_AXI_ETH_DMA0_AWREADY),
.M_AXI_ETH_DMA0_awvalid(M_AXI_ETH_DMA0_AWVALID),
.M_AXI_ETH_DMA0_wdata(M_AXI_ETH_DMA0_WDATA),
.M_AXI_ETH_DMA0_wready(M_AXI_ETH_DMA0_WREADY),
.M_AXI_ETH_DMA0_wstrb(M_AXI_ETH_DMA0_WSTRB),
.M_AXI_ETH_DMA0_wvalid(M_AXI_ETH_DMA0_WVALID),
.M_AXI_ETH_DMA0_rdata(M_AXI_ETH_DMA0_RDATA),
.M_AXI_ETH_DMA0_rready(M_AXI_ETH_DMA0_RREADY),
.M_AXI_ETH_DMA0_rresp(M_AXI_ETH_DMA0_RRESP),
.M_AXI_ETH_DMA0_rvalid(M_AXI_ETH_DMA0_RVALID),
.M_AXI_ETH_DMA0_bready(M_AXI_ETH_DMA0_BREADY),
.M_AXI_ETH_DMA0_bresp(M_AXI_ETH_DMA0_BRESP),
.M_AXI_ETH_DMA0_bvalid(M_AXI_ETH_DMA0_BVALID),
.M_AXI_ETH_DMA1_araddr(M_AXI_ETH_DMA1_ARADDR),
.M_AXI_ETH_DMA1_arprot(),
.M_AXI_ETH_DMA1_arready(M_AXI_ETH_DMA1_ARREADY),
.M_AXI_ETH_DMA1_arvalid(M_AXI_ETH_DMA1_ARVALID),
.M_AXI_ETH_DMA1_awaddr(M_AXI_ETH_DMA1_AWADDR),
.M_AXI_ETH_DMA1_awprot(),
.M_AXI_ETH_DMA1_awready(M_AXI_ETH_DMA1_AWREADY),
.M_AXI_ETH_DMA1_awvalid(M_AXI_ETH_DMA1_AWVALID),
.M_AXI_ETH_DMA1_bready(M_AXI_ETH_DMA1_BREADY),
.M_AXI_ETH_DMA1_bresp(M_AXI_ETH_DMA1_BRESP),
.M_AXI_ETH_DMA1_bvalid(M_AXI_ETH_DMA1_BVALID),
.M_AXI_ETH_DMA1_rdata(M_AXI_ETH_DMA1_RDATA),
.M_AXI_ETH_DMA1_rready(M_AXI_ETH_DMA1_RREADY),
.M_AXI_ETH_DMA1_rresp(M_AXI_ETH_DMA1_RRESP),
.M_AXI_ETH_DMA1_rvalid(M_AXI_ETH_DMA1_RVALID),
.M_AXI_ETH_DMA1_wdata(M_AXI_ETH_DMA1_WDATA),
.M_AXI_ETH_DMA1_wready(M_AXI_ETH_DMA1_WREADY),
.M_AXI_ETH_DMA1_wstrb(M_AXI_ETH_DMA1_WSTRB),
.M_AXI_ETH_DMA1_wvalid(M_AXI_ETH_DMA1_WVALID),
.m_axi_eth_internal_araddr(m_axi_eth_internal_araddr),
.m_axi_eth_internal_arprot(),
.m_axi_eth_internal_arready(m_axi_eth_internal_arready),
.m_axi_eth_internal_arvalid(m_axi_eth_internal_arvalid),
.m_axi_eth_internal_awaddr(m_axi_eth_internal_awaddr),
.m_axi_eth_internal_awprot(),
.m_axi_eth_internal_awready(m_axi_eth_internal_awready),
.m_axi_eth_internal_awvalid(m_axi_eth_internal_awvalid),
.m_axi_eth_internal_bready(m_axi_eth_internal_bready),
.m_axi_eth_internal_bresp(m_axi_eth_internal_bresp),
.m_axi_eth_internal_bvalid(m_axi_eth_internal_bvalid),
.m_axi_eth_internal_rdata(m_axi_eth_internal_rdata),
.m_axi_eth_internal_rready(m_axi_eth_internal_rready),
.m_axi_eth_internal_rresp(m_axi_eth_internal_rresp),
.m_axi_eth_internal_rvalid(m_axi_eth_internal_rvalid),
.m_axi_eth_internal_wdata(m_axi_eth_internal_wdata),
.m_axi_eth_internal_wready(m_axi_eth_internal_wready),
.m_axi_eth_internal_wstrb(m_axi_eth_internal_wstrb),
.m_axi_eth_internal_wvalid(m_axi_eth_internal_wvalid),
.M_AXI_JESD0_araddr(M_AXI_JESD0_ARADDR),
.M_AXI_JESD0_arprot(),
.M_AXI_JESD0_arready(M_AXI_JESD0_ARREADY),
.M_AXI_JESD0_arvalid(M_AXI_JESD0_ARVALID),
.M_AXI_JESD0_awaddr(M_AXI_JESD0_AWADDR),
.M_AXI_JESD0_awprot(),
.M_AXI_JESD0_awready(M_AXI_JESD0_AWREADY),
.M_AXI_JESD0_awvalid(M_AXI_JESD0_AWVALID),
.M_AXI_JESD0_bready(M_AXI_JESD0_BREADY),
.M_AXI_JESD0_bresp(M_AXI_JESD0_BRESP),
.M_AXI_JESD0_bvalid(M_AXI_JESD0_BVALID),
.M_AXI_JESD0_rdata(M_AXI_JESD0_RDATA),
.M_AXI_JESD0_rready(M_AXI_JESD0_RREADY),
.M_AXI_JESD0_rresp(M_AXI_JESD0_RRESP),
.M_AXI_JESD0_rvalid(M_AXI_JESD0_RVALID),
.M_AXI_JESD0_wdata(M_AXI_JESD0_WDATA),
.M_AXI_JESD0_wready(M_AXI_JESD0_WREADY),
.M_AXI_JESD0_wstrb(M_AXI_JESD0_WSTRB),
.M_AXI_JESD0_wvalid(M_AXI_JESD0_WVALID),
.M_AXI_JESD1_araddr(M_AXI_JESD1_ARADDR),
.M_AXI_JESD1_arprot(),
.M_AXI_JESD1_arready(M_AXI_JESD1_ARREADY),
.M_AXI_JESD1_arvalid(M_AXI_JESD1_ARVALID),
.M_AXI_JESD1_awaddr(M_AXI_JESD1_AWADDR),
.M_AXI_JESD1_awprot(),
.M_AXI_JESD1_awready(M_AXI_JESD1_AWREADY),
.M_AXI_JESD1_awvalid(M_AXI_JESD1_AWVALID),
.M_AXI_JESD1_bready(M_AXI_JESD1_BREADY),
.M_AXI_JESD1_bresp(M_AXI_JESD1_BRESP),
.M_AXI_JESD1_bvalid(M_AXI_JESD1_BVALID),
.M_AXI_JESD1_rdata(M_AXI_JESD1_RDATA),
.M_AXI_JESD1_rready(M_AXI_JESD1_RREADY),
.M_AXI_JESD1_rresp(M_AXI_JESD1_RRESP),
.M_AXI_JESD1_rvalid(M_AXI_JESD1_RVALID),
.M_AXI_JESD1_wdata(M_AXI_JESD1_WDATA),
.M_AXI_JESD1_wready(M_AXI_JESD1_WREADY),
.M_AXI_JESD1_wstrb(M_AXI_JESD1_WSTRB),
.M_AXI_JESD1_wvalid(M_AXI_JESD1_WVALID),
.M_AXI_NET0_araddr(M_AXI_NET0_ARADDR),
.M_AXI_NET0_arprot(),
.M_AXI_NET0_arready(M_AXI_NET0_ARREADY),
.M_AXI_NET0_arvalid(M_AXI_NET0_ARVALID),
.M_AXI_NET0_awaddr(M_AXI_NET0_AWADDR),
.M_AXI_NET0_awprot(),
.M_AXI_NET0_awready(M_AXI_NET0_AWREADY),
.M_AXI_NET0_awvalid(M_AXI_NET0_AWVALID),
.M_AXI_NET0_bready(M_AXI_NET0_BREADY),
.M_AXI_NET0_bresp(M_AXI_NET0_BRESP),
.M_AXI_NET0_bvalid(M_AXI_NET0_BVALID),
.M_AXI_NET0_rdata(M_AXI_NET0_RDATA),
.M_AXI_NET0_rready(M_AXI_NET0_RREADY),
.M_AXI_NET0_rresp(M_AXI_NET0_RRESP),
.M_AXI_NET0_rvalid(M_AXI_NET0_RVALID),
.M_AXI_NET0_wdata(M_AXI_NET0_WDATA),
.M_AXI_NET0_wready(M_AXI_NET0_WREADY),
.M_AXI_NET0_wstrb(M_AXI_NET0_WSTRB),
.M_AXI_NET0_wvalid(M_AXI_NET0_WVALID),
.M_AXI_NET1_araddr(M_AXI_NET1_ARADDR),
.M_AXI_NET1_arprot(),
.M_AXI_NET1_arready(M_AXI_NET1_ARREADY),
.M_AXI_NET1_arvalid(M_AXI_NET1_ARVALID),
.M_AXI_NET1_awaddr(M_AXI_NET1_AWADDR),
.M_AXI_NET1_awprot(),
.M_AXI_NET1_awready(M_AXI_NET1_AWREADY),
.M_AXI_NET1_awvalid(M_AXI_NET1_AWVALID),
.M_AXI_NET1_bready(M_AXI_NET1_BREADY),
.M_AXI_NET1_bresp(M_AXI_NET1_BRESP),
.M_AXI_NET1_bvalid(M_AXI_NET1_BVALID),
.M_AXI_NET1_rdata(M_AXI_NET1_RDATA),
.M_AXI_NET1_rready(M_AXI_NET1_RREADY),
.M_AXI_NET1_rresp(M_AXI_NET1_RRESP),
.M_AXI_NET1_rvalid(M_AXI_NET1_RVALID),
.M_AXI_NET1_wdata(M_AXI_NET1_WDATA),
.M_AXI_NET1_wready(M_AXI_NET1_WREADY),
.M_AXI_NET1_wstrb(M_AXI_NET1_WSTRB),
.M_AXI_NET1_wvalid(M_AXI_NET1_WVALID),
.M_AXI_NET2_araddr(M_AXI_NET2_ARADDR),
.M_AXI_NET2_arprot(),
.M_AXI_NET2_arready(M_AXI_NET2_ARREADY),
.M_AXI_NET2_arvalid(M_AXI_NET2_ARVALID),
.M_AXI_NET2_awaddr(M_AXI_NET2_AWADDR),
.M_AXI_NET2_awprot(),
.M_AXI_NET2_awready(M_AXI_NET2_AWREADY),
.M_AXI_NET2_awvalid(M_AXI_NET2_AWVALID),
.M_AXI_NET2_bready(M_AXI_NET2_BREADY),
.M_AXI_NET2_bresp(M_AXI_NET2_BRESP),
.M_AXI_NET2_bvalid(M_AXI_NET2_BVALID),
.M_AXI_NET2_rdata(M_AXI_NET2_RDATA),
.M_AXI_NET2_rready(M_AXI_NET2_RREADY),
.M_AXI_NET2_rresp(M_AXI_NET2_RRESP),
.M_AXI_NET2_rvalid(M_AXI_NET2_RVALID),
.M_AXI_NET2_wdata(M_AXI_NET2_WDATA),
.M_AXI_NET2_wready(M_AXI_NET2_WREADY),
.M_AXI_NET2_wstrb(M_AXI_NET2_WSTRB),
.M_AXI_NET2_wvalid(M_AXI_NET2_WVALID),
.M_AXI_WR_CLK(m_axi_wr_clk),
.M_AXI_WR_RSTn(1'b1),
.M_AXI_WR_araddr(m_axi_wr_araddr),
.M_AXI_WR_arready(m_axi_wr_arready),
.M_AXI_WR_arvalid(m_axi_wr_arvalid),
.M_AXI_WR_awaddr(m_axi_wr_awaddr),
.M_AXI_WR_awready(m_axi_wr_awready),
.M_AXI_WR_awvalid(m_axi_wr_awvalid),
.M_AXI_WR_bready(m_axi_wr_bready),
.M_AXI_WR_bresp(m_axi_wr_bresp),
.M_AXI_WR_bvalid(m_axi_wr_bvalid),
.M_AXI_WR_rdata(m_axi_wr_rdata),
.M_AXI_WR_rready(m_axi_wr_rready),
.M_AXI_WR_rresp(m_axi_wr_rresp),
.M_AXI_WR_rvalid(m_axi_wr_rvalid),
.M_AXI_WR_wdata(m_axi_wr_wdata),
.M_AXI_WR_wready(m_axi_wr_wready),
.M_AXI_WR_wstrb(m_axi_wr_wstrb),
.M_AXI_WR_wvalid(m_axi_wr_wvalid),
.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),
.S_AXI_GP0_ACLK(clk40),
.S_AXI_GP0_ARESETN(clk40_rstn),
.S_AXI_GP0_araddr(S_AXI_GP0_ARADDR),
.S_AXI_GP0_arburst(S_AXI_GP0_ARBURST),
.S_AXI_GP0_arcache(S_AXI_GP0_ARCACHE),
.S_AXI_GP0_arlen(S_AXI_GP0_ARLEN),
.S_AXI_GP0_arlock(1'b0),
.S_AXI_GP0_arprot(S_AXI_GP0_ARPROT),
.S_AXI_GP0_arqos(4'b0000),
.S_AXI_GP0_arready(S_AXI_GP0_ARREADY),
.S_AXI_GP0_arsize(S_AXI_GP0_ARSIZE),
.S_AXI_GP0_arvalid(S_AXI_GP0_ARVALID),
.S_AXI_GP0_awaddr(S_AXI_GP0_AWADDR),
.S_AXI_GP0_awburst(S_AXI_GP0_AWBURST),
.S_AXI_GP0_awcache(S_AXI_GP0_AWCACHE),
.S_AXI_GP0_awlen(S_AXI_GP0_AWLEN),
.S_AXI_GP0_awlock(1'b0),
.S_AXI_GP0_awprot(S_AXI_GP0_AWPROT),
.S_AXI_GP0_awqos(4'b0000),
.S_AXI_GP0_awregion(4'b0000),
.S_AXI_GP0_awready(S_AXI_GP0_AWREADY),
.S_AXI_GP0_awsize(S_AXI_GP0_AWSIZE),
.S_AXI_GP0_awvalid(S_AXI_GP0_AWVALID),
.S_AXI_GP0_bready(S_AXI_GP0_BREADY),
.S_AXI_GP0_bresp(S_AXI_GP0_BRESP),
.S_AXI_GP0_bvalid(S_AXI_GP0_BVALID),
.S_AXI_GP0_rdata(S_AXI_GP0_RDATA),
.S_AXI_GP0_rlast(S_AXI_GP0_RLAST),
.S_AXI_GP0_rready(S_AXI_GP0_RREADY),
.S_AXI_GP0_rresp(S_AXI_GP0_RRESP),
.S_AXI_GP0_rvalid(S_AXI_GP0_RVALID),
.S_AXI_GP0_wdata(S_AXI_GP0_WDATA),
.S_AXI_GP0_wlast(S_AXI_GP0_WLAST),
.S_AXI_GP0_wready(S_AXI_GP0_WREADY),
.S_AXI_GP0_wstrb(S_AXI_GP0_WSTRB),
.S_AXI_GP0_wvalid(S_AXI_GP0_WVALID),
.S_AXI_GP1_ACLK(clk40),
.S_AXI_GP1_ARESETN(clk40_rstn),
.S_AXI_GP1_araddr(S_AXI_GP1_ARADDR),
.S_AXI_GP1_arburst(S_AXI_GP1_ARBURST),
.S_AXI_GP1_arcache(S_AXI_GP1_ARCACHE),
.S_AXI_GP1_arid(S_AXI_GP1_ARID),
.S_AXI_GP1_arlen(S_AXI_GP1_ARLEN),
.S_AXI_GP1_arlock(1'b0),
.S_AXI_GP1_arprot(S_AXI_GP1_ARPROT),
.S_AXI_GP1_arqos(4'b000),
.S_AXI_GP1_arready(S_AXI_GP1_ARREADY),
.S_AXI_GP1_arsize(S_AXI_GP1_ARSIZE),
.S_AXI_GP1_arvalid(S_AXI_GP1_ARVALID),
.S_AXI_GP1_awaddr(S_AXI_GP1_AWADDR),
.S_AXI_GP1_awburst(S_AXI_GP1_AWBURST),
.S_AXI_GP1_awcache(S_AXI_GP1_AWCACHE),
.S_AXI_GP1_awid(S_AXI_GP1_AWID),
.S_AXI_GP1_awlen(S_AXI_GP1_AWLEN),
.S_AXI_GP1_awlock(1'b0),
.S_AXI_GP1_awprot(S_AXI_GP1_AWPROT),
.S_AXI_GP1_awqos(4'b0000),
.S_AXI_GP1_awregion(4'b0000),
.S_AXI_GP1_awready(S_AXI_GP1_AWREADY),
.S_AXI_GP1_awsize(S_AXI_GP1_AWSIZE),
.S_AXI_GP1_awvalid(S_AXI_GP1_AWVALID),
.S_AXI_GP1_bid(),
.S_AXI_GP1_bready(S_AXI_GP1_BREADY),
.S_AXI_GP1_bresp(S_AXI_GP1_BRESP),
.S_AXI_GP1_bvalid(S_AXI_GP1_BVALID),
.S_AXI_GP1_rdata(S_AXI_GP1_RDATA),
.S_AXI_GP1_rid(),
.S_AXI_GP1_rlast(S_AXI_GP1_RLAST),
.S_AXI_GP1_rready(S_AXI_GP1_RREADY),
.S_AXI_GP1_rresp(S_AXI_GP1_RRESP),
.S_AXI_GP1_rvalid(S_AXI_GP1_RVALID),
.S_AXI_GP1_wdata(S_AXI_GP1_WDATA),
.S_AXI_GP1_wlast(S_AXI_GP1_WLAST),
.S_AXI_GP1_wready(S_AXI_GP1_WREADY),
.S_AXI_GP1_wstrb(S_AXI_GP1_WSTRB),
.S_AXI_GP1_wvalid(S_AXI_GP1_WVALID),
.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_arlen(S_AXI_HP0_ARLEN),
.S_AXI_HP0_arlock(1'b0),
.S_AXI_HP0_arprot(S_AXI_HP0_ARPROT),
.S_AXI_HP0_arqos(4'b0000),
.S_AXI_HP0_arready(S_AXI_HP0_ARREADY),
.S_AXI_HP0_arregion(4'b0),
.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_awlen(S_AXI_HP0_AWLEN),
.S_AXI_HP0_awlock(1'b0),
.S_AXI_HP0_awprot(S_AXI_HP0_AWPROT),
.S_AXI_HP0_awqos(4'b0000),
.S_AXI_HP0_awready(S_AXI_HP0_AWREADY),
.S_AXI_HP0_awregion(4'b0),
.S_AXI_HP0_awsize(S_AXI_HP0_AWSIZE),
.S_AXI_HP0_awvalid(S_AXI_HP0_AWVALID),
.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_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),
.S_AXI_HP1_ACLK(clk40),
.S_AXI_HP1_ARESETN(clk40_rstn),
.S_AXI_HP1_araddr(S_AXI_HP1_ARADDR),
.S_AXI_HP1_arburst(S_AXI_HP1_ARBURST),
.S_AXI_HP1_arcache(S_AXI_HP1_ARCACHE),
.S_AXI_HP1_arid(S_AXI_HP1_ARID),
.S_AXI_HP1_arlen(S_AXI_HP1_ARLEN),
.S_AXI_HP1_arlock(1'b0),
.S_AXI_HP1_arprot(S_AXI_HP1_ARPROT),
.S_AXI_HP1_arqos(4'b0000),
.S_AXI_HP1_arready(S_AXI_HP1_ARREADY),
.S_AXI_HP1_arsize(S_AXI_HP1_ARSIZE),
.S_AXI_HP1_arvalid(S_AXI_HP1_ARVALID),
.S_AXI_HP1_awaddr(S_AXI_HP1_AWADDR),
.S_AXI_HP1_awburst(S_AXI_HP1_AWBURST),
.S_AXI_HP1_awcache(S_AXI_HP1_AWCACHE),
.S_AXI_HP1_awid(S_AXI_HP1_AWID),
.S_AXI_HP1_awlen(S_AXI_HP1_AWLEN),
.S_AXI_HP1_awlock(1'b0),
.S_AXI_HP1_awprot(S_AXI_HP1_AWPROT),
.S_AXI_HP1_awqos(4'b0000),
.S_AXI_HP1_awready(S_AXI_HP1_AWREADY),
.S_AXI_HP1_awsize(S_AXI_HP1_AWSIZE),
.S_AXI_HP1_awvalid(S_AXI_HP1_AWVALID),
.S_AXI_HP1_bid(),
.S_AXI_HP1_bready(S_AXI_HP1_BREADY),
.S_AXI_HP1_bresp(S_AXI_HP1_BRESP),
.S_AXI_HP1_bvalid(S_AXI_HP1_BVALID),
.S_AXI_HP1_rdata(S_AXI_HP1_RDATA),
.S_AXI_HP1_rid(),
.S_AXI_HP1_rlast(S_AXI_HP1_RLAST),
.S_AXI_HP1_rready(S_AXI_HP1_RREADY),
.S_AXI_HP1_rresp(S_AXI_HP1_RRESP),
.S_AXI_HP1_rvalid(S_AXI_HP1_RVALID),
.S_AXI_HP1_wdata(S_AXI_HP1_WDATA),
.S_AXI_HP1_wlast(S_AXI_HP1_WLAST),
.S_AXI_HP1_wready(S_AXI_HP1_WREADY),
.S_AXI_HP1_wstrb(S_AXI_HP1_WSTRB),
.S_AXI_HP1_wvalid(S_AXI_HP1_WVALID),
// ARM DMA
.s_axis_dma_tdata(e2h_tdata),
.s_axis_dma_tkeep(e2h_tkeep),
.s_axis_dma_tlast(e2h_tlast),
.s_axis_dma_tready(e2h_tready),
.s_axis_dma_tvalid(e2h_tvalid),
.m_axis_dma_tdata(h2e_tdata),
.m_axis_dma_tkeep(h2e_tkeep),
.m_axis_dma_tlast(h2e_tlast),
.m_axis_dma_tready(h2e_tready),
.m_axis_dma_tvalid(h2e_tvalid),
// Misc Interrupts, GPIO, clk
.IRQ_F2P(IRQ_F2P),
.GPIO_0_tri_i(ps_gpio_in),
.GPIO_0_tri_o(ps_gpio_out),
.GPIO_0_tri_t(ps_gpio_tri),
.JTAG0_TCK(DBA_CPLD_JTAG_TCK),
.JTAG0_TMS(DBA_CPLD_JTAG_TMS),
.JTAG0_TDI(DBA_CPLD_JTAG_TDI),
.JTAG0_TDO(DBA_CPLD_JTAG_TDO),
`ifndef N300
.JTAG1_TCK(DBB_CPLD_JTAG_TCK),
.JTAG1_TMS(DBB_CPLD_JTAG_TMS),
.JTAG1_TDI(DBB_CPLD_JTAG_TDI),
.JTAG1_TDO(DBB_CPLD_JTAG_TDO),
`else
.JTAG1_TCK(),
.JTAG1_TMS(),
.JTAG1_TDI(),
.JTAG1_TDO('b0),
`endif
.FCLK_CLK0(FCLK_CLK0),
.FCLK_RESET0_N(FCLK_RESET0_N),
.FCLK_CLK1(FCLK_CLK1),
.FCLK_RESET1_N(),
.FCLK_CLK2(FCLK_CLK2),
.FCLK_RESET2_N(),
.FCLK_CLK3(FCLK_CLK3),
.FCLK_RESET3_N(),
.WR_UART_txd(wr_uart_rxd), // rx <-> tx
.WR_UART_rxd(wr_uart_txd), // rx <-> tx
.qsfp_sda_i(qsfp_sda_i),
.qsfp_sda_o(qsfp_sda_o),
.qsfp_sda_t(qsfp_sda_t),
.qsfp_scl_i(qsfp_scl_i),
.qsfp_scl_o(qsfp_scl_o),
.qsfp_scl_t(qsfp_scl_t),
.USBIND_0_port_indctl(),
.USBIND_0_vbus_pwrfault(),
.USBIND_0_vbus_pwrselect(),
// Outward connections to the pins
.MIO(MIO),
.DDR_cas_n(DDR_CAS_n),
.DDR_cke(DDR_CKE),
.DDR_ck_n(DDR_Clk_n),
.DDR_ck_p(DDR_Clk),
.DDR_cs_n(DDR_CS_n),
.DDR_reset_n(DDR_DRSTB),
.DDR_odt(DDR_ODT),
.DDR_ras_n(DDR_RAS_n),
.DDR_we_n(DDR_WEB),
.DDR_ba(DDR_BankAddr),
.DDR_addr(DDR_Addr),
.DDR_VRN(DDR_VRN),
.DDR_VRP(DDR_VRP),
.DDR_dm(DDR_DM),
.DDR_dq(DDR_DQ),
.DDR_dqs_n(DDR_DQS_n),
.DDR_dqs_p(DDR_DQS),
.PS_SRSTB(PS_SRSTB),
.PS_CLK(PS_CLK),
.PS_PORB(PS_PORB)
);
///////////////////////////////////////////////////////////////////////////////////
//
// Xilinx DDR3 Controller and PHY.
//
///////////////////////////////////////////////////////////////////////////////////
wire ddr3_axi_clk; // 1/4 DDR external clock rate (200MHz)
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;
// Instantiate the DDR3 MIG core
//
// The top-level IP block has no parameters defined for some reason.
// Most of configurable parameters are hard-coded in the mig so get
// some additional knobs we pull those out into verilog headers.
//
// Synthesis params: ip/ddr3_32bit/ddr3_32bit_mig_parameters.vh
// Simulation params: ip/ddr3_32bit/ddr3_32bit_mig_sim_parameters.vh
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), // 200Hz clock out
.ui_clk_sync_rst (ddr3_axi_rst), // Active high Reset signal synchronised to 200 MHz.
.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),
.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),
.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 (~global_rst) // IJB. Poorly named active low. Should change RST_ACT_LOW.
);
// Temperature monitor module
mig_7series_v4_2_tempmon #(
.TEMP_MON_CONTROL("INTERNAL"),
.XADC_CLK_PERIOD(5000 /* 200MHz clock period in ps */)
) tempmon_i (
.clk(bus_clk), .xadc_clk(bus_clk), .rst(bus_rst),
.device_temp_i(12'd0 /* ignored */), .device_temp(device_temp)
);
///////////////////////////////////////////////////////
//
// DB PS SPI Connections
//
///////////////////////////////////////////////////////
wire [NUM_CHANNELS-1:0] rx_atr;
wire [NUM_CHANNELS-1:0] tx_atr;
(* IOB = "true" *) reg [NUM_CHANNELS-1:0] rx_atr_reg;
(* IOB = "true" *) reg [NUM_CHANNELS-1:0] tx_atr_reg;
// Radio GPIO control for DSA
wire [16*NUM_CHANNELS-1:0] db_gpio_out;
wire [16*NUM_CHANNELS-1:0] db_gpio_ddr;
wire [16*NUM_CHANNELS-1:0] db_gpio_in;
wire [16*NUM_CHANNELS-1:0] db_gpio_fab;
// Vivado has demonstrated difficulty meeting timing with the spi0_mosi split.
// To improve the chances of meeting timing, we are routing this signal
// through a BUFG.
wire spi0_mosi_buf;
BUFG bufg_spi0_mosi (
.O (spi0_mosi_buf),
.I (spi0_mosi)
);
// DB A SPI Connections
wire cpld_a_cs_n;
wire lmk_a_cs_n;
wire dac_a_cs_n;
wire myk_a_cs_n;
// Split out the SCLK and MOSI data to Mykonos and the CPLD.
assign DBA_CPLD_PS_SPI_SCLK = spi0_sclk;
assign DBA_CPLD_PS_SPI_SDI = spi0_mosi_buf;
assign DBA_MYK_SPI_SCLK = spi0_sclk;
assign DBA_MYK_SPI_SDIO = spi0_mosi_buf;
// Assign individual chip selects from PS SPI MASTER 0.
assign cpld_a_cs_n = spi0_ss0;
assign lmk_a_cs_n = spi0_ss1;
assign dac_a_cs_n = ps_gpio_out[8]; // DAC select driven through GPIO.
assign myk_a_cs_n = spi0_ss2;
// Returned data mux from the SPI interfaces.
assign spi0_miso = ~myk_a_cs_n ? DBA_MYK_SPI_SDO : // From Mykonos
DBA_CPLD_PS_SPI_SDO;
// For the PS SPI connection to the CPLD, we use the LE and ADDR lines as individual
// chip selects for the CPLD endpoint as well as the LMK and DAC endpoints.
// LE = CPLD
// ADDR[0] = LMK
// ADDR[1] = DAC
assign DBA_CPLD_PS_SPI_LE = cpld_a_cs_n;
assign DBA_CPLD_PS_SPI_ADDR[0] = lmk_a_cs_n;
assign DBA_CPLD_PS_SPI_ADDR[1] = dac_a_cs_n;
assign DBA_MYK_SPI_CS_n = myk_a_cs_n;
// Instantiate DSA registers in the IOB
(* IOB = "true" *) reg [5:0] dsa_tx1_a_out_iob, dsa_rx1_a_out_iob;
(* IOB = "true" *) reg [5:0] dsa_tx2_a_out_iob, dsa_rx2_a_out_iob;
always @(posedge radio_clk) begin
dsa_tx1_a_out_iob <= db_gpio_out[16*0+11:16*0+6];
dsa_rx1_a_out_iob <= db_gpio_out[16*0+5:16*0+0];
dsa_tx2_a_out_iob <= db_gpio_out[16*1+11:16*1+6];
dsa_rx2_a_out_iob <= db_gpio_out[16*1+5:16*1+0];
end
assign DBA_CH1_TX_DSA_DATA = dsa_tx1_a_out_iob;
assign DBA_CH1_RX_DSA_DATA = dsa_rx1_a_out_iob;
assign DBA_CH2_TX_DSA_DATA = dsa_tx2_a_out_iob;
assign DBA_CH2_RX_DSA_DATA = dsa_rx2_a_out_iob;
assign DBA_ATR_RX_1 = rx_atr_reg[0];
assign DBA_ATR_RX_2 = rx_atr_reg[1];
assign DBA_ATR_TX_1 = tx_atr_reg[0];
assign DBA_ATR_TX_2 = tx_atr_reg[1];
assign DBA_MYK_GPIO_0 = 1'b0;
assign DBA_MYK_GPIO_1 = 1'b0;
assign DBA_MYK_GPIO_3 = 1'b0;
assign DBA_MYK_GPIO_4 = 1'b0;
assign DBA_MYK_GPIO_12 = 1'b0;
assign DBA_MYK_GPIO_13 = 1'b0;
assign DBA_MYK_GPIO_14 = 1'b0;
assign DBA_MYK_GPIO_15 = 1'b0;
`ifndef N300
// DB B SPI Connections
wire cpld_b_cs_n;
wire lmk_b_cs_n;
wire dac_b_cs_n;
wire myk_b_cs_n;
// Split out the SCLK and MOSI data to Mykonos and the CPLD.
assign DBB_CPLD_PS_SPI_SCLK = spi1_sclk;
assign DBB_CPLD_PS_SPI_SDI = spi1_mosi;
assign DBB_MYK_SPI_SCLK = spi1_sclk;
assign DBB_MYK_SPI_SDIO = spi1_mosi;
// Assign individual chip selects from PS SPI MASTER 1.
assign cpld_b_cs_n = spi1_ss0;
assign lmk_b_cs_n = spi1_ss1;
assign dac_b_cs_n = ps_gpio_out[9]; // DAC select driven through GPIO.
assign myk_b_cs_n = spi1_ss2;
// Returned data mux from the SPI interfaces.
assign spi1_miso = ~myk_b_cs_n ? DBB_MYK_SPI_SDO : // From Mykonos
DBB_CPLD_PS_SPI_SDO;
// For the PS SPI connection to the CPLD, we use the LE and ADDR lines as individual
// chip selects for the CPLD endpoint as well as the LMK and DAC endpoints.
// LE = CPLD
// ADDR[0] = LMK
// ADDR[1] = DAC
assign DBB_CPLD_PS_SPI_LE = cpld_b_cs_n;
assign DBB_CPLD_PS_SPI_ADDR[0] = lmk_b_cs_n;
assign DBB_CPLD_PS_SPI_ADDR[1] = dac_b_cs_n;
assign DBB_MYK_SPI_CS_n = myk_b_cs_n;
// Instantiate DSA registers in the IOB
(* IOB = "true" *) reg [5:0] dsa_tx1_b_out_iob, dsa_rx1_b_out_iob;
(* IOB = "true" *) reg [5:0] dsa_tx2_b_out_iob, dsa_rx2_b_out_iob;
always @(posedge radio_clk) begin
dsa_tx1_b_out_iob <= db_gpio_out[16*2+11:16*2+6];
dsa_rx1_b_out_iob <= db_gpio_out[16*2+5:16*2+0];
dsa_tx2_b_out_iob <= db_gpio_out[16*3+11:16*3+6];
dsa_rx2_b_out_iob <= db_gpio_out[16*3+5:16*3+0];
end
assign DBB_CH1_TX_DSA_DATA = dsa_tx1_b_out_iob;
assign DBB_CH1_RX_DSA_DATA = dsa_rx1_b_out_iob;
assign DBB_CH2_TX_DSA_DATA = dsa_tx2_b_out_iob;
assign DBB_CH2_RX_DSA_DATA = dsa_rx2_b_out_iob;
assign DBB_ATR_RX_1 = rx_atr_reg[2];
assign DBB_ATR_RX_2 = rx_atr_reg[3];
assign DBB_ATR_TX_1 = tx_atr_reg[2];
assign DBB_ATR_TX_2 = tx_atr_reg[3];
assign DBB_MYK_GPIO_0 = 1'b0;
assign DBB_MYK_GPIO_1 = 1'b0;
assign DBB_MYK_GPIO_3 = 1'b0;
assign DBB_MYK_GPIO_4 = 1'b0;
assign DBB_MYK_GPIO_12 = 1'b0;
assign DBB_MYK_GPIO_13 = 1'b0;
assign DBB_MYK_GPIO_14 = 1'b0;
assign DBB_MYK_GPIO_15 = 1'b0;
`endif
///////////////////////////////////////////////////////
//
// N3xx CORE
//
///////////////////////////////////////////////////////
wire [31:0] rx[NUM_CHANNELS-1:0];
wire [31:0] tx[NUM_CHANNELS-1:0];
wire [32*NUM_CHANNELS-1:0] rx_flat;
wire [32*NUM_CHANNELS-1:0] tx_flat;
wire [NUM_CHANNELS-1:0] rx_stb;
wire [NUM_CHANNELS-1:0] tx_stb;
wire [31:0] build_datestamp;
genvar i;
generate
for (i = 0; i < NUM_CHANNELS; i = i + 1) begin
// Radio Data
assign rx_flat[32*i+31:32*i] = rx[i];
assign tx[i] = tx_flat[32*i+31:32*i];
end
endgenerate
USR_ACCESSE2 usr_access_i (
.DATA(build_datestamp), .CFGCLK(), .DATAVALID()
);
n3xx_core #(
.REG_AWIDTH(14),
.BUS_CLK_RATE(BUS_CLK_RATE),
.FP_GPIO_WIDTH(FP_GPIO_WIDTH),
.NUM_CHANNELS_PER_RADIO(NUM_CHANNELS_PER_RADIO),
.NUM_CHANNELS(NUM_CHANNELS),
.NUM_DBOARDS(NUM_DBOARDS),
.CHDR_W(CHDR_W),
.BYTE_MTU(BYTE_MTU),
.RFNOC_PROTOVER(RFNOC_PROTOVER)
) n3xx_core(
// Clocks and resets
`ifdef NO_DB
.radio_clk(bus_clk),
.radio_rst(bus_rst),
`else
.radio_clk(radio_clk),
.radio_rst(radio_rst),
`endif
.bus_clk(bus_clk),
.bus_rst(bus_rst),
.ddr3_dma_clk(ddr3_dma_clk),
.clk40(clk40),
.ce_clk(ce_clk),
// Clocking and PPS Controls/Indicators
.pps(pps_radioclk1x),
.pps_select(pps_select),
.pps_out_enb(pps_out_enb),
.pps_select_sfp(pps_select_sfp),
.ref_clk_reset(),
.meas_clk_reset(meas_clk_reset),
.ref_clk_locked(1'b1),
.meas_clk_locked(meas_clk_locked),
.enable_ref_clk_async(enable_ref_clk_async),
.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),
// ps gpio source
.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]),
// FP_GPIO
.fp_gpio_inout(FPGA_GPIO),
// Radio ATR
.rx_atr(rx_atr),
.tx_atr(tx_atr),
// Radio GPIO DSA
.db_gpio_out_flat(db_gpio_out),
.db_gpio_in_flat(db_gpio_in),
.db_gpio_ddr_flat(db_gpio_ddr),
.db_gpio_fab_flat(db_gpio_fab),
// Radio Strobes
.rx_stb(rx_stb),
.tx_stb(tx_stb),
// Radio Data
.rx(rx_flat),
.tx(tx_flat),
// CPLD RX_LO TX_LO SPI
`ifndef N300
.sclk_flat({DBB_CPLD_PL_SPI_SCLK,
DBA_CPLD_PL_SPI_SCLK}),
.sen_flat({5'b0,DBB_CPLD_PL_SPI_ADDR[1],DBB_CPLD_PL_SPI_ADDR[0],DBB_CPLD_PL_SPI_LE,
5'b0,DBA_CPLD_PL_SPI_ADDR[1],DBA_CPLD_PL_SPI_ADDR[0],DBA_CPLD_PL_SPI_LE}),
.mosi_flat({DBB_CPLD_PL_SPI_SDI,
DBA_CPLD_PL_SPI_SDI}),
.miso_flat({DBB_CPLD_PL_SPI_SDO,
DBA_CPLD_PL_SPI_SDO}),
`else
.sclk_flat(DBA_CPLD_PL_SPI_SCLK),
.sen_flat({5'b0,DBA_CPLD_PL_SPI_ADDR[1],DBA_CPLD_PL_SPI_ADDR[0],DBA_CPLD_PL_SPI_LE}),
.mosi_flat(DBA_CPLD_PL_SPI_SDI),
.miso_flat(DBA_CPLD_PL_SPI_SDO),
`endif
// 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),
// Internal Ethernet DMA to PS
.m_dma_tdata(s_axis_dma_tdata),
.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_tlast(m_axis_dma_tlast),
.s_dma_tready(m_axis_dma_tready),
.s_dma_tvalid(m_axis_dma_tvalid),
// VITA to Ethernet
.v2e0_tdata(v2e0_tdata),
.v2e0_tvalid(v2e0_tvalid),
.v2e0_tlast(v2e0_tlast),
.v2e0_tready(v2e0_tready),
.v2e1_tdata(v2e1_tdata),
.v2e1_tlast(v2e1_tlast),
.v2e1_tvalid(v2e1_tvalid),
.v2e1_tready(v2e1_tready),
// Ethernet to VITA
.e2v0_tdata(e2v0_tdata),
.e2v0_tlast(e2v0_tlast),
.e2v0_tvalid(e2v0_tvalid),
.e2v0_tready(e2v0_tready),
.e2v1_tdata(e2v1_tdata),
.e2v1_tlast(e2v1_tlast),
.e2v1_tvalid(e2v1_tvalid),
.e2v1_tready(e2v1_tready),
//regport interface to npio
.reg_wr_req_npio(reg_wr_req_npio),
.reg_wr_addr_npio(reg_wr_addr_npio),
.reg_wr_data_npio(reg_wr_data_npio),
.reg_rd_req_npio(reg_rd_req_npio),
.reg_rd_addr_npio(reg_rd_addr_npio),
.reg_rd_resp_npio(reg_rd_resp_npio),
.reg_rd_data_npio(reg_rd_data_npio),
.build_datestamp(build_datestamp),
.xadc_readback({20'h0, device_temp}),
.sfp_ports_info({sfp_port1_info, sfp_port0_info}),
.device_id(device_id)
);
// Register the ATR bits once between sending them out to the CPLD to avoid
// glitches on the outputs!
always @(posedge radio_clk) begin
rx_atr_reg <= rx_atr;
tx_atr_reg <= tx_atr;
end
// //////////////////////////////////////////////////////////////////////
//
// Daughterboard Cores
//
// //////////////////////////////////////////////////////////////////////
wire [49:0] bRegPortInFlatA;
wire [33:0] bRegPortOutFlatA;
wire rx_a_valid;
wire tx_a_rfi;
`ifndef N300
wire [49:0] bRegPortInFlatB;
wire [33:0] bRegPortOutFlatB;
wire rx_b_valid;
wire tx_b_rfi;
`endif
`ifdef BUILD_WR
localparam INCL_WR_TDC = 1'b1;
`else
localparam INCL_WR_TDC = 1'b0;
`endif
wire reg_portA_rd;
wire reg_portA_wr;
wire [14-1:0] reg_portA_addr;
wire [32-1:0] reg_portA_wr_data;
wire [32-1:0] reg_portA_rd_data;
wire reg_portA_ready;
wire validA_unused;
assign bRegPortInFlatA = {2'b0, reg_portA_addr, reg_portA_wr_data, reg_portA_rd, reg_portA_wr};
assign {reg_portA_rd_data, validA_unused, reg_portA_ready} = bRegPortOutFlatA;
DbCore #(
.kInclWhiteRabbitTdc(INCL_WR_TDC)
) dba_core (
.bBusReset(clk40_rst), //in std_logic
.BusClk(clk40), //in std_logic
.Clk40(clk40), //in std_logic
.MeasClk(meas_clk), //in std_logic
.FpgaClk_p(DBA_FPGA_CLK_P), //in std_logic
.FpgaClk_n(DBA_FPGA_CLK_N), //in std_logic
.SampleClk1xOut(radio_clk), //out std_logic
.SampleClk1x(radio_clk), //in std_logic
.SampleClk2xOut(radio_clk_2x), //out std_logic
.SampleClk2x(radio_clk_2x), //in std_logic
.bRegPortInFlat(bRegPortInFlatA), //in std_logic_vector(49:0)
.bRegPortOutFlat(bRegPortOutFlatA), //out std_logic_vector(33:0)
.kSlotId(1'b0), //in std_logic
.sSysRefFpgaLvds_p(DBA_FPGA_SYSREF_P), //in std_logic
.sSysRefFpgaLvds_n(DBA_FPGA_SYSREF_N), //in std_logic
.aLmkSync(DBA_CPLD_PL_SPI_ADDR[2]), //out std_logic
.JesdRefClk_p(USRPIO_A_MGTCLK_P), //in std_logic
.JesdRefClk_n(USRPIO_A_MGTCLK_N), //in std_logic
.aAdcRx_p(USRPIO_A_RX_P), //in std_logic_vector(3:0)
.aAdcRx_n(USRPIO_A_RX_N), //in std_logic_vector(3:0)
.aSyncAdcOut_n(DBA_MYK_SYNC_IN_n), //out std_logic
.aDacTx_p(USRPIO_A_TX_P), //out std_logic_vector(3:0)
.aDacTx_n(USRPIO_A_TX_N), //out std_logic_vector(3:0)
.aSyncDacIn_n(DBA_MYK_SYNC_OUT_n), //in std_logic
.sAdcDataValid(rx_a_valid), //out std_logic
.sAdcDataSamples0I(rx[0][31:16]), //out std_logic_vector(15:0)
.sAdcDataSamples0Q(rx[0][15:0]), //out std_logic_vector(15:0)
.sAdcDataSamples1I(rx[1][31:16]), //out std_logic_vector(15:0)
.sAdcDataSamples1Q(rx[1][15:0]), //out std_logic_vector(15:0)
.sDacReadyForInput(tx_a_rfi), //out std_logic
.sDacDataSamples0I(tx[0][31:16]), //in std_logic_vector(15:0)
.sDacDataSamples0Q(tx[0][15:0]), //in std_logic_vector(15:0)
.sDacDataSamples1I(tx[1][31:16]), //in std_logic_vector(15:0)
.sDacDataSamples1Q(tx[1][15:0]), //in std_logic_vector(15:0)
.RefClk(ref_clk), //in std_logic
.rPpsPulse(pps_refclk), //in std_logic
.rGatedPulseToPin(UNUSED_PIN_TDCA_0), //inout std_logic
.sGatedPulseToPin(UNUSED_PIN_TDCA_1), //inout std_logic
.sPps(pps_radioclk1x), //out std_logic
.sPpsToIob(pps_radioclk1x_iob), //out std_logic
.WrRefClk(wr_ref_clk), //in std_logic
.rWrPpsPulse(pps_wr_refclk), //in std_logic
.rWrGatedPulseToPin(UNUSED_PIN_TDCA_2), //inout std_logic
.sWrGatedPulseToPin(UNUSED_PIN_TDCA_3), //inout std_logic
.aPpsSfpSel(pps_select_sfp), //out std_logic_vector(1:0)
.sAdcSync(), //out std_logic
.sDacSync(), //out std_logic
.sSysRef(), //out std_logic
.rRpTransfer(), //out std_logic
.sSpTransfer(), //out std_logic
.rWrRpTransfer(), //out std_logic
.sWrSpTransfer() //out std_logic
);
assign rx_stb[0] = rx_a_valid;
assign rx_stb[1] = rx_a_valid;
assign tx_stb[0] = tx_a_rfi;
assign tx_stb[1] = tx_a_rfi;
axil_to_ni_regport #(
.RP_DWIDTH (32),
.RP_AWIDTH (14),
.TIMEOUT (512)
) ni_regportA_inst (
// Clock and reset
.s_axi_aclk (clk40),
.s_axi_areset (clk40_rst),
// AXI4-Lite: Write address port (domain: s_axi_aclk)
.s_axi_awaddr(M_AXI_JESD0_AWADDR),
.s_axi_awvalid(M_AXI_JESD0_AWVALID),
.s_axi_awready(M_AXI_JESD0_AWREADY),
// AXI4-Lite: Write data port (domain: s_axi_aclk)
.s_axi_wdata(M_AXI_JESD0_WDATA),
.s_axi_wstrb(M_AXI_JESD0_WSTRB),
.s_axi_wvalid(M_AXI_JESD0_WVALID),
.s_axi_wready(M_AXI_JESD0_WREADY),
// AXI4-Lite: Write response port (domain: s_axi_aclk)
.s_axi_bresp(M_AXI_JESD0_BRESP),
.s_axi_bvalid(M_AXI_JESD0_BVALID),
.s_axi_bready(M_AXI_JESD0_BREADY),
// AXI4-Lite: Read address port (domain: s_axi_aclk)
.s_axi_araddr(M_AXI_JESD0_ARADDR),
.s_axi_arvalid(M_AXI_JESD0_ARVALID),
.s_axi_arready(M_AXI_JESD0_ARREADY),
// AXI4-Lite: Read data port (domain: s_axi_aclk)
.s_axi_rdata(M_AXI_JESD0_RDATA),
.s_axi_rresp(M_AXI_JESD0_RRESP),
.s_axi_rvalid(M_AXI_JESD0_RVALID),
.s_axi_rready(M_AXI_JESD0_RREADY),
// Register port
.reg_port_in_rd (reg_portA_rd),
.reg_port_in_wt (reg_portA_wr),
.reg_port_in_addr (reg_portA_addr),
.reg_port_in_data (reg_portA_wr_data),
.reg_port_out_data (reg_portA_rd_data),
.reg_port_out_ready(reg_portA_ready)
);
`ifndef N300
wire reg_portB_rd;
wire reg_portB_wr;
wire [14-1:0] reg_portB_addr;
wire [32-1:0] reg_portB_wr_data;
wire [32-1:0] reg_portB_rd_data;
wire reg_portB_ready;
wire validB_unused;
assign bRegPortInFlatB = {2'b0, reg_portB_addr, reg_portB_wr_data, reg_portB_rd, reg_portB_wr};
assign {reg_portB_rd_data, validB_unused, reg_portB_ready} = bRegPortOutFlatB;
DbCore #(
.kInclWhiteRabbitTdc(INCL_WR_TDC)
) dbb_core (
.bBusReset(clk40_rst), //in std_logic
.BusClk(clk40), //in std_logic
.Clk40(clk40), //in std_logic
.MeasClk(meas_clk), //in std_logic
.FpgaClk_p(DBB_FPGA_CLK_P), //in std_logic
.FpgaClk_n(DBB_FPGA_CLK_N), //in std_logic
.SampleClk1xOut(), //out std_logic
.SampleClk1x(radio_clk), //in std_logic
.SampleClk2xOut(), //out std_logic
.SampleClk2x(radio_clk_2x), //in std_logic
.bRegPortInFlat(bRegPortInFlatB), //in std_logic_vector(49:0)
.bRegPortOutFlat(bRegPortOutFlatB), //out std_logic_vector(33:0)
.kSlotId(1'b1), //in std_logic
.sSysRefFpgaLvds_p(DBB_FPGA_SYSREF_P), //in std_logic
.sSysRefFpgaLvds_n(DBB_FPGA_SYSREF_N), //in std_logic
.aLmkSync(DBB_CPLD_PL_SPI_ADDR[2]), //out std_logic
.JesdRefClk_p(USRPIO_B_MGTCLK_P), //in std_logic
.JesdRefClk_n(USRPIO_B_MGTCLK_N), //in std_logic
.aAdcRx_p(USRPIO_B_RX_P), //in std_logic_vector(3:0)
.aAdcRx_n(USRPIO_B_RX_N), //in std_logic_vector(3:0)
.aSyncAdcOut_n(DBB_MYK_SYNC_IN_n), //out std_logic
.aDacTx_p(USRPIO_B_TX_P), //out std_logic_vector(3:0)
.aDacTx_n(USRPIO_B_TX_N), //out std_logic_vector(3:0)
.aSyncDacIn_n(DBB_MYK_SYNC_OUT_n), //in std_logic
.sAdcDataValid(rx_b_valid), //out std_logic
.sAdcDataSamples0I(rx[2][31:16]), //out std_logic_vector(15:0)
.sAdcDataSamples0Q(rx[2][15:0]), //out std_logic_vector(15:0)
.sAdcDataSamples1I(rx[3][31:16]), //out std_logic_vector(15:0)
.sAdcDataSamples1Q(rx[3][15:0]), //out std_logic_vector(15:0)
.sDacReadyForInput(tx_b_rfi), //out std_logic
.sDacDataSamples0I(tx[2][31:16]), //in std_logic_vector(15:0)
.sDacDataSamples0Q(tx[2][15:0]), //in std_logic_vector(15:0)
.sDacDataSamples1I(tx[3][31:16]), //in std_logic_vector(15:0)
.sDacDataSamples1Q(tx[3][15:0]), //in std_logic_vector(15:0)
.RefClk(ref_clk), //in std_logic
.rPpsPulse(pps_refclk), //in std_logic
.rGatedPulseToPin(UNUSED_PIN_TDCB_0), //inout std_logic
.sGatedPulseToPin(UNUSED_PIN_TDCB_1), //inout std_logic
.sPps(), //out std_logic
.sPpsToIob(), //out std_logic
.WrRefClk(wr_ref_clk), //in std_logic
.rWrPpsPulse(pps_wr_refclk), //in std_logic
.rWrGatedPulseToPin(UNUSED_PIN_TDCB_2), //inout std_logic
.sWrGatedPulseToPin(UNUSED_PIN_TDCB_3), //inout std_logic
.aPpsSfpSel(2'b0), //out std_logic_vector(1:0)
.sAdcSync(), //out std_logic
.sDacSync(), //out std_logic
.sSysRef(), //out std_logic
.rRpTransfer(), //out std_logic
.sSpTransfer(), //out std_logic
.rWrRpTransfer(), //out std_logic
.sWrSpTransfer() //out std_logic
);
assign rx_stb[2] = rx_b_valid;
assign rx_stb[3] = rx_b_valid;
assign tx_stb[2] = tx_b_rfi;
assign tx_stb[3] = tx_b_rfi;
axil_to_ni_regport #(
.RP_DWIDTH (32),
.RP_AWIDTH (14),
.TIMEOUT (512)
) ni_regportB_inst (
// Clock and reset
.s_axi_aclk (clk40),
.s_axi_areset (clk40_rst),
// AXI4-Lite: Write address port (domain: s_axi_aclk)
.s_axi_awaddr(M_AXI_JESD1_AWADDR),
.s_axi_awvalid(M_AXI_JESD1_AWVALID),
.s_axi_awready(M_AXI_JESD1_AWREADY),
// AXI4-Lite: Write data port (domain: s_axi_aclk)
.s_axi_wdata(M_AXI_JESD1_WDATA),
.s_axi_wstrb(M_AXI_JESD1_WSTRB),
.s_axi_wvalid(M_AXI_JESD1_WVALID),
.s_axi_wready(M_AXI_JESD1_WREADY),
// AXI4-Lite: Write response port (domain: s_axi_aclk)
.s_axi_bresp(M_AXI_JESD1_BRESP),
.s_axi_bvalid(M_AXI_JESD1_BVALID),
.s_axi_bready(M_AXI_JESD1_BREADY),
// AXI4-Lite: Read address port (domain: s_axi_aclk)
.s_axi_araddr(M_AXI_JESD1_ARADDR),
.s_axi_arvalid(M_AXI_JESD1_ARVALID),
.s_axi_arready(M_AXI_JESD1_ARREADY),
// AXI4-Lite: Read data port (domain: s_axi_aclk)
.s_axi_rdata (M_AXI_JESD1_RDATA),
.s_axi_rresp (M_AXI_JESD1_RRESP),
.s_axi_rvalid (M_AXI_JESD1_RVALID),
.s_axi_rready (M_AXI_JESD1_RREADY),
// Register port
.reg_port_in_rd (reg_portB_rd),
.reg_port_in_wt (reg_portB_wr),
.reg_port_in_addr (reg_portB_addr),
.reg_port_in_data (reg_portB_wr_data),
.reg_port_out_data (reg_portB_rd_data),
.reg_port_out_ready(reg_portB_ready)
);
`else
// Tie off second daughterboard interface
axi_dummy #(
.DEC_ERR(1'b0)
) inst_axi_dummy_dbb_core (
// Clock and reset
.s_axi_aclk (clk40),
.s_axi_areset (clk40_rst),
// AXI4-Lite: Write address port (domain: s_axi_aclk)
.s_axi_awaddr(M_AXI_JESD1_AWADDR),
.s_axi_awvalid(M_AXI_JESD1_AWVALID),
.s_axi_awready(M_AXI_JESD1_AWREADY),
// AXI4-Lite: Write data port (domain: s_axi_aclk)
.s_axi_wdata(M_AXI_JESD1_WDATA),
.s_axi_wstrb(M_AXI_JESD1_WSTRB),
.s_axi_wvalid(M_AXI_JESD1_WVALID),
.s_axi_wready(M_AXI_JESD1_WREADY),
// AXI4-Lite: Write response port (domain: s_axi_aclk)
.s_axi_bresp(M_AXI_JESD1_BRESP),
.s_axi_bvalid(M_AXI_JESD1_BVALID),
.s_axi_bready(M_AXI_JESD1_BREADY),
// AXI4-Lite: Read address port (domain: s_axi_aclk)
.s_axi_araddr(M_AXI_JESD1_ARADDR),
.s_axi_arvalid(M_AXI_JESD1_ARVALID),
.s_axi_arready(M_AXI_JESD1_ARREADY),
// AXI4-Lite: Read data port (domain: s_axi_aclk)
.s_axi_rdata (M_AXI_JESD1_RDATA),
.s_axi_rresp (M_AXI_JESD1_RRESP),
.s_axi_rvalid (M_AXI_JESD1_RVALID),
.s_axi_rready (M_AXI_JESD1_RREADY)
);
`endif
// //////////////////////////////////////////////////////////////////////
//
// LEDS
//
// //////////////////////////////////////////////////////////////////////
assign PANEL_LED_LINK = ps_gpio_out[45];
assign PANEL_LED_REF = ps_gpio_out[46];
assign PANEL_LED_GPS = ps_gpio_out[47];
/////////////////////////////////////////////////////////////////////
//
// PUDC Workaround
//
//////////////////////////////////////////////////////////////////////
// This is a workaround for a silicon bug in Series 7 FPGA where a
// race condition with the reading of PUDC during the erase of the FPGA
// image cause glitches on output IO pins.
//
// Workaround:
// - Define the PUDC pin in the XDC file with a pullup.
// - Implements an IBUF on the PUDC input and make sure that it does
// not get optimized out.
(* dont_touch = "true" *) wire fpga_pudc_b_buf;
IBUF pudc_ibuf_i (
.I(FPGA_PUDC_B),
.O(fpga_pudc_b_buf));
endmodule