DSP原理及應(yīng)用:第三章 匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
DSP原理及應(yīng)用:第三章 匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
DSP原理及應(yīng)用:第三章 匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
DSP原理及應(yīng)用:第三章 匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
DSP原理及應(yīng)用:第三章 匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩174頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、三、TMS320C54X DSP 匯編語(yǔ)言程序設(shè)計(jì)C54x尋址方式及特殊尋址方式說(shuō)明C54x指令集軟件開(kāi)發(fā)過(guò)程匯編語(yǔ)言程序設(shè)計(jì)1、立即數(shù)尋址: 指令中嵌有一個(gè)固定的數(shù)2、絕對(duì)地址尋址: 指令中有一個(gè)固定的地址3、累加器尋址: 以累加器中的數(shù)據(jù)為地址去訪問(wèn)程序存儲(chǔ)器中的一個(gè)單元4、直接尋址: 指令中的7bits是一個(gè)數(shù)據(jù)頁(yè)內(nèi)的偏移地址,而所在的數(shù)據(jù)頁(yè)由數(shù)據(jù)頁(yè)指針DP或SP決定。該偏移加上DP和SP的值決定了在數(shù)據(jù)存儲(chǔ)器中的實(shí)際地址。5、間接尋址: 按照輔助寄存器中的地址訪問(wèn)存儲(chǔ)器。6、存儲(chǔ)器映射寄存器尋址: 修改存儲(chǔ)器映射寄存器中的值,而不受當(dāng)前DP或SP值的影響。7、堆棧尋址: 把數(shù)據(jù)壓入和彈

2、出系統(tǒng)堆棧。3.1 TMS320C54x 尋址方式 在立即數(shù)尋址中,指令里包括了立即操作數(shù)。在一條指令中可對(duì)兩種立即數(shù)編碼。一種是短立即數(shù)(3、5、8或9bits),另一種是16bits的長(zhǎng)立即數(shù)。立即數(shù)可包含在單字或雙字指令中。3-,5-,8-或9-bit值在單字指令中,16-bit值在雙字指令中。1 . 立即數(shù)尋址立即數(shù)尋址的其他例子: LD #0,ARP ;ARP=2(#k3) LD #3,ASM ;ASM=3(#k5) LD #50,DP ;DP=50(#k9) LD #1234,A ;A=1234(#k) STM #0FFFFh,IMR ;IMR=FFFFh(#lk)短立即數(shù)RPT長(zhǎng)

3、立即數(shù)RPT2. 直接尋址 在直接尋址中,指令代碼包含了數(shù)據(jù)存儲(chǔ)器地址的低七位。這7-bit dma作為偏移地址與數(shù)據(jù)頁(yè)指針(DP)或堆棧指針(SP)相結(jié)合共同形成16-bit的數(shù)據(jù)存儲(chǔ)器實(shí)際地址。如右圖所示。CPL=0:dma與9-bit的DP相結(jié)合形成數(shù)據(jù)存儲(chǔ)器地址。以DP為基準(zhǔn)的直接尋址DP9-bit9-bit的DP指向數(shù)據(jù)存儲(chǔ)空間的512個(gè)數(shù)據(jù)頁(yè)中的一頁(yè)012510511編程舉例:直接尋址編程:.mmregs.bss x, 4, 1a0.word 012ha1.word 3211ha2.word 0fe11ha3.word 0ff03h.sect “program”RSBX CPL L

4、D #0, ALD #X, DPLD a0, TMAC x,ALD a1,TMAC x+1,ALD a2,TMAC x+2,A.以SP為基準(zhǔn)的直接尋址CPL=1:dma加上SP基地址形成數(shù)據(jù)存儲(chǔ)器地址。(st1中) 以SP為基址的直接尋址: SSBX CPL; STM #STACK+10H,SP; AND 1, A LD 2, A ADD 5, B 3. 間接尋址 在間接尋址中,64K數(shù)據(jù)空間任意單元都可通過(guò)一個(gè)輔助寄存器中的16-bit地址進(jìn)行訪問(wèn)。C54x有8個(gè)16-bit輔助寄存器(AR0-AR7)。兩個(gè)輔助寄存器算術(shù)單元(ARAU0和ARAU1),根據(jù)輔助寄存器的內(nèi)容進(jìn)行操作,完成無(wú)符

5、號(hào)的16-bit算術(shù)運(yùn)算。間接尋址很靈活,不僅能從存儲(chǔ)器中讀或?qū)懸粋€(gè)單16-bit數(shù)據(jù)操作數(shù),而且能在一條指令中訪問(wèn)兩個(gè)數(shù)據(jù)存儲(chǔ)器單元(即從兩個(gè)獨(dú)立的存儲(chǔ)器單元讀數(shù)據(jù),或讀一個(gè)存儲(chǔ)器單元同時(shí)寫(xiě)另一個(gè)存儲(chǔ)器單元,或讀寫(xiě)兩個(gè)連續(xù)的存儲(chǔ)器單元)。單操作數(shù)尋址單操作數(shù)間接尋址方框圖 單操作數(shù)間接尋址類型:*ARx: ARx包含了數(shù)據(jù)存儲(chǔ)器地址*ARx(lk): ARx和16-bit的長(zhǎng)偏移(lk) 的和用來(lái) 作為數(shù)據(jù)存儲(chǔ)器地址。ARx本身不 被修改*ARx-/ *ARx+ : 訪問(wèn)后, ARx中地址減1/加1*ARx-0/ *ARx+0 : 訪問(wèn)后,從ARx中減去/加上AR0*ARx-0B/ *ARx

