ADSP2106x中DMA的應(yīng)用
摘 要: 直接內(nèi)存存?。―MA)是DSP芯片中用于快速數(shù)據(jù)交換的重要技術(shù),對(duì)AD公司的浮點(diǎn)系列芯片ADSP2106x中的DMA的應(yīng)用進(jìn)行了詳細(xì)介紹,并給出實(shí)際應(yīng)用中的一些例子。
本文引用地址:http://butianyuan.cn/article/241582.htm關(guān)鍵詞: DMA 浮點(diǎn)系列芯片ADSP2106x
1 DMA概述
直接內(nèi)存存?。―MA)對(duì)計(jì)算機(jī)系統(tǒng)是非常重要的。它可以使CPU在運(yùn)行指令的同時(shí),系統(tǒng)能實(shí)現(xiàn)從外部存儲(chǔ)器或設(shè)備中存取數(shù)據(jù),也可以在CPU不參與的情況下,由專(zhuān)用的DMA設(shè)備存取數(shù)據(jù)。
對(duì)于浮點(diǎn)DSP芯片來(lái)講,DMA的作用更是重要。眾所周知,DSP芯片主要是面向?qū)崟r(shí)的信號(hào)處理,其核心的運(yùn)算部件具有很高的運(yùn)算速度,常以MFLOPS(每秒百萬(wàn)次浮點(diǎn)運(yùn)算)來(lái)衡量。ADSP2106x為120MFLOPS,但該速度是以存儲(chǔ)在芯片內(nèi)部存儲(chǔ)器中的程序和數(shù)據(jù)為前提的。在DSP內(nèi)部往往采用多總線(xiàn)的哈佛結(jié)構(gòu),數(shù)據(jù)總線(xiàn)和程序總線(xiàn)相互獨(dú)立,即指令的存取和數(shù)據(jù)的存取并行不悖;另外在ADSP2106x內(nèi)部還有各種接口總線(xiàn),用以提高數(shù)據(jù)的流通能力。但在芯片的外部,所有的總線(xiàn)都合并在一起了。因此為了發(fā)揮DSP核心運(yùn)算單元的高速運(yùn)算能力,首先必須把程序和數(shù)據(jù)傳輸?shù)叫酒膬?nèi)存中,這通常需要DMA操作來(lái)實(shí)現(xiàn)。
另一方面,DSP系統(tǒng)總要與各種外部信號(hào)打交道,它從外部輸入數(shù)字信號(hào),經(jīng)過(guò)各種算法的處理后,再輸出給其他設(shè)備。不僅如此,對(duì)于浮點(diǎn)DSP系統(tǒng),數(shù)據(jù)的輸入和輸出常常是連續(xù)不斷的。試想,如果用DSP的核心部件來(lái)完成數(shù)據(jù)的輸入和輸出,它高速的運(yùn)算能力又如何發(fā)揮得出來(lái)呢?所以,浮點(diǎn)系列的DSP芯片大都把DMA控制部分直接集成到了芯片上,用DMA來(lái)完成數(shù)據(jù)的輸入和輸出。
高效的DSP系統(tǒng)通常采用圖1所示的結(jié)構(gòu)。在內(nèi)存中開(kāi)辟出四塊緩存區(qū),兩個(gè)作為輸入緩存,兩個(gè)作為輸出緩存,用來(lái)實(shí)現(xiàn)輸入、輸出的乒乓切換。核心處理單元直接從輸入緩存中取數(shù)運(yùn)算,然后把運(yùn)算結(jié)果寫(xiě)入輸出緩存;而數(shù)據(jù)從外部接口的輸入和輸出則完全由DMA來(lái)實(shí)現(xiàn),不需核心處理單元的參與。只要核心處理單元的運(yùn)算速度和DMA的數(shù)據(jù)率滿(mǎn)足要求,圖1所示的結(jié)構(gòu)就可以完成連續(xù)的數(shù)據(jù)流輸入和輸出。當(dāng)然,從外部看,數(shù)據(jù)的輸入和輸出是連續(xù)的,但在芯片內(nèi)部卻是分段處理的。分段處理雖然帶來(lái)一些誤差,但只要緩存的數(shù)據(jù)足夠長(zhǎng),就可以使誤差降到允許的范圍。因?yàn)殚g隔越長(zhǎng),前后數(shù)據(jù)間的相關(guān)性越小,相互間的影響就越小,故分段處理是可行的。由于分段處理,也給DSP芯片的結(jié)構(gòu)帶來(lái)了一個(gè)重要影響,那就是盡可能地增加其內(nèi)部存儲(chǔ)器的容量。對(duì)于ADSP21060,其內(nèi)部的SRAM容量達(dá)4Mbit,可以滿(mǎn)足大多數(shù)分段處理的需要。
下面首先對(duì)ADSP2106x中的DMA做概要介紹,然后對(duì)幾種典型的DMA操作進(jìn)行詳細(xì)分析。
2 ADSP2106x中的DMA
ADSP2106x中的片內(nèi)DMA控制器可以同時(shí)控制10個(gè)通道的DMA,完成下列類(lèi)型的數(shù)據(jù)傳輸操作:
·內(nèi)存外存或外部存儲(chǔ)器映射設(shè)備
·內(nèi)存其他ADSP2106x的內(nèi)存
·內(nèi)存主機(jī)接口
·內(nèi)存串行口
·內(nèi)存Link口
·內(nèi)存外部設(shè)備
·外存外部設(shè)備
豐富的數(shù)據(jù)流向可以使ADSP2106x實(shí)現(xiàn)對(duì)各種外設(shè)的接口;另外,由于ADSP2106x的內(nèi)存是雙口SRAM,因此在進(jìn)行上述DMA操作的同時(shí),核心處理單元仍可以讀寫(xiě)內(nèi)存,使DMA操作與內(nèi)部運(yùn)算處理達(dá)到高度的并行性。當(dāng)然,應(yīng)盡量避免二者同時(shí)對(duì)同一內(nèi)存地址進(jìn)行讀寫(xiě)。
每個(gè)DMA通道都有一個(gè)(或兩個(gè))用FIFO實(shí)現(xiàn)的數(shù)據(jù)緩存器,最大的緩沖深度為6級(jí),用以提高DMA數(shù)據(jù)傳輸率。所有的DMA數(shù)據(jù)傳輸都是通過(guò)這10個(gè)數(shù)據(jù)緩存器來(lái)完成的,這些緩存器如表1所示。其中通道1、3、6、7都是兩個(gè)緩存器共用一個(gè)DMA通道。所有數(shù)據(jù)緩存器作為I/O寄存器被映射到內(nèi)存的前256個(gè)地址中。
DMA的編程是通過(guò)內(nèi)部核心處理單元或外部主機(jī)對(duì)片內(nèi)有關(guān)的I/O寄存器設(shè)置來(lái)實(shí)現(xiàn)的,這些I/O口寄存器也被映射到內(nèi)存的前256個(gè)地址上。與DMA操作有關(guān)的I/O寄存器除了前面的數(shù)據(jù)緩存器外,主要還包括:
·DMA控制寄存器:DMAC6~9,LCTL,STCTL0~1,SRCTL0~1。
·地址-計(jì)數(shù)寄存器:II0~9,IM0~9,C0~9,EI6~9,EM6~9,EC6~9。
·鏈?zhǔn)讲僮髦羔樇拇嫫鳎篊P0~9。
·二維操作寄存器(也可作DMA通用寄存器):GP0~9,DA0~5,DB0~5。
·DMA狀態(tài)寄存器:DMASTAT。
DMA設(shè)置傳輸過(guò)程一般如下:
(1)設(shè)置對(duì)應(yīng)通道的地址-計(jì)數(shù)寄存器。
(2)設(shè)置對(duì)應(yīng)通道的DMA控制寄存器,并將其中的DMA使能位設(shè)為有效。
(3)開(kāi)始DMA數(shù)據(jù)傳輸。
(4)DMA傳輸結(jié)束后,產(chǎn)生對(duì)應(yīng)的中斷,程序?qū)χ袛噙M(jìn)行處理。
3 幾種常用的DMA操作
在基于ADSP2106x的DSP系統(tǒng)的開(kāi)發(fā)過(guò)程中,最常用到以下幾種DMA操作:內(nèi)存與外存、內(nèi)存與主機(jī)、內(nèi)存與外設(shè)、內(nèi)存與Link口間的數(shù)據(jù)交換。
3.1 內(nèi)存與外存間的DMA
內(nèi)存與外存間的DMA傳輸可用DMA通道6~9這四個(gè)通道中的任一個(gè)。這里用一個(gè)例子來(lái)說(shuō)明,假如要把內(nèi)存地址0x26000~0x263ff中的1024個(gè)數(shù)用DMA通道6傳送到外存0x400000~4003ff中,可用下面的編程來(lái)實(shí)現(xiàn):
/*設(shè)置內(nèi)存地址-計(jì)數(shù)寄存器*/
R0=0x26000;
DM(II6)=R0; /*設(shè)置內(nèi)存起始地址*/
R0=1
DM(IM6)=R0; /*設(shè)置內(nèi)存地址增加值*/
R0=1024;
DM(C6)=R0 /*設(shè)置內(nèi)存讀數(shù)次數(shù)*/
/*設(shè)置外存地址-計(jì)數(shù)寄存器*/
R0=0x400000;
DM(E16)=R0; /*設(shè)置外存起始地址*/
R0=1;
DM(EM6)=R0; /*設(shè)置外存地址增加值*/
R0=1024;
DM(EC6)=R0; /*設(shè)置外存寫(xiě)數(shù)次數(shù)*/
R0=0x0205;
DM(DMAC6)=R0;;/*設(shè)置DMA控制寄存器
DMAC6*/
/*設(shè)置為Master和從內(nèi)存讀數(shù)方
式,并使能DMA*/
/*DMA通道6開(kāi)啟DMA傳數(shù)操作*/
這里需要說(shuō)明兩點(diǎn):(1)I/O寄存器不能用立即數(shù)來(lái)直接賦值,而要通過(guò)通用寄存器R0~15或USTAT0~1來(lái)賦值;(2)在ADSP2106x中,由于數(shù)據(jù)的寬度有8、16、32和48幾種方式,通過(guò)DMA傳輸時(shí),內(nèi)存和外部接口上的寬度可以不同,因此對(duì)應(yīng)的讀寫(xiě)次數(shù)可能不同,故內(nèi)部計(jì)數(shù)器和外部計(jì)數(shù)器要分別設(shè)置。
對(duì)于外部存儲(chǔ)器映射設(shè)備,其接口地址是固定的,此時(shí)內(nèi)存與該外設(shè)間DMA的編程更加簡(jiǎn)單。比如某外設(shè)的地址設(shè)在0x400000,要把內(nèi)存0x26000~0x263ff中的1024個(gè)數(shù)用DMA通道6傳送到該外設(shè)接口上,只需把上面程序中的EM6設(shè)為0即可。
3.2 內(nèi)存與主機(jī)間的DMA
在ADSP2106x芯片上包含了一個(gè)主機(jī)(host)接口,可以使其方便地與通用16位或32位計(jì)算機(jī)相連接,此時(shí),通用計(jì)算機(jī)就作為ADSP2106x的主機(jī),它可對(duì)ADSP2106x的片內(nèi)存儲(chǔ)器進(jìn)行訪問(wèn)。通常情況下,為了減少主機(jī)對(duì)ADSP2106x尋址的地址線(xiàn)根數(shù),以降低硬件復(fù)雜性,主機(jī)往往只對(duì)ADSP2106x的I/O寄存器(有256個(gè))尋址,尋址的地址線(xiàn)只需8根1。BittWare公司的ADSP2106xEZ-LAB開(kāi)發(fā)板即采用了此種方式。在這種情況下,主機(jī)與ADSP2106x內(nèi)存間的數(shù)據(jù)交換大多是通過(guò)DMA完成的。下面通過(guò)運(yùn)行在微機(jī)上的一段C語(yǔ)言程序來(lái)說(shuō)明,此時(shí)EZ-LAB板插入微機(jī)的ISA總線(xiàn)插槽上,微機(jī)作為ADSP2106x的主機(jī),ADSP2106x的I/O寄存器可由微機(jī)通過(guò)ISA總線(xiàn)上的I/O口來(lái)訪問(wèn)。該程序把數(shù)據(jù)d[1024]通過(guò)DMA通道6加載到ADSP2106x內(nèi)存0x26000~0x263ff中。具體程序如下:
#injcludeconio.h
#include def21060.h /*ADSP I/O寄存器地址定義文件*/
#include :stdio.h
#define ADDR 0X402 /*定義ADSP地址線(xiàn)對(duì)應(yīng)
的ISA總線(xiàn)I/O口地址*/
#define DATA 0x404 /*定義ADSP數(shù)據(jù)線(xiàn)對(duì)應(yīng)
的ISA總線(xiàn)I/O口地址*/
main()
{int n,d[1024];
/*設(shè)置ADSP中DMA通道6的地址-計(jì)數(shù)寄存器及控制寄存器*/
outpw(ADDR,II6); /*尋址起始地址寄存器II6*/
outpw(DATA,0x6000);/*設(shè)置II6的低16位*/
outpw(DATA,0x2); /*設(shè)置II6的高16位*/
outpw(ADDR,IM6); /*尋址地址增加寄存器IM6*/
outpw(DATA,1); /*設(shè)置IM6的低16位*/
outpw(DATA,0); /*設(shè)置IM6的高16位*/
outpw(ADDR,C6); /*尋址計(jì)數(shù)寄存器C6*/
outpw(DATA,1024); /*設(shè)置C6的低16位*/
outpw(DATA,0); /*設(shè)置C6的高16位*/
outpw(ADDR,DMAC6); /*尋址DMA控制寄存器
DMAC6 */
outpw(DATA,0x41);/*設(shè)置DMAC6的低16位*/
outpw(DATA,0); /*設(shè)置DMAC6的高16位*/
/*ADSP的DMA通道6設(shè)為16/32位模式,
并開(kāi)啟就緒,等待微機(jī)傳數(shù)*/
/*微機(jī)向DMA通道6的數(shù)據(jù)緩存器EPB0中連續(xù)寫(xiě)入數(shù)據(jù)d[.]*/
outpw(ADDR,EPB0); /*尋址DAM通道6的數(shù)
據(jù)緩存器EPB0*/
for(n=0;n<1024;n++)
{outpw(DATA,d[n]); /*寫(xiě)數(shù)據(jù)d[n]*/
outpw(DATA,0); /*高16位寫(xiě)0*/
}
}
對(duì)以上程序需要說(shuō)明的有兩點(diǎn):(1)ADSP2106x的地址線(xiàn)和數(shù)據(jù)線(xiàn)是通過(guò)ISA總線(xiàn)上兩個(gè)I/O口地址(ADDR和DATA)來(lái)訪問(wèn)的;(2)ISA總線(xiàn)為16位,而ADSP2106x的I/O寄存器和內(nèi)存的數(shù)據(jù)都為32位,因此微機(jī)要用高、低16位分別傳輸,同時(shí)把DMA6設(shè)置為16/32位模式。關(guān)于EZ-LAB的詳細(xì)情況可參見(jiàn)文獻(xiàn)[1]。
3.3 內(nèi)存與外設(shè)間的DMA
對(duì)于某些外部設(shè)備,其輸入或輸出是與某個(gè)外部時(shí)鐘同步的,而與ADSP2106x的讀寫(xiě)時(shí)鐘不相干。當(dāng)這樣的設(shè)備與ADSP2106x接口時(shí),通常的做法是在接口端加FIFO或雙口RAM,把ADSP2106x的讀寫(xiě)與該外設(shè)的輸入或輸出時(shí)鐘隔離開(kāi)來(lái)。但ADSP2106x芯片本身提供了更靈活、更高效的方式,即DMA通道7和8的握手DMA方式(Handshake),可以完全省去FIFO或RAM,其典型應(yīng)用電路如圖2所示。
圖中以8位數(shù)據(jù)線(xiàn)寬度為例,以DMA通道7為輸出,對(duì)應(yīng)的握手信號(hào)為DMAR1和DMAG1;以DMA通道8為輸入,對(duì)應(yīng)的握手信號(hào)為DMAR2和DMAG2。整個(gè)電路只用到了最常用的74273和74374芯片,外設(shè)的讀寫(xiě)時(shí)鐘最高可達(dá)40MHz。在這種握手DMA方式中,外設(shè)不占用ADSP2106x的外部地址總線(xiàn)。關(guān)于上面電路的詳細(xì)情況,在此不再贅述。
下面給出設(shè)置握手DMA的對(duì)應(yīng)程序。這里假設(shè)要從外設(shè)2中輸入1024個(gè)數(shù)據(jù)到內(nèi)存0x26000~0x264ff中,則需對(duì)DMA通道8進(jìn)行如下編程:
/*設(shè)置內(nèi)存地址-計(jì)數(shù)寄存器*/
R0=0x26000;
DM(II8)=R0; /*設(shè)置內(nèi)存起始地址*/
R0=1;
DM(IM8)=R0; /*設(shè)置內(nèi)存地址增加值*/
R0=1024;
DM(C8)=R0; /*設(shè)置內(nèi)存寫(xiě)數(shù)次數(shù)*/
/*設(shè)置外存計(jì)數(shù)寄存器*/
R0=1;
DM(EM8)=R0; /*設(shè)置外存地址增加值*/
R0=1024;
DM(EC8)=R0; /*設(shè)置外存輸入次數(shù)*/
R0=0x401;
DM(DMAC8)=R0; /*設(shè)置DMA控制寄存器
DMAC8*/
/*設(shè)置為Handshake和向內(nèi)存寫(xiě)數(shù)方式,并使能DMA*/
/*DMA通道8開(kāi)啟,等待外設(shè)的輸入時(shí)鐘,每接 收到一個(gè)時(shí)鐘,輸入一次*/
對(duì)上面程序需要說(shuō)明的是:雖然電路中沒(méi)有用到外存地址,但外存計(jì)數(shù)寄存器EM7和EC7也必須設(shè)置。
如果要向外設(shè)1中輸入數(shù)據(jù),則需要對(duì)DMA7進(jìn)行類(lèi)似的編程。
3.4 內(nèi)存與Link口間的DMA
ADSP2106x具有很強(qiáng)的并行工作能力,不需加任何外部仲裁電路,6片ADSP2106x和一個(gè)主機(jī)就可以很方便連在一起并行工作。它們之間的數(shù)據(jù)交換既可以通過(guò)共享的外部數(shù)據(jù)、地址總線(xiàn)來(lái)實(shí)現(xiàn),也可采用點(diǎn)對(duì)點(diǎn)的Link口來(lái)完成。6個(gè)Link口是ADSP2106x芯片所獨(dú)有的高速數(shù)據(jù)接口;每個(gè)Link口包含4根數(shù)據(jù)線(xiàn)、一個(gè)時(shí)鐘線(xiàn)和一個(gè)應(yīng)答信號(hào)線(xiàn),最高的數(shù)據(jù)傳輸率為40Mbyte/s。
用Link口進(jìn)行片間數(shù)據(jù)交換,通常情況下都要采用DMA方式,這樣才能將其優(yōu)點(diǎn)充分發(fā)揮。在使用DMA方式進(jìn)行Link口通訊時(shí),除了要進(jìn)行地址-計(jì)數(shù)寄存器的設(shè)置外,還要進(jìn)行傳輸速率選擇寄存器(LCOM)和緩存-口配對(duì)寄存器(LAR)的設(shè)置;最后設(shè)置DMA控制寄存器LCTL,并開(kāi)啟DMA操作。
假設(shè)有兩片ADSP2106x,它們相互間用Link5口相連;我們要把第一片內(nèi)存0x26000~0x263ff中的1024個(gè)數(shù)用Link5口傳輸?shù)降诙膬?nèi)存0x23000~0x23fff處,則兩片ADSP2106x的DMA編程設(shè)置如下:
/*第一片*/
r0=0X3f000;
dm(LCOM)=r0; /*把Link口設(shè)為2x clock*/
r0=0xfff7f;
dm(LAR)=r0; /*link port5--> link buffer2,
對(duì)應(yīng)DMA通道4*/
r0=0X26000;
dm(II4)=r0; /*設(shè)置起始地址*/
r0=1024;
dm(C4)=r0; /*設(shè)置讀數(shù)次數(shù)*/
r0=1;
dm(IM4)=r0; /*設(shè)置地址增加值*/
r0=0Xb00;
dm(LCTL)=r0; /*enable output DMA*/
/*第二片*/
r0=0X3f000;
dm(LCOM)=r0; /*把Link口設(shè)為2x clock*/
r0=0xfff7f;
dm(LAR)=r0; /*link port5-->link buffer 2,對(duì)
應(yīng)DMA通道4*/
r0=0x23000;
dm(II4)=r0; /*設(shè)置起始地址*/
r0=1024;
dm(C4)=r0; /*設(shè)置讀數(shù)次數(shù)*/
r0=1;
dm(IM4)=r0; /*設(shè)置地址增加值*/
r0=0x300;
dm(LCTL)=r0; /*enable input DMA*/
對(duì)于上面的兩段程序,應(yīng)分別加載到兩片ADSP2106x中。需要說(shuō)明的是:Link Buffer 2對(duì)應(yīng)DMA通道4。如果把其他的Link Buffer與Link口5配對(duì),則需設(shè)置與該Buffer對(duì)應(yīng)的DMA通道。
ADSP2106x中DMA操作功能強(qiáng)大,形式多樣,除了本文所介紹的部分外,還有鏈?zhǔn)紻MA、二維DMA等,因此要全部掌握并熟練應(yīng)用是有一定難度的。通過(guò)對(duì)各種DMA的應(yīng)用,可以使數(shù)據(jù)進(jìn)出芯片變得更加流暢,也可以使其核心處理單元的運(yùn)算能力發(fā)揮到極致
相關(guān)推薦
技術(shù)專(zhuān)區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車(chē)電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論