天天看點

十、基于FPGA的PCIE協定介紹(二)

該文介紹Xilinx的 PCIE XMDA核 。基于上文:https://blog.csdn.net/weixin_41838250/article/details/114919487

1,Xdma核介紹

  1.1 核架構

十、基于FPGA的PCIE協定介紹(二)

 a,XDMA核主要有兩個資料功能;一個是可以配置為AXI接口或AXIS流接口的資料解析通道;一個是配置為橋,使用PCIE核功能。另外還有中斷。

 b,核内互動的4個資料通道:DMA:RQ,RC;橋:CQ,CC

         RQ:通過DMA發送資料通道;

         RC:通過DMA接收資料通道;

         CC:通過橋發送資料通道;

         CQ:通過橋接收資料通道;

  c,DMA:H2C與C2H各有4個;完成TLP報資料解析與處理;然後将資料傳遞到端口子產品

  d,橋:通過Target Bridge了連接配接PCIE端口到外部端口子產品。

1.2,端口介紹

資料端口分為3類:使用DMA的CH,HC接口和AXI-MM;通過橋的AXI-MM接口;配置寄存器的AXI-Lite接口。

3個中斷類型:傳統中斷,MSI中斷;MSI-X中斷。

傳統中斷時序:

十、基于FPGA的PCIE協定介紹(二)

MSI中斷時序:

十、基于FPGA的PCIE協定介紹(二)

MSI-X中斷時序:

十、基于FPGA的PCIE協定介紹(二)

2,寄存器配置

  2.1寄存器位址字段介紹:(詳見pg195)

十、基于FPGA的PCIE協定介紹(二)
十、基于FPGA的PCIE協定介紹(二)

2.2 H2C ,C2H通道寄存器

C2H與H2C類似;

十、基于FPGA的PCIE協定介紹(二)
十、基于FPGA的PCIE協定介紹(二)

2.3 IRQ寄存器

十、基于FPGA的PCIE協定介紹(二)

2.4 配置寄存器

十、基于FPGA的PCIE協定介紹(二)

 通道狀态狀解析如下:

十、基于FPGA的PCIE協定介紹(二)

3,IP核配置

 第一頁基本屬性接口配置:

十、基于FPGA的PCIE協定介紹(二)

(1)、mode:可選擇Basic or Advanced;   block location : X7晶片隻支援X0Y0;

(2)、lane width:可選擇 x1,x2,x4,x8 ;  speed:2.5G,5G ; 參考時鐘支援:100M,125M,250M

(3)、使用者資料位寬:64bit或128bit,使用者時鐘和位寬相關:64對應250M,128對應125M。

(4)、使用者資料接口:AXIS或AXI-M,AXI-lite為BAR空間配置端口根據需要配置。

第二頁裝置ID,功能配置:

十、基于FPGA的PCIE協定介紹(二)

(1)Vendor ID:裝置廠商ID;

         Device ID:裝置ID,統一配置為:70<鍊路速率><鍊路寬度>;

         Revision ID:裝置ID擴充;

        Subsystem Vendor ID:裝置或程式制造商ID;

        Subsystem ID:裝置系統ID;這個值通常與裝置ID相同;

(2) Class Code 配置代碼辨別的一部功能;

          base:定義基本類型;

          sub:具體辨別裝置功能;

         interface:定義相關寄存器接口。

第四頁中斷及相關功能配置:

十、基于FPGA的PCIE協定介紹(二)

(1)中斷數量配置:可選擇1-16;

(2)傳統中斷配置:可選擇 A,B,C,D;

(3)MSI中斷配置:選擇使能,不選不使能;

(4)MSI-X中斷配置:選擇使能,不選擇不使能;

(5)configuration management interface : 支援PCIE配置管理接口

(6)link 狀态使能;

第五頁DMA通道相關配置

十、基于FPGA的PCIE協定介紹(二)

上到下依次為:

    H2C通道個數,C2H通道個數,讀通道允許的最大請求個數, 寫通道允許的最大請求個數,選擇通過H2C通道,選擇通過C2H通道,ID位寬,通道狀态端口。

到此IP配置完成。 

4,IP例化:

xdma_0 xdma_0_inst(
        .sys_clk                      (pcie_clk		),
        .sys_rst_n                    (pcie_rst_n     ),
        .user_lnk_up                  (user_lnk_up	), //link status
        //PCIE 端口
        .pci_exp_txp                  (pci_exp_txp    ),
        .pci_exp_txn                  (pci_exp_txn    ),
        .pci_exp_rxp                  (pci_exp_rxp    ),
        .pci_exp_rxn                  (pci_exp_rxn    ),
        //使用者端口
        .axi_aclk                     (sys_clk	      ),
        .axi_aresetn                  (sys_rst        ),
        .usr_irq_req                  (0              ),
        .usr_irq_ack                  (               ),
        //使用者資料端口
        .s_axis_c2h_tdata_0           (xdma_tx_tdata      ), 
        .s_axis_c2h_tlast_0           (xdma_tx_tlast      ), 
        .s_axis_c2h_tvalid_0          (xdma_tx_tvalid      ),  
        .s_axis_c2h_tready_0          (xdma_tx_tready      ),  
        .s_axis_c2h_tkeep_0           (xdma_tx_tkeep       ),  
        .m_axis_h2c_tdata_0           (xdma_rx_tdata     ), 
        .m_axis_h2c_tlast_0           (xdma_rx_tlast     ), 
        .m_axis_h2c_tvalid_0          (xdma_rx_tvalid    ),  
        .m_axis_h2c_tready_0          (xdma_rx_tready    ),  
        .m_axis_h2c_tkeep_0           (xdma_rx_tkeep     )
    );