6、+0B :訪問(wèn)后,從ARx中以位倒序進(jìn)位的 方式減去/加上AR0*ARx-%/ *ARx+% : 訪問(wèn)后,ARx中的地址以循環(huán)尋址 的方式減1/加1*ARx-0%/ *ARx+0% :訪問(wèn)后,從ARx中以循環(huán)尋址的方 式減去/加上AR0*+ARx: 尋址前,ARx中地址加1(僅寫(xiě)操作)*+ARx(lk): 在尋址之前,把一個(gè)帶符號(hào)的16-bit的長(zhǎng)偏移 (lk)加到ARx中,然后用新的ARx的值作為 數(shù)據(jù)存儲(chǔ)器的地址*+ARx(lk)%:在尋址之前,把一個(gè)帶符號(hào)的16-bit的長(zhǎng)偏移 以循環(huán)尋址的方式加到ARx中,然后再用新 的ARx的值作為數(shù)據(jù)存儲(chǔ)器的地址編程舉例:間接尋址編程:.mmreg

7、s.bss x, 4, 1a.word 1, 2, 3, 4.sect “program”STM #a, AR1STM #x, AR2LD #0, ALD *AR1+,TMAC *AR2+,ALD *AR1+,TMAC *AR2+,ALD *AR1+,TMAC *AR2+,ALD *AR1,TMAC *AR2,A.雙操作數(shù)尋址方式雙數(shù)據(jù)存儲(chǔ)器操作數(shù)間接尋址類型*ARx: ARx是數(shù)據(jù)存儲(chǔ)器地址*ARx-/ *ARx+: 訪問(wèn)后,ARx中的地址減1/加1*ARx+0%: 訪問(wèn)后,AR0以循環(huán)尋址的方式加 到ARx中。例如:MPY *AR2,*AR3,AFIRS *AR2,*AR3,coef雙數(shù)據(jù)

8、存儲(chǔ)器操作數(shù)間接尋址方框圖4. 絕對(duì)地址尋址有部分指令可以使用16bits的絕對(duì)地址尋址: 數(shù)據(jù)存儲(chǔ)器地址(dmad)尋址: MVDK Smem, dmad MVDM dmad, MMR MVKD dmad, Smem MVMD pmad, Smem程序存儲(chǔ)器地址(pmad)尋址: FIRS Xmem, Ymem, pmad MACD Smem, pmad, src MACP Smem, pmad, src MVPD pmad, Smem端口地址(PA)尋址 PORTR PA, Smem PORTW Smem, PA*(lk)尋址適用于支持單數(shù)據(jù)存儲(chǔ)器操作數(shù)的指令 5. 累加器尋址 累加器尋址

9、是用累加器中的數(shù)作為一個(gè)地址。這種尋址方式可用來(lái)對(duì)存放數(shù)據(jù)的程序存儲(chǔ)器尋址。共有兩條指令可以采用累加器尋址:READA Smem (無(wú)READB)WRITA Smem ( 無(wú)WRITB ) READA是把累加器A所確定的程序存儲(chǔ)器單元中的一個(gè)字,傳送到單數(shù)據(jù)存儲(chǔ)器(Smem)單元中。WRITA是把Smem操作數(shù)所確定的數(shù)據(jù)單元中的一個(gè)字,傳送到累加器A確定的程序存儲(chǔ)器單元中去。只有8條指令能使用存儲(chǔ)器映射寄存器尋址:LDM MMR, dstMVDM dmad, MMR MVMD MMR, dmad MVMM MMRx, MMRy POPM MMRPSHM MMRSTLM src, MMRSTM

10、 #lk, MMR6. 存儲(chǔ)器映射寄存器尋址 存儲(chǔ)器映射寄存器尋址用來(lái)修改存儲(chǔ)器映射寄存器而不影響當(dāng)前數(shù)據(jù)頁(yè)指針(DP)或堆棧指針(SP)的值。存儲(chǔ)器映射寄存器尋址既可以在直接尋址中使用,又可以在間接尋址中使用。 7. 堆棧尋址 系統(tǒng)堆棧用來(lái)在中斷和子程序期間自動(dòng)存放程序計(jì)數(shù)器。它也能用來(lái)存放額外的數(shù)據(jù)項(xiàng)或傳遞數(shù)據(jù)值。處理器使用一個(gè)16-bit的存儲(chǔ)器映射寄存器堆棧指針來(lái)對(duì)堆棧尋址,它總是指向存放在堆棧中的最后一個(gè)元素。 共有四條使用堆棧尋址方式訪問(wèn)堆棧的指令:PSHD 把一個(gè)數(shù)據(jù)存儲(chǔ)器的值壓入堆棧。PSHM 把一個(gè)存儲(chǔ)器映射寄存器的值壓入堆棧。POPD 把一個(gè)數(shù)據(jù)存儲(chǔ)器的值彈出堆棧。POPM

11、 把一個(gè)存儲(chǔ)器映射寄存器的值彈出堆棧。 特殊尋址方式說(shuō)明 位倒序?qū)ぶ贰⒀h(huán)尋址 位倒序?qū)ぶ烽g接尋址:*ARn+0B/-0B,表示位倒序?qū)ぶ贰Rn指向存放數(shù)據(jù)的存儲(chǔ)單元。 AR0存放的整數(shù)N是FFT點(diǎn)數(shù)的一半。位倒序?qū)ぶ罚喊袮R0加到ARn中時(shí),地址以位倒序的方式產(chǎn)生,即進(jìn)位是從左向右,即高位向低位進(jìn)位。位倒序?qū)ぶ诽岣吡藞?zhí)行速度和在FFT算法的程序中使用存儲(chǔ)器的效率。8點(diǎn)的FFT蝶型結(jié)運(yùn)算00000100001001100001010100110111倒序00000001001000110100010101100111整序8081828384858687存儲(chǔ)器FFT中混序就是位倒序FFT運(yùn)算時(shí)

