DMA無處不在http://blog./ilove314/1790879/message.aspx 在一次閑聊中,一位朋友就問其中幾位物流專業(yè)的同學(xué)“你們是什么專業(yè)的”。答曰“物流”。那位朋友就調(diào)侃說“物流就是把東西搬來搬去”。同學(xué)不服,糾正說“應(yīng)該是‘實現(xiàn)物體空間的位移‘”。然后我就問自己,“我們這般電子工程師在干什么?很多時候(當(dāng)然不完全是)不也是在做物流嗎?只不過對象不同而已,因為我們是‘實現(xiàn)數(shù)據(jù)(信息)的空間位移’”。哈哈,說得通俗一點,“通信”不也是“物流”嗎? 言歸正傳,數(shù)據(jù)的傳輸可以通過各種各樣的途徑,載體可以是模擬的,也可以是數(shù)字的;協(xié)議可以五花八門的,位寬也可以或大或小,速度當(dāng)然也是各有千秋,電平不同,穩(wěn)定性也有差異……而這里要提一種在CPU系統(tǒng)數(shù)據(jù)傳輸中很常見的通信方式——DMA(Direct Memory Access),即直接存儲存取。在很多較高端的DSP或是MCU中,都存在著這樣一種數(shù)據(jù)傳輸功能,引一段網(wǎng)絡(luò)上常見的對DAM的解釋如下。 DMA是一種不經(jīng)過CPU而直接從內(nèi)存存取數(shù)據(jù)的數(shù)據(jù)交換模式。在DMA模式下,CPU只須向DMA控制器下達(dá)指令,讓DMA控制器來處理數(shù)據(jù)的傳送,數(shù)據(jù)傳送完畢再把信息反饋給CPU,這樣就很大程度上減輕了CPU資源占有率,可以大大節(jié)省系統(tǒng)資源。 那么也就是說,DMA工作時可以和正常工作的CPU毫不相關(guān),CPU可以控制(或者確切的說是配置)DMA,而DMA和CPU和并行工作。大家都明白CPU工作大多要有軟件程序運行,而軟件的順序決定了它的速度和性能是有瓶頸的,但是一旦有了DMA這個功能,就能夠給系統(tǒng)帶來一定性能上的提升。打個不恰當(dāng)?shù)谋确剑€是和前面提到的物流相關(guān),在A和B地之間原本只有一條鐵軌(對應(yīng)一條總線)一列火車(對應(yīng)一個CPU)進(jìn)行運輸,那么如果要在一個月或一年之內(nèi)多運一些東西(加大數(shù)據(jù)吞吐量),除了加快火車速度外別無選擇,但是DMA就相當(dāng)于在火車運轉(zhuǎn)過程中的空閑路段上(不被總線占用的模塊)增加了一列火車,他不負(fù)責(zé)全程運輸,他只負(fù)責(zé)一個路段的運輸(局部數(shù)據(jù)傳輸),并且只能在主運火車不占用該路段的情況下工作(由總線仲裁器進(jìn)行判斷)。 換句話說,DMA可以提升系統(tǒng)的數(shù)據(jù)吞吐量。因為DMA能夠傳送CPU配置好的初始地址到目的地址之間的數(shù)據(jù),他在初始化并啟動之后不需要CPU程序的任何其他控制,直到傳輸結(jié)束遞交一個中斷信號。DMA的吞吐量很大程度上決定于與他所連接的模塊(可以是存儲器、總線、芯片等等)。當(dāng)然,越多的DMA通道也就越能夠加大系統(tǒng)的數(shù)據(jù)吞吐量。就如圖1所示。從一個DMA到兩個DMA,可以在系統(tǒng)運行中,讓每個模塊都不處于閑置狀態(tài)。 圖1 舉一個很簡單的CPU系統(tǒng)中使用DMA的例子。如圖2所示,在不是用DMA的CPU系統(tǒng)中,需要完成一個數(shù)據(jù)采集(輸入)、數(shù)據(jù)處理、數(shù)據(jù)傳輸(輸出)的功能,就需要CPU從始至終不停的運轉(zhuǎn),這三個步驟都是CPU的程序來控制,采集到數(shù)據(jù),然后扔進(jìn)buffer(通常是存儲器),處理的時候也需要從buffer里取數(shù)據(jù),處理完成還要送出去。同樣的功能,如圖3所示的含有DMA的系統(tǒng)中對數(shù)據(jù)的傳輸就顯得游刃有余,CPU可以專注于數(shù)據(jù)處理,數(shù)據(jù)輸入輸出這等搬運工干的活就交給DMA來做,DMA和CPU可以共用一片存儲區(qū),并且采用乒乓操作進(jìn)行交互,這樣一來,系統(tǒng)性能得到大大提高,CPU的運算能力也可以最大限度的得到發(fā)揮。 圖2 圖3 說完CPU系統(tǒng)中的DMA,不得不轉(zhuǎn)移話題來解釋下這篇博文的主題“DMA無處不在”。沒錯,特權(quán)同學(xué)就是想說FPGA,一個FPGA原型開發(fā)系統(tǒng)中“DMA無處不在”。因為一個數(shù)據(jù)流的處理中,往往是一個流水線式的一刻都不停歇的工作機制。并且任意兩個相關(guān)模塊的通信都有一套握手機制,都有專用的數(shù)據(jù)地址通道,當(dāng)然也可以復(fù)用,這時候就會涉及到總線仲裁。對于點到點數(shù)據(jù)傳輸,特權(quán)同學(xué)最喜歡的一種簡單握手機制如圖4所示,模塊A要向模塊B寫入或在讀出數(shù)據(jù),只要發(fā)出req請求,然后送ab/db,直到模塊B發(fā)出傳輸完成標(biāo)志ack信號,那么模塊A撤銷req完成一次傳輸。 圖4 而對于多點到點的傳輸,簡單的看就如圖5所示。需要添加一個仲裁邏輯。 圖5 再看整個系統(tǒng)的傳輸,最簡單的順序流傳輸就如6所示。 圖6 對于稍復(fù)雜一些的互聯(lián)架構(gòu)的系統(tǒng),如圖7所示。 圖7 從上面的幾個示意圖中不難發(fā)現(xiàn),尤其是圖7,系統(tǒng)的利用率很高,可以做到同一時刻整個系統(tǒng)都在運轉(zhuǎn),并且可以是毫不相關(guān)的。這就是FPGA的硬件特性所決定的,軟件系統(tǒng)的硬件架構(gòu)其實就是FPGA設(shè)計的精髓,在FPGA系統(tǒng)中的DMA是無處不在的。 |
|