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