12、輸出/輸入序列中必有其一要混序。位倒序?qū)ぶ返膱?zhí)行 設(shè)FFT長(zhǎng)度N=16,則AR0賦值為8,位倒序方式讀入數(shù)據(jù)情況如下:循環(huán)尋址: 許多算法,如卷積,相關(guān)和FIR濾波等,都需要在存儲(chǔ)器中實(shí)現(xiàn)一個(gè)循環(huán)緩沖器。在這些算法中,一個(gè)循環(huán)緩沖器就是一個(gè)包含了最近的數(shù)據(jù)的滑動(dòng)窗口。當(dāng)新的數(shù)據(jù)來(lái)到時(shí),緩沖器就會(huì)覆蓋最早的數(shù)據(jù)。循環(huán)緩沖器實(shí)現(xiàn)的關(guān)鍵是循環(huán)尋址的實(shí)現(xiàn)。C54x間接尋址中提供了循環(huán)尋址的方式,以%表示。循環(huán)尋址圖示000001010011100101110111循環(huán)尋址的有效基地址計(jì)算 定義循環(huán)緩沖器大小寄存器(BK)來(lái)確定了循環(huán)緩沖器的大小。大小為R的循環(huán)緩沖器必須從一個(gè)N-bit邊界開(kāi)始。循環(huán)緩

13、沖器的有效基地址(EFB)就是用戶選定的輔助寄存器(ARx)的低N位置 0后所得到的值。 滿足條件: 循環(huán)緩沖器的尾地址(EOB)是通過(guò)用BK的低N位代替ARx的低N位得到。循環(huán)緩沖器的INDEX就是ARx的低N位,step就是加到輔助寄存器,或從輔助寄存器中減去的值。循環(huán)尋址的算法如下:if 0 index+step BK: index = index + stepelse if index + step BK: index = index + step - BKelse if index + step 二進(jìn)制 100000 N=6R(BK)=31 二進(jìn)制 011111 N=5應(yīng)用舉例: 計(jì)

14、算16階的FIR濾波器輸出256個(gè)點(diǎn).sect “fir-prog”STM #255, BRC ; Repeat 256 timesRPTBD fir_filter_loop-1STM #16, BK ; FIR circular buffer sizeLD *AR7+, A ; load the input valueSTL A, *AR4+% ; replace oldest sample with; newest sampleRPTZ A, #16MAC *AR4+0%, *AR3+0%, A ; filteringSTH A, *AR5+ ; replace the oldest bu

15、ffer valuefir_filter_loop TMS320C54x的指令集有近兩百條指令,按功能分為如下幾類: 算術(shù)運(yùn)算指令邏輯運(yùn)算指令程序控制指令裝入和存儲(chǔ)指令 3.2 TMS320C54x的指令集 一、算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令可分為如下幾類: 加法指令 減法指令 乘法指令 乘加指令 乘減指令 雙數(shù)/雙精度指令 特殊操作指令1、加法指令定點(diǎn)DSP中數(shù)據(jù)表示方法當(dāng)它表示一個(gè)整數(shù)時(shí),其最低位(D0)表示1,D1位表示2的1次方,次高位(D14)表示2的14方。如果表示一個(gè)有符號(hào)數(shù)時(shí),最高位(D15)為符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)。例如,07FFFH表示最大的正數(shù)32767(十進(jìn)制),而0

16、FFFFH表示最大的負(fù)數(shù)-1(負(fù)數(shù)用2的補(bǔ)碼方式顯示)。當(dāng)需要表示小數(shù)時(shí),小數(shù)點(diǎn)的位置始終在最高位后,而最高位(D15)表示符號(hào)位。這樣次高位(D14)表示0.5,然后是0.25,最低位(D0)表示。所以04000H表示小數(shù)0.5,01000H表示小數(shù)0.25,而0001H表示16位定點(diǎn)DSP表示的最小的小數(shù)(有符號(hào))0.000030517578125。實(shí)現(xiàn)16位定點(diǎn)加法C54X中提供了多條用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于無(wú)符號(hào)數(shù)的加法運(yùn)算,ADDC用于帶進(jìn)位的加法運(yùn)算(如32位擴(kuò)展精度加法),而ADDM專用于立即數(shù)的加法。使用ADD完成加法 ld te

17、mp1,a;將變量temp1裝入寄存器A add temp2,a;將變量temp2與寄存器A相加 ;結(jié)果放入A中 stla,temp3;將結(jié)果(低16位)存入變量 ;temp3中。 注意,這里完成計(jì)算temp3=temp1+temp2,我們沒(méi)有特意考慮temp1和temp2是整數(shù)還是小數(shù),在加法和下面的減法中整數(shù)運(yùn)算和定點(diǎn)的小數(shù)運(yùn)算都是一樣的。利用ADDS實(shí)現(xiàn)32位數(shù)據(jù)裝入 ld #0,dp ; 設(shè)置數(shù)據(jù)頁(yè)指針 ld 60h,16,a; 將60H的內(nèi)容裝如A的高16位 adds 61h,a; 將61H的內(nèi)容加到A的低16位 dld 60h,b; 直接裝入32位到B寄存器ADD中尋址方式ADD

18、Smem ,SHIFT,src ,dst 例如: ADD *AR0,1,A,A ADD 60H,-1,A,A ADD *AR5,1,A,B ADD Xmem, SHFT, src 例如: ADD *AR5,1,AADD Xmem,Ymem, dst 例如: ADD *AR2,*AR3,A2、減法指令實(shí)現(xiàn)16位定點(diǎn)減法C54X中提供了多條用于減法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于無(wú)符號(hào)數(shù)的減法運(yùn)算,SUBB用于帶進(jìn)位的減法運(yùn)算(如32位擴(kuò)展精度的減法),而SUBC為移位減,DSP中的除法就是用該指令來(lái)實(shí)現(xiàn)的。SUB指令與ADD指令一樣,有許多的尋址方式,其詳細(xì)使用說(shuō)

