作為嵌入式系統(tǒng)常用的AMBA總線結(jié)構(gòu)和一般的計(jì)算機(jī)系統(tǒng)有一定的區(qū)別。AMBA總線控制權(quán)是由總線仲裁器給予的,DMA控制器與CPU一樣,向總線仲裁器提出總線使用需求,總線仲裁器根據(jù)優(yōu)先級(jí)算法決定是否給予總線使用權(quán)。而一般計(jì)算機(jī)系統(tǒng)默認(rèn)CPU控制總線,若DMA有占用總線的需求是直接向CPU提出申請(qǐng)。
DMA主狀態(tài)機(jī)如圖2所示。當(dāng)有硬件或軟件提出DMA傳輸請(qǐng)求時(shí),DMA控制器將轉(zhuǎn)到工作態(tài)的第一個(gè)子狀態(tài)——準(zhǔn)備狀態(tài),DMA向總線仲裁器發(fā)出總線控制請(qǐng)求。若此時(shí)總線仲裁器沒有更高優(yōu)先級(jí)的總線需求請(qǐng)求,它會(huì)將總線控制權(quán)交給DMA控制器。當(dāng)DMA控制器拿到總線控制權(quán)后會(huì)轉(zhuǎn)到傳輸狀態(tài)。根據(jù)選定的通道及其寄存器組的要求,進(jìn)行DMA傳輸。在傳輸狀態(tài)中,DMA讀數(shù)據(jù)部分會(huì)率先動(dòng)作,從源地址讀取數(shù)據(jù)至FIFO中,當(dāng)FIFO中的數(shù)據(jù)量夠一次Burst操作后,寫數(shù)據(jù)部分會(huì)行動(dòng),將數(shù)據(jù)從FIFO中寫到目的地址所對(duì)應(yīng)的模塊中。若圖2DMA主狀態(tài)機(jī)FIFO滿,則自動(dòng)停止讀數(shù)據(jù),若FIFO空則自動(dòng)停止寫數(shù)據(jù)。當(dāng)讀數(shù)據(jù)部分完成了此次DMA傳輸要求的長(zhǎng)度后,狀態(tài)機(jī)進(jìn)入下一個(gè)子狀態(tài),等待寫數(shù)據(jù)部分將數(shù)據(jù)全部寫完。當(dāng)完成全部操作后,DMA控制器會(huì)向發(fā)起DMA傳輸請(qǐng)求的設(shè)備發(fā)出信號(hào),告知DMA傳輸順利完成,要求該設(shè)備撤銷DMA傳輸請(qǐng)求,并歸還總線控制權(quán)。至此DMA控制器回到空閑狀態(tài),等待下一次DMA傳輸請(qǐng)求。

