金璐


關鍵詞: Xilinx XDMA 數據通路 性能
PCIe Gen5 信號速率已經達到32 Gb/s[1],在數據采集、雷達通信、遙感探測等領域,數據量的日益增大和數據處理的日益復雜化,使高速數據傳輸逐漸成為通信系統設計中的關鍵點[2]。XDMA 是Xilinx 系列FPGA 中官方自帶的PCIe“高級”IP[3],所謂的“高級”指的就是XDMA 操作層面比較“高級”,其操作層面主要在應用層,簡單來說,在FPGA 例化配置完以后基本上不需要FPGA 在邏輯層面上進行過多的操作[4],FPGA 只需要對Host 主機進行中斷觸發操作即可,所有的DMA 操作完全由Host 主機通過PCIe 配置XDMA的寄存器來實現。
1 XDMA IP 核概述
Xilinx DMA/Bridge Subsystem for PCI Express?是Xilinx 公司2017 年前后新推出的PCIe FPGA 解決方案[5]。功能上涵蓋了PCIe IP 核、SGDMA 功能、多通道分離,同時支持AXI 總線訪問等。XDMA 支持Ultra‐Scale+、UltraScale 和Virtex7 XT Gen3,以及7 系列[6]。最高支持4 對Host-to-Card(H2C)和Card-to-Host(C2H)數據通道。
2 XDMA IP 核結構
該IP 核的主要功能就是完成Host 主機和FPGA 之間完成PCIe 接口的數據傳輸。配置部分主要分為DMA 配置和PCIe Bridge 配置這兩個部分具體描述如下(如圖1 所示)。
2. 1 DMA 配置
XDMA IP 核可通過AXI Memory Mapped 接口或者通過AXI Streaming 接口來配置,以支持直接連接至RTL 邏輯。在PCIe 地址空間與AXI 地址空間之間可使用所提供的字符驅動程序通過以上任一接口進行高性能塊數據移動。除了基本DMA 功能外,DMA 還支持最多4 條上行和下行通道、支持PCIe 流量繞過DMA 引擎(主機DMA 旁路),還支持通過可選描述符旁路來管理來自FPGA 互連結構的描述符,以滿足需要最高性能和最低時延的應用的需求。
2. 2 PCIe Bridge
接收到PCIe 數據包將被轉換為AXI 流量,接收到的AXI 流量則將被轉換為PCIe 流量。橋接功能適合需要快速且輕松地訪問PCI Express 子系統的AXI 外設使用。橋接功能可用作為端點(Endpoint)或根端口(Root Port)。
讀寫部分分為兩種:一種是數據的讀寫,DMA 通過MIG 控制DDR 完成數據讀寫;另一種是配置數據的讀寫,通過AXI-lite 總線與BRAM 連接后,XDMA 將PCIe 配置信息存在BRAM。
3 XDMA IP 核配置說明
配置說明主要包括3 個部分來介紹XDMA IP 的使用方式,分別是PL 端的配置說明、PS 端的配置說明及XDMA 驅動相關設計。
3. 1 PL 端配置說明
PL 端搭建最基本的Block Design,如圖2 所示,該設計使用的軟件版本是Vivado 2020.2。
其中DMA/Bridge Subsystem for PCI Express 核與ZYNQ7 Processing System 的相關配置情況如下。
3.1.1 DMA/Bridge Subsystem for PCI Express 核配置情況
(1)Basic 項。lane width 表示PCIe 通信并行數據寬度,設計中使用的ZYNQ7 最高只支持X4,兼容情況需考慮Host 主機的PCI 卡槽最大支持。
link speed 選擇最大的,這里的IP 核都是PCIe 2.0協議的。
AXI clock 是AXI 總線時鐘頻率,選125 M。
DMA interface 是AXI Memory Mapped 即地址映射,用于訪問存儲類的設備, 另一個 AXI Stream 表示AXI 數據流,沒有地址,數據直接流入或流出。
(2)PCIe ID 項。這里是一些廠商ID、設備ID 等配置,保持默認即可,否則對應驅動需要修改INF 文件。
(3)PCIe:BARs 項。PCIe to AXILite Master Interface:XDMA 作為PCI-AXI 橋接器時,Host 主機可以通過XDMA 訪問PL 端的BRAM,值得注意的是PCIe toAXI Translation 需要PC 與PL 端商定,否則訪問地址會出現偏差。
PCIe to DMA Interface:默認選項,Host 主機訪問DDR 的方式如下 Host->XDMA->PS->DDR。
PCIe to DMA Bypass Interface:不做勾選,如勾選則IP 核僅作為PCIe 使用,如需使用DMA 功能,可另行添加定制DMA 核配合使用。
(4)PCIe:MISC 項。
User Interrupts:這里選擇2 個,即PL2PC 的中斷一共兩個。
Legacy Interrupt Settings:這種使用的INTA,為漏極開路且低電平有效(相應的IRQ 應編程為電平觸發方式)。
3.1.2 ZYNQ7 Processing System 核配置情況
(1)PS-PL 配置項。
使能M AXI GP0 interface,用于PS 端訪問BRAM使用;使能S AXI HP0 interface,用于PC 端訪問DDR使用。
(2)MIO 配置項。
使能Quad SPI Flash,固化程序;使能UART1,用于調試輸出。
(3)Interrupt 配置項。
使能IRQ_F2P[15:0]選項,用于PL 端到PS 端的中斷觸發通路,具體PS 端的中斷響應后面會進行描述。
3. 2 PS 端配置說明
下面介紹PS 端搭建設置,Vivado2020.2 與以往的Vivado 版本不同需要手動關聯. xsa 文件,具體流程如下。
3.2.1 Export Hardware
生成bit 文件后,File->Export,在這個界面下可以看到Vivado2020.2 這個版本已經沒有SDK 的啟動選項了,Include bitstream 文件->Next。
3.2.2 生成xsa 文件
文件生成路徑選擇默認路徑,項目根目錄下->Next,即可生成文件。
3.2.3 創建Demo 工程
后面根據需要創建工程即可,這里創建了一個Hello World 基礎工程。
3.2.4 添加中斷觸發函數
由于使用到PL 端到PS 端中斷觸發,所以需要在main.c 中添加PL 中斷的觸發函數,這里使用到了SDK 提供的中斷庫文件xscugic.h,以下僅中斷函數庫提供的函數變量和函數體,具體操作可自行查閱資料,默認即可。在該設計中使用的到函數具體介紹如下。
(1)產生一個中斷控制器實例——XScuGic。
(2)中斷控制器配置實例——XScuGic_Config。
(3)找到scugic 實體——XScuGic_LookupConfig。
(4)初始化scugic——XScuGic_CfgInitialize。
(5)Xilinx 提供的通用異常處理程序——Xil_ExceptionRegisterHandler。
(6)中斷處理函數——XScuGic_InterruptHandler(中斷方式為查表方式)。
(7)使能異常處理——Xil_ExceptionEnable。
(8)連接到自己定義的中斷處理函數——XScuGic_Connect(對應IRQ_F2P[15:0]配置個數,注冊中斷回調函數)。
(9)設立的中斷實例——XScuGic_Enable。
基本流程為:初始化中斷控制器→建立中斷→注冊特定的中斷→寫中斷處理函數。PL 到PS 的中斷就完成了。
3. 3 XDMA 驅動設計說明
下面介紹PL 到PC 的中斷控制搭建,需要結合XDMA 驅動說明,該設計中使用的是Xilinx 官方提供的驅動文件,編譯環境是VS2017,針對Win10 平臺編譯,這里僅講解XDMA 驅動通路設計原理,不進行過多的邏輯編程。pg195-pcie-dma 提到,XDMA 模塊中的DMA 操作以描述符形式。
3.3.1 DMA Engine
XDMA 驅動中的DMA Engine Framework 使用的也是描述符操作,基本操作步驟如下。
(1)申請一個DMA Channel。
(2)根據設備(Slave)特性,配置DMA Channel。
(3)要進行DMA 傳輸的時候,獲取一個用于識別該次傳輸的描述符(descriptor)。
(4)將該次傳輸提交給dma engine 并啟動傳輸。
(5)等待傳輸結束。
(6)然后,重復3~5 次即可。
3.3.2 User interrupt
(1)注冊中斷回調函數XDMA_UserIsrRegister。
(3)注冊中斷ISR 和DPC 的回調函數。
WDF_INTERRUPT_CONFIG_INIT(&config,EvtInterruptIsr,EvtInterruptDpc)。
(3)中斷DPC 處理函數EvtInterruptDpc。
(4)HandleUserEvent 函數。
4 具體測試方案結果及結論
如圖3 所示,針對BRAM 測試結果如下。
bypass mode:64 bytes≈0.000058s,lite mode 與bypassmode 測試速率一樣。
如圖4 所示,針對DDR 測試結果如下。
XDMA X1Gen2 模式(PS DDR)讀取速率 400 MB/s左右,寫入速率340 MB/s 左右。
XDMA X2Gen2 模式(PS DDR)讀取速率 600 MB/s左右,寫入速率640 MB/s 左右。
XDMA X2Gen2 PC 全速讀取PL DDR 速率(PLDDR),讀取速率670 MB/s 左右。
XDMA X2Gen2 PL 讀寫PL DDR 時,PC 讀取PLDDR 速率(PL DDR),讀取速率360 MB/s 左右。
PCIE X1Gen2 模式的理論速率是500 MB/s,X2Gen2 模式的理論速率是1 GB/s,XDMA 實測結果達到PCIe 的理論數值的70% 左右。