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

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中斷。
傳統中斷時序:
MSI中斷時序:
MSI-X中斷時序:
2,寄存器配置
2.1寄存器位址字段介紹:(詳見pg195)
2.2 H2C ,C2H通道寄存器
C2H與H2C類似;
2.3 IRQ寄存器
2.4 配置寄存器
通道狀态狀解析如下:
3,IP核配置
第一頁基本屬性接口配置:
(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,功能配置:
(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:定義相關寄存器接口。
第四頁中斷及相關功能配置:
(1)中斷數量配置:可選擇1-16;
(2)傳統中斷配置:可選擇 A,B,C,D;
(3)MSI中斷配置:選擇使能,不選不使能;
(4)MSI-X中斷配置:選擇使能,不選擇不使能;
(5)configuration management interface : 支援PCIE配置管理接口
(6)link 狀态使能;
第五頁DMA通道相關配置
上到下依次為:
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 )
);