一般而言,DMA控制器在總線仲裁器中是優(yōu)先級(jí)最低的設(shè)備。因此,當(dāng)有其它更高優(yōu)先級(jí)的總線主設(shè)備要求總線資源時(shí),DMA控制器會(huì)被剝奪總線使用的權(quán)利,此時(shí)DMA控制器將進(jìn)入等待狀態(tài),直到優(yōu)先級(jí)更高的總線主設(shè)備釋放總線控制權(quán)后再進(jìn)入傳輸狀態(tài)。
當(dāng)軟件提出申請(qǐng),完成內(nèi)存之間的大量DMA傳輸時(shí),一般會(huì)使用LLI功能。LLI功能針對(duì)的虛擬內(nèi)存空間與物理內(nèi)存空間映射的不一致性,為了提高傳輸性能而引入的一種傳輸機(jī)制。作為L(zhǎng)LI傳輸,ARM需要編程給DMA控制器,告知LLI列表的地址,并啟動(dòng)DMA傳輸。當(dāng)DMA控制器發(fā)現(xiàn)是LLI傳輸時(shí),它會(huì)到LLI列表中讀取第一次DMA傳輸?shù)脑吹刂贰⒛康牡刂贰鬏旈L(zhǎng)度以及下一個(gè)LLI列表的地址并存入寄存器。當(dāng)此次DMA傳輸結(jié)束后,DMA控制器會(huì)自動(dòng)到下一個(gè)LLI列表中讀取下一次DMA傳輸?shù)男畔?。這個(gè)鏈表傳輸過程直到LLI寄存器中的內(nèi)容為“0”時(shí)中止。
基于ASIC的考慮
關(guān)于總線
根據(jù)AMBA協(xié)議,AHB總線支持字節(jié)、半字和全字操作。因此DMA控制器在這點(diǎn)上符合AHB協(xié)議的要求DMA控制器默認(rèn)32位數(shù)據(jù)線,因此需要根據(jù)讀寫地址以及讀數(shù)據(jù)操作類型將讀入的數(shù)據(jù)放入32位的FIFO中,寫出的時(shí)候再根據(jù)地址和寫數(shù)據(jù)的操作類型將數(shù)據(jù)從FIFO中放到寫數(shù)據(jù)總線上。如字節(jié)操作時(shí),根據(jù)讀地址從讀到的一個(gè)字的數(shù)據(jù)中選取合適的字節(jié)放到FIFO中的最低字節(jié);寫的時(shí)候從FIFO最低部分取數(shù),根據(jù)寫地址將此字節(jié)放到寫數(shù)據(jù)相應(yīng)的部分,其余位補(bǔ)零。
作為ASIC而言,一般情況下,三態(tài)只用于輸入輸出的管腳上。即使是總線在芯片內(nèi)部也是將讀數(shù)據(jù)線與寫數(shù)據(jù)線分開使用的。本設(shè)計(jì)秉承這一原則,將讀寫數(shù)據(jù)線分開。
作為DMA傳輸,地址的變更需要靈。有時(shí)候讀寫地址需要增加,有時(shí)候地址需要不變。當(dāng)增加的時(shí)候,也要根據(jù)傳輸?shù)念愋蜎Q定地址增加1、2或4
關(guān)于復(fù)位
復(fù)位是ASIC設(shè)計(jì)中最容易出問題的一環(huán)。DMA控制器主要有兩種復(fù)位方式,一種是上電復(fù)位,即異步復(fù)位,另一種是軟件復(fù)位,即同步復(fù)位。
異步復(fù)位通過將全部D-觸發(fā)器的Reset端接到復(fù)位信號(hào)線上,無需時(shí)鐘就可以實(shí)現(xiàn)的復(fù)位。一般情況下在上電的時(shí)候作一次。而根據(jù)功能的需要當(dāng)系統(tǒng)出現(xiàn)故障,或軟件需要強(qiáng)行中止一次DMA傳輸?shù)臅r(shí)候,則需要軟件通過配置寄存器實(shí)現(xiàn)復(fù)位功能。此時(shí)就需要同步復(fù)位。
關(guān)于綜合
由于DMA控制器工作在高速總線上,總線時(shí)鐘最高可以達(dá)到200M,故在做前端設(shè)計(jì)的時(shí)候要特別注意。
以優(yōu)先級(jí)判斷為例。優(yōu)先級(jí)判斷本質(zhì)就是16個(gè)數(shù)字比大小。為了使時(shí)間復(fù)雜度最小,不采取經(jīng)典的“冒泡排序”,而是對(duì)半排序法。這樣比較4次就可以得到需要的數(shù)據(jù)。四級(jí)MUX對(duì)于低頻而言不算很困難,但是對(duì)于高頻而言,為了能夠滿足時(shí)序要求,就需要在第二次比較之后插入一組觸發(fā)器。
結(jié)語
本文討論了一種基于AMBA總線的DMA控制器的IP核設(shè)計(jì),結(jié)合這個(gè)實(shí)際的設(shè)計(jì),討論了IP復(fù)用技術(shù)的設(shè)計(jì)方法。這個(gè)設(shè)計(jì)不依賴于具體的FPGA或ASIC型號(hào)或工藝,因此其可移植性被大大增加。另一方面本設(shè)計(jì)綜合出來的DMA控制器是20K門,比起ARM公司的DMAC控制器的68K門,在面積方面也有很大的優(yōu)勢(shì)。
IP復(fù)用技術(shù)越來越成為嵌入式系統(tǒng)的發(fā)展趨勢(shì)。這種設(shè)計(jì)方法順應(yīng)了超大規(guī)模集成電路的發(fā)展潮流,必將成為這一領(lǐng)域發(fā)展的方向。
電子發(fā)燒友App







































評(píng)論