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