Description
I referenced the ExaNIC_X10 project and ported it to my own Ku060 board. Now, I have a problem where I downloaded the program to the board but the network card is not connected. The top-level is as follows:
module udp_stack_10g #
(
parameter C_S_AXI_ADDR_WIDTH = 8,
parameter C_S_AXI_DATA_WIDTH = 32,
parameter TARGET = "XILINX",
parameter DW = 64,
parameter KW = DW/8,
// fpga
parameter [31:0] C_SRC_IP_ADDR = {8'd192,8'd168,8'd2,8'd101},
parameter [15:0] C_SRC_UDP_PORT = 1234,
parameter [31:0] C_SRC_GATEWAY_IP = {8'd192,8'd168,8'd2,8'd1},
parameter [31:0] C_SRC_SUBNET_MASK = {8'd255,8'd255,8'd255,8'd0},
parameter [47:0] C_SRC_MAC_ADDR = 48'h00_0a_35_00_1e_53,
// pc
parameter [31:0] C_DST_IP_ADDR = {8'd192,8'd168,8'd2,8'd100},
parameter [15:0] C_DST_UDP_PORT = 4001
)(
// AXI4_LITE
// System Signals
input wire clk, // 156.25Mhz
input wire reset_n,
// Slave Interface Write Address Ports
input wire [C_S_AXI_ADDR_WIDTH-1:0] s_axi_awaddr,
input wire s_axi_awvalid,
output wire s_axi_awready,
// Slave Interface Write Data Ports
input wire [C_S_AXI_DATA_WIDTH-1:0] s_axi_wdata,
input wire [C_S_AXI_DATA_WIDTH/8-1:0] s_axi_wstrb,
input wire s_axi_wvalid,
output wire s_axi_wready,
// Slave Interface Write Response Ports
output wire [1:0] s_axi_bresp,
output wire s_axi_bvalid,
input wire s_axi_bready,
// Slave Interface Read Address Ports
input wire [C_S_AXI_ADDR_WIDTH-1:0] s_axi_araddr,
input wire s_axi_arvalid,
output wire s_axi_arready,
// Slave Interface Read Data Ports
output wire [C_S_AXI_DATA_WIDTH-1:0] s_axi_rdata,
output wire [1:0] s_axi_rresp,
output wire s_axi_rvalid,
input wire s_axi_rready,
// user interface
// tx(fpga -> pc)
input wire [DW-1:0] usr_s_axis_tdata,
input wire [KW-1:0] usr_s_axis_tkeep,
input wire usr_s_axis_tvalid,
output wire usr_s_axis_tready,
input wire usr_s_axis_tlast,
input wire usr_s_axis_tuser,
// rx(pc -> fpga)
output wire [DW-1:0] usr_m_axis_tdata,
output wire [KW-1:0] usr_m_axis_tkeep,
output wire usr_m_axis_tvalid,
input wire usr_m_axis_tready,
output wire usr_m_axis_tlast,
output wire usr_m_axis_tuser,
//input wire clk_100m_p,
//input wire clk_100m_n,
input wire i_clk_125m,
input wire i_mmcm_lock,
// 10G Ethernet: SFP BASE_R
input wire sfp_refclk_p,
input wire sfp_refclk_n,
input wire sfp_rx_p,
input wire sfp_rx_n,
output wire sfp_tx_p,
output wire sfp_tx_n
);
//******************************************************************************
// 内部信号定义
//******************************************************************************
wire [4:0] cmd_phy_addr;
wire [4:0] cmd_reg_addr;
wire [15:0] cmd_data;
wire [1:0] cmd_opcode;
wire cmd_start; // pulse
wire [15:0] phy_rdata;
wire [7:0] prescale;
wire mdio_busy;
wire [31:0] src_ip_addr;
wire [15:0] src_udp_port;
wire [31:0] src_gateway_ip;
wire [31:0] src_subnet_mask;
wire [47:0] src_mac_addr;
wire [31:0] dst_ip_addr;
wire [15:0] dst_udp_port;
wire [1:0] phy_speed;
wire usr_rst;
// udp <-> mac
// mac(m) -> udp(s)
wire [DW-1:0] mac_s_axis_tdata;
wire [KW-1:0] mac_s_axis_tkeep;
wire mac_s_axis_tvalid;
wire mac_s_axis_tready;
wire mac_s_axis_tlast;
wire mac_s_axis_tuser;
// udp(m) -> mac(s)
wire [DW-1:0] mac_m_axis_tdata;
wire [KW-1:0] mac_m_axis_tkeep;
wire mac_m_axis_tvalid;
wire mac_m_axis_tready;
wire mac_m_axis_tlast;
wire mac_m_axis_tuser;
// 10G phy
wire [63:0] xgmii_sfp_txd;
wire [7:0] xgmii_sfp_txc;
wire [63:0] xgmii_sfp_rxd;
wire [7:0] xgmii_sfp_rxc;
wire xgmii_rx_clk_156mhz;
wire xgmii_rx_rst_156mhz;
wire xgmii_tx_clk_156mhz;
wire xgmii_tx_rst_156mhz;
wire sfp_mgt_refclk;
wire phy_rx_block_lock;
wire sfp_qpll0lock;
wire sfp_qpll0outclk;
wire sfp_qpll0outrefclk;
//******************************************************************************
// 主控逻辑
//******************************************************************************
udp_stack_reg #(
.C_S_AXI_ADDR_WIDTH ( C_S_AXI_ADDR_WIDTH ),
.C_S_AXI_DATA_WIDTH ( C_S_AXI_DATA_WIDTH ),
.C_SRC_IP_ADDR ( C_SRC_IP_ADDR ),
.C_SRC_UDP_PORT ( C_SRC_UDP_PORT ),
.C_SRC_GATEWAY_IP ( C_SRC_GATEWAY_IP ),
.C_SRC_SUBNET_MASK ( C_SRC_SUBNET_MASK ),
.C_SRC_MAC_ADDR ( C_SRC_MAC_ADDR ),
.C_DST_IP_ADDR ( C_DST_IP_ADDR ),
.C_DST_UDP_PORT ( C_DST_UDP_PORT )
) udp_stack_reg (
// axi lite slave
.s_axi_aclk ( clk ),
.s_axi_aresetn ( reset_n ),
.s_axi_awaddr ( s_axi_awaddr ),
.s_axi_awvalid ( s_axi_awvalid ),
.s_axi_awready ( s_axi_awready ),
.s_axi_wdata ( s_axi_wdata ),
.s_axi_wstrb ( s_axi_wstrb ),
.s_axi_wvalid ( s_axi_wvalid ),
.s_axi_wready ( s_axi_wready ),
.s_axi_bresp ( s_axi_bresp ),
.s_axi_bvalid ( s_axi_bvalid ),
.s_axi_bready ( s_axi_bready ),
.s_axi_araddr ( s_axi_araddr ),
.s_axi_arvalid ( s_axi_arvalid ),
.s_axi_arready ( s_axi_arready ),
.s_axi_rdata ( s_axi_rdata ),
.s_axi_rresp ( s_axi_rresp ),
.s_axi_rvalid ( s_axi_rvalid ),
.s_axi_rready ( s_axi_rready ),
// User register
.cmd_phy_addr ( cmd_phy_addr ),
.cmd_reg_addr ( cmd_reg_addr ),
.cmd_data ( cmd_data ),
.cmd_opcode ( cmd_opcode ),
.cmd_start ( cmd_start ),
.phy_rdata ( phy_rdata ),
.prescale ( prescale ),
.mdio_busy ( mdio_busy ),
.src_ip_addr ( src_ip_addr ),
.src_udp_port ( src_udp_port ),
.src_gateway_ip ( src_gateway_ip ),
.src_subnet_mask ( src_subnet_mask ),
.src_mac_addr ( src_mac_addr ),
.dst_ip_addr ( dst_ip_addr ),
.dst_udp_port ( dst_udp_port ),
.usr_rst ( usr_rst ),
.phy_speed ( phy_speed )
);
assign phy_rdata = 16'd0;
assign mdio_busy = 1'b0;
assign phy_speed = {phy_rx_block_lock,sfp_qpll0lock};
//---------------------------------udp--------------------------------------------------
// udp_stack
udp_stack_logic #
(
.TARGET ( TARGET ),
.DW ( 64 )
)udp_stack_logic(
.clk ( clk ),
.rst ( ~reset_n ),
.src_ip_addr ( src_ip_addr ),
.src_udp_port ( src_udp_port ),
.src_gateway_ip ( src_gateway_ip ),
.src_subnet_mask ( src_subnet_mask ),
.src_mac_addr ( src_mac_addr ),
.dst_ip_addr ( dst_ip_addr ),
.dst_udp_port ( dst_udp_port ),
// tx(fpga -> pc)
.usr_s_axis_tdata ( usr_s_axis_tdata ),
.usr_s_axis_tkeep ( usr_s_axis_tkeep ),
.usr_s_axis_tvalid ( usr_s_axis_tvalid ),
.usr_s_axis_tready ( usr_s_axis_tready ),
.usr_s_axis_tlast ( usr_s_axis_tlast ),
.usr_s_axis_tuser ( usr_s_axis_tuser ),
// rx(pc -> fpga)
.usr_m_axis_tdata ( usr_m_axis_tdata ),
.usr_m_axis_tkeep ( usr_m_axis_tkeep ),
.usr_m_axis_tvalid ( usr_m_axis_tvalid ),
.usr_m_axis_tready ( usr_m_axis_tready ),
.usr_m_axis_tlast ( usr_m_axis_tlast ),
.usr_m_axis_tuser ( usr_m_axis_tuser ),
.mac_s_axis_tdata ( mac_s_axis_tdata ),
.mac_s_axis_tkeep ( mac_s_axis_tkeep ),
.mac_s_axis_tvalid ( mac_s_axis_tvalid ),
.mac_s_axis_tready ( mac_s_axis_tready ),
.mac_s_axis_tlast ( mac_s_axis_tlast ),
.mac_s_axis_tuser ( mac_s_axis_tuser ),
.mac_m_axis_tdata ( mac_m_axis_tdata ),
.mac_m_axis_tkeep ( mac_m_axis_tkeep ),
.mac_m_axis_tvalid ( mac_m_axis_tvalid ),
.mac_m_axis_tready ( mac_m_axis_tready ),
.mac_m_axis_tlast ( mac_m_axis_tlast ),
.mac_m_axis_tuser ( mac_m_axis_tuser )
);
// mac(fifo:32KB)
eth_mac_10g_fifo #(
.ENABLE_PADDING ( 1 ),
.ENABLE_DIC ( 1 ),
.MIN_FRAME_LENGTH ( 64 ),
.TX_FIFO_DEPTH ( 4096 ),
.TX_FRAME_FIFO ( 1 ),
.RX_FIFO_DEPTH ( 4096 ),
.RX_FRAME_FIFO ( 1 )
)eth_mac_10g_fifo_inst (
.rx_clk ( xgmii_rx_clk_156mhz ), // 同步xgmii_rxd
.rx_rst ( xgmii_rx_rst_156mhz ),
.tx_clk ( xgmii_tx_clk_156mhz ), // 同步xgmii_txd
.tx_rst ( xgmii_tx_rst_156mhz ),
.logic_clk ( clk ),
.logic_rst ( ~reset_n ),
.tx_axis_tdata ( mac_m_axis_tdata ),
.tx_axis_tkeep ( mac_m_axis_tkeep ),
.tx_axis_tvalid ( mac_m_axis_tvalid ),
.tx_axis_tready ( mac_m_axis_tready ),
.tx_axis_tlast ( mac_m_axis_tlast ),
.tx_axis_tuser ( mac_m_axis_tuser ),
.rx_axis_tdata ( mac_s_axis_tdata ),
.rx_axis_tkeep ( mac_s_axis_tkeep ),
.rx_axis_tvalid ( mac_s_axis_tvalid ),
.rx_axis_tready ( mac_s_axis_tready ),
.rx_axis_tlast ( mac_s_axis_tlast ),
.rx_axis_tuser ( mac_s_axis_tuser ),
.xgmii_rxd ( xgmii_sfp_rxd ),
.xgmii_rxc ( xgmii_sfp_rxc ),
.xgmii_txd ( xgmii_sfp_txd ),
.xgmii_txc ( xgmii_sfp_txc ),
.tx_fifo_overflow ( ),
.tx_fifo_bad_frame ( ),
.tx_fifo_good_frame ( ),
.rx_error_bad_frame ( ),
.rx_error_bad_fcs ( ),
.rx_fifo_overflow ( ),
.rx_fifo_bad_frame ( ),
.rx_fifo_good_frame ( ),
.ifg_delay ( 8'd12 )
);
// xilinx phy(pcs+pma): include share logic in the core
wire clk_125m_rst;
sync_reset #(
.N ( 4 )
)sync_reset (
.clk ( i_clk_125m ),
.rst ( ~i_mmcm_lock ),
.out ( clk_125m_rst )
);
IBUFDS_GTE3 ibufds_gte3_sfp_mgt_refclk_inst
(
.I ( sfp_refclk_p ),
.IB ( sfp_refclk_n ),
.CEB ( 1'b0 ),
.O ( sfp_mgt_refclk ),
.ODIV2 ( )
);
eth_xcvr_phy_wrapper #(
.HAS_COMMON ( 1 )
)sfp_1_phy_inst(
.xcvr_ctrl_clk ( i_clk_125m ), // freerun
.xcvr_ctrl_rst ( clk_125m_rst ),
// Common
.xcvr_gtpowergood_out ( ),
// PLL out
.xcvr_gtrefclk00_in ( sfp_mgt_refclk ),
.xcvr_qpll0lock_out ( sfp_qpll0lock ),
.xcvr_qpll0outclk_out ( sfp_qpll0outclk ),
.xcvr_qpll0outrefclk_out( sfp_qpll0outrefclk ),
// PLL in
.xcvr_qpll0lock_in ( 1'b0 ),
.xcvr_qpll0reset_out ( ),
.xcvr_qpll0clk_in ( 1'b0 ),
.xcvr_qpll0refclk_in ( 1'b0 ),
// Serial data
.xcvr_txp ( sfp_tx_p ),
.xcvr_txn ( sfp_tx_n ),
.xcvr_rxp ( sfp_rx_p ),
.xcvr_rxn ( sfp_rx_n ),
// PHY connections
.phy_tx_clk ( xgmii_tx_clk_156mhz ), // o
.phy_tx_rst ( xgmii_tx_rst_156mhz ), // o
.phy_xgmii_txd ( xgmii_sfp_txd ), // i
.phy_xgmii_txc ( xgmii_sfp_txc ), // i
.phy_rx_clk ( xgmii_rx_clk_156mhz ), // o
.phy_rx_rst ( xgmii_rx_rst_156mhz ), // o
.phy_xgmii_rxd ( xgmii_sfp_rxd ), // o
.phy_xgmii_rxc ( xgmii_sfp_rxc ), // o
.phy_tx_bad_block ( ),
.phy_rx_error_count ( ),
.phy_rx_bad_block ( ),
.phy_rx_sequence_error ( ),
.phy_rx_block_lock ( phy_rx_block_lock ),
.phy_rx_high_ber ( ),
.phy_tx_prbs31_enable ( ),
.phy_rx_prbs31_enable ( )
);
endmodule
`resetall