ADSP-21535 Blackfin的Mem DMA高速通信
摘要:針對(duì)ADSP-21535 Blackfin 的Mem DMA 高速通信中的關(guān)鍵技術(shù)進(jìn)行了討論,分析了系統(tǒng)的內(nèi)存管理,對(duì)DMA的相關(guān)寄存器的配置進(jìn)行了詳細(xì)講解,并給出了具體實(shí)例。對(duì)多種內(nèi)存之間的DMA列出了實(shí)際的指標(biāo)評(píng)測(cè),為該系列DSP工程應(yīng)用的高速通信設(shè)計(jì)提供了重要參考。 關(guān)鍵詞: ADSP-21535, Blackfin Mem DMA ADSP-21535 Blackfin 是美國(guó)AD公司和Intel 公司于2001年底聯(lián)合推出的一款定點(diǎn)DSP, RISC指令結(jié)構(gòu),運(yùn)作高效,具有十分優(yōu)異的性能。該DSP具有300MHz的主頻,2個(gè)40bit的MAC(乘加器)和2個(gè)32bit的ALU(算術(shù)邏輯單元),4個(gè)8bit的視頻處理單元,16個(gè)地址尋址單元。該DSP內(nèi)部集成了308KB的RAM,并具有豐富的外部接口,如PCI、USB、SPI、同步和異步串口等。同時(shí),芯片內(nèi)部設(shè)計(jì)了看門狗和多種定時(shí)器,充分滿足軟件工程穩(wěn)定性的設(shè)計(jì)要求。值得一提的是,21535可以動(dòng)態(tài)地控制電壓輸入,調(diào)整運(yùn)行頻率,減少芯片功耗,十分適用于移動(dòng)產(chǎn)品的設(shè)計(jì)。
2002年底,AD公司在中國(guó)開始大規(guī)模推廣Blackfin系列的DSP,21535成為該系列的旗艦產(chǎn)品。由于該DSP推出時(shí)間不長(zhǎng),相關(guān)文獻(xiàn)幾乎沒有報(bào)道;而且,在許多接口性能方面,AD公司也沒有對(duì)其給出準(zhǔn)確的指標(biāo)。根據(jù)通常的設(shè)計(jì)經(jīng)驗(yàn)可知,新產(chǎn)品通常在某些方面沒有達(dá)到設(shè)計(jì)要求。筆者所設(shè)計(jì)的高速通信板數(shù)據(jù)交換速度必須達(dá)20M Word/s以上,因此對(duì)該DSP的高速通信必須進(jìn)行準(zhǔn)確仔細(xì)的評(píng)估和設(shè)計(jì)。 ADSP-21535的內(nèi)存訪問(wèn)支持I/O方式、內(nèi)存映射和多種DMA方式,其中Mem DMA(Memory to memory DMA)方式是最快的一種并行通信方式。因此,筆者在設(shè)計(jì)時(shí)選擇了Mem DMA作為高速通信方式。由于21535支持多種內(nèi)存,因此在設(shè)計(jì)Mem DMA時(shí),必須對(duì)21535的內(nèi)存管理有一個(gè)詳細(xì)的了解。 1 ADSP-21535的內(nèi)存管理 21535的內(nèi)存管理十分強(qiáng)大。它把存儲(chǔ)器視為一個(gè)統(tǒng)一的4GB的地址空間,使用32位地址。所有的資源,包括內(nèi)部存儲(chǔ)器、外部存儲(chǔ)器、PCI地址空間和I/O控制寄存器,都具有獨(dú)立的地址空間。此地址空間的各部分存儲(chǔ)器按照分級(jí)結(jié)構(gòu)排列,以提供較高的性能價(jià)格比。一些快速、低延遲的存儲(chǔ)器(如L1)的位置接近處理器核心,而低成本低性能的存儲(chǔ)器遠(yuǎn)離核心。 芯片內(nèi)部的308KB RAM中,其中L1(一級(jí)緩存)52KB,L2(二級(jí)緩存)256KB;外部地址訪問(wèn)空間可以高達(dá)768MB,通過(guò)EBIU(External Bus Interface Unit,外部總線接口單元)進(jìn)行管理。EBIU支持多種內(nèi)存,如SDRAM、SRAM、ROM、EPROM、FLASH、FIFO等。內(nèi)存地址的具體配置空間如圖1所示。
L1作為DSP的一級(jí)緩存,可以與DSP的內(nèi)核一樣,運(yùn)行在300Mbps的高速上。它分為三部分:16KB的Instruction Ram(指令存儲(chǔ)器)、,兩塊16KB的Data Ram(數(shù)據(jù)存儲(chǔ)器)、4KB的Scratchpad Ram(中間結(jié)果緩存)。指令存儲(chǔ)器既可以作為SRAM,也可以配置為4路聯(lián)合設(shè)置的Cache。數(shù)據(jù)存儲(chǔ)器能夠配置成雙路聯(lián)合設(shè)置的Cache或者SRAM;中間結(jié)果緩存只能作為SRAM使用。指令緩存和數(shù)據(jù)緩存都可以通過(guò)DMA方式灌入數(shù)據(jù),但是對(duì)于中間結(jié)果緩存這種方式不能使用。 L2作為DSP的二級(jí)緩存,是一個(gè)統(tǒng)一的指令和數(shù)據(jù)存儲(chǔ)器,能夠根據(jù)系統(tǒng)設(shè)計(jì)要求同時(shí)存放代碼和數(shù)據(jù)。L2具有DSP核心同樣的帶寬,但是延遲時(shí)間較長(zhǎng),訪問(wèn)L2單個(gè)獨(dú)立的地址時(shí)系統(tǒng)需要經(jīng)過(guò)7個(gè)周期的延時(shí),這時(shí)它的訪問(wèn)速度在42.8Mbps左右。所以如果程序比較大,必須在L2中編寫程序時(shí),通常將L1配置為L(zhǎng)2的Cache,這樣,速度可以大大加快。 21535支持的片外存儲(chǔ)器種類很多,值得一提的是它的SDRAM控制器。21535集成的SDRAM控制器能夠以fSCLK(系統(tǒng)時(shí)鐘,為核心時(shí)鐘的若干分頻)的速度,與多達(dá)4個(gè)Bank的工業(yè)標(biāo)準(zhǔn)SDRAM或者DIMM接口。每個(gè)Bank可以配置為16MB~128MB的存儲(chǔ)器,符合PC133 SDRAM的標(biāo)準(zhǔn)。 存儲(chǔ)器的DMA控制器提供高帶寬的數(shù)據(jù)傳輸能力,它能夠在內(nèi)部L1/L2存儲(chǔ)器和外部存儲(chǔ)器(包括PCI存儲(chǔ)空間)之間執(zhí)行代碼或者數(shù)據(jù)的塊傳輸。
2 DMA寄存器的配置 為了描述Mem DMA序列,DMA控制器使用一套名為描述子塊(Descriptor)的參數(shù)。當(dāng)需要后繼的DMA序列時(shí),這些描述子塊被鏈接起來(lái)。這樣,一個(gè)DMA序列完成時(shí)能夠自動(dòng)初始化下一個(gè)序列,并將其啟動(dòng)。如果不需啟動(dòng)下一個(gè)序列,只要將其指向一個(gè)內(nèi)容為0的地址空間即可。如果下一次鏈接指向原描述子塊,則DMA完成后暫停。為訪問(wèn)整個(gè)ADSP-21535的地址空間,源地址和目的地址描述子塊采用了全32位地址的基指針。兩個(gè)描述子塊均為5個(gè)字的連續(xù)空間,需要注意的是該連續(xù)空間必須定義在L2范圍內(nèi)。描述子塊內(nèi)包含的內(nèi)容如圖2所示。 Mem DMA規(guī)定,描述子塊所在的首地址必須傳入相關(guān)的寄存器。描述子塊首地址的高16位裝入DMA_DBP寄存器(DMA Descriptor Base Pointer Register,DMA描述子塊基地址寄存器)內(nèi)。由于該寄存器嚴(yán)格限定必須在0xF000~0xF003,這就限定了源和目的地址描述子塊只能定義在L2存儲(chǔ)器內(nèi),并且高16位地址相同。 描述子塊首地址的低16位放在兩個(gè)寄存器中,源地址描述子塊低16位裝入MDS_DND寄存器(Source Memory DMA Next Descriptor Pointer Register,DMA源地址下一個(gè)描述子塊寄存器),而目的地址描述子塊低16位裝入MDD_DND寄存器(Destination Memory DMA Next Descriptor Pointer Register,DMA目的地址下一個(gè)描述子塊寄存器)。其說(shuō)明如圖3所示。 在描述子塊的地址傳入相應(yīng)寄存器后,后面的四項(xiàng)先配置,然后設(shè)置第一項(xiàng)。也就是對(duì)管理DMA啟動(dòng)參數(shù)的寄存器進(jìn)行參數(shù)配置。兩個(gè)配置寄存器的詳細(xì)內(nèi)容如圖4所示。例如當(dāng)目的地址寄存器為0x8003,源地址寄存器為0x8001時(shí),傳輸?shù)臄?shù)據(jù)總長(zhǎng)=DMA傳輸?shù)拈L(zhǎng)度%26;#215;字。需要注意的是,雖然此時(shí)傳輸以16位(字長(zhǎng))傳輸,但DMA的帶寬是32位,剩下的帶寬資源將被浪費(fèi)。8位傳輸時(shí),帶寬資源利用率更低。 下面,以一個(gè)具體的32位DMA例子說(shuō)明上面的描述子塊和多個(gè)寄存器的使用方法。 圖4 DMA源地址和目的地址配置寄存器 3 32位DMA的例程 R0.H = 0x8009? //DMA源配置字,設(shè)置為32位傳輸 R0.L = 0x800? //DMA長(zhǎng)度 R1.L = 0x2000? //DMA源地址低16位 R1.H = 0xf000? //DMA源地址高16位,這里指向L2 R2.L = RAM_READ? //DMA源描述子塊首地址 低十六位,DMA讀 R2.H = 0x800b? //DMA目的配置字,設(shè)置為32位傳輸 R3.L =0x0000? //DMA目的地址低16位 R3.H =0xff90? //DMA目的地址高16位,這里指向 L1數(shù)據(jù)存儲(chǔ)器-Bank B R4.L = RAM_WRITE? //DMA目的描述子塊首地址低 十六位,DMA寫 P0.L = RAM_READ? //將32位的源描述子塊的地址 載入P0 P0.H = RAM_READ? P1.L = RAM_WRITE? //將32位的目的描述子塊的地 址載入P1 P1.H = RAM_WRITE? W?P0+0x2? = R0? //將DMA長(zhǎng)度寫入源描述塊第 二個(gè)字中 ?P0+0x4? = R1? //將DMA的32位源起始地址 寫入源描述塊第三第四個(gè)字中 W?P0+0x8? = R2.L? //將下一個(gè)源描述子塊的地址 寫入源描述塊第五個(gè)字中 W?P1+0x2? = R0? //將DMA長(zhǎng)度寫入目的描述塊 第二個(gè)字中 ?P1+0x4? = R3? //將DMA的32位目的起始地址 寫入目的描述塊第三第四個(gè)字中 W?P1+0x8? = R4? //將下一個(gè)目的描述子塊的地 址寫入目的描述塊第五個(gè)字中 W?P0? = R0.H? //將DMA源配置字寫入源描述 塊第一個(gè)字中 W?P1? = R2.H? //將DMA目的配置字寫入目的 描述塊第一個(gè)字中 R6 = P0? //將P0的值同時(shí)存在R6內(nèi) P2.L = 0x390A? //將DMA源描述子塊配置寄存 器的地址傳給P2 P2.H = 0xFFC0? W?P2? = R6.L? //將DMA源描述子塊所在地址 的低16位傳給P2指向的地方 P3.L = 0x4880? //將描述子塊基地址寄存器的 地址傳給P3 P3.H = 0xFFC0? W?P3? = R6.H? //將DMA源描述子塊所在地址 的高16位傳給基地址寄存器 P4.L = 0x380A? P4.H = 0xFFC0? //將DMA目的描述子塊配置寄 存器的地址傳給P4 R6 = P1? //將P1的值轉(zhuǎn)存到R6 W?P4? = R6.L? //將目的描述子塊所在地址的 低16位傳給配置目的地址寄存器 P5.L = 0x3902 P5.H = 0xFFC0? //將DMA源地址配置寄存器所 在地址傳給P5 R6 = W?P5?? BITSET?R6?0? //設(shè)置R6的最低位為1,表示 準(zhǔn)備啟動(dòng)讀DMA I0.L = 0x3802? I0.H = 0xFFC0? //將DMA目的地址配置寄存器 的地址傳給I0 R7.L = W?I0?? BITSET?R7?0? //設(shè)置R7的最低位為1,表示 準(zhǔn)備啟動(dòng)寫DMA W?P5? = R6? //將R6和R7的低16位寫入 兩個(gè)配置寄存器中,真正啟動(dòng)DMA W?I0? = R7.L? DMA_WAIT? //等待DMA結(jié)束 R6 = W?P1?? //根據(jù)寫描述子塊第一個(gè)字的 最高位判斷描述子塊的所有權(quán) cc = bittst?R6?15? IF cc JUMP DMA_WAIT? //如果為1,表示還在DMA 狀態(tài),繼續(xù)判斷,等待 RTS? .align 4? //在L2空間范圍內(nèi)定義兩個(gè) 描述子塊,要求4個(gè)字節(jié)對(duì)齊 .BYTE2 RAM_READ?5?? .align 4? .BYTE2 RAM_WRITE?5?? 值得注意的是,在上述DMA例程中,筆者使用了查詢等待方式,但中間完全可以插入其他指令,例如DSP還可以同時(shí)作雙乘加和兩次32位取數(shù)。只要不訪問(wèn)正在DMA讀寫的地址區(qū)域,沒有任何影響。這意味著,在系統(tǒng)DMA的同時(shí),DSP可以同時(shí)進(jìn)行其他操作,這一點(diǎn)對(duì)于提高DSP的效率至關(guān)重要。 4 各種內(nèi)存空間的DMA訪問(wèn)指標(biāo)測(cè)試及分析 根據(jù)以上配置,筆者對(duì)ADSP-21535的DMA性能進(jìn)行了比較詳盡的測(cè)試。測(cè)試數(shù)據(jù)如表1所示。 表1 21535的DMA實(shí)測(cè)數(shù)據(jù) 源地址目的地址 DMA長(zhǎng)度(雙字)周期數(shù)(個(gè))速度(雙字/秒) L2 L1 4096 43615 28.2M L2 SDRAM 8192 54878 44.8M L2 L2 8192 66737 36.8M L1 L1 4096 64164 19.1M L1 SDRAM 4096 39891 30.8M L1 L2 4096 52661 23.3M SDRAM L1 4096 28625 42.9M SDRAM SDRAM 4096 65668 18.7M SDRAM L2 8192 52314 46.9M 注:測(cè)試環(huán)境-DSP核心時(shí)鐘300MHz,系統(tǒng)時(shí)鐘120MHz,SDRAM為PC133標(biāo)準(zhǔn)。樣本采樣:各15次 從表1中的實(shí)測(cè)數(shù)據(jù)可以看出,DMA的速度均在18.7M雙字/秒以上,最高速度達(dá)46.9M雙字/秒,可以滿足工程中高速采集的需要。從表中數(shù)據(jù)可以得出以下結(jié)論: (1)DMA雙向速度不對(duì)稱,將源地址和目的地址交換后,速度會(huì)發(fā)生變化; (2)低速向高速區(qū)域傳輸時(shí),要比反向傳輸快; (3)同類區(qū)域DMA一般比區(qū)域之間DMA要慢。如L1 DMA到L1,比L1 DMA到L2和SDRAM都要慢一些。其它區(qū)域也有類似現(xiàn)象。 (4)高速區(qū)域DMA速度并不一定快,如L1區(qū)域DMA速度總體表現(xiàn)反而最低。