19、明請(qǐng)參考TMS320C54X使用教程減法指令使用舉例 stm#60h,ar3;將變量temp2的地址裝入ar3寄存器 stm#61h,ar2;將變量temp3的地址裝入ar2寄存器 sub*ar2+, *ar3,b;temp3 、temp2左移16位,然后相減, ;結(jié)果放入寄存器BH,同時(shí)ar2加1。 sthb,63h;將相減的結(jié)果(高16位)存入變量63h 利用SUBC實(shí)現(xiàn)除法在C54X中沒(méi)有提供專門的除法指令,一般有兩種方法來(lái)完成除法。一種是用乘法來(lái)代替,除以某個(gè)數(shù)相當(dāng)于乘以其倒數(shù),所以先求出其倒數(shù),然后相乘。這種方法對(duì)于除以常數(shù)特別適用。另一種方法是使用SUBC指令,重復(fù)16次減法完成除

20、法運(yùn)算。利用SUBC完成整數(shù)除法Temp1/Temp2ldtemp1,b;將被除數(shù)temp1裝入B寄存 ;器的低16位rpt#15 ;重復(fù)SUBC指令16次subctemp2,b;使用SUBC指令完成除法stlB,temp3;將商(B寄存器的低16位) ;存入變量temp3sthB,temp4;將余數(shù)(B寄存器的高16位) ;存入變量temp4 注: 實(shí)際上是完成整數(shù)除法實(shí)現(xiàn)小數(shù)除法在C54X中實(shí)現(xiàn)16位的小數(shù)除法與前面的整數(shù)除法基本一致,也是使用SUBC指令來(lái)完成。需要注意:第一,小數(shù)除法的結(jié)果一定是小數(shù)(小于1),所以被除數(shù)一定小于除數(shù)。在執(zhí)行SUBC指令前,應(yīng)將被除數(shù)裝入A或B寄存器的高

21、16位,而不是低16位。其結(jié)果的格式與整數(shù)除法一樣。第二,應(yīng)考慮符號(hào)位對(duì)結(jié)果小數(shù)點(diǎn)的影響。所以應(yīng)對(duì)商右移一位,得到正確的有符號(hào)數(shù)。3、乘法指令實(shí)現(xiàn)16定點(diǎn)整數(shù)乘法 在C54X中提供了大量的乘法運(yùn)算指令,其結(jié)果都是32位,放在A或B寄存器中。乘數(shù)在C54X的乘法指令很靈活,可以是T寄存器、立即數(shù)、存貯單元和A或B寄存器的高16位。如果是無(wú)符號(hào)數(shù)乘時(shí),請(qǐng)使用MPYU指令。這是一條專用于無(wú)符號(hào)數(shù)乘法運(yùn)算的指令,而其它指令都是有符號(hào)數(shù)的乘法。整數(shù)乘法舉例rsbxFRCT;清FRCT標(biāo)志,準(zhǔn)備整數(shù)乘ldtemp1,T;將變量temp1裝入T寄存器mpytemp2,a;完成temp2*temp1,結(jié)果放

22、;入A寄存器(32位)實(shí)現(xiàn)小數(shù)乘法在C54X中,小數(shù)的乘法與整數(shù)乘法基本一致,只是由于兩個(gè)有符號(hào)的小數(shù)相乘,其結(jié)果的小數(shù)點(diǎn)的位置在次高的后面,所以必須左移一位,才能得到正確的結(jié)果。C54X中提供了一個(gè)狀態(tài)位FRCT,將其設(shè)置為1時(shí),系統(tǒng)自動(dòng)將乘積結(jié)果左移移位。兩個(gè)小數(shù)(16位)相乘后結(jié)果為32位,如果精度允許的話,可以只存高16位,將低16位丟棄,這樣仍可得到16位的結(jié)果。小數(shù)乘法舉例 ssbx FRCT ;FRCT=1,準(zhǔn)備小數(shù)乘法 ld temp1,16,a ;將變量temp1裝入寄存器A的高16位 mpya temp2 ;完成temp2乘寄存器A的高16位,結(jié) ;果在B中,同時(shí)將temp

23、2裝入T寄存器 sth b,temp3 ;將乘積結(jié)果的高16位存入變量temp3如:0.1(0 x0ccd) x 0.7(0 x599a) = 0.06997680664063(0 x08f5)注:可以使用MPYR完成四舍五入。 比較如下結(jié)果 mpyr temp1,b ; T * temp1 - b4、乘加和乘減指令5雙精度/雙數(shù)操作指令6、特殊指令二、邏輯運(yùn)算指令邏輯指令包括與、或、異或、移位和測(cè)試指令1、與指令(AND)2、或、異或指令3、移位和測(cè)試指令三、程序控制指令程序控制指令包括:分支指令調(diào)用指令中斷指令返回指令重復(fù)指令堆棧操作指令混合程序控制指令1、分支指令2、調(diào)用與中斷指令3、返

24、回指令4、重復(fù)指令和堆棧操作指令5、混合程序控制指令四、裝入和存儲(chǔ)指令裝入和存儲(chǔ)指令包括:一般的裝入和存儲(chǔ)指令條件存儲(chǔ)指令并行裝入和存儲(chǔ)指令并行裝入和乘法指令并行存儲(chǔ)和加/乘指令混合裝入和存儲(chǔ)指令1、一般的裝入指令2、存儲(chǔ)指令3 并行裝入和存儲(chǔ)指令4、條件存儲(chǔ)指令5、并行存儲(chǔ)和加、減、乘法指令6、并行裝入和乘法指令7、混合裝入和存儲(chǔ)指令注意:同一條指令在不同存儲(chǔ)器中可能有不同執(zhí)行時(shí)間操作數(shù)在雙尋址空間、單尋址空間和外部程序代碼在雙尋址、單尋址和外部空間操作數(shù)和代碼在相同存儲(chǔ)器塊中數(shù)據(jù)空間插入了等待周期程序空間插入了等待周期FIRS指令使用方法:FIRS *AR2+, *AR3+, COEF 特

