一、AXI DMA介紹
本篇博文講述AXI DMA的一些使用總結,硬件IP子系統搭建與SDK C代碼封裝參考米聯客ZYNQ教程。若想讓ZYNQ的PS與PL兩部分高速數據傳輸,需要利用PS的HP(高性能)接口通過AXI_DMA完成數據搬移,這正符合PG021 AXI DMA v7.1 LogiCORE IP Product Guide中介紹的AXI DMA的應用場景:The AXI DMA provides high-speed data movement between system memory and an AXI4-Stream-based target IP such as AXI Ethernet.
如圖,AXI DMA主要包括Memory Map和 Stream兩部分接口,前者連接PS子系統,后者則連接帶有流接口的PL IP核。
其最簡單的事直接寄存器模式(Simple DMA),這里需要注意地址對齊的問題:當沒有使能地址重對齊的情況下,如果AXI Memory Map數據位寬是32bit,則搬移數據所在地址必須在0x0,0x4,0x8等起始地址上。接下來關注DMA IP核配置界面主要參數:
AXI DMA可以有兩個傳輸方向:讀通道和寫通道,依次為MM2S和S2MM方向。也就是說“讀”和“寫”是DMA主動對CPU發起的操作。重點查看以下幾個參數:
1 Width of Buffer Length Register:
在直接寄存器模式下,它指定在MM2S_LENGTH和S2MM_LENGTH寄存器的有效比特數。MM2S_LENGTH寄存器指定了MM2S通道傳輸數據字節數,當CPU寫入非零值時開始進行PS到PL的數據搬移,而S2MM_LENGTH對應另一個數據流方向。比特數直接與對應寄存器可寫入的最大數直接相關,傳輸最大字節數= 2^(Width of Buffer Length Register)。此處保持默認14bit,也就是說啟動DMA傳輸的最大數據量是16384byte。
2 Memory Map Data Width:
該參數指定了Memory Map側數據接口寬度,選定32bit后搬移數據所在內存地址必須與4對齊。
3 Max Burst Size:
之前在講解PS子系統內部的DMA時介紹過DMA的Burst概念,即分批次傳輸數據塊。官方IP核文檔解釋為:
理解起來burst size確定了突發周期的最大數值,也就是burst size越大,突發粒度越大(單次傳輸的數據個數越多)。這與PS端DMA有所區別,顯然與 PS DMA的burst length意義相近。筆者也進行過嘗試,當啟動傳輸數據量相同時,burst size設置較大情況下,每批次傳輸數據量更多。
二、AXI DMA Loop IP子系統
在利用ZYNQ搭建系統時,經常需要利用各種IP核做所謂的“計算加速”,將重復性高 計算量大 占用較大CPU資源的底層處理交給各個IP核完成。這時PS ->DMA ->PL -> DMA -> PS的環路架構非常適用。這里使用AXI Stream Data FIFO代替自定義IP核作為演示,硬件IP子系統如下:
三、SDK 官方demo解析
首先分析下官方的demo。

主函數中依次完成了:DMA初始化,建立中斷系統,使能DMA中斷,初始化標志位及發送數據,啟動DMA傳輸以及數據檢測。中斷部分的內容與PS DMA非常相近,傳輸完成后進入的中斷函數中僅置位了發送或接收完成標志位:

DMA啟動傳輸部分如下,調用庫函數XAxiDma_SimpleTransfer。以第一個為例,是將RxBufferPtr為數據首地址,MAX_PKT_LEN為字節數,XAXIDMA_DEVICE_TO_DMA為傳輸方向啟動DMA傳輸數據。MAX_PKT_LEN不能超過之前IP核配置參數指定的16384byte,XAXIDMA_DEVICE_TO_DMA和XAXIDMA_DMA_TO_DEVICE依次指PL-> DMA ->PS以及PS->DMA -> PL方向,也就是PL就是其中的DEVICE。DMA啟動函數只有一個地址,這是與PS端DMA最大的區別,因為數據搬移的另一側是帶有無地址的流接口的IP核,該側“地址”由硬件連接決定。
再來看看搬移數據內存首地址RxBufferPtr和TxBufferPtr.從下邊的定義可見MEM_BASE_ADDR是DDR_BASE_ADDR加上一段偏移量的結果,DDR基地址數值從xparameters.h中查看。
四、函數重用封裝
官方的代碼比較亂,都寫在main函數里,米聯客教程init_intr_sys()函數完成整個中斷系統的建立,將官方demo中main函數DMA測試之前關於中斷部分的代碼全部封裝其中,包括DMA中斷初始化,中斷控制器初始化,使能中斷異常,連接DMA發送與接收中斷,DMA中斷使能五個過程。
五、AXI總線信號ILA波形分析
AXI Stream主要接口:
tdata:數據 tkeep:字節有效指示 tlast:幀尾指示 tready:准備就緒 tvalid:數據有效指示
MM2S方向一旦tvalid拉高則觸發ILA抓取信號波形。一幀數據有64個,每個數據32bit(4byte),一共正好為C代碼中MAX_PKT_LEN數值,即256byte。
其中他keep信號比較關鍵。如當stream位寬為16bit,傳輸數據量為255byte時,tkeep信號在最后一個stream數據對應位置是2'b01指示第128個16bit數中最后一個數的高字節為upsize過程中無效填充數據。
后續本人會利用System Generator設計算法IP,之后集成到IP Integerator中作為CPU外設進行板級驗證。繼續學習!