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