// ---------------------------------------------------------------------- // "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: // de10pro_b: Top-level module for DE10Pro Rev.B board with 4x QSFP // ---------------------------------------------------------------------- `default_nettype none module de10pro_b # ( parameter NumCh = 16, BondingEnable = 0, // Set to 1 to enable BondingCh = 4 ) ( input wire PCIE_PERST_N, // PCIe reset input wire CLK100, output wire [1:0] SI5340_RST_N, SI5340_OE_N, output wire [3:0] LED_N, input wire [3:0] QSFP_REFCLKP, output wire [3:0][3:0] QSFP_TXP, input wire [3:0][3:0] QSFP_RXP ); parameter NumChB = ((BondingEnable==0) ? NumCh : NumCh/BondingCh); parameter ChW = (BondingEnable==0) ? 4 : 1; parameter BusW = (BondingEnable==0) ? 64 : 64*BondingCh; // ------------------------------------------------------------ // LED polarity and clock generator enable wire [3:0] LED; assign LED_N = ~LED; assign SI5340_RST_N = 2'b11; assign SI5340_OE_N = 2'b00; // ------------------------------------------------------------ // Configuration-to-reset or PCIe reset wire RST_REL_N; rst_rel rrel ( .ninit_done (RST_REL_N) ); reg [9:0] RST_CNT = 0; wire RST_FULL = &RST_CNT; reg RST; always @ (posedge CLK100) begin if (~PCIE_PERST_N | RST_REL_N) begin RST_CNT <= 0; end else begin if (~RST_FULL) RST_CNT <= RST_CNT + 1; else RST_CNT <= RST_CNT; end RST <= ~&RST_FULL; end // ------------------------------------------------------------ // Kyokko signals wire [3:0][ChW-1:0] CH_UP, AURORA_CLK; // Data channel wire [3:0][ChW-1:0][BusW-1:0] S_AXI_TX_TDATA, M_AXI_RX_TDATA; wire [3:0][ChW-1:0] S_AXI_TX_TLAST, S_AXI_TX_TVALID, S_AXI_TX_TREADY, M_AXI_RX_TLAST, M_AXI_RX_TVALID; // UFC channel wire [3:0][ChW-1:0] UFC_TX_REQ; wire [3:0][ChW-1:0][7:0] UFC_TX_MS; wire [3:0][ChW-1:0][BusW-1:0] S_AXI_UFC_TX_TDATA, M_AXI_UFC_RX_TDATA; wire [3:0][ChW-1:0] S_AXI_UFC_TX_TVALID, S_AXI_UFC_TX_TREADY, M_AXI_UFC_RX_TLAST, M_AXI_UFC_RX_TVALID; // NFC channel wire [3:0][ChW-1:0][15:0] S_AXI_NFC_TDATA; wire [3:0][ChW-1:0] S_AXI_NFC_TVALID, S_AXI_NFC_TREADY; // ------------------------------------------------------------ // Kyokko instance genvar ch; generate for (ch=0; ch<4; ch=ch+1) begin : qsfp_gen s10_kyokko #(.BondingEnable(BondingEnable), .BondingCh(BondingCh) ) ky ( .CLK250(CLK100), .RST(RST), .CLK644P(QSFP_REFCLKP[ch]), .SFP_TXP(QSFP_TXP [ch]), .SFP_RXP(QSFP_RXP [ch]), .CH_UP (CH_UP [ch]), .USER_CLK(AURORA_CLK [ch]), // Data channel .S_AXI_TX_TDATA (S_AXI_TX_TDATA [ch]), // I [64*NumCh] .S_AXI_TX_TLAST (S_AXI_TX_TLAST [ch]), // I [NumCh] .S_AXI_TX_TVALID (S_AXI_TX_TVALID[ch]), // I [NumCh] .S_AXI_TX_TREADY (S_AXI_TX_TREADY[ch]), // O [NumCh] .M_AXI_RX_TDATA (M_AXI_RX_TDATA [ch]), // O [64*NumCh] .M_AXI_RX_TLAST (M_AXI_RX_TLAST [ch]), // O [NumCh] .M_AXI_RX_TVALID (M_AXI_RX_TVALID[ch]), // O [NumCh] // UFC channel .UFC_TX_REQ (UFC_TX_REQ [ch]), // I [NumCh] .UFC_TX_MS (UFC_TX_MS [ch]), // O [8*NumCh] .S_AXI_UFC_TX_TDATA (S_AXI_UFC_TX_TDATA [ch]), // I [64*NumCh] .S_AXI_UFC_TX_TVALID(S_AXI_UFC_TX_TVALID[ch]), // I [NumCh] .S_AXI_UFC_TX_TREADY(S_AXI_UFC_TX_TREADY[ch]), // O [NumCh] .M_AXI_UFC_RX_TDATA (M_AXI_UFC_RX_TDATA [ch]), // O [64*NumCh] .M_AXI_UFC_RX_TLAST (M_AXI_UFC_RX_TLAST [ch]), // O [NumCh] .M_AXI_UFC_RX_TVALID(M_AXI_UFC_RX_TVALID[ch]), // O [NumCh] // NFC channel .S_AXI_NFC_TDATA (S_AXI_NFC_TDATA [ch]), // I [16*NumCh] .S_AXI_NFC_TVALID (S_AXI_NFC_TVALID[ch]), // I [NumCh] .S_AXI_NFC_TREADY (S_AXI_NFC_TREADY[ch]) // O [NumCh] ); end // block: qsfp_gen endgenerate assign LED = { |CH_UP[3], |CH_UP[2], |CH_UP[1], |CH_UP[0] }; // ------------------------------------------------------------ // Test stuff wire [NumChB-1:0] GO; // Frame generators generate if (BondingEnable==0) begin : nobond_tp_gen for (ch=0; ch