25、殊指令使用說(shuō)明FIRS指令 FIRS指令用于線性相位濾波器的處理。一個(gè)如下圖的8階線性相位濾波器的輸出表達(dá)式:FIR濾波的兩指令MAC、FIRSRPTZ A,#(N-1) ;重復(fù)MAC指令N次,先將A清零MAC *FIR_DATA_P+0%,*FIR_COFF_P+0%,A ; 完成濾波計(jì)算。注意FIR濾波 ;系數(shù)存放在數(shù)據(jù)存儲(chǔ)區(qū) RPTZ B, #(N/2-1) ; 重復(fù)FIRS指令N/2次,先將B清零 FIRS *ar2+0%, *ar3+0%,filter_coff+N/2 ;完成濾波計(jì)算。注意FIR濾波系數(shù) ;存放在程序存貯filter_coff為 ;系數(shù)起始地址Viterbi譯碼指令

26、DADST、DSADT、CMPS在信道均衡和解碼中經(jīng)常會(huì)使用到Viterbi算法,C54x為此提供了專門的硬件和指令。根據(jù)輸入信號(hào)確定分支似然概率增加量D1/D2,放在T寄存器中,TRN存儲(chǔ)可能信號(hào)譯碼輸出。相關(guān)指令應(yīng)用最小均方運(yùn)算LMS 在進(jìn)行自適應(yīng)濾波等操作中經(jīng)常會(huì)使用LMS算法,C54x提供的LMS指令方便了編程。如下圖所示的自適應(yīng)濾波器設(shè)計(jì)中,濾波器系數(shù)修正公式為:其中,e(i) = d(i) - y(i)。濾波器輸出:基于LMS的自適應(yīng)濾波編程數(shù)據(jù)歸一化相關(guān)指令EXP、NORM 歸一化一個(gè)數(shù)是先求其指數(shù),然后把它調(diào)整到最大精度格式。實(shí)現(xiàn)方法如下:數(shù)據(jù)塊移動(dòng)MVDD、MVDP、MVPD

27、 在C54x系列DSP,數(shù)據(jù)與數(shù)據(jù)存儲(chǔ)器、數(shù)據(jù)與程序存儲(chǔ)器之間可以方便的進(jìn)行數(shù)據(jù)傳輸,結(jié)合單指令循環(huán)可實(shí)現(xiàn)數(shù)據(jù)塊移動(dòng)。如16個(gè)系數(shù)的移動(dòng):指令效率的提高 C54x中有一些指令功能差不多,但編寫(xiě)出的程序效率不同,應(yīng)靈活使用,如:MPYR Smem, dst;T*(Smen)dstMACR Smem, dst;(Smen)*T+src( MPYR +ADD); srcMACD Smen,pmen,src;pmend PAR (MAC+DELY+LD);(Smem)*(pmed); +(src) src;(Smem)T;(Smem) Smem+13.3 C54x DSP程序開(kāi)發(fā)過(guò)程3.4 C54x

28、DSP匯編語(yǔ)言程序設(shè)計(jì)3.4.1 程序的控制與轉(zhuǎn)移C54X具有豐富的程序控制與轉(zhuǎn)移指令,利用這些指令可以執(zhí)行分支轉(zhuǎn)移、循環(huán)控制以及子程序操作。分支轉(zhuǎn)移指令子程序調(diào)用子程序返回B nextBACC srcBC next,condCALL subCALL srcCC sub,condRETRC cond(1)條件算符條件算符分成兩組;每組又分為兩類或三類:選用條件算符時(shí)應(yīng)注意以下幾點(diǎn):第一組:組內(nèi)兩類條件可以與/或,但不能在組內(nèi)同一類中選擇兩個(gè)條件算符與/或。當(dāng)選擇兩個(gè)條件時(shí),累加器必須是同一個(gè)。例如:可以同時(shí)選擇AGT和AOV,但不能AGT和BOV。第二組:可以組內(nèi)3類算符中個(gè)選一個(gè)條件算符與/

29、或,但不能在組內(nèi)同一類中選擇2個(gè)條件算符與/或。如:可以TC、C、BIO,不可NTC、TC組與組之間的條件只能“或”。如:條件返回:RC TC;若TC=1,則返回。條件調(diào)用:CC sub ,BNEQ;B=1調(diào)。條件“與”:BC new,AGT,AOV;A0且溢出轉(zhuǎn)若要“或”,則:BC new,AGTBC new,AOV計(jì)算五項(xiàng)累加.bssx,5.bssy,1STM#x,AR1STM#4,AR2;AR2循環(huán)計(jì)數(shù)器LD#0,ALoop:ADD*AR1+,ABANZ loop,*AR2-STLA,y(2)循環(huán)操作BANZ;當(dāng)輔助寄存器不為0時(shí)轉(zhuǎn)移;如:(3)比較操作CMPR經(jīng)常用到數(shù)據(jù)之間的比較,利

30、用CMPR:3.4.2 堆棧的使用C54X提供了一個(gè)用16位堆棧指針SP尋址的軟件堆棧。當(dāng)向堆棧中壓入數(shù)據(jù)時(shí),堆棧從高地址向低地址增長(zhǎng)。堆棧指針是減在前,加在后,即先SP-1,再壓入數(shù)據(jù),先彈出數(shù)據(jù),后SP+1。1、若程序中要用到堆棧,必須先進(jìn)行設(shè)置:size .set 100stack .usect “STACK”,sizeSTM #stack+size , SP2、設(shè)置堆棧后,就可以使用堆棧了:CALL pmad ;(sp)-1-sp, (pc)+2-TOS ;pmad-pcRET;(TOS)-PC, (SP)+1-SP3.4.3 加、減法與乘法運(yùn)算計(jì)算: z=x+y-w.title“ex

