基于DMA的大批量數(shù)據(jù)快速傳輸模塊設(shè)計(jì)
摘要 針對(duì)Altera公司SOPC解決方案中,DMA模塊無法直接讀/寫FPGA外設(shè)的情況,提出了基于Avalon總線流傳輸模式的通用DMA讀/寫控制模塊的設(shè)計(jì),設(shè)計(jì)了兩個(gè)自定義外設(shè),實(shí)現(xiàn)了DMA對(duì)FPGA外設(shè)的高速數(shù)據(jù)存取和Nios II與FPGA大批量數(shù)據(jù)的快速傳輸。介紹了Avalon—MM總線規(guī)范,闡述了系統(tǒng)架構(gòu)以及DMA讀控制器的設(shè)計(jì),測(cè)試結(jié)果表明,該方法是一種高效可行的解決方案。
關(guān)鍵詞 SOPC;Nios II;DMA;Avalon總線
DMA控制器作為SOPC設(shè)計(jì)中使用頻率較高的IP核,可用于存儲(chǔ)器或外設(shè)間進(jìn)行批量數(shù)據(jù)傳輸,以提高系統(tǒng)數(shù)據(jù)吞吐量。然而,由于DMA控制器只支持對(duì)基于Avalon總線流傳輸模式的外設(shè)進(jìn)行數(shù)據(jù)傳輸操作,對(duì)用戶自定義外設(shè)不予支持。文中提出了一種基于Avalon總線流傳輸模式的通用DMA接口控制器設(shè)計(jì),實(shí)現(xiàn)了NiosⅡ與FPGA的大批量數(shù)據(jù)快速傳輸,顯著提高了系統(tǒng)的數(shù)據(jù)吞吐量。
1 Avalon—MM總線規(guī)范
Avalon總線規(guī)范是為開發(fā)SOPC環(huán)境下外設(shè)而設(shè)計(jì)的,為SOPC設(shè)計(jì)者描述這些外設(shè)的端口提供了基礎(chǔ)。Avalon總線有多種傳輸模式,其中,流傳輸模式為從端口提供了一種機(jī)制,用于控制來自主端口的傳輸,流傳輸模式的這些特點(diǎn)使其特別適合于DMA傳輸。
流模式從端口傳輸模式的信號(hào),除了在從端口傳輸中使用的信號(hào)之外,又引入了3個(gè)信號(hào):readyfordata、dataavailable和endofpack et。其中,從端口通過設(shè)置Readyfordata有效來表示它已經(jīng)準(zhǔn)備好接收來自Avalon總線模塊的寫傳輸;使readyfordata無效表示寫操作將引起數(shù)據(jù)上溢;從端口通過設(shè)置dataavailable有效來表示它已經(jīng)能夠?yàn)閬碜訟valon總線模塊的讀傳輸提供數(shù)據(jù),dataavailable無效時(shí)讀操作將引起數(shù)據(jù)下溢;在任何傳輸期間,流模式從端口都可以設(shè)置endofpacket信號(hào)有效,并通過Avalon總線模式傳輸給主端口。對(duì)于endofpack et信號(hào)的解釋取決于用戶設(shè)計(jì),必須明確外設(shè)如何響應(yīng)endofpacket信號(hào)的變化。
2 系統(tǒng)結(jié)構(gòu)
提出的NiosⅡ與外設(shè)進(jìn)行大批量數(shù)據(jù)傳輸?shù)慕Y(jié)構(gòu)如圖1所示,當(dāng)NiosⅡ需要從外設(shè)讀入數(shù)據(jù)時(shí),外設(shè)通過FIFO接口將數(shù)據(jù)寫入DMA讀控制模塊,然后數(shù)據(jù)經(jīng)DMA傳輸至NiosⅡ,反之,當(dāng)NiosⅡ輸出數(shù)據(jù)時(shí),數(shù)據(jù)通過DMA傳輸至DMA寫控制模塊,F(xiàn)PGA邏輯通過FIFO接口從這個(gè)模塊讀取數(shù)據(jù)。DMA讀/寫控制模塊的設(shè)計(jì),是為了解決SOPC中DMA模塊與FPGA片上FIFO不同接口間的數(shù)據(jù)傳輸問題,而在SOPC中,DMA模塊使用的是支持流傳輸模式的Avalon—MM總線。DMA讀/寫控制模塊主要完成兩個(gè)功能:一是FIFO與DMA主端口之間的數(shù)據(jù)交互;二是作為一個(gè)NiosⅡ的外設(shè),NiosⅡ處理器能夠?qū)Υ送庠O(shè)進(jìn)行控制并能隨時(shí)獲取該外設(shè)的狀態(tài)信息。
3 DMA讀/寫控制模塊的設(shè)計(jì)
DMA讀/寫控制模塊作為系統(tǒng)結(jié)構(gòu)的核心,其結(jié)構(gòu)框圖如圖2所示。此模塊包括兩個(gè)Avalon—MM從端口:一個(gè)作為DMA從端口,用于處理DMA對(duì)此模塊的數(shù)據(jù)讀操作;另一個(gè)Avalon—MM從端口是NiosⅡ的控制從端口,用于NiosⅡ處理器對(duì)這個(gè)模塊進(jìn)行控制并且隨時(shí)獲取此模塊的狀態(tài)信息。模塊還包括一個(gè)中斷請(qǐng)求信號(hào)(IRQ),當(dāng)外設(shè)有數(shù)據(jù)需要讀取時(shí),可以使這個(gè)信號(hào)有效,從而通知NiosⅡ發(fā)起DMA讀傳輸。另外,DMA讀控制模塊中還例化了一片F(xiàn)PGA片上FIFO作為數(shù)據(jù)上傳FIFO,用于系統(tǒng)待上傳數(shù)據(jù)的暫存。使用FIFO可以提高數(shù)據(jù)傳輸?shù)耐掏铝?,同時(shí)簡(jiǎn)化FPGA硬件邏輯的操作,圖2中的管道(Conduit)端口就是FPGA硬件邏輯操作FIFO的接口。
對(duì)于與NiosⅡ處理器交互的Avalon—MM從端口,從NiosⅡ處理器的角度看,這個(gè)端口是一些寄存器的映射,即NiosⅡ?qū)υ撃K的操作,是通過對(duì)模塊內(nèi)部的寄存器的操作完成的。根據(jù)功能需隸,DMA讀控制模塊中設(shè)計(jì)了3個(gè)寄存器,即狀態(tài)寄存器status,控制字寄存器control和FIFO中已有數(shù)據(jù)個(gè)數(shù)寄存器usedw。
DMA讀控制模塊的中斷請(qǐng)求應(yīng)當(dāng)在兩種情況下產(chǎn)生:一是此模塊的數(shù)據(jù)源端將FIFO寫滿且外設(shè)中斷使能有效;二是此模塊的數(shù)據(jù)源端置數(shù)據(jù)包結(jié)束標(biāo)志且外設(shè)中斷使能有效。
對(duì)于DMA從端口,使用的是帶流控制信號(hào)的Avalon總線,DMA使用流控制信號(hào)中的dataavailable以及endofpacket兩個(gè)總線信號(hào)。其中dataavailable表示外設(shè)是否準(zhǔn)備好讀操作,即FIFO是否非空;對(duì)于endofpacket信號(hào),設(shè)計(jì)中使用這個(gè)信號(hào)來表示模塊中數(shù)據(jù)包的結(jié)束,endofpacket信號(hào)與最后一個(gè)數(shù)據(jù)同時(shí)出現(xiàn)并持續(xù)1個(gè)時(shí)鐘周期,DMA檢測(cè)到endofpacket信號(hào)有效后將停止DMA傳輸。對(duì)于管道端口,這是最新的Avalon總線規(guī)范定義的接口形式,主要用于外設(shè)和外部邏輯進(jìn)行交互。
DMA讀控制模塊作為一個(gè)用戶自定義外設(shè),在將其添加到SOPC Builder外設(shè)庫后,就可以在SOPCBuilder中調(diào)用此外設(shè),圖3表示了SOPC Builder中該外設(shè)與DMA的連接,圖中fifo_control_0即為DMA讀控制模塊,可以看出,這個(gè)外設(shè)包含了兩個(gè)Avalon—MM端口,其中一個(gè)連接至DMA控制器模塊dma_0,而且SOPC Builder為這個(gè)外設(shè)分配了基地址和中斷優(yōu)先級(jí)。
4 測(cè)試驗(yàn)證
DMA讀控制模塊測(cè)試時(shí),F(xiàn)PGA內(nèi)部產(chǎn)生數(shù)據(jù)源并通過外設(shè)管道接口把數(shù)據(jù)寫入FIFO,外設(shè)中斷時(shí),DMA讀取外設(shè)中的數(shù)據(jù)。測(cè)試時(shí)使用QuartusⅡ自帶的SignalTapⅡ嵌入式邏輯分析儀進(jìn)行測(cè)試,觀察相應(yīng)信號(hào)的波形。本測(cè)試的觸發(fā)條件為signaltap_read上升沿觸發(fā),F(xiàn)IFO深度為1 024,F(xiàn)IFO數(shù)據(jù)寬度為16位,數(shù)據(jù)源為2~513共512個(gè)計(jì)數(shù)值,在Nios II的軟件中讀取600個(gè)數(shù)據(jù),測(cè)試結(jié)果如圖4所示。
圖4對(duì)應(yīng)3幅圖像,圖4(a)表示DMA讀取外設(shè)的測(cè)試數(shù)據(jù)的全局視圖,后面兩幅為局部放大結(jié)果,其中圖4(b)是測(cè)試數(shù)據(jù)的開始段,圖4(c)是測(cè)試數(shù)據(jù)的結(jié)束段。如圖4(b)所示,在第一個(gè)時(shí)鐘周期,DMA的讀信號(hào)有效,在之后的第二個(gè)時(shí)鐘周期,F(xiàn)IFO的數(shù)據(jù)總線出現(xiàn)數(shù)據(jù)2,之后是3,4,…,從圖4(c)可以看出,最后一個(gè)數(shù)據(jù)是513,且DMA讀取外設(shè)512個(gè)數(shù)據(jù),只花費(fèi)了約776個(gè)時(shí)鐘周期,這充分顯示了DMA高速的數(shù)據(jù)傳輸能力。
對(duì)于調(diào)試模式下Nios II IDE的輸出結(jié)果,如圖5所示。由于測(cè)試數(shù)據(jù)太長,這里只給出測(cè)試數(shù)據(jù)的首部及尾部。圖5(a)為測(cè)試數(shù)據(jù)的首部,使用printf()函數(shù)輸出,第一個(gè)數(shù)據(jù)為2,接著是2,3,…,從圖5(b)可看出最后一個(gè)有效數(shù)據(jù)是513,從512起的數(shù)據(jù)為0,這是數(shù)組的初始值,這與圖4相對(duì)應(yīng)。
DMA寫控制模塊測(cè)試時(shí),置FIFO數(shù)據(jù)寬度為16,NiosⅡ控制端口數(shù)據(jù)總線寬度為16,F(xiàn)IFO深度為2 048,在NiosⅡ軟件中設(shè)置一個(gè)長度為2 048的數(shù)組,數(shù)組數(shù)據(jù)寬度為16位,初始化時(shí)把數(shù)據(jù)賦值為1~2 048的計(jì)數(shù)值,然后發(fā)起DMA寫傳輸,把數(shù)據(jù)寫入到DMA寫控制模塊中,在FPGA再用硬件語言讀此外設(shè)中FIFO數(shù)據(jù)并在SignalTapⅡ中顯示,其測(cè)試結(jié)果如圖6所示。
圖6中,fifo_rd表示FPGA中硬件邏輯讀取DMA寫控制模塊的讀信號(hào),fifo_readdata是外設(shè)中FIFO的數(shù)據(jù)總線信號(hào),sigtap_test信號(hào)連接至外設(shè)中FIFO滿、FIFO空以及waitrequest信號(hào)(LSB),圖6(a)表示了外部邏輯讀取外設(shè)中FIFO的數(shù)據(jù)起始段,在讀信號(hào)有效之前,sigtap_ test[2]信號(hào)是高電平,表示FIFO滿,sigtap_test[0]為高,表示外設(shè)此刻不能響應(yīng)DMA寫入的數(shù)據(jù),然后FPGA外部邏輯在檢測(cè)到FIFO滿后開始讀取數(shù)據(jù),在下一個(gè)時(shí)鐘周期,F(xiàn)IFO數(shù)據(jù)總線上出現(xiàn)有效數(shù)據(jù)。圖6(b)是讀取FIFO時(shí)數(shù)據(jù)的結(jié)束段,最后一個(gè)數(shù)據(jù)為2 048,讀取后,sig tap_test[1]為高電平,表示數(shù)據(jù)讀空,這與NiesⅡ中軟件寫入DMA從而寫入DMA寫控制模塊的數(shù)據(jù)是一致的,由此驗(yàn)證了模塊設(shè)計(jì)的正確性。
5 結(jié)束語
設(shè)計(jì)方案穩(wěn)定可靠、傳輸速度高,具有一定的通用性,能滿足NiosⅡ與外設(shè)之間的大批量數(shù)據(jù)傳輸,具有廣泛的應(yīng)用前景,同時(shí),使用了FIFO作為緩存,進(jìn)一步提高了數(shù)據(jù)吞吐量,具有較強(qiáng)的實(shí)用價(jià)值。