一、DMA控制器介紹
DMA控制器是一種在系統內部轉移數據的獨特外設,可以將其視為一種能夠通過一組專用總線將內部和外部存儲器與每個具有DMA能力的外設連接起來的控制器。它之所以屬于外設,是因為它是在處理器的編程控制下來 執行傳輸的。
傳輸結構與設置
目前有兩類主要的DMA傳輸結構:寄存器模式和描述符模式。無論屬于哪一類DMA,表1的幾種信息都會在DMA控制器中出現。當DMA以寄存器模式工作時,DMA控制器只是簡單地利用寄存器中所存儲的參數值。在描述符模式中,DMA控制器在存儲器中查找自己的配置參數。
(1)基于寄存器的DMA
在基于寄存器的DMA內部,處理器直接對DMA控制寄存器進行編程,來啟動傳輸。基于寄存器的DMA提供了最佳的DMA控制器性能,因為寄存器并不需要不斷地從存儲器中的描述符上載入數據,而內核也不需要保持描述符。基于寄存器的DMA由兩種子模式組成:自動緩沖(Autobuffer)模式和停止模式。在自動緩沖DMA中,當一個傳輸塊傳輸完畢,控制寄存器就自動重新載入其最初的設定值,同一個DMA進程重新啟動,開銷為零。如果將一個自動緩沖DMA設定為從外設傳輸一定數量的字到 L1數據存儲器的緩沖器上,則DMA控制器將會在最后一個字傳輸完成的時刻就迅速重新載入初始的參數。這構成了一個“循環緩沖器”,因為當一個量值被寫入 到緩沖器的最后一個位置上時,下一個值將被寫入到緩沖器的第一個位置上。
自動緩沖DMA特別適合于對性能敏感的、存在持續數據流的應用。DMA控制器可以在獨立于處理器其他活動的情況下讀入數據流,然后在每次傳輸結束時,向內核發出中斷。
停止模式的工作方式與自動緩沖DMA類似,區別在于各寄存器在DMA結束后不會重新載入,因 此整個DMA傳輸只發生一次。停止模式對于基于某種事件的一次性傳輸來說十分有用。例如,非定期地將數據塊從一個位置轉移到另一個位置。當你需要對事件進 行同步時,這種模式也非常有用。例如,如果一個任務必須在下一次傳輸前完成的話,則停止模式可以確保各事件發生的先后順序。此外,停止模式對于緩沖器的初 始化來說非常有用。
(2)描述符模型
基于描述符(descriptor)的DMA要求在存儲器中存入一組參數,以 啟動DMA的系列操作。該描述符所包含的參數與那些通常通過編程寫入DMA控制寄存器組的所有參數相同。不過,描述符還可以容許多個DMA操作序列串在一 起。在基于描述符的DMA操作中,我們可以對一個DMA通道進行編程,在當前的操作序列完成后,自動設置并啟動另一次DMA傳輸。基于描述符的方式為管理 系統中的DMA傳輸提供了最大的靈活性。
基本組成
(1)內存地址計數器:用于存放內存中要交換的數據的地址。在 DMA傳送前,須通過程序將數據在內存中的起始位置(首地址)送到內存地址計數器。而當 DMA 傳送時,每交換一次數據,將地址計數器加“1”,從而以增量方式給出內存中要交換的一批數據的地址。
(2)字計數器:用于記錄傳送數據塊的長度(多少字數)。其內容也是在數據傳送之前由程序預置,交換的字數通常以補碼形式表示。在DMA傳送時,每傳送一個字,字計數器就加“1”。當計數器溢出即最高位產生進位時,表示這批數據傳送完畢,于是引起DMA控制器向CPU發出中斷信號。
(3)數據緩沖寄存器:用于暫存每次傳送的數據(一個字)。當輸入時,由設備(如磁盤)送往數據緩沖寄存器,再由緩沖寄存器通過數據總線送到內存。反之,輸出時,由內存通過數據總線送到數據緩沖寄存器,然后再送到設備。
(4)DMA請求”標志:每當設備準備好一個數據字后給出一個控制信號,使“DMA
請求”標志置“1”。該標志置位后向“控制/狀態”邏輯發出DMA請求,后者又向CPU發出總線使用權的請求(HOLD),CPU響應此請求后發回響應信號HLDA,“控制/狀態”邏輯接收此信號后發出DMA響應信號,使“DMA 請求”標志復位,為交換下一個字做好準備。
(5)控制/狀態”邏輯:由控制和時序電路以及狀態標志等組成,用于修改內存地址計數器和字計數器,指定傳送類型(輸入或輸出),并對“DMA請求”信號和CPU響應信號進行協調和同步。
(6)中斷機構:當字計數器溢出時,意味著一組數據交換完畢,由溢出信號觸發中斷機構,向CPU提出中斷報告。
二、NiosⅡ介紹
Nios Ⅱ嵌入式處理器是ALTERA公司推出的采用哈佛結構、具有32位指令集的第二代片上可編程的軟核處理器, 其最大優勢和特點是模塊化的硬件結構, 以及由此帶來的靈活性和可裁減性。
NiosⅡ特點
Nios II系列支持使用專用指令。專用指令是用戶增加的硬件模塊,它增加了算術邏輯單元(ALU)。用戶能為系統中使用的每個Nios II處理器創建多達256個專用指令,這使得設計者能夠細致地調整系統硬件以滿足性能目標。專用指令邏輯和本身Nios II指令相同,能夠從多達兩個源寄存器取值,可選擇將結果寫回目標寄存器。同時,Nios II系列支持60多個外設選項,開發者能夠選擇合適的外設,獲得最合適的處理器、外設和接口組合,而不必支付根本不使用的硅片功能。 Nios II系列能夠滿足任何應用32位嵌入式微處理器的需要,客戶可以將第一代Nios處理器設計移植到某種Nios II處理器上,Altera將長期支持現有FPGA系列上的第一代Nios處理器。另外,Altera提供了一鍵式移植選項,可以升級至Nios II系列。Nios II處理器也能夠在HardCopy器件中實現,Altera還為基于Nios II處理器的系統提供ASIC的移植方式。
開發環境
Nios II處理器具有完善的軟件開發套件,包括編譯器、集成開發環境(IDE)、JTAG調試器、實時操作系統(RTOS)和TCP/IP協議棧。設計者能夠用Altera Quartus II開發軟件中的SOPC Builder系統開發工具很容易地創建專用的處理器系統,并能夠根據系統的需求添加Nios II處理器核的數量。
使用Nios II軟件開發工具能夠為Nios II系統構建軟件,即一鍵式自動生成適用于系統硬件的專用C/C++運行環境。Nios II集成開發環境(IDE)提供了許多軟件模板,簡化了項目設置。此外,Nios II開發套件包括兩個第三方實時操作系統(RTOS)——MicroC/OS-II(Micrium),Nucleus Plus(ATI/Mentor)以及供網絡應用使用的TCP/IP協議棧。
三、NiosⅡ系統中DMA控制器的原理及應用
1、dma控制器的原理
1.1dma功能介紹
nios ⅱ中的dma控制器包含2個avalonmm類型的主控制器端口(讀端口和寫端口),1個用于dma控制avalonmm類型的從端口以及內部一些寄存器組所構成,其結構圖如圖1所示。
? ? ? ?圖1dma控制器的結構圖dma控制器可以將數據從源地址搬移到目的地址。源地址或者目的地址可以是存儲器中的一段地址范圍也可以是avalon從控制器的外設。因此,在nios ⅱ系統中,存在3種類型的dma操作,即存儲器到外設,外設到存儲器以及存儲器到存儲器。dma控制器還具備流處理能力,允許固定或者可變長度的數據傳輸。當dma操作結束時,dma控制器發出中斷(irq)請求。典型的dma數據傳輸過程如下:
(1) cpu通過寫控制端口配置dma控制器用于數據傳輸;
(2) dma控制器向cpu發出hold信號請求占用總線;
(3) cpu響應dma控制器的請求,并讓出總線,dma控制器獲得總線的控制權;
(4) dma控制器讀端口從源地址讀數據,寫端口向目的地址寫數據,讀寫端口間利用fifo緩存數據;
(5) 當傳輸完指定的數據時,dma傳輸結束并向nios ⅱ cpu發出中斷請求;
(6) cpu響應中斷請求,dma交出總線控制權。
1.2dma寄存器組描述
dma控制器共有8個32位寄存器,其中5個為當前有效的寄存器,另外3個為以后擴展所用。寄存器的映射表如表1所示。 表1dma控制器內部寄存器映射表
偏移量寄存器名稱功能0狀態寄存器指示dma控制器內部 的詳細情況1源地址寄存器讀取數據的起始地址2目的地址寄存器寫入數據的起始地址3數據長度寄存器從讀端口傳輸到 寫端口的字節數6控制寄存器設置dma的工作方式
狀態寄存器的每個狀態位指示dma控制器內部的詳細情況。
位編號位名稱描述0donedma傳輸完成。當檢測到數據包結束信號或指定長度的數據傳輸完成時,done位為1。寫0到狀態寄存器使done位為0。1busy當dma傳輸正在進行時,busy位為12reop當傳輸完成事件由讀數據包結束信號引起時,reop位為13weop當傳輸完成事件由寫數據包結束信號引起時,weop位為14len當長度寄存器遞減為0時,len位為1.
源地址寄存器指定dma傳輸的數據源的起始地址;目的地址寄存器指定了dma傳輸的目標數據區的起始地址;數據長度寄存器指定從讀端口傳輸到寫端口的字節數。如果是字傳輸,則數據長度寄存器的值需乘以4;若為半字傳輸,則需乘以2。主控制器寫端口每寫一個字節數據時,數據長度寄存器減1。當數據長度寄存器為0時,狀態寄存器的len位置位;控制寄存器每個位設定dma的工作方式。控制寄存器每個位的意義如表3所示。dma傳輸的數據寬度用字節、半字、字、雙字和4字位指定。這些位只能有一位設置為1。數據傳輸的寬度由2個讀/寫傳輸設備中傳輸寬度窄的一方決定。例如,將數據從16位的外部sdram存儲器中搬移到內部32位的片內存儲器時,傳輸數據寬度應該設置為半字。
表3控制寄存器位
位編號位名稱描述0byte設置為字節(8位)方式傳輸1hw設置為半字(16位)方式傳輸2word設置為字(32位)方式傳輸3go使能dma傳輸。當設置為1且數據長度寄存器不為0時,開始dma傳輸4i_en使能中斷(irq)。當i_en為1時,若狀態寄存器的done位也為1,則dma控制器產生中斷請求。5reen終止讀數據傳輸。6ween終止寫數據傳輸。7leen數據長度寄存器為0時傳輸結束。當leen位為1時,若數據長度寄存器達到0時,則結束dma傳輸。8rcon讀地址固定。當rcon為0時,讀地址在每次數據傳輸后增加;當rcon為1時,讀地址在每次數據傳輸后不增加。9wcon寫地址固定。當wcon為0時,寫地址在每次數據傳輸后增加;當wcon為1時,寫地址在每次數據傳輸后不增加。10doubleword設置為雙字(64位)方式傳輸。11quadword設置為4字(128位)方式傳輸。
1.3軟件編程
altera 提供了hal dma設備的驅動程序[45],該驅動程序把dma傳輸抽象成2種數據通道:發送數據通道和接收數據通道。當存儲器從外設接收數據時,使用數據接收通道;當存儲器向外設發送數據時,使用數據發送通道;當存儲器間進行數據傳輸時,既要使用數據接收通道又要使用數據發送通道。與dma發送數據通道相關的函數有
alt_dma_txchan_open(),alt_dma_txchan_send(),
alt_dma_txchan_space(),alt_dma_txchan_ioctl(),
alt_dma_txchan_close();而與dma接收數據通道相關的函數
alt_dma_rxchan_open(),alt_dma_rxchan_prerare(),
alt_dma_rxchan_depth(),alt_dma_rxchan_ioctl()。
alt_dma_txchan_open()和alt_dma_rxchan_open()
函數分別打開dma控制器的發送數據通道和接收數據通道,獲得dma控制器的發送數據通道和接收數據通道的句柄,返回非0值表示成功。
調用alt_dma_txchan_send()函數產生一次dma發送數據請求。其函數原型為int alt_dma_txchan_send(alt_dma_txchan dma,const void* from ,alt_u32 length, alt_ txchan_done* done ,void* handle)。調用此函數時,length字節長度的數據將從地址from處被發送。當發送結束時,函數返回值為非負則表示dma傳輸成功,否則表示傳輸失敗。當傳輸結束時,回調函數done將被執行,handle為函數done的參數。
dma接收函數的用法與dma發送函數的用法大致相同,其函數原型為 int alt_dma_rxchan_prepare(alt_dma_rxchan dma,const void* data ,alt_u32 length, alt_ txchan_done* done ,void* handle)。參數data表示dma接收數據存放的起始地址。length表示接收數據的長度,單位為字節。函數返回值為非負表示接收成功。當接收結束時,回調函數done將被執行,handle為函數done的參數。另外,與發送通道和接收通道相關的還各有2個函數。與發送通道相關的函數為alt_dma_txchan_space()和alt_dma_txchan_ioctl()。alt_dma_txchan_space()返回傳送到dma發送信道的發送請求數目。alt_dma_txchan_ioctl()則是執行了與器件相關的控制操作。與接收通道相關的函數為:
alt_dma_rxchan_depth()和alt_dma_rxchan_ioctl()。alt_dma_rxchan_depth()函數返回dma接收通道的最大接收請求數。alt_dma_rxchan_ioctl()執行了與器件相關的控制操作。
2、dma控制器應用舉例
在軟硬件的調試過程中,有時需要將內存中的一段數據通過串口打印出來,作為調試信息,這時就可利用dma技術進行數據傳輸。圖2為在sopc builder中構建的dma傳輸的硬件連接圖,實現了sdram到串口的數據傳輸。
圖2硬件連接圖如下的程序實現了將sdram中以chr為起始地址的20個字節的數據通過dma方式發送到串口。其實現的核心代碼如下:
3、結語
在某雷達信號網絡化數字傳輸系統的研制中,將雷達信號接口單元與網絡接口單元分別映射為nios ⅱ系統中的2個外設,利用外設間的dma方式進行數據傳輸。實踐證明,利用dma方式進行數據傳輸,cpu可從繁重的數據傳輸工作中釋放出來,提高了cpu進行數據處理的能力。
評論