31、ample.asm”.mmregsSTACK:.usect “STACK”, 10H.bss x , 1;add =0060H.bssy, 1.bssw, 1.bssz , 1.def _c_int00.dataTable:.word10 , 26 , 23.text_c_int00:STM #0,SWWSRSTM #STACK+10H,SPSTM#X,AR1RPT#2MVPDtable,*AR1+CALLSUMend:BendSUM: LDX,AADDY,ASUB W,ASTLA,ZRET.end例:在4項(xiàng)乘積aixi中找出最大值。.title“example.asm”.mmregsSTAC

32、K:.usect “STACK”, 10H.bss a , 4;add =0060H.bssx, 4.bssy, 1.def _c_int00.dataTable:.word1 , 5 , 3, 4.word 8 , 6 , 7, 2.text_c_int00 :STM #0,SWWSRSTM #STACK+10H,SPSTM#a,AR1RPT#7MVPDtable,*AR1+CALLMAXend:BendMAX:STM#a, AR1STM#x, AR2STM#2, AR3LD*AR1+, TMPY*AR2+ , ALoop:LD*AR1+ , TMPY*AR2+, BMAX A;A=max(

33、A,B)BANZloop, *AR3-RET.end舍入直接尋址重復(fù)操作指令:PRT(重復(fù)下條指令);RPTZ(累加器清零并重復(fù)下條指令);RPTB(塊重復(fù)指令)。(1) 重復(fù)執(zhí)行單條指令由于只需取指一次,比循環(huán)效率高。特別是對(duì)那些乘法累加和數(shù)據(jù)傳送的多周期指令(如:MAC、MVDK、MVDP、MVPD等指令),在執(zhí)行一次后就變成了單周期指令,大大提高了運(yùn)行速度。3.4.3 重復(fù)操作重復(fù)計(jì)數(shù)器例:對(duì)一個(gè)數(shù)組進(jìn)行初始化:X5=0,0,0,0,0.bssx,5STM#x,AR1LD#0,ARPT#4STLA,*AR1+或: .bssx,5STM#X,AR1RPTZA,#4STLA,*AR1+注意:

34、在執(zhí)行重復(fù)操作期間,CPU是不響應(yīng)中斷的(RS除外); 當(dāng)響應(yīng)HOLD信號(hào)時(shí),若HM=0,CPU繼續(xù)執(zhí)行重復(fù)操作;若HM=1,則暫停重復(fù)操作。(2) 塊程序重復(fù)操作 RPTB指令的特點(diǎn):其本身是一條2字4周期指令; 重復(fù)次數(shù):用STM指令將所規(guī)定的重復(fù)次數(shù)加載到塊重復(fù)計(jì)數(shù)器(BRC)中。 循環(huán)塊開(kāi)始地址(RSA):是RPTB指令的下一行; 循環(huán)塊結(jié)束地址(REA):由RPTB指令的操作數(shù)規(guī)定。 例、對(duì)數(shù)組x5中的每個(gè)元素加1。.bssx,5Start:LD#1,16,BSTM#4,BRC;重復(fù)計(jì)數(shù)器 STM #x,AR4RPTBnext-1ADD*AR4,16,B,ASTHA,*AR4+nex

35、t:LD#0,B.注意:1、循環(huán)的結(jié)束地址;2、RPTB指令是可以響應(yīng)中斷的,與RPT,RPTZ不同。ST1中的塊循環(huán)有效標(biāo)志(3) 循環(huán)的嵌套 執(zhí)行RPT指令時(shí)用到RPTC寄存器(重復(fù)計(jì)數(shù)器);執(zhí)行RPTB指令時(shí)用到BRC,RSA和REA寄存器。由于兩者使用了不同的寄存器,因此二者可以嵌套。當(dāng)然,只要保存好有關(guān)寄存器,RPTB和RPTB也可嵌套,但效率不高。Lst:STM#L-1, AR7;2T外部;開(kāi)銷為4L+2TSTM#M-1, BRC;2TRPTBabc-1;4T中間;開(kāi)銷為6T中間RPT#N-1;1T開(kāi)銷為1T內(nèi)部中間中間Abc:外部外部BANZ lst , *AR7-; 4T3.4

36、.5 數(shù)據(jù)塊傳送數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器:MVDKsmem, dmadMVKDdmad, smemMVDDxmem, ymem程序存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器:MVPDpmad, smemMVDPsmem, pmad數(shù)據(jù)存儲(chǔ)器MMR:MVDMdmad, MMRMVMDMMR, dmadMVMMmmr, mmr程序存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器:READAsmemWRITAsmem這些指令的特點(diǎn):傳送速度比加載和存儲(chǔ)指令要快;傳送數(shù)據(jù)不需要通過(guò)累加器;可以尋址程序存儲(chǔ)器;與RPT指令相結(jié)合,可以實(shí)現(xiàn)數(shù)據(jù)塊傳送。一、程序存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器例、數(shù)組X5=1,2,3,4,5初始化。.title “example.asm”.mmreg

37、sSTACK .usect “.STACK”,10H.bssx, 5.dataTable.word 1,2,3,4,5.def start.textStart:STM#x, AR1RPT#4MVPDtable,*AR1+end:B end.end二、數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器例、將數(shù)據(jù)存儲(chǔ)器中的數(shù)組x20復(fù)制到數(shù)組y20。.title“example.asm”.mmregsSTACK.usect“STACK”,30H.bssx,20.bssy,20.dataTable.word1,2,3,4,5,6,7,8,9,10,11,12,13,14.word 15,16,17,18,19,20.defsta

