ZYNQ MPSOC之PL與PS數據交互DMA方式
1 摘要
XILINX ZYNQ 以及 ZYNQ MPSOC主要優勢在于異構 ARM+FPGA。其中非常關鍵的一點使用了 AXI 總線進行高速互聯。而且這個 AXI 總線是開放給我們用戶使用的。在前面的文章中我們詳解了使用了AXI-HP方式PL到PS端進行數據交互。本文主要涉及到DMA訪問方式,實現PL端到PS端數據互訪,并測試在當前數據總線位寬和PL端頻率下DMA方式的帶寬速度。
2 DMA(Direct Memory Access)接口
DMA 是一種高效的數據傳輸技術,廣泛應用于需要大量數據傳輸的計算機系統中。通過允許外設直接訪問內存,DMA 可以顯著提高系統的性能和資源利用率。
(1)DMA 的工作原理
請求 DMA 傳輸:外部設備(如硬盤、網絡適配器或其他外設)通過控制器發出 DMA 請求,表明它需要進行數據傳輸。
?DMA 控制器響應:系統的 DMA 控制器接收到請求后,向 CPU 發送信號,通知它暫時停止處理任務,允許 DMA 控制器接管總線。
?設置傳輸參數:DMA 控制器配置數據傳輸的源地址、目的地址和數據傳輸的大小。
?數據傳輸:DMA 控制器直接從源地址讀取數據并寫入到目的地址。此過程不需要 CPU 的參與,從而提高了效率。
?完成傳輸:當數據傳輸完成后,DMA 控制器向 CPU 發送中斷信號,通知其傳輸已完成,CPU 可以繼續執行其他任務。
可以看到 DMA 的數據傳輸經 S_AXI_HP 接口。ZYNQ MPSOC 擁有 4 個S-AXI HP 接口,提供了 ZYNQ 內最大的總帶寬。每一個 HP 接口都包含控制和數據 FIFO。這些 FIFO 為大數據量突發傳輸提供緩沖,讓 HP 接口成為理想的高速數據傳輸接口。
(2)DMA 的類型
?Burst Mode DMA:在這種模式下,DMA 控制器在傳輸數據時占用總線,直到傳輸完成。此模式適合于大塊數據傳輸。
?Cycle Stealing DMA:DMA 控制器在每個數據傳輸周期中占用總線的一部分時間,允許 CPU 和 DMA 控制器交替訪問總線。此模式適合于小塊數據傳輸。
?Transparent DMA:DMA 控制器在 CPU 不使用總線時進行數據傳輸,從而不會影響 CPU 的操作。
?Demand Mode DMA:DMA 控制器在設備請求時才進行數據傳輸,適合于不定時的數據傳輸需求。
(3)DMA 的應用場景
?音頻和視頻處理:在音頻和視頻流的傳輸中,DMA 可以實現高效的數據傳輸,減少延遲。
?網絡數據傳輸:網絡適配器通常使用 DMA 將數據包直接傳輸到內存中,提高網絡通信性能。
?大數據量的存儲操作:在硬盤和內存之間進行大規模數據傳輸時,DMA 可以顯著提高傳輸效率。
3 DMA FPGA設計
3.1 block design設計
采用FPGA block design 設計MPSOC DMA接口,頂層通過axis-data-fifo控制寫數據操作,SOC端通過DMA中斷將DMA通道接收的數據緩存至DDR中,完成PL端到PS端DDR的讀寫訪問。
在位寬為32bit,PL端頻率為150MHz測試DMA速率如下,可以適當提高PL端時鐘頻率以提高傳輸速度
3.2 頂層模塊
`timescale 1 ps / 1 ps
module system_wrapper();reg [31:0]S_AXIS_tdata;wire S_AXIS_tlast;wire S_AXIS_tvalid = 1'b1; wire pl_clk0;wire s_axis_aclk;wire s_axis_aresetn;wire [3:0]S_AXIS_tkeep;wire S_AXIS_tready;wire [0:0]gpio_rtl_tri_o;wire [0:0]peripheral_aresetn;assign S_AXIS_tkeep = 4'b1111;
assign s_axis_aclk = pl_clk0;
assign s_axis_aresetn = peripheral_aresetn&&gpio_rtl_tri_o;always@(posedge pl_clk0)beginif(s_axis_aresetn == 1'b0)beginS_AXIS_tdata <= 0;endelse beginif(S_AXIS_tready&&S_AXIS_tdata<511)S_AXIS_tdata <= S_AXIS_tdata + 1'b1; else if(S_AXIS_tready)S_AXIS_tdata <= 0; endendassign S_AXIS_tlast = (S_AXIS_tdata == 511)&&S_AXIS_tready&&S_AXIS_tvalid;system system_i(.S_AXIS_tdata(S_AXIS_tdata),.S_AXIS_tkeep(S_AXIS_tkeep),.S_AXIS_tlast(S_AXIS_tlast),.S_AXIS_tready(S_AXIS_tready),.S_AXIS_tvalid(S_AXIS_tvalid),.gpio_rtl_tri_o(gpio_rtl_tri_o),.peripheral_aresetn(peripheral_aresetn),.pl_clk0(pl_clk0),.s_axis_aclk(s_axis_aclk),.s_axis_aresetn(s_axis_aresetn));
endmodule
4 SOC設計
4.1 硬件導出
在工程中導出硬件平臺及bit文件
生成VITIS工程
)
4.2 PSU_A53控制代碼
#include "dma_intr.h"
#include "ttc_intr.h"
#include "sys_intr.h"
#include "xgpio.h"
volatile u32 RX_success;
volatile u32 TX_success;volatile u32 RX_ready=1;
volatile u32 TX_ready=1;
int Tries = NUMBER_OF_TRANSFERS;
int i;
int Index;
u8 *TxBufferPtr= (u8 *)TX_BUFFER_BASE;
u8 *RxBufferPtr= (u8 *)RX_BUFFER_BASE;
u8 Value=0;
float speed_tx;
float speed_rx;
static XGpio Gpio;
XAxiDma AxiDma;
XScuGic Intc; //GIC
#define AXI_GPIO_DEV_ID XPAR_AXI_GPIO_0_DEVICE_IDint axi_dma_test()
{int Status;char speed_r[100];TxDone = 0;RxDone = 0;Error = 0;xil_printf( "----DMA Test----\r\n");XTtcPs_Start(&