548
548
//////////////////////////////////////////////////////////////////////
550
localparam IOP2_MSG_WIDTH = 64;
551
localparam DMA_STREAM_WIDTH = `LVFPGA_IFACE_DMA_CHAN_WIDTH;
552
localparam DMA_COUNT_WIDTH = `LVFPGA_IFACE_DMA_SIZE_WIDTH;
553
localparam NUM_TX_STREAMS = `LVFPGA_IFACE_NUM_TX_DMA_CNT;
554
localparam NUM_RX_STREAMS = `LVFPGA_IFACE_NUM_RX_DMA_CNT;
555
localparam TX_STREAM_START_IDX = `LVFPGA_IFACE_TX_DMA_INDEX;
556
localparam RX_STREAM_START_IDX = `LVFPGA_IFACE_RX_DMA_INDEX;
558
wire [DMA_STREAM_WIDTH-1:0] dmatx_tdata, dmarx_tdata;
559
wire dmatx_tvalid, dmarx_tvalid;
560
wire dmatx_tlast, dmarx_tlast;
561
wire dmatx_tready, dmarx_tready;
563
wire [IOP2_MSG_WIDTH-1:0] o_iop2_msg_tdata, i_iop2_msg_tdata;
564
wire o_iop2_msg_tvalid, o_iop2_msg_tlast, o_iop2_msg_tready;
565
wire i_iop2_msg_tvalid, i_iop2_msg_tlast, i_iop2_msg_tready;
567
wire pcie_usr_reg_wr, pcie_usr_reg_rd, pcie_usr_reg_rc, pcie_usr_reg_rdy;
568
wire [1:0] pcie_usr_reg_len;
569
wire [19:0] pcie_usr_reg_addr;
570
wire [31:0] pcie_usr_reg_data_in, pcie_usr_reg_data_out;
572
wire chinch_reg_wr, chinch_reg_rd, chinch_reg_rc, chinch_reg_rdy;
573
wire [1:0] chinch_reg_len;
574
wire [19:0] chinch_reg_addr;
575
wire [31:0] chinch_reg_data_out;
576
wire [63:0] chinch_reg_data_in;
578
wire [(NUM_TX_STREAMS*DMA_STREAM_WIDTH)-1:0] dmatx_tdata_iop2;
579
wire [NUM_TX_STREAMS-1:0] dmatx_tvalid_iop2, dmatx_tready_iop2;
581
wire [(NUM_RX_STREAMS*DMA_STREAM_WIDTH)-1:0] dmarx_tdata_iop2;
582
wire [NUM_RX_STREAMS-1:0] dmarx_tvalid_iop2, dmarx_tready_iop2;
584
//PCIe Express "Physical" DMA and Register logic
585
LvFpga_Chinch_Interface lvfpga_chinch_inst
587
.aIoResetIn_n(aIoResetIn_n),
588
.bBusReset(), //Output
591
.BusClk(ioport2_clk),
592
.Rio40Clk(rio40_clk),
593
.IDelayRefClk(ioport2_idelay_ref_clk),
594
.aRioClkPllLocked(rio40_clk_locked),
595
.aRioClkPllReset(rio40_clk_reset),
597
// The IO_Port2 asynchronous handshaking pins
598
.aIoReadyOut(aIoReadyOut),
599
.aIoReadyIn(aIoReadyIn),
600
.aIoPort2Restart(aIoPort2Restart),
602
// The IO_Port2 high speed receiver pins
603
.IoRxClock(IoRxClock),
604
.IoRxClock_n(IoRxClock_n),
605
.irIoRxData(irIoRxData),
606
.irIoRxData_n(irIoRxData_n),
607
.irIoRxHeader(irIoRxHeader),
608
.irIoRxHeader_n(irIoRxHeader_n),
610
// The IO_Port2 high speed transmitter interface pins
611
.IoTxClock(IoTxClock),
612
.IoTxClock_n(IoTxClock_n),
613
.itIoTxData(itIoTxData),
614
.itIoTxData_n(itIoTxData_n),
615
.itIoTxHeader(itIoTxHeader),
616
.itIoTxHeader_n(itIoTxHeader_n),
619
.bDmaTxData(dmatx_tdata_iop2),
620
.bDmaTxValid(dmatx_tvalid_iop2),
621
.bDmaTxReady(dmatx_tready_iop2),
623
.bDmaTxFifoFullCnt(),
626
.bDmaRxData(dmarx_tdata_iop2),
627
.bDmaRxValid(dmarx_tvalid_iop2),
628
.bDmaRxReady(dmarx_tready_iop2),
630
.bDmaRxFifoFreeCnt(),
632
// User Register Port In
633
.bUserRegPortInWt(pcie_usr_reg_wr),
634
.bUserRegPortInRd(pcie_usr_reg_rd),
635
.bUserRegPortInAddr(pcie_usr_reg_addr),
636
.bUserRegPortInData(pcie_usr_reg_data_in),
637
.bUserRegPortInSize(pcie_usr_reg_len),
639
// User Register Port Out
640
.bUserRegPortOutData(pcie_usr_reg_data_out),
641
.bUserRegPortOutDataValid(pcie_usr_reg_rc),
642
.bUserRegPortOutReady(pcie_usr_reg_rdy),
644
// Chinch Register Port Out
645
.bChinchRegPortOutWt(chinch_reg_wr),
646
.bChinchRegPortOutRd(chinch_reg_rd),
647
.bChinchRegPortOutAddr({12'h0, chinch_reg_addr}),
648
.bChinchRegPortOutData({32'h0, chinch_reg_data_out}),
649
.bChinchRegPortOutSize(chinch_reg_len),
651
// User Register Port In
652
.bChinchRegPortInData(chinch_reg_data_in),
653
.bChinchRegPortInDataValid(chinch_reg_rc),
654
.bChinchRegPortInReady(chinch_reg_rdy),
660
//PCIe Express adapter logic to link to the AXI crossbar and the WB bus
662
.DMA_STREAM_WIDTH(DMA_STREAM_WIDTH),
663
.NUM_TX_STREAMS(NUM_TX_STREAMS),
664
.NUM_RX_STREAMS(NUM_RX_STREAMS),
665
.REGPORT_ADDR_WIDTH(20),
666
.REGPORT_DATA_WIDTH(32),
667
.IOP2_MSG_WIDTH(IOP2_MSG_WIDTH)
669
.ioport2_clk(ioport2_clk),
673
//DMA TX FIFOs (IoPort2 Clock Domain)
674
.dmatx_tdata_iop2(dmatx_tdata_iop2),
675
.dmatx_tvalid_iop2(dmatx_tvalid_iop2),
676
.dmatx_tready_iop2(dmatx_tready_iop2),
678
//DMA TX FIFOs (IoPort2 Clock Domain)
679
.dmarx_tdata_iop2(dmarx_tdata_iop2),
680
.dmarx_tvalid_iop2(dmarx_tvalid_iop2),
681
.dmarx_tready_iop2(dmarx_tready_iop2),
684
.pcie_usr_reg_wr(pcie_usr_reg_wr),
685
.pcie_usr_reg_rd(pcie_usr_reg_rd),
686
.pcie_usr_reg_addr(pcie_usr_reg_addr),
687
.pcie_usr_reg_data_in(pcie_usr_reg_data_in),
688
.pcie_usr_reg_len(pcie_usr_reg_len),
689
.pcie_usr_reg_data_out(pcie_usr_reg_data_out),
690
.pcie_usr_reg_rc(pcie_usr_reg_rc),
691
.pcie_usr_reg_rdy(pcie_usr_reg_rdy),
694
.chinch_reg_wr(chinch_reg_wr),
695
.chinch_reg_rd(chinch_reg_rd),
696
.chinch_reg_addr(chinch_reg_addr),
697
.chinch_reg_data_out(chinch_reg_data_out),
698
.chinch_reg_len(chinch_reg_len),
699
.chinch_reg_data_in(chinch_reg_data_in[31:0]),
700
.chinch_reg_rc(chinch_reg_rc),
701
.chinch_reg_rdy(chinch_reg_rdy),
703
//DMA TX FIFO (Bus Clock Domain)
704
.dmatx_tdata(dmatx_tdata),
705
.dmatx_tlast(dmatx_tlast),
706
.dmatx_tvalid(dmatx_tvalid),
707
.dmatx_tready(dmatx_tready),
709
//DMA RX FIFO (Bus Clock Domain)
710
.dmarx_tdata(dmarx_tdata),
711
.dmarx_tlast(dmarx_tlast),
712
.dmarx_tvalid(dmarx_tvalid),
713
.dmarx_tready(dmarx_tready),
715
//Message FIFO Out (Bus Clock Domain)
716
.rego_tdata(o_iop2_msg_tdata),
717
.rego_tvalid(o_iop2_msg_tvalid),
718
.rego_tlast(o_iop2_msg_tlast),
719
.rego_tready(o_iop2_msg_tready),
721
//Message FIFO In (Bus Clock Domain)
722
.regi_tdata(i_iop2_msg_tdata),
723
.regi_tvalid(i_iop2_msg_tvalid),
724
.regi_tlast(i_iop2_msg_tlast),
725
.regi_tready(i_iop2_msg_tready),
728
.misc_status({31'h0, aStc3Gpio7}),
550
localparam IOP2_MSG_WIDTH = 64;
551
localparam DMA_STREAM_WIDTH = `LVFPGA_IFACE_DMA_CHAN_WIDTH;
552
localparam DMA_COUNT_WIDTH = `LVFPGA_IFACE_DMA_SIZE_WIDTH;
553
localparam NUM_TX_STREAMS = `LVFPGA_IFACE_NUM_TX_DMA_CNT;
554
localparam NUM_RX_STREAMS = `LVFPGA_IFACE_NUM_RX_DMA_CNT;
555
localparam TX_STREAM_START_IDX = `LVFPGA_IFACE_TX_DMA_INDEX;
556
localparam RX_STREAM_START_IDX = `LVFPGA_IFACE_RX_DMA_INDEX;
558
wire [DMA_STREAM_WIDTH-1:0] dmatx_tdata, dmarx_tdata, pcii_tdata, pcio_tdata;
559
wire dmatx_tvalid, dmarx_tvalid, pcii_tvalid, pcio_tvalid;
560
wire dmatx_tlast, dmarx_tlast, pcii_tlast, pcio_tlast;
561
wire dmatx_tready, dmarx_tready, pcii_tready, pcio_tready;
563
wire [IOP2_MSG_WIDTH-1:0] o_iop2_msg_tdata, i_iop2_msg_tdata;
564
wire o_iop2_msg_tvalid, o_iop2_msg_tlast, o_iop2_msg_tready;
565
wire i_iop2_msg_tvalid, i_iop2_msg_tlast, i_iop2_msg_tready;
567
wire pcie_usr_reg_wr, pcie_usr_reg_rd, pcie_usr_reg_rc, pcie_usr_reg_rdy;
568
wire [1:0] pcie_usr_reg_len;
569
wire [19:0] pcie_usr_reg_addr;
570
wire [31:0] pcie_usr_reg_data_in, pcie_usr_reg_data_out;
572
wire chinch_reg_wr, chinch_reg_rd, chinch_reg_rc, chinch_reg_rdy;
573
wire [1:0] chinch_reg_len;
574
wire [19:0] chinch_reg_addr;
575
wire [31:0] chinch_reg_data_out;
576
wire [63:0] chinch_reg_data_in;
578
wire [(NUM_TX_STREAMS*DMA_STREAM_WIDTH)-1:0] dmatx_tdata_iop2;
579
wire [NUM_TX_STREAMS-1:0] dmatx_tvalid_iop2, dmatx_tready_iop2;
581
wire [(NUM_RX_STREAMS*DMA_STREAM_WIDTH)-1:0] dmarx_tdata_iop2;
582
wire [NUM_RX_STREAMS-1:0] dmarx_tvalid_iop2, dmarx_tready_iop2;
584
//PCIe Express "Physical" DMA and Register logic
585
LvFpga_Chinch_Interface lvfpga_chinch_inst
587
.aIoResetIn_n(aIoResetIn_n),
588
.bBusReset(), //Output
591
.BusClk(ioport2_clk),
592
.Rio40Clk(rio40_clk),
593
.IDelayRefClk(ioport2_idelay_ref_clk),
594
.aRioClkPllLocked(rio40_clk_locked),
595
.aRioClkPllReset(rio40_clk_reset),
597
// The IO_Port2 asynchronous handshaking pins
598
.aIoReadyOut(aIoReadyOut),
599
.aIoReadyIn(aIoReadyIn),
600
.aIoPort2Restart(aIoPort2Restart),
602
// The IO_Port2 high speed receiver pins
603
.IoRxClock(IoRxClock),
604
.IoRxClock_n(IoRxClock_n),
605
.irIoRxData(irIoRxData),
606
.irIoRxData_n(irIoRxData_n),
607
.irIoRxHeader(irIoRxHeader),
608
.irIoRxHeader_n(irIoRxHeader_n),
610
// The IO_Port2 high speed transmitter interface pins
611
.IoTxClock(IoTxClock),
612
.IoTxClock_n(IoTxClock_n),
613
.itIoTxData(itIoTxData),
614
.itIoTxData_n(itIoTxData_n),
615
.itIoTxHeader(itIoTxHeader),
616
.itIoTxHeader_n(itIoTxHeader_n),
619
.bDmaTxData(dmatx_tdata_iop2),
620
.bDmaTxValid(dmatx_tvalid_iop2),
621
.bDmaTxReady(dmatx_tready_iop2),
623
.bDmaTxFifoFullCnt(),
626
.bDmaRxData(dmarx_tdata_iop2),
627
.bDmaRxValid(dmarx_tvalid_iop2),
628
.bDmaRxReady(dmarx_tready_iop2),
630
.bDmaRxFifoFreeCnt(),
632
// User Register Port In
633
.bUserRegPortInWt(pcie_usr_reg_wr),
634
.bUserRegPortInRd(pcie_usr_reg_rd),
635
.bUserRegPortInAddr(pcie_usr_reg_addr),
636
.bUserRegPortInData(pcie_usr_reg_data_in),
637
.bUserRegPortInSize(pcie_usr_reg_len),
639
// User Register Port Out
640
.bUserRegPortOutData(pcie_usr_reg_data_out),
641
.bUserRegPortOutDataValid(pcie_usr_reg_rc),
642
.bUserRegPortOutReady(pcie_usr_reg_rdy),
644
// Chinch Register Port Out
645
.bChinchRegPortOutWt(chinch_reg_wr),
646
.bChinchRegPortOutRd(chinch_reg_rd),
647
.bChinchRegPortOutAddr({12'h0, chinch_reg_addr}),
648
.bChinchRegPortOutData({32'h0, chinch_reg_data_out}),
649
.bChinchRegPortOutSize(chinch_reg_len),
651
// User Register Port In
652
.bChinchRegPortInData(chinch_reg_data_in),
653
.bChinchRegPortInDataValid(chinch_reg_rc),
654
.bChinchRegPortInReady(chinch_reg_rdy),
660
//PCIe Express adapter logic to link to the AXI crossbar and the WB bus
662
.DMA_STREAM_WIDTH(DMA_STREAM_WIDTH),
663
.NUM_TX_STREAMS(NUM_TX_STREAMS),
664
.NUM_RX_STREAMS(NUM_RX_STREAMS),
665
.REGPORT_ADDR_WIDTH(20),
666
.REGPORT_DATA_WIDTH(32),
667
.IOP2_MSG_WIDTH(IOP2_MSG_WIDTH)
669
.ioport2_clk(ioport2_clk),
673
//DMA TX FIFOs (IoPort2 Clock Domain)
674
.dmatx_tdata_iop2(dmatx_tdata_iop2),
675
.dmatx_tvalid_iop2(dmatx_tvalid_iop2),
676
.dmatx_tready_iop2(dmatx_tready_iop2),
678
//DMA TX FIFOs (IoPort2 Clock Domain)
679
.dmarx_tdata_iop2(dmarx_tdata_iop2),
680
.dmarx_tvalid_iop2(dmarx_tvalid_iop2),
681
.dmarx_tready_iop2(dmarx_tready_iop2),
684
.pcie_usr_reg_wr(pcie_usr_reg_wr),
685
.pcie_usr_reg_rd(pcie_usr_reg_rd),
686
.pcie_usr_reg_addr(pcie_usr_reg_addr),
687
.pcie_usr_reg_data_in(pcie_usr_reg_data_in),
688
.pcie_usr_reg_len(pcie_usr_reg_len),
689
.pcie_usr_reg_data_out(pcie_usr_reg_data_out),
690
.pcie_usr_reg_rc(pcie_usr_reg_rc),
691
.pcie_usr_reg_rdy(pcie_usr_reg_rdy),
694
.chinch_reg_wr(chinch_reg_wr),
695
.chinch_reg_rd(chinch_reg_rd),
696
.chinch_reg_addr(chinch_reg_addr),
697
.chinch_reg_data_out(chinch_reg_data_out),
698
.chinch_reg_len(chinch_reg_len),
699
.chinch_reg_data_in(chinch_reg_data_in[31:0]),
700
.chinch_reg_rc(chinch_reg_rc),
701
.chinch_reg_rdy(chinch_reg_rdy),
703
//DMA TX FIFO (Bus Clock Domain)
704
.dmatx_tdata(dmatx_tdata),
705
.dmatx_tlast(dmatx_tlast),
706
.dmatx_tvalid(dmatx_tvalid),
707
.dmatx_tready(dmatx_tready),
709
//DMA RX FIFO (Bus Clock Domain)
710
.dmarx_tdata(dmarx_tdata),
711
.dmarx_tlast(dmarx_tlast),
712
.dmarx_tvalid(dmarx_tvalid),
713
.dmarx_tready(dmarx_tready),
715
//Message FIFO Out (Bus Clock Domain)
716
.rego_tdata(o_iop2_msg_tdata),
717
.rego_tvalid(o_iop2_msg_tvalid),
718
.rego_tlast(o_iop2_msg_tlast),
719
.rego_tready(o_iop2_msg_tready),
721
//Message FIFO In (Bus Clock Domain)
722
.regi_tdata(i_iop2_msg_tdata),
723
.regi_tvalid(i_iop2_msg_tvalid),
724
.regi_tlast(i_iop2_msg_tlast),
725
.regi_tready(i_iop2_msg_tready),
728
.misc_status({15'h0, aStc3Gpio7}),
732
// The PCIe logic will tend to stay close to the physical IoPort2 pins
733
// so add an additional stage of pipelining to give the tool more routing
734
// slack. This is significantly help timing closure.
736
axi_fifo_short #(.WIDTH(DMA_STREAM_WIDTH+1)) pcii_pipeline_srl (
737
.clk(bus_clk), .reset(bus_rst), .clear(1'b0),
738
.i_tdata({dmatx_tlast, dmatx_tdata}), .i_tvalid(dmatx_tvalid), .i_tready(dmatx_tready),
739
.o_tdata({pcii_tlast, pcii_tdata}), .o_tvalid(pcii_tvalid), .o_tready(pcii_tready),
740
.space(), .occupied());
742
axi_fifo_short #(.WIDTH(DMA_STREAM_WIDTH+1)) pcio_pipeline_srl (
743
.clk(bus_clk), .reset(bus_rst), .clear(1'b0),
744
.i_tdata({pcio_tlast, pcio_tdata}), .i_tvalid(pcio_tvalid), .i_tready(pcio_tready),
745
.o_tdata({dmarx_tlast, dmarx_tdata}), .o_tvalid(dmarx_tvalid), .o_tready(dmarx_tready),
746
.space(), .occupied());
732
748
//////////////////////////////////////////////////////////////////////