axi_DMA環路


一、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。

  xaxidma_example_simple_intr.c

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

  intrHandler

   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外設進行板級驗證。繼續學習!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM