學(xué)習(xí)內(nèi)容
本文主要介紹關(guān)于AXI DMA的IP核相關(guān)內(nèi)容。
DMA簡介
DMA(Direct Memory Access,直接存儲器訪問)是計算機中一種內(nèi)存訪問技術(shù)。它允許某些硬件子系統(tǒng)可以獨立地直接讀寫系統(tǒng)內(nèi)存,而不需中央處理器( CPU)介入處理。
DMA 是用硬件實現(xiàn)存儲器與存儲器之間或存儲器與 I/O 設(shè)備之間直接進行高速數(shù)據(jù)傳輸。使用 DMA時, CPU 向 DMA 控制器發(fā)出一個存儲傳輸請求, 這樣當(dāng) DMA 控制器在傳輸?shù)臅r候, CPU 執(zhí)行其它操作,傳輸操作完成時 DMA 以中斷的方式通知 CPU。
為了發(fā)起傳輸事務(wù), DMA 控制器必須得到以下數(shù)據(jù):
- 源地址 — 數(shù)據(jù)被讀出的地址。
- 目的地址 — 數(shù)據(jù)被寫入的地址。
- 傳輸長度 — 應(yīng)被傳輸?shù)淖止?jié)數(shù)。
DMA 存儲傳輸?shù)倪^程如下:
- 配置用 DMA 傳輸數(shù)據(jù)到存儲器,處理器發(fā)出操作DMA的指令/代碼。
- DMA 控制器把數(shù)據(jù)從外設(shè)傳輸?shù)酱鎯ζ骰驈拇鎯ζ鞯酱鎯ζ?,而?CPU 騰出手來做其它操作。
- 數(shù)據(jù)傳輸完成后,向 CPU 發(fā)出一個中斷信號來通知它 DMA 傳輸可以關(guān)閉了。
AXI DMA IP簡介
ZYNQ 提供了兩種 DMA,一種是集成在 PS 中的硬核 DMA,另一種是 PL 中使用的軟核 AXI DMA IP。AXI DMA IP提供內(nèi)存和AX14-Stream接口的目標(biāo)外設(shè)之間的高帶寬直接內(nèi)存訪問。它可以選擇scatter/gather模式進行數(shù)據(jù)的傳輸搬移,可將CPU從數(shù)據(jù)搬運任務(wù)中解放出來。
功能框圖
IP的功能框圖如下:
由框圖可知,通過AXI4-Lite從接口訪問初始化、狀態(tài)并控制和管理寄存器。MM2S接口完成MemoryMap to Stream 的轉(zhuǎn)換,即存儲器映射轉(zhuǎn)換到AXI4-Stream接口轉(zhuǎn)換。同理S2MM接口完成Stream to MemoryMap的轉(zhuǎn)換,即AXI4-Stream接口轉(zhuǎn)換到存儲器映射轉(zhuǎn)換。圖中標(biāo)注的三個接口只有在S/G模式下才會生成那三個接口進行IP的控制讀寫以及數(shù)據(jù)交互。
典型設(shè)計解讀
在IP的指導(dǎo)手冊中有下圖這樣的一個控制AXI DMA IP的設(shè)計系統(tǒng)。在圖中我們可以看到,對于處理器(microblaze),只需要使用少量的控制指令,即可完成高速的多數(shù)據(jù)傳輸。處理器(microblaze)通過interconnect互聯(lián)模塊連接到AXI4-Lite接口,進行IP的寄存器配置。在AXI DMA IP的完成數(shù)據(jù)傳輸時,通過MM2S_IntrOut,S2MM_IntrOut指示數(shù)據(jù)傳輸完成,并發(fā)送給處理器進行進一步操作。在圖中的系統(tǒng)AXI DMA IP使能了S/G模式,該存儲器映射接口通過互聯(lián)模塊連接到DDR控制端口,ctrStrm(控制Stream)、StatusStrm(判斷Stream狀態(tài))和SG R/W是在SG模式下使用的三個端口。剩下的MM2S和S2MM進行數(shù)據(jù)的交互和傳輸。
時鐘要求
AXI DMA IP,對于不同芯片信號的不同速度、等級下的最大時鐘頻率有不同的要求。在進行設(shè)計開發(fā)時,要根據(jù)設(shè)計芯片的具體型號滿足時序要求,避免出現(xiàn)時序偽例的現(xiàn)象。
對于時鐘的輸入端口,有以下端口:
- m_axi_mm2s_aclk for MM2S interface
- m_axi_s2mm_aclk for S2MM interface
- s_axi_lite_aclk for AXI4-Lite control interface
- m_axi_sg_clk for Scatter Gather Interface AXI DMA提供兩種時鐘模式,同步模式和異步模式。同步模式: 所有的邏輯都連接在一個單一的時鐘源,m_axi_mm2s_aclk、m_axi_s2mm_aclk、m_axi_sg_clk必須在一個相同的時鐘源下,s_axi_lite_aclk可以連接到更低的時鐘。異步模式: 所有邏輯都可以是異步的,但是s_axi_lite_aclk必須小于或等于m_axi_sg_aclk的時鐘頻率, m_axi_sg_aclk必須小于或等于m_axi_mm2s_aclk或m_axi_s2mm_aclk的時鐘。在異步模式下,這四類時鐘信號所影響到的接口信號,(在SG模式下和單一傳輸模式)如下圖所示:
復(fù)位
axi_resetn信號需要持續(xù)至少16個最慢的時鐘周期,并且需要和s_axi_lite_aclk保持同步。
編程指導(dǎo)
在AXI DMA IP中,一共有三個模式可以進行編程配置:
- Direct Register Mode (Simple DMA)
- Scatter/Gather Mode
- Cyclic DMA Mode
Direct Register Mode (Simple DMA)
簡單DMA模式,該模式下,提供了在MM2S和S2MM通道上進行簡單的DMA傳輸?shù)呐渲?。只需要較少的FPGA資源,通過訪問DMACR、源地址或者目的地址和長度寄存器發(fā)起DMA的傳輸。當(dāng)傳輸完成后,如果使能了產(chǎn)生中斷輸出,那么DMASR寄存器相關(guān)聯(lián)的通道位會有效,即產(chǎn)生中斷輸出。
DMA的MM2S通道啟動順序:
- 設(shè)置運行/停止位為1 (MM2S_DMACR.RS=1),啟動MM2S通道運行。 停止位(DMASR.Halted)應(yīng)該取消上拉,表示MM2S通道正在運行。
- 可以通過向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn寫入1來啟用中斷。 當(dāng)AXI DMA配置為Direct Register 模式時,延遲中斷、延遲計數(shù)和閾值計數(shù)不被使用。
- 向MM2S_SA寄存器寫入有效的源地址。 如果AXI DMA配置的地址空間大于32,則對MM2S_SA MSB寄存器進行編程。如果AXI DMA沒有配置為數(shù)據(jù)重新對齊,則必須對齊有效地址,否則將出現(xiàn)未定義的結(jié)果。認為對齊是或非對齊是基于數(shù)據(jù)流的寬度。當(dāng)在Micro 模式下配置AXI DMA時,要進行指定正確的地址。在Micro 模式下配置AXI DMA時,是不關(guān)心4K邊界的。例如,如果內(nèi)存映射數(shù)據(jù)寬度= 32,則如果數(shù)據(jù)位于字偏移(32位偏移),即Ox0、0x4、0x8、OxC,等等,則數(shù)據(jù)對齊。如果DRE使能,并且數(shù)據(jù)寬度小于128,那么源地址可以是任何字節(jié)偏移量。
- 在MM2S LENGTH寄存器中寫入要傳輸?shù)淖止?jié)數(shù)。 寫為零的值沒有任何效果。如果該值不為零,則MM2S LENGTH決定了從MM2S AXI4接口讀取并輸出到MM2S AXI4- stream接口傳輸?shù)臄?shù)據(jù)個數(shù)。MM2S_LENGTH寄存器必須最后寫入。 所有其他MM2S寄存器都可以按任意順序?qū)懭搿T贛icro DMA下,此值不能超過[突發(fā)長度*(內(nèi)存映射數(shù)據(jù)寬度)/8]。
DMA的S2MM通道啟動順序:(類似MM2S通道啟動順序)
- 開啟/使能S2MM通道
- 如果需要,可以使能中斷
- 寫一個有效的源地址到S2MM_SA寄存器,如果沒有使能DRE功能,在指定起始地址時,要注意字節(jié)地址對齊,哪些地址對齊不對齊取決于Stream流的數(shù)據(jù)位寬。
- 寫傳輸?shù)淖止?jié)數(shù)到LENGTH寄存器。一個長度為0的值是無效的,而一個非0的值將決定存儲器映射到Stream流的數(shù)據(jù)個數(shù)。S2MM_LENGTH寄存器必須最后寫入。
Scatter/Gather Mode
S/G模式下,AXI DMA操作需要一個存儲DMA操作列表的內(nèi)存駐留數(shù)據(jù)結(jié)構(gòu)。這個指令列表被組織成所謂描述符鏈。每個描述符都有一個指向下一個要處理的描述符的指針。鏈中的最后一個描述符指向鏈中的第一個描述符。S/G模式允許一個包被多個描述符描述。此特性的典型用途是允許從內(nèi)存中的一個位置存儲或獲取頭,并從另一個位置存儲有效數(shù)據(jù)。利用這一點的程序可以提高吞吐量。利用幀起始位(TXSOF)和幀結(jié)束位(TXEOF)來描述緩沖區(qū)描述符鏈中的數(shù)據(jù)包。當(dāng)DMA獲取一個設(shè)置了TXSOF位的描述符時,將觸發(fā)包的開始。包繼續(xù)獲取后續(xù)的描述符,直到獲取一個設(shè)置了TXEOF位的描述符。在接收(S2MM)通道上,當(dāng)數(shù)據(jù)包開始被接收時,AXI DMA用RXSOF標(biāo)記描述符,指示軟件與此描述符相關(guān)聯(lián)的數(shù)據(jù)緩沖區(qū),包含數(shù)據(jù)包的開始。如果正在接收的包的字節(jié)數(shù)比描述符中指定的更長,則使用下一個描述符緩沖區(qū)來存儲接收包的其余部分。這個獲取和存儲過程繼續(xù)進行,直到整個接收包被傳輸完畢。接收包結(jié)束時正在處理的描述符被AXI DMA標(biāo)記為RXEOF=1。這向軟件表明,與此描述符相關(guān)聯(lián)的緩沖區(qū)包含包的結(jié)尾。每個描述符的狀態(tài)字段包含為特定描述符實際傳輸?shù)淖止?jié)數(shù)。該軟件可以通過從RXSOF描述符遍歷描述符鏈到RXEOF描述符來確定接收包傳輸?shù)目傋止?jié)數(shù)。Scatter Gather繼續(xù)獲取一個額外的描述符并存儲。這個過程在很大程度上改善了DMA性能。S/G模式從設(shè)置控制寄存器和描述符指針開始。簡單來說,就是把傳輸?shù)幕緟?shù)存儲到內(nèi)存中;這些參數(shù)被稱為BD(Buffer Descriptor),在工作時,通過SG的接口進行加載和更新BD的狀態(tài)從而進行對指定的位置的數(shù)據(jù)進行讀寫操作。
MM2S通道的DMA操作通過以下順序建立和啟動:
- 將起始描述符的地址寫入當(dāng)前描述符寄存器。 如果AXI DMA被配置為大于32的地址空間,那么也對當(dāng)前描述符的MSB的32位進行編程。
- 設(shè)置運行/停止位為1 (MM2S_DMACR.RS=1),啟動MM2S通道運行。 停止位(DMASR.Halted)應(yīng)該取消上拉,表示MM2S通道正在運行。
- 可以通過向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn寫入1來啟用中斷。
- 向尾部描述符寄存器寫入一個有效地址。 如果AXI DMA被配置為大于32的地址空間,那么也對尾部描述符的MSB 32位進行編程。
- 寫入尾描述符寄存器將觸發(fā)DMA開始從內(nèi)存中獲取描述符。 在多通道配置的情況下,當(dāng)數(shù)據(jù)包到達S2MM通道時開始獲取描述符。
- 對獲取的描述符進行處理,數(shù)據(jù)從內(nèi)存中讀取,然后輸出到MM2S流通道。
S2MM通道的DMA操作通過以下順序建立和啟動:
- 將起始描述符的地址寫入當(dāng)前描述符寄存器。 如果AXI DMA被配置為大于32的地址空間,那么也對當(dāng)前描述符的MSB 32位進行編程。
- 設(shè)置運行/停止位為1 (S2MM_DMACR.RS=1),啟動S2MM通道運行 停止位(DMASR.Halted)應(yīng)該取消上拉,表示MM2S通道正在運行。
- 可以通過向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn寫入1來啟用中斷。
- 向尾部描述符寄存器寫入一個有效地址。 如果AXI DMA被配置為大于32的地址空間,那么也對當(dāng)前描述符的MSB 32位進行編程。
- 寫入尾描述符寄存器將觸發(fā)DMA開始從內(nèi)存中獲取描述符。
- 對獲取的描述符進行處理,并將從S2MM流通道接收的任何數(shù)據(jù)寫入內(nèi)存。
Cyclic DMA Mode
通過對緩沖區(qū)描述符(BD)鏈設(shè)置進行某些更改,AXI DMA可以以循環(huán)模式運行。在循環(huán)模式下,DMA不中斷地獲取和處理相同的BDs。DMA繼續(xù)獲取和處理,直到停止或重置為止。為了使循環(huán)運行,BD鏈的設(shè)置如下圖所示:
在這個設(shè)置中,Tail BD指向第一個BD, Tail Descriptor(尾描述寄存器)沒有任何用途,僅用于觸發(fā)DMA。遵循在S/G模式中提到的相同編程順序。確保控制寄存器中的循環(huán)位已設(shè)置。在編寫了Tail Descriptor寄存器之后,DMA開始獲取和處理BDs(以環(huán)形方式設(shè)置),直到DMA停止或重置。
Reference
- PG021_axi_dma
-
正點原子開發(fā)視頻