master-thesis/netpfga/minip4/simple_sume_switch/hw/hdl/top.v
2019-07-23 15:17:53 +02:00

1268 lines
49 KiB
Verilog

//-
// Copyright (c) 2015 Noa Zilberman
// All rights reserved.
//
// This software was developed by Stanford University and the University of Cambridge Computer Laboratory
// under National Science Foundation under Grant No. CNS-0855268,
// the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and
// by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),
// as part of the DARPA MRC research programme.
//
// File:
// top.v
//
// Module:
// top
//
// Author: Noa Zilberman
//
// Description:
// reference switch top module
//
// @NETFPGA_LICENSE_HEADER_START@
//
// Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor
// license agreements. See the NOTICE file distributed with this work for
// additional information regarding copyright ownership. NetFPGA licenses this
// file to you under the NetFPGA Hardware-Software License, Version 1.0 (the
// "License"); you may not use this file except in compliance with the
// License. You may obtain a copy of the License at:
//
// http://www.netfpga-cic.org
//
// Unless required by applicable law or agreed to in writing, Work distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
//
// @NETFPGA_LICENSE_HEADER_END@
//
`timescale 1ps / 1ps
module top # (
parameter C_DATA_WIDTH = 256, // RX/TX interface data width
parameter C_TUSER_WIDTH = 128 // RX/TX interface data width
) (
//PCI Express
input [7:0]pcie_7x_mgt_rxn,
input [7:0]pcie_7x_mgt_rxp,
output [7:0]pcie_7x_mgt_txn,
output [7:0]pcie_7x_mgt_txp,
//10G Interface
input sfp0_rx_p,
input sfp0_rx_n,
output sfp0_tx_p,
output sfp0_tx_n,
input sfp0_tx_fault,
input sfp0_tx_abs,
output sfp0_tx_disable,
input sfp1_rx_p,
input sfp1_rx_n,
output sfp1_tx_p,
output sfp1_tx_n,
input sfp1_tx_fault,
input sfp1_tx_abs,
output sfp1_tx_disable,
input sfp2_rx_p,
input sfp2_rx_n,
output sfp2_tx_p,
output sfp2_tx_n,
input sfp2_tx_fault,
input sfp2_tx_abs,
output sfp2_tx_disable,
input sfp3_rx_p,
input sfp3_rx_n,
output sfp3_tx_p,
output sfp3_tx_n,
input sfp3_tx_fault,
input sfp3_tx_abs,
output sfp3_tx_disable,
// 100MHz PCIe Clock
input sys_clkp,
input sys_clkn,
// 200MHz FPGA Clock
input fpga_sysclk_p,
input fpga_sysclk_n,
// 156.25MHz Si5324 clock
input xphy_refclk_p,
input xphy_refclk_n,
//debug features
output [1:0] leds,
output sfp0_tx_led,
output sfp1_tx_led,
output sfp2_tx_led,
output sfp3_tx_led,
output sfp0_rx_led,
output sfp1_rx_led,
output sfp2_rx_led,
output sfp3_rx_led,
//-SI5324 I2C programming interface
inout i2c_clk,
inout i2c_data,
output [1:0] i2c_reset,
//UART interface
input uart_rxd,
output uart_txd,
input sys_reset_n
);
//----------------------------------------------------------------------------------------------------------------//
// System(SYS) Interface //
//----------------------------------------------------------------------------------------------------------------//
wire sys_clk;
wire clk_200;
wire sys_rst_n_c;
wire clk_200_locked;
//-----------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------//
// axis interface //
//----------------------------------------------------------------------------------------------------------------//
wire[C_DATA_WIDTH-1:0] axis_i_0_tdata;
wire axis_i_0_tvalid;
wire axis_i_0_tlast;
wire[C_TUSER_WIDTH-1:0] axis_i_0_tuser;
wire[(C_DATA_WIDTH/8)-1:0] axis_i_0_tkeep;
wire axis_i_0_tready;
(* mark_debug = "true" *) wire[C_DATA_WIDTH-1:0] axis_o_0_tdata;
(* mark_debug = "true" *) wire axis_o_0_tvalid;
(* mark_debug = "true" *) wire axis_o_0_tlast;
(* mark_debug = "true" *) wire [C_TUSER_WIDTH-1:0] axis_o_0_tuser;
(* mark_debug = "true" *) wire[(C_DATA_WIDTH/8)-1:0] axis_o_0_tkeep;
(* mark_debug = "true" *) wire axis_o_0_tready;
wire[C_DATA_WIDTH-1:0] axis_i_1_tdata;
wire axis_i_1_tvalid;
wire axis_i_1_tlast;
wire[C_TUSER_WIDTH-1:0] axis_i_1_tuser;
wire[C_DATA_WIDTH/8-1:0] axis_i_1_tkeep;
wire axis_i_1_tready;
(* mark_debug = "true" *) wire[C_DATA_WIDTH-1:0] axis_o_1_tdata;
(* mark_debug = "true" *) wire axis_o_1_tvalid;
(* mark_debug = "true" *) wire axis_o_1_tlast;
(* mark_debug = "true" *) wire [C_TUSER_WIDTH-1:0] axis_o_1_tuser;
(* mark_debug = "true" *) wire[C_DATA_WIDTH/8-1:0] axis_o_1_tkeep;
(* mark_debug = "true" *) wire axis_o_1_tready;
wire[C_DATA_WIDTH-1:0] axis_i_2_tdata;
wire axis_i_2_tvalid;
wire axis_i_2_tlast;
wire[C_TUSER_WIDTH-1:0] axis_i_2_tuser;
wire[C_DATA_WIDTH/8-1:0] axis_i_2_tkeep;
wire axis_i_2_tready;
(* mark_debug = "true" *) wire[C_DATA_WIDTH-1:0] axis_o_2_tdata;
(* mark_debug = "true" *) wire axis_o_2_tvalid;
(* mark_debug = "true" *) wire axis_o_2_tlast;
(* mark_debug = "true" *) wire [C_TUSER_WIDTH-1:0] axis_o_2_tuser;
(* mark_debug = "true" *) wire[C_DATA_WIDTH/8-1:0] axis_o_2_tkeep;
(* mark_debug = "true" *) wire axis_o_2_tready;
wire[C_DATA_WIDTH-1:0] axis_i_3_tdata;
wire axis_i_3_tvalid;
wire axis_i_3_tlast;
wire[C_TUSER_WIDTH-1:0] axis_i_3_tuser;
wire[C_DATA_WIDTH/8-1:0] axis_i_3_tkeep;
wire axis_i_3_tready;
(* mark_debug = "true" *) wire[C_DATA_WIDTH-1:0] axis_o_3_tdata;
(* mark_debug = "true" *) wire axis_o_3_tvalid;
(* mark_debug = "true" *) wire axis_o_3_tlast;
(* mark_debug = "true" *) wire [C_TUSER_WIDTH-1:0] axis_o_3_tuser;
(* mark_debug = "true" *) wire[C_DATA_WIDTH/8-1:0] axis_o_3_tkeep;
(* mark_debug = "true" *) wire axis_o_3_tready;
// AXIS DMA interfaces
wire [255:0] axis_dma_i_tdata ;
wire [31:0] axis_dma_i_tkeep ;
wire axis_dma_i_tlast ;
wire axis_dma_i_tready;
wire [255:0] axis_dma_i_tuser ;
wire axis_dma_i_tvalid;
wire [255:0] axis_dma_o_tdata;
wire [31:0] axis_dma_o_tkeep;
wire axis_dma_o_tlast;
wire axis_dma_o_tready;
wire [127:0] axis_dma_o_tuser;
wire axis_dma_o_tvalid;
//----------------------------------------------------------------------------------------------------------------//
// AXI Lite interface //
//----------------------------------------------------------------------------------------------------------------//
wire [11:0] M00_AXI_araddr;
wire [2:0] M00_AXI_arprot;
wire [0:0] M00_AXI_arready;
wire [0:0] M00_AXI_arvalid;
wire [11:0] M00_AXI_awaddr;
wire [2:0] M00_AXI_awprot;
wire [0:0] M00_AXI_awready;
wire [0:0] M00_AXI_awvalid;
wire [0:0] M00_AXI_bready;
wire [1:0] M00_AXI_bresp;
wire [0:0] M00_AXI_bvalid;
wire [31:0] M00_AXI_rdata;
wire [0:0] M00_AXI_rready;
wire [1:0] M00_AXI_rresp;
wire [0:0] M00_AXI_rvalid;
wire [31:0] M00_AXI_wdata;
wire [0:0] M00_AXI_wready;
wire [3:0] M00_AXI_wstrb;
wire [0:0] M00_AXI_wvalid;
wire [11:0] M01_AXI_araddr;
wire [2:0] M01_AXI_arprot;
wire [0:0] M01_AXI_arready;
wire [0:0] M01_AXI_arvalid;
wire [11:0] M01_AXI_awaddr;
wire [2:0] M01_AXI_awprot;
wire [0:0] M01_AXI_awready;
wire [0:0] M01_AXI_awvalid;
wire [0:0] M01_AXI_bready;
wire [1:0] M01_AXI_bresp;
wire [0:0] M01_AXI_bvalid;
wire [31:0] M01_AXI_rdata;
wire [0:0] M01_AXI_rready;
wire [1:0] M01_AXI_rresp;
wire [0:0] M01_AXI_rvalid;
wire [31:0] M01_AXI_wdata;
wire [0:0] M01_AXI_wready;
wire [3:0] M01_AXI_wstrb;
wire [0:0] M01_AXI_wvalid;
(* mark_debug = "true" *) wire [11:0] M02_AXI_araddr;
(* mark_debug = "true" *) wire [2:0] M02_AXI_arprot;
(* mark_debug = "true" *) wire [0:0] M02_AXI_arready;
(* mark_debug = "true" *) wire [0:0] M02_AXI_arvalid;
(* mark_debug = "true" *) wire [11:0] M02_AXI_awaddr;
(* mark_debug = "true" *) wire [2:0] M02_AXI_awprot;
(* mark_debug = "true" *) wire [0:0] M02_AXI_awready;
(* mark_debug = "true" *) wire [0:0] M02_AXI_awvalid;
(* mark_debug = "true" *) wire [0:0] M02_AXI_bready;
(* mark_debug = "true" *) wire [1:0] M02_AXI_bresp;
(* mark_debug = "true" *) wire [0:0] M02_AXI_bvalid;
(* mark_debug = "true" *) wire [31:0] M02_AXI_rdata;
(* mark_debug = "true" *) wire [0:0] M02_AXI_rready;
(* mark_debug = "true" *) wire [1:0] M02_AXI_rresp;
(* mark_debug = "true" *) wire [0:0] M02_AXI_rvalid;
(* mark_debug = "true" *) wire [31:0] M02_AXI_wdata;
(* mark_debug = "true" *) wire [0:0] M02_AXI_wready;
(* mark_debug = "true" *) wire [3:0] M02_AXI_wstrb;
(* mark_debug = "true" *) wire [0:0] M02_AXI_wvalid;
wire [11:0] M03_AXI_araddr;
wire [2:0] M03_AXI_arprot;
wire [0:0] M03_AXI_arready;
wire [0:0] M03_AXI_arvalid;
wire [11:0] M03_AXI_awaddr;
wire [2:0] M03_AXI_awprot;
wire [0:0] M03_AXI_awready;
wire [0:0] M03_AXI_awvalid;
wire [0:0] M03_AXI_bready;
wire [1:0] M03_AXI_bresp;
wire [0:0] M03_AXI_bvalid;
wire [31:0] M03_AXI_rdata;
wire [0:0] M03_AXI_rready;
wire [1:0] M03_AXI_rresp;
wire [0:0] M03_AXI_rvalid;
wire [31:0] M03_AXI_wdata;
wire [0:0] M03_AXI_wready;
wire [3:0] M03_AXI_wstrb;
wire [0:0] M03_AXI_wvalid;
wire [11:0] M04_AXI_araddr;
wire [2:0] M04_AXI_arprot;
wire [0:0] M04_AXI_arready;
wire [0:0] M04_AXI_arvalid;
wire [11:0] M04_AXI_awaddr;
wire [2:0] M04_AXI_awprot;
wire [0:0] M04_AXI_awready;
wire [0:0] M04_AXI_awvalid;
wire [0:0] M04_AXI_bready;
wire [1:0] M04_AXI_bresp;
wire [0:0] M04_AXI_bvalid;
wire [31:0] M04_AXI_rdata;
wire [0:0] M04_AXI_rready;
wire [1:0] M04_AXI_rresp;
wire [0:0] M04_AXI_rvalid;
wire [31:0] M04_AXI_wdata;
wire [0:0] M04_AXI_wready;
wire [3:0] M04_AXI_wstrb;
wire [0:0] M04_AXI_wvalid;
wire [11:0] M05_AXI_araddr;
wire [2:0] M05_AXI_arprot;
wire [0:0] M05_AXI_arready;
wire [0:0] M05_AXI_arvalid;
wire [11:0] M05_AXI_awaddr;
wire [2:0] M05_AXI_awprot;
wire [0:0] M05_AXI_awready;
wire [0:0] M05_AXI_awvalid;
wire [0:0] M05_AXI_bready;
wire [1:0] M05_AXI_bresp;
wire [0:0] M05_AXI_bvalid;
wire [31:0] M05_AXI_rdata;
wire [0:0] M05_AXI_rready;
wire [1:0] M05_AXI_rresp;
wire [0:0] M05_AXI_rvalid;
wire [31:0] M05_AXI_wdata;
wire [0:0] M05_AXI_wready;
wire [3:0] M05_AXI_wstrb;
wire [0:0] M05_AXI_wvalid;
wire [11:0] M06_AXI_araddr;
wire [2:0] M06_AXI_arprot;
wire [0:0] M06_AXI_arready;
wire [0:0] M06_AXI_arvalid;
wire [11:0] M06_AXI_awaddr;
wire [2:0] M06_AXI_awprot;
wire [0:0] M06_AXI_awready;
wire [0:0] M06_AXI_awvalid;
wire [0:0] M06_AXI_bready;
wire [1:0] M06_AXI_bresp;
wire [0:0] M06_AXI_bvalid;
wire [31:0] M06_AXI_rdata;
wire [0:0] M06_AXI_rready;
wire [1:0] M06_AXI_rresp;
wire [0:0] M06_AXI_rvalid;
wire [31:0] M06_AXI_wdata;
wire [0:0] M06_AXI_wready;
wire [3:0] M06_AXI_wstrb;
wire [0:0] M06_AXI_wvalid;
wire [11:0] M07_AXI_araddr;
wire [2:0] M07_AXI_arprot;
wire [0:0] M07_AXI_arready;
wire [0:0] M07_AXI_arvalid;
wire [11:0] M07_AXI_awaddr;
wire [2:0] M07_AXI_awprot;
wire [0:0] M07_AXI_awready;
wire [0:0] M07_AXI_awvalid;
wire [0:0] M07_AXI_bready;
wire [1:0] M07_AXI_bresp;
wire [0:0] M07_AXI_bvalid;
wire [31:0] M07_AXI_rdata;
wire [0:0] M07_AXI_rready;
wire [1:0] M07_AXI_rresp;
wire [0:0] M07_AXI_rvalid;
wire [31:0] M07_AXI_wdata;
wire [0:0] M07_AXI_wready;
wire [3:0] M07_AXI_wstrb;
wire [0:0] M07_AXI_wvalid;
// 10G Interfaces
//Port 0
wire sfp_qplllock ;
wire sfp_qplloutrefclk;
wire sfp_qplloutclk ;
wire sfp_clk156;
wire sfp_areset_clk156;
wire sfp_gttxreset;
wire sfp_gtrxreset;
wire sfp_txuserrdy;
wire sfp_txusrclk;
wire sfp_txusrclk2;
wire sfp_reset_counter_done;
wire sfp_tx_axis_areset;
wire sfp_tx_axis_aresetn;
wire sfp_rx_axis_aresetn;
wire port0_ready;
wire block0_lock;
wire sfp0_resetdone;
wire sfp0_txclk322;
wire port1_ready;
wire block1_lock;
wire sfp1_tx_resetdone;
wire sfp1_rx_resetdone;
wire sfp1_txclk322;
wire port2_ready;
wire block2_lock;
wire sfp2_tx_resetdone;
wire sfp2_rx_resetdone;
wire sfp2_txclk322;
wire port3_ready;
wire block3_lock;
wire sfp3_tx_resetdone;
wire sfp3_rx_resetdone;
wire sfp3_txclk322;
wire i2c_scl_o;
wire i2c_scl_i;
wire i2c_scl_t;
wire i2c_sda_o;
wire i2c_sda_i;
wire i2c_sda_t;
wire axi_clk;
wire axi_aresetn;
wire sys_reset;
(* ASYNC_REG = "TRUE" *) reg [3:0] core200_reset_sync_n;
wire axis_resetn;
wire axi_datapath_resetn;
wire peripheral_reset;
// Assign interface numbers to ports
// Odd bits are ports and even bits are DMA
localparam IF_SFP0 = 8'b00000001;
localparam IF_SFP1 = 8'b00000100;
localparam IF_SFP2 = 8'b00010000;
localparam IF_SFP3 = 8'b01000000;
///////////////////////////// DEBUG ONLY ///////////////////////////
// system clk heartbeat
reg [27:0] sfp_clk156_count;
reg [27:0] sfp_clk100_count;
reg [1:0] led;
//---------------------------------------------------------------------
// Misc
//---------------------------------------------------------------------
// Debug LEDs
// 156MHz clk heartbeat ~ every second
OBUF led_0_obuf (
.O (leds[0]),
.I (led[0])
);
// 100MHz clk heartbeat ~ every 1.5 seconds
OBUF led_1_obuf (
.O (leds[1]),
.I (led[1])
);
////////////////////////////////////////
// clock generation and buffers
IBUF sys_reset_n_ibuf(
.O (sys_rst_n_c),
.I (sys_reset_n)
);
IBUFDS_GTE2 #(
.CLKCM_CFG ("TRUE"),
.CLKRCV_TRST ("TRUE"),
.CLKSWING_CFG (2'b11) // Refer to Transceiver User Guide
) IBUFDS_GTE2_inst (
.O (sys_clk), // 1-bit output: Refer to Transceiver User Guide
.ODIV2 (), // 1-bit output: Refer to Transceiver User Guide
.CEB (1'b0), // 1-bit input: Refer to Transceiver User Guide
.I (sys_clkp), // 1-bit input: Refer to Transceiver User Guide
.IB (sys_clkn) // 1-bit input: Refer to Transceiver User Guide
);
IOBUF i2c_scl_iobuf (
.I (i2c_scl_o),
.IO (i2c_clk),
.O (i2c_scl_i),
.T (i2c_scl_t)
);
IOBUF i2c_sda_iobuf (
.I (i2c_sda_o),
.IO (i2c_data),
.O (i2c_sda_i),
.T (i2c_sda_t)
);
axi_clocking axi_clocking_i (
.clk_in_p (fpga_sysclk_p),
.clk_in_n (fpga_sysclk_n),
.clk_200 (clk_200), // generates 200MHz clk
.locked (clk_200_locked),
.resetn (sys_rst_n_c)
);
// axi_clk - 100MHz - assign through buffer
BUFG axi_lite_bufg0 (
.I (sys_clk),
.O (axi_clk)
);
////////////////////////////////////////
// main resets
proc_sys_reset_ip proc_sys_reset_i (
.slowest_sync_clk(clk_200), // input wire slowest_sync_clk
.ext_reset_in(sys_rst_n_c), // input wire ext_reset_in
.aux_reset_in(1'b1), // input wire aux_reset_in
.mb_debug_sys_rst(1'b0), // input wire mb_debug_sys_rst
.dcm_locked(clk_200_locked), // input wire dcm_locked
.mb_reset(), // output wire mb_reset
.bus_struct_reset(), // output wire [0 : 0] bus_struct_reset
.peripheral_reset(peripheral_reset), // output wire [0 : 3] peripheral_reset
.interconnect_aresetn(), // output wire [0 : 0] interconnect_aresetn
.peripheral_aresetn(axis_resetn) // output wire [0 : 7] peripheral_aresetn
);
assign sys_reset = !sys_rst_n_c;
//assign axi_aresetn = sys_rst_n_c;
always @ (posedge clk_200) begin
if (!sys_rst_n_c)
core200_reset_sync_n <= 4'h0;
else
core200_reset_sync_n <= #1 {core200_reset_sync_n[2:0],sys_rst_n_c};
end
assign axi_aresetn = axis_resetn;
assign axi_datapath_resetn = axis_resetn;
//-----------------------------------------------------------------------------------------------//
// Network modules //
//-----------------------------------------------------------------------------------------------//
nf_datapath
#(
// Master AXI Stream Data Width
.C_M_AXIS_DATA_WIDTH (C_DATA_WIDTH),
.C_S_AXIS_DATA_WIDTH (C_DATA_WIDTH),
.C_S_AXI_ADDR_WIDTH (12),
.C_M_AXIS_TUSER_WIDTH (128),
.C_S_AXIS_TUSER_WIDTH (128),
.NUM_QUEUES (5)
)
nf_datapath_0
(
.axis_aclk (clk_200),
.axis_resetn (axis_resetn),
.axi_aclk (clk_200),
.axi_resetn (axi_datapath_resetn),
// Slave Stream Ports (interface from Rx queues)
.s_axis_0_tdata (axis_i_0_tdata),
.s_axis_0_tkeep (axis_i_0_tkeep),
.s_axis_0_tuser (axis_i_0_tuser),
.s_axis_0_tvalid (axis_i_0_tvalid),
.s_axis_0_tready (axis_i_0_tready),
.s_axis_0_tlast (axis_i_0_tlast),
.s_axis_1_tdata (axis_i_1_tdata),
.s_axis_1_tkeep (axis_i_1_tkeep),
.s_axis_1_tuser (axis_i_1_tuser),
.s_axis_1_tvalid (axis_i_1_tvalid),
.s_axis_1_tready (axis_i_1_tready),
.s_axis_1_tlast (axis_i_1_tlast),
.s_axis_2_tdata (axis_i_2_tdata),
.s_axis_2_tkeep (axis_i_2_tkeep),
.s_axis_2_tuser (axis_i_2_tuser),
.s_axis_2_tvalid (axis_i_2_tvalid),
.s_axis_2_tready (axis_i_2_tready),
.s_axis_2_tlast (axis_i_2_tlast),
.s_axis_3_tdata (axis_i_3_tdata),
.s_axis_3_tkeep (axis_i_3_tkeep),
.s_axis_3_tuser (axis_i_3_tuser),
.s_axis_3_tvalid (axis_i_3_tvalid),
.s_axis_3_tready (axis_i_3_tready),
.s_axis_3_tlast (axis_i_3_tlast),
.s_axis_4_tdata (axis_dma_i_tdata ),
.s_axis_4_tkeep (axis_dma_i_tkeep ),
.s_axis_4_tuser (axis_dma_i_tuser[127:0] ),
.s_axis_4_tvalid (axis_dma_i_tvalid),
.s_axis_4_tready (axis_dma_i_tready ),
.s_axis_4_tlast (axis_dma_i_tlast),
// Master Stream Ports (interface to TX queues)
.m_axis_0_tdata (axis_o_0_tdata),
.m_axis_0_tkeep (axis_o_0_tkeep),
.m_axis_0_tuser (axis_o_0_tuser),
.m_axis_0_tvalid (axis_o_0_tvalid),
.m_axis_0_tready (axis_o_0_tready),
.m_axis_0_tlast (axis_o_0_tlast),
.m_axis_1_tdata (axis_o_1_tdata),
.m_axis_1_tkeep (axis_o_1_tkeep),
.m_axis_1_tuser (axis_o_1_tuser),
.m_axis_1_tvalid (axis_o_1_tvalid),
.m_axis_1_tready (axis_o_1_tready),
.m_axis_1_tlast (axis_o_1_tlast),
.m_axis_2_tdata (axis_o_2_tdata),
.m_axis_2_tkeep (axis_o_2_tkeep),
.m_axis_2_tuser (axis_o_2_tuser),
.m_axis_2_tvalid (axis_o_2_tvalid),
.m_axis_2_tready (axis_o_2_tready),
.m_axis_2_tlast (axis_o_2_tlast),
.m_axis_3_tdata (axis_o_3_tdata ),
.m_axis_3_tkeep (axis_o_3_tkeep ),
.m_axis_3_tuser (axis_o_3_tuser ),
.m_axis_3_tvalid (axis_o_3_tvalid),
.m_axis_3_tready (axis_o_3_tready),
.m_axis_3_tlast (axis_o_3_tlast ),
.m_axis_4_tdata (axis_dma_o_tdata ),
.m_axis_4_tkeep (axis_dma_o_tkeep ),
.m_axis_4_tuser (axis_dma_o_tuser ),
.m_axis_4_tvalid (axis_dma_o_tvalid),
.m_axis_4_tready (axis_dma_o_tready ),
.m_axis_4_tlast (axis_dma_o_tlast),
//AXI-Lite interface
.S0_AXI_AWADDR (M01_AXI_awaddr),
.S0_AXI_AWVALID (M01_AXI_awvalid),
.S0_AXI_WDATA (M01_AXI_wdata),
.S0_AXI_WSTRB (M01_AXI_wstrb),
.S0_AXI_WVALID (M01_AXI_wvalid),
.S0_AXI_BREADY (M01_AXI_bready),
.S0_AXI_ARADDR (M01_AXI_araddr),
.S0_AXI_ARVALID (M01_AXI_arvalid),
.S0_AXI_RREADY (M01_AXI_rready),
.S0_AXI_ARREADY (M01_AXI_arready),
.S0_AXI_RDATA (M01_AXI_rdata),
.S0_AXI_RRESP (M01_AXI_rresp),
.S0_AXI_RVALID (M01_AXI_rvalid),
.S0_AXI_WREADY (M01_AXI_wready),
.S0_AXI_BRESP (M01_AXI_bresp),
.S0_AXI_BVALID (M01_AXI_bvalid),
.S0_AXI_AWREADY (M01_AXI_awready),
.S1_AXI_AWADDR (M02_AXI_awaddr),
.S1_AXI_AWVALID (M02_AXI_awvalid),
.S1_AXI_WDATA (M02_AXI_wdata),
.S1_AXI_WSTRB (M02_AXI_wstrb),
.S1_AXI_WVALID (M02_AXI_wvalid),
.S1_AXI_BREADY (M02_AXI_bready),
.S1_AXI_ARADDR (M02_AXI_araddr),
.S1_AXI_ARVALID (M02_AXI_arvalid),
.S1_AXI_RREADY (M02_AXI_rready),
.S1_AXI_ARREADY (M02_AXI_arready),
.S1_AXI_RDATA (M02_AXI_rdata),
.S1_AXI_RRESP (M02_AXI_rresp),
.S1_AXI_RVALID (M02_AXI_rvalid),
.S1_AXI_WREADY (M02_AXI_wready),
.S1_AXI_BRESP (M02_AXI_bresp),
.S1_AXI_BVALID (M02_AXI_bvalid),
.S1_AXI_AWREADY (M02_AXI_awready),
.S2_AXI_AWADDR (M03_AXI_awaddr),
.S2_AXI_AWVALID (M03_AXI_awvalid),
.S2_AXI_WDATA (M03_AXI_wdata),
.S2_AXI_WSTRB (M03_AXI_wstrb),
.S2_AXI_WVALID (M03_AXI_wvalid),
.S2_AXI_BREADY (M03_AXI_bready),
.S2_AXI_ARADDR (M03_AXI_araddr),
.S2_AXI_ARVALID (M03_AXI_arvalid),
.S2_AXI_RREADY (M03_AXI_rready),
.S2_AXI_ARREADY (M03_AXI_arready),
.S2_AXI_RDATA (M03_AXI_rdata),
.S2_AXI_RRESP (M03_AXI_rresp),
.S2_AXI_RVALID (M03_AXI_rvalid),
.S2_AXI_WREADY (M03_AXI_wready),
.S2_AXI_BRESP (M03_AXI_bresp),
.S2_AXI_BVALID (M03_AXI_bvalid),
.S2_AXI_AWREADY (M03_AXI_awready)
);
// PCIe to {AXI_Lite, AXIS} bridge
control_sub control_sub_i
(
.M00_AXI_araddr (M00_AXI_araddr ),
.M00_AXI_arprot (M00_AXI_arprot ),
.M00_AXI_arready (M00_AXI_arready ),
.M00_AXI_arvalid (M00_AXI_arvalid ),
.M00_AXI_awaddr (M00_AXI_awaddr ),
.M00_AXI_awprot (M00_AXI_awprot ),
.M00_AXI_awready (M00_AXI_awready ),
.M00_AXI_awvalid (M00_AXI_awvalid ),
.M00_AXI_bready (M00_AXI_bready ),
.M00_AXI_bresp (M00_AXI_bresp ),
.M00_AXI_bvalid (M00_AXI_bvalid ),
.M00_AXI_rdata (M00_AXI_rdata ),
.M00_AXI_rready (M00_AXI_rready ),
.M00_AXI_rresp (M00_AXI_rresp ),
.M00_AXI_rvalid (M00_AXI_rvalid ),
.M00_AXI_wdata (M00_AXI_wdata ),
.M00_AXI_wready (M00_AXI_wready ),
.M00_AXI_wstrb (M00_AXI_wstrb ),
.M00_AXI_wvalid (M00_AXI_wvalid ),
.M01_AXI_araddr (M01_AXI_araddr ),
.M01_AXI_arprot (M01_AXI_arprot ),
.M01_AXI_arready (M01_AXI_arready ),
.M01_AXI_arvalid (M01_AXI_arvalid ),
.M01_AXI_awaddr (M01_AXI_awaddr ),
.M01_AXI_awprot (M01_AXI_awprot ),
.M01_AXI_awready (M01_AXI_awready ),
.M01_AXI_awvalid (M01_AXI_awvalid ),
.M01_AXI_bready (M01_AXI_bready ),
.M01_AXI_bresp (M01_AXI_bresp ),
.M01_AXI_bvalid (M01_AXI_bvalid ),
.M01_AXI_rdata (M01_AXI_rdata ),
.M01_AXI_rready (M01_AXI_rready ),
.M01_AXI_rresp (M01_AXI_rresp ),
.M01_AXI_rvalid (M01_AXI_rvalid ),
.M01_AXI_wdata (M01_AXI_wdata ),
.M01_AXI_wready (M01_AXI_wready ),
.M01_AXI_wstrb (M01_AXI_wstrb ),
.M01_AXI_wvalid (M01_AXI_wvalid ),
.M02_AXI_araddr (M02_AXI_araddr ),
.M02_AXI_arprot (M02_AXI_arprot ),
.M02_AXI_arready (M02_AXI_arready ),
.M02_AXI_arvalid (M02_AXI_arvalid ),
.M02_AXI_awaddr (M02_AXI_awaddr ),
.M02_AXI_awprot (M02_AXI_awprot ),
.M02_AXI_awready (M02_AXI_awready ),
.M02_AXI_awvalid (M02_AXI_awvalid ),
.M02_AXI_bready (M02_AXI_bready ),
.M02_AXI_bresp (M02_AXI_bresp ),
.M02_AXI_bvalid (M02_AXI_bvalid ),
.M02_AXI_rdata (M02_AXI_rdata ),
.M02_AXI_rready (M02_AXI_rready ),
.M02_AXI_rresp (M02_AXI_rresp ),
.M02_AXI_rvalid (M02_AXI_rvalid ),
.M02_AXI_wdata (M02_AXI_wdata ),
.M02_AXI_wready (M02_AXI_wready ),
.M02_AXI_wstrb (M02_AXI_wstrb ),
.M02_AXI_wvalid (M02_AXI_wvalid ),
.M03_AXI_araddr (M03_AXI_araddr ),
.M03_AXI_arprot (M03_AXI_arprot ),
.M03_AXI_arready (M03_AXI_arready),
.M03_AXI_arvalid (M03_AXI_arvalid),
.M03_AXI_awaddr (M03_AXI_awaddr ),
.M03_AXI_awprot (M03_AXI_awprot ),
.M03_AXI_awready (M03_AXI_awready),
.M03_AXI_awvalid (M03_AXI_awvalid),
.M03_AXI_bready (M03_AXI_bready ),
.M03_AXI_bresp (M03_AXI_bresp ),
.M03_AXI_bvalid (M03_AXI_bvalid ),
.M03_AXI_rdata (M03_AXI_rdata ),
.M03_AXI_rready (M03_AXI_rready ),
.M03_AXI_rresp (M03_AXI_rresp ),
.M03_AXI_rvalid (M03_AXI_rvalid ),
.M03_AXI_wdata (M03_AXI_wdata ),
.M03_AXI_wready (M03_AXI_wready ),
.M03_AXI_wstrb (M03_AXI_wstrb ),
.M03_AXI_wvalid (M03_AXI_wvalid ),
.M04_AXI_araddr (M04_AXI_araddr ),
.M04_AXI_arprot (M04_AXI_arprot ),
.M04_AXI_arready (M04_AXI_arready),
.M04_AXI_arvalid (M04_AXI_arvalid),
.M04_AXI_awaddr (M04_AXI_awaddr ),
.M04_AXI_awprot (M04_AXI_awprot ),
.M04_AXI_awready (M04_AXI_awready),
.M04_AXI_awvalid (M04_AXI_awvalid),
.M04_AXI_bready (M04_AXI_bready ),
.M04_AXI_bresp (M04_AXI_bresp ),
.M04_AXI_bvalid (M04_AXI_bvalid ),
.M04_AXI_rdata (M04_AXI_rdata ),
.M04_AXI_rready (M04_AXI_rready ),
.M04_AXI_rresp (M04_AXI_rresp ),
.M04_AXI_rvalid (M04_AXI_rvalid ),
.M04_AXI_wdata (M04_AXI_wdata ),
.M04_AXI_wready (M04_AXI_wready ),
.M04_AXI_wstrb (M04_AXI_wstrb ),
.M04_AXI_wvalid (M04_AXI_wvalid ),
.M05_AXI_araddr (M05_AXI_araddr ),
.M05_AXI_arprot (M05_AXI_arprot ),
.M05_AXI_arready (M05_AXI_arready),
.M05_AXI_arvalid (M05_AXI_arvalid),
.M05_AXI_awaddr (M05_AXI_awaddr ),
.M05_AXI_awprot (M05_AXI_awprot ),
.M05_AXI_awready (M05_AXI_awready),
.M05_AXI_awvalid (M05_AXI_awvalid),
.M05_AXI_bready (M05_AXI_bready ),
.M05_AXI_bresp (M05_AXI_bresp ),
.M05_AXI_bvalid (M05_AXI_bvalid ),
.M05_AXI_rdata (M05_AXI_rdata ),
.M05_AXI_rready (M05_AXI_rready ),
.M05_AXI_rresp (M05_AXI_rresp ),
.M05_AXI_rvalid (M05_AXI_rvalid ),
.M05_AXI_wdata (M05_AXI_wdata ),
.M05_AXI_wready (M05_AXI_wready ),
.M05_AXI_wstrb (M05_AXI_wstrb ),
.M05_AXI_wvalid (M05_AXI_wvalid ),
.M06_AXI_araddr (M06_AXI_araddr ),
.M06_AXI_arprot (M06_AXI_arprot ),
.M06_AXI_arready (M06_AXI_arready),
.M06_AXI_arvalid (M06_AXI_arvalid),
.M06_AXI_awaddr (M06_AXI_awaddr ),
.M06_AXI_awprot (M06_AXI_awprot ),
.M06_AXI_awready (M06_AXI_awready),
.M06_AXI_awvalid (M06_AXI_awvalid),
.M06_AXI_bready (M06_AXI_bready ),
.M06_AXI_bresp (M06_AXI_bresp ),
.M06_AXI_bvalid (M06_AXI_bvalid ),
.M06_AXI_rdata (M06_AXI_rdata ),
.M06_AXI_rready (M06_AXI_rready ),
.M06_AXI_rresp (M06_AXI_rresp ),
.M06_AXI_rvalid (M06_AXI_rvalid ),
.M06_AXI_wdata (M06_AXI_wdata ),
.M06_AXI_wready (M06_AXI_wready ),
.M06_AXI_wstrb (M06_AXI_wstrb ),
.M06_AXI_wvalid (M06_AXI_wvalid ),
.M07_AXI_araddr (M07_AXI_araddr ),
.M07_AXI_arprot (M07_AXI_arprot ),
.M07_AXI_arready (M07_AXI_arready),
.M07_AXI_arvalid (M07_AXI_arvalid),
.M07_AXI_awaddr (M07_AXI_awaddr ),
.M07_AXI_awprot (M07_AXI_awprot ),
.M07_AXI_awready (M07_AXI_awready),
.M07_AXI_awvalid (M07_AXI_awvalid),
.M07_AXI_bready (M07_AXI_bready ),
.M07_AXI_bresp (M07_AXI_bresp ),
.M07_AXI_bvalid (M07_AXI_bvalid ),
.M07_AXI_rdata (M07_AXI_rdata ),
.M07_AXI_rready (M07_AXI_rready ),
.M07_AXI_rresp (M07_AXI_rresp ),
.M07_AXI_rvalid (M07_AXI_rvalid ),
.M07_AXI_wdata (M07_AXI_wdata ),
.M07_AXI_wready (M07_AXI_wready ),
.M07_AXI_wstrb (M07_AXI_wstrb ),
.M07_AXI_wvalid (M07_AXI_wvalid ),
//I2C and UART to microblaze
.iic_fpga_scl_i(i2c_scl_i),
.iic_fpga_scl_o(i2c_scl_o),
.iic_fpga_scl_t(i2c_scl_t),
.iic_fpga_sda_i(i2c_sda_i),
.iic_fpga_sda_o(i2c_sda_o),
.iic_fpga_sda_t(i2c_sda_t),
.iic_reset (i2c_reset),
.uart_txd (uart_txd),
.uart_rxd (uart_rxd),
// axi-lite clk&rst
// NOTE: (INPUTS now)
.axi_lite_aclk (axi_clk),
.axi_lite_aresetn (axi_aresetn),
// axis clk & rst
// ref pipe clk
.axis_datapath_aclk (clk_200),
.axis_datapath_aresetn (axis_resetn),
// axis dma tx data
.m_axis_dma_tx_tdata (axis_dma_i_tdata),
.m_axis_dma_tx_tkeep (axis_dma_i_tkeep),
.m_axis_dma_tx_tlast (axis_dma_i_tlast),
.m_axis_dma_tx_tready (axis_dma_i_tready),
.m_axis_dma_tx_tuser (axis_dma_i_tuser),
.m_axis_dma_tx_tvalid (axis_dma_i_tvalid),
// axis dma rx data
.s_axis_dma_rx_tdata (axis_dma_o_tdata),
.s_axis_dma_rx_tkeep (axis_dma_o_tkeep),
.s_axis_dma_rx_tlast (axis_dma_o_tlast),
.s_axis_dma_rx_tready (axis_dma_o_tready),
.s_axis_dma_rx_tuser ({128'h0,axis_dma_o_tuser}),
.s_axis_dma_rx_tvalid (axis_dma_o_tvalid),
// pcie clk, rst, mgt
.pcie_7x_mgt_rxn (pcie_7x_mgt_rxn),
.pcie_7x_mgt_rxp (pcie_7x_mgt_rxp),
.pcie_7x_mgt_txn (pcie_7x_mgt_txn),
.pcie_7x_mgt_txp (pcie_7x_mgt_txp),
.sys_clk (sys_clk),
.sys_reset (sys_reset)
);
//SFP Port 0
nf_10g_interface_shared_ip nf_10g_interface_0
(
//Clocks and resets
.core_clk (clk_200 ),
.refclk_n (xphy_refclk_n),
.refclk_p (xphy_refclk_p),
.rst (peripheral_reset ),
.core_resetn (axis_resetn),
//Shared logic
.clk156_out (sfp_clk156 ),
.gtrxreset_out (sfp_gtrxreset ),
.gttxreset_out (sfp_gttxreset ),
.qplllock_out (sfp_qplllock ),
.qplloutclk_out (sfp_qplloutclk ),
.qplloutrefclk_out (sfp_qplloutrefclk ),
.txuserrdy_out (sfp_txuserrdy ),
.txusrclk_out (sfp_txusrclk ),
.txusrclk2_out (sfp_txusrclk2 ),
.areset_clk156_out (sfp_areset_clk156 ),
.reset_counter_done_out (sfp_reset_counter_done),
//SFP Controls and indications
.resetdone (sfp0_resetdone ),
.tx_fault (sfp0_tx_fault ),
.tx_abs (sfp0_tx_abs ),
.tx_disable (sfp0_tx_disable ),
//AXI Interface
.m_axis_tdata (axis_i_0_tdata ),
.m_axis_tkeep (axis_i_0_tkeep ),
.m_axis_tuser (axis_i_0_tuser ),
.m_axis_tvalid (axis_i_0_tvalid ),
.m_axis_tready (axis_i_0_tready ),
.m_axis_tlast (axis_i_0_tlast ),
.s_axis_tdata (axis_o_0_tdata ),
.s_axis_tkeep (axis_o_0_tkeep ),
.s_axis_tuser (axis_o_0_tuser ),
.s_axis_tvalid (axis_o_0_tvalid ),
.s_axis_tready (axis_o_0_tready ),
.s_axis_tlast (axis_o_0_tlast ),
.S_AXI_ACLK (clk_200 ),
.S_AXI_ARESETN (axi_datapath_resetn),
.S_AXI_AWADDR (M04_AXI_awaddr),
.S_AXI_AWVALID (M04_AXI_awvalid),
.S_AXI_WDATA (M04_AXI_wdata),
.S_AXI_WSTRB (M04_AXI_wstrb),
.S_AXI_WVALID (M04_AXI_wvalid),
.S_AXI_BREADY (M04_AXI_bready),
.S_AXI_ARADDR (M04_AXI_araddr),
.S_AXI_ARVALID (M04_AXI_arvalid),
.S_AXI_RREADY (M04_AXI_rready),
.S_AXI_ARREADY (M04_AXI_arready),
.S_AXI_RDATA (M04_AXI_rdata),
.S_AXI_RRESP (M04_AXI_rresp),
.S_AXI_RVALID (M04_AXI_rvalid),
.S_AXI_WREADY (M04_AXI_wready),
.S_AXI_BRESP (M04_AXI_bresp),
.S_AXI_BVALID (M04_AXI_bvalid),
.S_AXI_AWREADY (M04_AXI_awready),
//Serial I/O from/to transceiver
.rxn (sfp0_rx_n ),
.rxp (sfp0_rx_p ),
.txn (sfp0_tx_n ),
.txp (sfp0_tx_p ),
//Interface number
.interface_number (IF_SFP0 )
);
assign sfp0_tx_led = sfp0_resetdone ;
assign sfp0_rx_led = sfp0_resetdone ;
//SFP Port 1
nf_10g_interface_ip nf_10g_interface_1
(
//Clocks and resets
.core_clk (clk_200),
.core_resetn (axis_resetn),
//Shared logic
.clk156 (sfp_clk156 ),
.qplllock (sfp_qplllock ),
.qplloutclk (sfp_qplloutclk ),
.qplloutrefclk (sfp_qplloutrefclk ),
.txuserrdy (sfp_txuserrdy ),
.txusrclk (sfp_txusrclk ),
.txusrclk2 (sfp_txusrclk2 ),
.areset_clk156 (sfp_areset_clk156 ),
.reset_counter_done (sfp_reset_counter_done),
//SFP Controls and indications
.tx_abs (sfp1_tx_abs ),
.tx_disable (sfp1_tx_disable ),
.tx_fault (sfp1_tx_fault ),
.tx_resetdone (sfp1_tx_resetdone ),
.rx_resetdone (sfp1_rx_resetdone ),
.gtrxreset (sfp_gtrxreset ),
.gttxreset (sfp_gttxreset ),
//AXI Interface
.m_axis_tdata (axis_i_1_tdata ),
.m_axis_tkeep (axis_i_1_tkeep ),
.m_axis_tuser (axis_i_1_tuser ),
.m_axis_tvalid (axis_i_1_tvalid),
.m_axis_tready (axis_i_1_tready),
.m_axis_tlast (axis_i_1_tlast ),
.s_axis_tdata (axis_o_1_tdata ),
.s_axis_tkeep (axis_o_1_tkeep ),
.s_axis_tuser (axis_o_1_tuser ),
.s_axis_tvalid (axis_o_1_tvalid),
.s_axis_tready (axis_o_1_tready),
.s_axis_tlast (axis_o_1_tlast ),
.S_AXI_ACLK (clk_200 ),
.S_AXI_ARESETN (axi_datapath_resetn),
.S_AXI_AWADDR (M05_AXI_awaddr),
.S_AXI_AWVALID (M05_AXI_awvalid),
.S_AXI_WDATA (M05_AXI_wdata),
.S_AXI_WSTRB (M05_AXI_wstrb),
.S_AXI_WVALID (M05_AXI_wvalid),
.S_AXI_BREADY (M05_AXI_bready),
.S_AXI_ARADDR (M05_AXI_araddr),
.S_AXI_ARVALID (M05_AXI_arvalid),
.S_AXI_RREADY (M05_AXI_rready),
.S_AXI_ARREADY (M05_AXI_arready),
.S_AXI_RDATA (M05_AXI_rdata),
.S_AXI_RRESP (M05_AXI_rresp),
.S_AXI_RVALID (M05_AXI_rvalid),
.S_AXI_WREADY (M05_AXI_wready),
.S_AXI_BRESP (M05_AXI_bresp),
.S_AXI_BVALID (M05_AXI_bvalid),
.S_AXI_AWREADY (M05_AXI_awready),
//Serial I/O from/to transceiver
.txp (sfp1_tx_p),
.txn (sfp1_tx_n),
.rxp (sfp1_rx_p),
.rxn (sfp1_rx_n),
//Interface number
.interface_number (IF_SFP1)
);
assign sfp1_tx_led = sfp1_tx_resetdone ;
assign sfp1_rx_led = sfp1_rx_resetdone ;
//SFP Port 2
nf_10g_interface_ip nf_10g_interface_2
(
//Clocks and resets
.core_clk (clk_200),
.core_resetn (axis_resetn),
//Shared logic
.clk156 (sfp_clk156 ),
.qplllock (sfp_qplllock ),
.qplloutclk (sfp_qplloutclk ),
.qplloutrefclk (sfp_qplloutrefclk ),
.txuserrdy (sfp_txuserrdy ),
.txusrclk (sfp_txusrclk ),
.txusrclk2 (sfp_txusrclk2 ),
.areset_clk156 (sfp_areset_clk156 ),
.reset_counter_done (sfp_reset_counter_done),
.gtrxreset (sfp_gtrxreset ),
.gttxreset (sfp_gttxreset ),
//SFP Controls and indications
.tx_abs (sfp2_tx_abs ),
.tx_disable (sfp2_tx_disable ),
.tx_fault (sfp2_tx_fault ),
.tx_resetdone (sfp2_tx_resetdone ),
.rx_resetdone (sfp2_rx_resetdone ),
//AXI Interface
.m_axis_tdata (axis_i_2_tdata ),
.m_axis_tkeep (axis_i_2_tkeep ),
.m_axis_tuser (axis_i_2_tuser ),
.m_axis_tvalid (axis_i_2_tvalid),
.m_axis_tready (axis_i_2_tready),
.m_axis_tlast (axis_i_2_tlast ),
.s_axis_tdata (axis_o_2_tdata ),
.s_axis_tkeep (axis_o_2_tkeep ),
.s_axis_tuser (axis_o_2_tuser ),
.s_axis_tvalid (axis_o_2_tvalid),
.s_axis_tready (axis_o_2_tready),
.s_axis_tlast (axis_o_2_tlast ),
.S_AXI_ACLK (clk_200 ),
.S_AXI_ARESETN (axi_datapath_resetn),
.S_AXI_AWADDR (M06_AXI_awaddr),
.S_AXI_AWVALID (M06_AXI_awvalid),
.S_AXI_WDATA (M06_AXI_wdata),
.S_AXI_WSTRB (M06_AXI_wstrb),
.S_AXI_WVALID (M06_AXI_wvalid),
.S_AXI_BREADY (M06_AXI_bready),
.S_AXI_ARADDR (M06_AXI_araddr),
.S_AXI_ARVALID (M06_AXI_arvalid),
.S_AXI_RREADY (M06_AXI_rready),
.S_AXI_ARREADY (M06_AXI_arready),
.S_AXI_RDATA (M06_AXI_rdata),
.S_AXI_RRESP (M06_AXI_rresp),
.S_AXI_RVALID (M06_AXI_rvalid),
.S_AXI_WREADY (M06_AXI_wready),
.S_AXI_BRESP (M06_AXI_bresp),
.S_AXI_BVALID (M06_AXI_bvalid),
.S_AXI_AWREADY (M06_AXI_awready),
//Serial I/O from/to transceiver
.txp (sfp2_tx_p),
.txn (sfp2_tx_n),
.rxp (sfp2_rx_p),
.rxn (sfp2_rx_n),
//Interface number
.interface_number (IF_SFP2)
);
assign sfp2_tx_led = sfp2_tx_resetdone ;
assign sfp2_rx_led = sfp2_rx_resetdone ;
//SFP Port 3
nf_10g_interface_ip nf_10g_interface_3
(
//Clocks and resets
.core_clk (clk_200),
.core_resetn (axis_resetn),
//Shared logic
.clk156 (sfp_clk156 ),
.qplllock (sfp_qplllock ),
.qplloutclk (sfp_qplloutclk ),
.qplloutrefclk (sfp_qplloutrefclk ),
.txuserrdy (sfp_txuserrdy ),
.txusrclk (sfp_txusrclk ),
.txusrclk2 (sfp_txusrclk2 ),
.areset_clk156 (sfp_areset_clk156 ),
.reset_counter_done (sfp_reset_counter_done),
.gtrxreset (sfp_gtrxreset ),
.gttxreset (sfp_gttxreset ),
//SFP Controls and indications
.tx_abs (sfp3_tx_abs ),
.tx_disable (sfp3_tx_disable ),
.tx_fault (sfp3_tx_fault ),
.tx_resetdone (sfp3_tx_resetdone ),
.rx_resetdone (sfp3_rx_resetdone ),
//AXI Interface
.m_axis_tdata (axis_i_3_tdata ),
.m_axis_tkeep (axis_i_3_tkeep ),
.m_axis_tuser (axis_i_3_tuser ),
.m_axis_tvalid (axis_i_3_tvalid),
.m_axis_tready (axis_i_3_tready),
.m_axis_tlast (axis_i_3_tlast ),
.s_axis_tdata (axis_o_3_tdata ),
.s_axis_tkeep (axis_o_3_tkeep ),
.s_axis_tuser (axis_o_3_tuser ),
.s_axis_tvalid (axis_o_3_tvalid),
.s_axis_tready (axis_o_3_tready),
.s_axis_tlast (axis_o_3_tlast ),
.S_AXI_ACLK (clk_200 ),
.S_AXI_ARESETN (axi_datapath_resetn),
.S_AXI_AWADDR (M07_AXI_awaddr),
.S_AXI_AWVALID (M07_AXI_awvalid),
.S_AXI_WDATA (M07_AXI_wdata),
.S_AXI_WSTRB (M07_AXI_wstrb),
.S_AXI_WVALID (M07_AXI_wvalid),
.S_AXI_BREADY (M07_AXI_bready),
.S_AXI_ARADDR (M07_AXI_araddr),
.S_AXI_ARVALID (M07_AXI_arvalid),
.S_AXI_RREADY (M07_AXI_rready),
.S_AXI_ARREADY (M07_AXI_arready),
.S_AXI_RDATA (M07_AXI_rdata),
.S_AXI_RRESP (M07_AXI_rresp),
.S_AXI_RVALID (M07_AXI_rvalid),
.S_AXI_WREADY (M07_AXI_wready),
.S_AXI_BRESP (M07_AXI_bresp),
.S_AXI_BVALID (M07_AXI_bvalid),
.S_AXI_AWREADY (M07_AXI_awready),
//Serial I/O from/to transceiver
.txp (sfp3_tx_p),
.txn (sfp3_tx_n),
.rxp (sfp3_rx_p),
.rxn (sfp3_rx_n),
//Interface number
.interface_number (IF_SFP3)
);
assign sfp3_tx_led = sfp3_tx_resetdone ;
assign sfp3_rx_led = sfp3_rx_resetdone ;
//Identifier Block
identifier_ip identifier (
.s_aclk (clk_200),
.s_aresetn (axi_datapath_resetn),
.s_axi_awaddr (M00_AXI_awaddr),
.s_axi_awvalid(M00_AXI_awvalid),
.s_axi_awready(M00_AXI_awready),
.s_axi_wdata (M00_AXI_wdata),
.s_axi_wstrb (M00_AXI_wstrb),
.s_axi_wvalid (M00_AXI_wvalid),
.s_axi_wready (M00_AXI_wready),
.s_axi_bresp (M00_AXI_bresp),
.s_axi_bvalid (M00_AXI_bvalid),
.s_axi_bready (M00_AXI_bready),
.s_axi_araddr (M00_AXI_araddr ),
.s_axi_arvalid(M00_AXI_arvalid),
.s_axi_arready(M00_AXI_arready),
.s_axi_rdata (M00_AXI_rdata),
.s_axi_rresp (M00_AXI_rresp),
.s_axi_rvalid (M00_AXI_rvalid),
.s_axi_rready (M00_AXI_rready)
);
//////////////////////// DEBUG ONLY ////////////////////////////////
// 100MHz PCIe clk heartbeat ~ every 1.5 seconds
always @ (posedge axi_clk) begin
sfp_clk100_count <= sfp_clk100_count + 1'b1;
if (!sfp_clk100_count) begin
led[1] <= ~led[1];
end
end
// 156MHz sfp clock heartbeat ~ every second
always @ (posedge sfp_clk156) begin
sfp_clk156_count <= sfp_clk156_count + 1'b1;
if (!sfp_clk156_count) begin
led[0] <= ~led[0];
end
end
endmodule