38、rt.textStart:STM#X,AR1RPT19MVPDtable,*AR1+STM#X,AR2STM#Y,AR3RPT19MVDD*AR2+,*AR3+end:B end.endvectors.objshiyan1.obj-o shiyan1.out-m shiyan1.map-e startMEMORY PAGE0: EPROM: org=0E000H, len=0100h VECS: org=0FF80H, len=0004H PAGE1: SPRAM: org=0060h, len = 0010H DARAM:org=0080H, len=0100HSECTIONS: .text

39、 : EPROM PAGE0.data :EPROM PAGE0.bss :SPRAM PAGE1STACK:DARAM PAGE1.vectors:VECS PAGE03.4.6 雙操作數(shù)乘法 TMS320C54X片內(nèi)的多總線結(jié)構(gòu),允許在一個(gè)機(jī)器周期內(nèi)通過(guò)兩個(gè)16位數(shù)據(jù)總線尋址兩個(gè)數(shù)據(jù)和系數(shù)。例、求y=mx+b(利用單操作數(shù)和雙操作數(shù)兩種方法)。LDm, T MPY *AR2,*AR3,AMPYx, A ADDb, AADDb, A STLA, ySTLA, y用雙操作數(shù)指令編程的特點(diǎn):用間接尋址方式獲得操作數(shù),且輔助寄存器為AR2AR5;占用的程序空間小;運(yùn)行速度快。注:雙操作數(shù)指令有四種

40、MPYXmem , Ymem ,dst;dst=Xmem*YmemMACXmem, Ymem ,src,dstMASXmem, Ymem, src,dstMACPSmem, pmad ,src,dst Smem數(shù)據(jù)存儲(chǔ)器數(shù)據(jù); Xmem , Ymem雙操作數(shù)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù); pmad為16位立即數(shù)程序存儲(chǔ)器地址。對(duì)Xmem , Ymem,只能用以下輔助存儲(chǔ)器及尋址方式:輔助寄存器:AR2 尋址方式:*ARn AR3 *ARn+ AR4 *ARn- AR5 *ARn+0%求:.mmregs STACK:.usect“STACK”, 30H.bssa, 20.bss x, 20.bss y, 2.

41、defstart.dataTable:.word1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16.word 1,17 ,18,19,20,1,2,3,4,5,6,7,8,9,10.word 11,12,13,14,15,16,17,18,19,20.textStart:STM #0, SWWSRSTM #STACK+10H,SPSTM #a,AR1RPT #39MVPD table,*AR1+LD#0, BSTM#a , AR2STM#x , AR3STM#19,BRCRPTBdone-1MPY*AR2+ , *AR3+ , AADDA, Bdone:STH B ,

42、 ySTLB , y+1End:Bend .end優(yōu)化:.title“example.asm”.mmregs STACK:.usect“STACK”, 30H.bssa, 20.bss x, 20.bss y, 2.defstart.dataTable:.word1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16.word 1,17 ,18,19,20,1,2,3,4,5,6,7,8,9,10.word 11,12,13,14,15,16,17,18,19,20.textStart:STM #0, SWWSRSTM #STACK+30H,SPSTM #a,AR1RPT

43、 #39MVPD table,*AR1+CALL SUMend:B endSUM:STM #a,AR3STM #x,AR4RPTZ A,#19MAC *AR3+,*AR4+,ASTH B , ySTLB , y+1.end3.4.7 長(zhǎng)字運(yùn)算DLDLmem, dstDSTsrc , LmemDADDLmem, src,dstDSUBLmem, src,dstDRSUBLmem, src,dst 除了DST指令外,都是單字單周期指令,也就是在單周期內(nèi)同時(shí)利用C和D總線,得到32位操作數(shù)。C160:雙精度運(yùn)算;C161:雙16位運(yùn)算偶地址排列法高16位在前(偶地址),低16位在后(寄地址)Tabl

44、e:.word 06CACH,0BD90H,3668HSTM#80H, AR1RPT#2MVPDtable, *AR1+STM#80H, AR3DLD *AR3+, A;程序運(yùn)行完A=00 6CAC BD90H6cach(H)Bd90h(L)3668h奇地址排列法:類似小端接高16位在后(奇地址),低16位在前(偶地址)STM#81H, AR3DLD *AR3+, A;程序運(yùn)行完,A=00 BD90 6CAC H6cach(L)Bd90h(H)3668h80h81h82h注意:一個(gè)系統(tǒng)內(nèi)部,僅使用一種地址排列方法;特殊情況下,可以同時(shí)利用兩種方法,解決特殊的數(shù)據(jù)尋址問(wèn)題;奇偶地址法的確定: 由

45、指令中地址的奇偶性決定。3.4.8 并行運(yùn)算D總線執(zhí)行加載或算術(shù)運(yùn)算;E總線存放先前的結(jié)果。并行指令有四種: 并行加載和乘法指令, 并行加載和存儲(chǔ)指令, 并行存儲(chǔ)和乘法指令, 并行存儲(chǔ)和加/減指令。所有并行指令都是單字單周期指令,并行運(yùn)算時(shí)存儲(chǔ)的是前面的結(jié)果,這些指令都工作在累加器的高位,且大多數(shù)并行運(yùn)算都受ASM(累加器移位方式位)影響。 LD:自動(dòng)左移16位; ST:自動(dòng)移位(ASM16)位,ASM0較合適雙操作數(shù):AR2AR51.并行裝載和存儲(chǔ)指令序號(hào)指 令功 能說(shuō) 明1ST src,Ymem| LD Xmem,dstYmem = src(ASM-16)|dst = Xmem 16累加器

