// ---------------------------------------------------------------------- // "THE BEER-WARE LICENSE" (Revision 42): // wrote this file. As long as you retain this // notice you can do whatever you want with this stuff. If we meet // some day, and you think this stuff is worth it, you can buy me a // beer in return Yasunori Osana at University of the Ryukyus, // Japan. // ---------------------------------------------------------------------- // OpenFC project: an open FPGA accelerated cluster toolkit // Kyokko project: an open Multi-vendor Aurora 64B/66B-compatible link // // Modules in this file: // ku040_kyokko: Kyokko + Transceiver wrapper for Kyokko, 2xSFP + 2xSMA // ---------------------------------------------------------------------- `default_nettype none module ku040_kyokko # ( parameter NumCh=4 ) ( input wire CLK100, RST, input wire SFP_REFCLKP, SFP_REFCLKN, output wire [1:0] SFP_TXP, SFP_TXN, input wire [1:0] SFP_RXP, SFP_RXN, output wire [1:0] SMA_TXP, SMA_TXN, input wire [1:0] SMA_RXP, SMA_RXN, // ------------------------------ // Aurora compatible interface signals output wire [NumCh-1:0] CH_UP, USER_CLK, // Data channel input wire [64*NumCh-1:0] S_AXI_TX_TDATA, input wire [ NumCh-1:0] S_AXI_TX_TLAST, S_AXI_TX_TVALID, output wire [NumCh-1:0] S_AXI_TX_TREADY, output wire [64*NumCh-1:0] M_AXI_RX_TDATA, output wire [ NumCh-1:0] M_AXI_RX_TLAST, M_AXI_RX_TVALID, // UFC channel input wire [NumCh-1:0] UFC_TX_REQ, input wire [8*NumCh-1:0] UFC_TX_MS, input wire [64*NumCh-1:0] S_AXI_UFC_TX_TDATA, input wire [NumCh-1:0] S_AXI_UFC_TX_TVALID, output wire [NumCh-1:0] S_AXI_UFC_TX_TREADY, output wire [64*NumCh-1:0] M_AXI_UFC_RX_TDATA, output wire [ NumCh-1:0] M_AXI_UFC_RX_TLAST, M_AXI_UFC_RX_TVALID, // NFC channel input wire [16*NumCh-1:0] S_AXI_NFC_TDATA, input wire [NumCh-1:0] S_AXI_NFC_TVALID, output wire [NumCh-1:0] S_AXI_NFC_TREADY ); // ------------------------------ // SMA/SFP bundle: QSFP[3:0] = {SMA1, SMA0, SFP1, SFP0} wire [NumCh-1:0] QSFP_TXP, QSFP_TXN, QSFP_RXP, QSFP_RXN; assign {SMA_TXP, SFP_TXP} = QSFP_TXP; assign {SMA_TXN, SFP_TXN} = QSFP_TXN; assign QSFP_RXP = {SMA_RXP, SFP_RXP}; assign QSFP_RXN = {SMA_RXN, SFP_RXN}; // ------------------------------ // GTREFCLK buffer and GT_RST wire GTREFCLK; IBUFDS_GTE3 refclkbuf ( .O(GTREFCLK), .ODIV2(), // O .I(SFP_REFCLKP), .IB (SFP_REFCLKN), .CEB(1'b0) ); // I wire GT_RST; gt_rst grst ( .CLK(CLK100), .RST(RST), .GT_RST(GT_RST) ); // ------------------------------ // Kyokko instances wire [NumCh-1:0] TXUSERCLK2, TX_RDY; wire [NumCh-1:0] RXUSERCLK2, RX_RDY; wire [63:0] TXS [NumCh-1:0], RXS [NumCh-1:0]; wire [1:0] TXHDRi [NumCh-1:0]; wire [5:0] RXHDRi [NumCh-1:0]; wire [NumCh-1:0] RXRST = ~RX_RDY; wire [NumCh-1:0] TXRST = ~TX_RDY; wire [NumCh-1:0] RXPATH_RST, RXSLIP; assign USER_CLK = TXUSERCLK2; genvar ch; generate for (ch=0; ch