46、移位存儲(chǔ)并行移位加載累加器2ST src,Ymem| LD Xmem,TYmem = src(ASM-16)|T= Xmem 累加器移位存儲(chǔ)并行加載T寄存器 并行裝載和存儲(chǔ)指令共2條。 2.并行存儲(chǔ)和加/減法指令 并行存儲(chǔ)和加/減法指令只有2條。 序號(hào)指 令功 能說(shuō) 明1ST src,Ymem| ADD Xmem,dstYmem = src(ASM-16)|dst = dst_+ Xmem 16累加器移位存儲(chǔ)并行移位加法運(yùn)算2ST src,Ymem| SUB Xmem,dstYmem = src(ASM-16)|dst = (Xmem 16)-dst_累加器移位存儲(chǔ)并行移位減法運(yùn)算3.并行裝載

47、和乘法指令 并行裝載和乘法指令共4條。 序號(hào)指 令功 能說(shuō) 明1LD Xmem,dst| MAC Ymem,dst_dst = Xmem 16|dst_ = dst_ +T*Ymem操作數(shù)移位加載累加器并行乘法累加運(yùn)算2LD Xmem,dst| MACR Ymem, dst_dst = Xmem 16|dst_ = rnd(dst_ +T*Ymem)操作數(shù)移位加載累加器并行帶舍入乘法累加運(yùn)算3LD Xmem,dst| MAS Ymem,dst_dst = Xmem 16|dst_ = dst_ -T*Ymem操作數(shù)移位加載累加器并行乘法減法運(yùn)算4LD Xmem,dst| MASR Ymem,

48、dst_dst = Xmem 16|dst_ = rnd(dst_ -T*Ymem)操作數(shù)移位加載累加器并行帶舍入乘法減法運(yùn)算4.并行存儲(chǔ)和乘法指令 并行存儲(chǔ)和乘法指令共5條。 序號(hào)指 令功 能說(shuō) 明1ST src,Ymem| MAC Xmem,dstYmem = src (ASM - 16)|dst = dst +T*Xmem累加器移位存儲(chǔ)并行乘法累加運(yùn)算2ST src,Ymem| MACR Xmem, dstYmem = src (ASM - 16)|dst = rnd(dst +T*Xmem)累加器移位存儲(chǔ)并行乘法累加運(yùn)算3ST src,Ymem| MAS Xmem,dstYmem =

49、src (ASM - 16)|dst = dst -T*Xmem累加器移位存儲(chǔ)并行乘法減法運(yùn)算4ST src,Ymem| MASR Xmem, dstYmem = src (ASM - 16)|dst = rnd(dst -T*Xmem)累加器移位存儲(chǔ)并行乘法減法運(yùn)算5ST src,Ymem| MAY Xmem,dstYmem = src z|LD*AR2+,B;e BHADD*AR2+,16,BSTHB,*AR2;BH f3.4.8 定點(diǎn)運(yùn)算一、數(shù)的定標(biāo) DSP芯片的數(shù)以2的補(bǔ)碼形式表示: 1位符號(hào)位,15位數(shù)字。在定點(diǎn)DSP中,都是采用定點(diǎn)數(shù)進(jìn)行數(shù)值運(yùn)算,其操作數(shù)一般采用整型數(shù)來(lái)表示。而許

50、多算法的仿真往往是使用浮點(diǎn)數(shù)進(jìn)行的。對(duì)于定點(diǎn)DSP編程來(lái)說(shuō),數(shù)的定標(biāo)是一個(gè)關(guān)鍵性的問(wèn)題對(duì)于16位的DSP而言,由程序員來(lái)確定一個(gè)數(shù)的小數(shù)點(diǎn)將處于16位中的哪一位??梢杂肣,S法來(lái)表示,不同的表示方法帶來(lái)的數(shù)的范圍和精度是不同的Q,S表示法及數(shù)的范圍定標(biāo)需注意的問(wèn)題運(yùn)算時(shí),保證兩個(gè)操作數(shù)的定標(biāo)值一樣;變量的Q值的確定,直接影響到系統(tǒng)的性能指標(biāo)。若Q值定高了,提高了系統(tǒng)的精度,但可能會(huì)帶來(lái)中間結(jié)果的溢出。若Q值定低了就能保證不溢出,但是損失了精度。關(guān)鍵就在于用理論分析或統(tǒng)計(jì)的方法估計(jì)出每一中間變量的可能動(dòng)態(tài)范圍MAX,然后以2MAX的數(shù)據(jù)范圍來(lái)定標(biāo)。 浮點(diǎn)數(shù)與定點(diǎn)數(shù)轉(zhuǎn)換:對(duì)Q15格式:0.9999

51、695 7FFFH0.5 4000H (16384)0 0000H-0.5 C000H; 絕對(duì)值乘以32768,取 反再加1-1 8000H 在匯編語(yǔ)言程序中,不能直接寫(xiě)入十進(jìn)制小數(shù)。0.1可寫(xiě)成: .word 1*32768/10 二、處理方法1、為了最大限度保持?jǐn)?shù)的精度,2、溢出及處理 FRACT0 FRACT1 1、小數(shù)乘小數(shù) Q15*Q15 Q3030 Q3131(AH/32768)2、小數(shù)乘整數(shù) Q15*Q0 Q1515 Q1616 (AH)3、整數(shù)乘整數(shù) Q0*Q0 Q0 Q11 三、定點(diǎn)乘法FRACT1:小數(shù)乘法方式, 乘法結(jié)果自動(dòng)左移一位乘法結(jié)果選取FRACT1 小數(shù)小數(shù):結(jié)果為AH/32768 小數(shù)整數(shù):結(jié)果為AHFRACT0 整數(shù)整數(shù):結(jié)果為A例:計(jì)算a=0.1 0.2 -0.3 0.4, x=0.8 0.6 0.4 0.2.bss a,4.bss x,4.bss y,1.datatable: .word 1*32768/10.word

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論