DSP技術(shù)及應(yīng)用第5章課件_第1頁(yè)
DSP技術(shù)及應(yīng)用第5章課件_第2頁(yè)
DSP技術(shù)及應(yīng)用第5章課件_第3頁(yè)
DSP技術(shù)及應(yīng)用第5章課件_第4頁(yè)
DSP技術(shù)及應(yīng)用第5章課件_第5頁(yè)
已閱讀5頁(yè),還剩114頁(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、1第五章 匯編語(yǔ)言編程舉例 第一節(jié)匯編語(yǔ)言編程的基本方法 第二節(jié) DSP的浮點(diǎn)運(yùn)算方法 第三節(jié) DSP在信號(hào)發(fā)生器上的應(yīng)用 第四節(jié) 用DSP實(shí)現(xiàn)FIR濾波器2第一節(jié) 匯編語(yǔ)言編程的基本方法 1堆棧的使用 1.壓入數(shù)據(jù)時(shí),堆棧從高地址向低地址增長(zhǎng)。2.壓棧時(shí)指針先減,SP-1,再壓入數(shù)據(jù);3.出棧時(shí),先彈出數(shù)據(jù)后,再SP+1。4.如要用堆棧,必須先設(shè)置,后使用。 要點(diǎn)3例5-1 設(shè)計(jì)一存儲(chǔ)空間為100個(gè)單元的堆棧。size .set 100 ;設(shè)置堆??臻g的 ;大小為100stack .usect “STK”,size ;設(shè)置堆棧段的首地址 ;和堆??臻g STM #stack+size,SP ;

2、將棧底地址指針?biāo)?; SP,對(duì)其初始化最后用的單元已用棧區(qū)可用棧區(qū)數(shù)據(jù)存儲(chǔ)器0棧頂SP棧底65535stack STKsize=100SP4例5-2 編寫(xiě)求解加、減法的程序,計(jì)算z=x+y-w。SUM1:LD x,A ;將x地址的內(nèi)容送A ADD y,A ;將y地址的內(nèi)容與A中x值相加 SUB w,A ;將A中的內(nèi)容與w相減,得z STL A,z ;將A的的計(jì)算值存入z地址中例5-3 寫(xiě)求解直線方程的程序,計(jì)算y=mx+b。 SUM2:LD m,T ;將m地址的內(nèi)容送T MPY x,A ;將x地址的內(nèi)容與T中的m相乘, ;結(jié)果送A ADD b,A ;將A中的mx與b地址的內(nèi)容相加, ;結(jié)果送A

3、 STH A,y ;將A的的計(jì)算結(jié)果存入y地址中 STL A,y+1 ;將A的的計(jì)算結(jié)果存入y+1地址中 2 加、減法和乘法運(yùn)算 5傳送速度比加載和存儲(chǔ)指令要快;傳送數(shù)據(jù)不需要通過(guò)累加器;可以尋址程序存儲(chǔ)器;與RPT指令相結(jié)合(重復(fù)時(shí),這些指令都變成單周期指令),可以實(shí)現(xiàn)數(shù)據(jù)塊傳送。 3 數(shù)據(jù)塊傳送 特點(diǎn)6(1)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器 這類指令有:MVDK Smem,dmad 指令的字?jǐn)?shù)/執(zhí)行周期 2/2MVKD dmad,Smem;Smem=dmad 2/2MVDD Xmem,Ymem ;Ymem=Xmem 1/1(2)程序存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器 這類指令有:MVPD pmad,Smem ;Smem

4、=pmad 2/3MVDP Smem,pmad ;pmad=Smem 2/4pmad為16位立即數(shù)程序存儲(chǔ)器地址;dmad為16位立即數(shù)數(shù)據(jù)存儲(chǔ)器地址;Smem為數(shù)據(jù)存儲(chǔ)器地址;Xmem、Ymem為雙操作數(shù)數(shù)據(jù)存儲(chǔ)器地址,Xmem從DB數(shù)據(jù)總線上讀出。Ymem從CB數(shù)據(jù)總線上讀出。7(3)數(shù)據(jù)存儲(chǔ)器MMR 這類指令有:MVDM dmad,MMR ;指令的字?jǐn)?shù)/執(zhí)行周期 2/2MVMD MMR,dmad ;dmad=MMR 2/2MVMM mmrx,mmry ;mmry=mmrx 1/1(4)程序存儲(chǔ)器(Acc)數(shù)據(jù)存儲(chǔ)器 包括:READA Smem ;Smem=prog(A) 1/5WRITA

5、 Smem ;prog(A)= Smem 1/5 mmrx,mmry為AR0AR7或SP; MMR為任何一個(gè)存儲(chǔ)器映象寄存器;8例5-6 將數(shù)組x5 初始化為1,2,3,4,5。.data ;定義初始化數(shù)據(jù)段起始地址TBL: .word 1,2,3,4,5 ;為標(biāo)號(hào)地址TBL ;開(kāi)始的5個(gè)單元賦初值 .sect “.vectors” ;定義自定義段,并獲 ;得該段起始地址 B START ;無(wú)條件轉(zhuǎn)移到標(biāo)號(hào)為START的地址 .bss x,5 ;為數(shù)組x分配5個(gè)存儲(chǔ)單元 .text ;定義代碼段起始地址START:STM #x,AR5 ;將x的首地址存入AR5 RPT #4 ;設(shè)置重復(fù)執(zhí)行5次

6、下條指令 MVPD TBL,*AR5+ ;將TBL開(kāi)始的5個(gè)值傳給x(1)程序存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器應(yīng)用舉例9例5-7 將數(shù)據(jù)存儲(chǔ)器中的數(shù)組x10復(fù)制到數(shù)組y10。 .title “cjy1.asm” ;為匯編源程序取名 .mmregs ;定義存儲(chǔ)器映象寄存器STACK .usect “STACK”,30H;設(shè)置堆棧 .bss x,10 ;為數(shù)組x分配10個(gè)存儲(chǔ)單元 .bss y,10 ;為數(shù)組y分配10個(gè)存儲(chǔ)單元 .datatable:.word 1,2,3,4,5,6,7,8,9,10 .def start ;定義標(biāo)號(hào)start .text10start:STM #0,SWWSR ;復(fù)位SWWS

7、R STM #STACK+30H,SP;初始化堆指針 STM #x,AR1 ;將目的地首地址賦給AR1 RPT #9 ;設(shè)定重復(fù)傳送的次數(shù)為10次 MVPD table,*AR1+;程序存儲(chǔ)器傳送到數(shù) ;據(jù)存儲(chǔ)器 STM #x,AR2 ;將x的首地址存入AR2 STM #y,AR3 ;將y的首地址存入AR3 RPT #9 ;設(shè)置重復(fù)執(zhí)行10次下條指令 MVDD *AR2+,*AR3+;將地址x開(kāi)始的10個(gè)值 ;復(fù)制到地址y開(kāi)始的10個(gè)單元end: B end .end11用間接尋址方式獲得操作數(shù),且輔助寄存器只用AR2AR5;占用程序空間?。贿\(yùn)行速度快。 4雙操作數(shù)乘法 特點(diǎn)例5-8 編制求解

8、 的程序。利用雙操作數(shù)指令可以節(jié)省機(jī)器周期。迭代次數(shù)越多,節(jié)省的機(jī)器周期數(shù)也越多。本例中,在每次循環(huán)中,雙操作數(shù)指令都比單操作數(shù)指令少用一個(gè)周期,節(jié)省的總機(jī)器周期數(shù)=1T*N(迭代次數(shù))=NT。12 單操作數(shù)指令方案 LD #0,B STM #a,AR2 STM #x,AR3 STM #19,BRC RPTB done-1 LD *AR2+,T;1T MPY *AR3+,A;1T ADD A,B ;1Tdone:STH B,y STL B,y+1 雙操作數(shù)指令方案 LD #0,B STM #a,AR2 STM #x,AR3 STM #19,BRC RPTB done-1 MPY *AR2+,*

9、AR3+,A;1T ADD A,B ;1Tdone:STH B,y STL B,y+113在單個(gè)周期內(nèi)同時(shí)利用C總線和D總線,得到32位操作數(shù)。 5長(zhǎng)字運(yùn)算 特點(diǎn)使用長(zhǎng)操作數(shù)指令時(shí),按指令中給出的地址存取的總是高16位操作數(shù)。這樣,有兩種數(shù)據(jù)排列方法:(1)偶地址排列法 指令中給出的地址為偶地址,存儲(chǔ)器中低地址存放高16位操作數(shù)。如: DLD *AR3+,A執(zhí)行前:A=00 0000 0000 執(zhí)行后:A=00 6CAC BD90 AR3=0100 AR3=0102 (0100h)=6CAC(高字) (0100h)=6CAC (0101h)=BD90(低字) (0101h)=BD90總是高16

10、位操作數(shù)14(2)奇地址排列法 指令中給出的地址為奇地址,存儲(chǔ)器中低地址存放低16位操作數(shù)。如: DLD *AR3-,A執(zhí)行前:A=00 0000 0000 執(zhí)行后:A=00 BD90 6CAC AR3=0103 AR3=0101 (0102h)=6CAC(低字) (0100h)=6CAC (0103h)=BD90(高字) (0101h)=BD90推薦采用偶地址排列法,將高16位操作數(shù)放在偶地址存儲(chǔ)單元中。如: 程序存儲(chǔ)器 .long 12345678 h ;偶地址:1234 ;奇地址:5678 數(shù)據(jù)存儲(chǔ)器 .bss xhi, 2, 1, 1 ;偶地址:xhi ;奇地址:xlo 變量名稱 字長(zhǎng)

11、 頁(yè)鄰接 偶地址排列法 總是高16位操作數(shù)15 標(biāo)準(zhǔn)運(yùn)算 LD xhi,16,A ADDS xlo,A ADD yhi,16,A ADDS ylo,A STH A,Zhi STL A,Zlo(6個(gè)字,6個(gè)T)長(zhǎng)字運(yùn)算DLD xhi,ADADD yhi,ADST A,zhi(3個(gè)字,3個(gè)T) 例5-9 計(jì)算Z32=X32+Y32。16(1)并行運(yùn)算指同時(shí)利用D總線和E總線。其中,D總線用來(lái)執(zhí)行加載或算術(shù)運(yùn)算,E總線用來(lái)存放先前的結(jié)果。(2)并行指令都是單字單周期指令。(3)并行運(yùn)算時(shí)所存儲(chǔ)的是前面的運(yùn)算結(jié)果,存儲(chǔ)之后再進(jìn)行加載或算術(shù)運(yùn)算。(4)并行指令都工作在累加器的高位。(5)大多數(shù)并行運(yùn)算指

12、令都受累加器移位方式ASM位影響。 6并行運(yùn)算 特點(diǎn)17表5-1 并行指令舉例指 令指 令舉 例操作說(shuō)明并行加載和乘法指令LDMACRLDMASRLD Xmem,dstMACR Ymem,dstdst=Xmem(16-ASM)dst=Xmem(16-ASM)dst=dst+T*Xmem并行存儲(chǔ)和加/減法指令STADDSTSUBST src, YmemADD Xmem, dstYmem=src(16-ASM)dst=dst+Xmem18例5-10 編寫(xiě)計(jì)算z=x+y和f=d+e的程序段。在此程序段中用到了并行存儲(chǔ)/加載指令,即在同一機(jī)器周期內(nèi)利用E總線存儲(chǔ)和D總線加載。 數(shù)據(jù)存儲(chǔ)器分配如圖5-4

13、所示。 .title “cjy3.asm” .mmregsSTACK .usect “STACK”,10H .bss x,3 ;為第一組變量 ;分配3個(gè)存儲(chǔ)單元 .bss d,3 ;為第二組變量 ;分配3個(gè)存儲(chǔ)單元 .def start .datatable: .word 0123H,1027H,0,1020H,0345H,0dyfezx數(shù)據(jù)存儲(chǔ)器AR5 AR2 19 .text start:STM #0,SWWSR STM #STACK+10H,SP STM #x,AR1 RPT #5 MVPD table,*AR1+ STM #x,AR5 ;將第一組變量的首地址傳給AR5 STM #d,A

14、R2 ;將第二組變量的首地址傳給AR2 LD #0,ASM ;設(shè)置ASM=0 LD *AR5+,16,A ;將x的值左移16位放入A的高端字 ADD *AR5+,16,A ;將y值左移16位與A的高端字x相加 ST A,*AR5 ;將A中的和值右移16位存入z中 LD *AR2+,B ;將d的值左移16位放入B的高端字 ADD *AR2+,16,B ;將e值左移16位與B的高端字d相加 STH B,*AR2 ;將B的高端字中的和值存入f中end: B end .end20 764位加法和減法運(yùn)算 例5-11 編寫(xiě)計(jì)算Z64=W64+X64-Y64的程序段。這里的W、X、Y和結(jié)果Z都是64位數(shù),

15、它們都由兩個(gè)32位的長(zhǎng)字組成。利用長(zhǎng)字指令可以完成64位數(shù)的加/減法。 w3 w2 w1 w0 (W64)+ x3 x2 C x1 x0 (X64) 低32位相加產(chǎn)生進(jìn)位C- y3 y2 C y1 y0 (Y64) 低32位相減產(chǎn)生借位C_ z3 z2 z1 z0 (Z64)累加器A累加器B21DLD w1,A ;A=w1w0DADD x1,A ;A=w1w0+x1x0, 產(chǎn)生進(jìn)位CDLD w3,B ;B=w3w2ADDC x2,B ;B=w3w2+x2+CADD x3,16,B ;B=w3w2+x3x2+CDSUB y1,A ;A=w1w0+x1x0-y1y0, 產(chǎn)生借位CDST A,z1

16、;z1z0=w1w0+x1x0-y1y0SUBB y2,B ;B=w3w2+x3x2+C-y2-CSUB y3,16,B ;B=w3w2+x3x2+C-y3y2-CDST B,z3 ;z3z2=w3w2+x3x2+C-y3y2-C由于沒(méi)有長(zhǎng)字帶進(jìn)(借)位加/減法指令,所以上述程序中只能用16位帶進(jìn)(借)位指令A(yù)DDC和SUBB。低32位加高32位加低32位減高32位減22 8. 32位乘法運(yùn)算 x1 x0 S U y1 y0 S U_ _ x0 * y0 U * U y1 * x0 S * U x1 * y0 S * Uy1 * x1 S * S_ _w3 w2 w1 w0 S U U U例5

17、-12 編寫(xiě)計(jì)算W64=X32*Y32的程序段。32位乘法算式如下:圖5-5y1x1w1w0y0 x0數(shù)據(jù)存儲(chǔ)器AR2 AR3 w2w323 其中,S為帶符號(hào)數(shù),U為無(wú)符號(hào)數(shù)。數(shù)據(jù)存儲(chǔ)器分配如圖5-5所示。在32位乘法運(yùn)算中,實(shí)際上包括了三種乘法運(yùn)算:U*U、S*U和S*S。一般的乘法運(yùn)算指令都是兩個(gè)帶符號(hào)數(shù)相乘,即S*S。 所以,在編程時(shí),要用到以下三條乘法指令: MACSU Xmem,Ymem,src ;無(wú)符號(hào)數(shù)與帶符號(hào)數(shù)相乘并 ;累加src=U(Xmem)* S(Ymem)+src MPYU Smem,dst ;無(wú)符號(hào)數(shù)相乘 ;dst=U()* U(Smem) MAC Xmem,Ymem

18、,src ;兩個(gè)符號(hào)數(shù)數(shù)相乘并累加 ;src=S(Xmem)* S(Ymem)+src32位乘法的程序段如下:24STM #x0,AR2 ;將x的首地址放入AR2 STM #y0,AR3 ;將y的首地址存入AR3LD *AR2,T ;T=x0MPYU *AR3+,A ;A=ux0*uy0STL A,w0 ;w0=ux0*uy0LD A,-16,A ;A=A16MACSU *AR2+,*AR3-,A ;A+=y1*ux0MACSU *AR3+,*AR2,A ;A+=x1*uy0STL A,w1 ;w1=ALD A,-16,A ;A=A16MAC *AR2,*AR3,A ;A+=x1*y1STL

19、A,w2 ;w2=A的低16位STH A,W3 ;w3=A的高16位 x1 x0 y1 y0 x1 * y0 y1 * x1 x1 x0 y1 y0 x0 * y0 y1 * x0w0w1w2w325 9小數(shù)運(yùn)算 整數(shù)運(yùn)算的問(wèn)題(1)兩個(gè)16位整數(shù)相乘,乘積總是“向左增長(zhǎng)”。這意味著多次相乘后,乘積將會(huì)很快超出定點(diǎn)器件的數(shù)據(jù)范圍。(2)保存32位乘積到存儲(chǔ)器,要開(kāi)銷2個(gè)機(jī)器周期以及2個(gè)字的存儲(chǔ)器單元。(3)由于乘法器都是16位相乘,因此很難在后續(xù)的遞推運(yùn)算中,將32位乘積作為乘法器的輸入。小數(shù)運(yùn)算的優(yōu)點(diǎn)(1)乘積總是“向右增長(zhǎng)”。這就味著超出定點(diǎn)器件數(shù)據(jù)范圍的將是不太感興趣的部分。(2)既可以

20、存儲(chǔ)32位乘積,也可以存儲(chǔ)高16位乘積,這就允許用較少的資源保存結(jié)果。(3)可以用于遞推運(yùn)算。小數(shù)運(yùn)算與整數(shù)運(yùn)算的比較26C54x采用2的補(bǔ)碼表示小數(shù),其最高位為符號(hào)位,數(shù)值范圍從-11。一個(gè)16位2的補(bǔ)碼小數(shù)(Q15格式)的每一位的權(quán)值為: MSB(最高位) LSB(最低位) -1. 1/2 1/4 1/8 2-15一個(gè)十進(jìn)制小數(shù)乘以32768之后再將其十進(jìn)制整數(shù)部分轉(zhuǎn)換成十六進(jìn)制數(shù),就能得到這個(gè)十進(jìn)制小數(shù)的2的補(bǔ)碼表示。1 7FFFh0.5正數(shù):乘以32768 4000h0 0000h-0.5 負(fù)數(shù):其絕對(duì)值部分乘以32768,再取反加1 C000h-1 8000h(1)小數(shù)的表示方法27

21、在匯編語(yǔ)言中,是不能直接寫(xiě)入十進(jìn)制小數(shù)的,可寫(xiě)為整數(shù)運(yùn)算式。如果要定義一個(gè)系數(shù)0.707,可以寫(xiě)成:.word 32768*707/1000不能寫(xiě)成32768*0.707。注意Q格式表示法 在Q格式中,Q之后的數(shù)字(如Q15格式中的15)決定小數(shù)點(diǎn)右邊有多少位二進(jìn)制位,故Q15表示在小數(shù)點(diǎn)后有15位小數(shù)。當(dāng)用一個(gè)16位的字來(lái)表示Q15格式時(shí),在MSB(最高位)的右邊有一個(gè)小數(shù)點(diǎn),而MSB表示符號(hào)位。所以Q15的表示數(shù)字可表示范圍從+1(以+0.999997表示)到-1的值。28通過(guò)合適的Q格式,可以把數(shù)值根據(jù)所需的精確度做適當(dāng)?shù)霓D(zhuǎn)換,以便定點(diǎn)數(shù)的DSP也可以處理高精度的浮點(diǎn)數(shù)。下面以Q15為例

22、,說(shuō)明轉(zhuǎn)換的過(guò)程。1) 先確定準(zhǔn)備轉(zhuǎn)換的十進(jìn)制數(shù)值N,是在Q15格式的數(shù)值范圍之間,即-1.000000N+0.999997。2)數(shù)值N乘以215,即N=N215=N327683)把步驟2)的結(jié)果加216,即N=N+216=N+65536。4)步驟3)的結(jié)果轉(zhuǎn)換成十六進(jìn)制,并把第17位舍棄掉,得到的結(jié)果就是N的Q15轉(zhuǎn)換值。29下面通過(guò)把-0.2345及+0.2345轉(zhuǎn)換成Q15格式來(lái)說(shuō)明轉(zhuǎn)換方法。-0.2345的轉(zhuǎn)換為:-0.234532768=-7684.1-7684-7684+65536=5785257852轉(zhuǎn)換成十六進(jìn)制數(shù)值為0E1FCh,所以結(jié)果為E1FCh。+0.2345的轉(zhuǎn)換為:

23、0.234532768=7684.176847684+65536=7332073320轉(zhuǎn)換成十六進(jìn)制數(shù)值為11E04h,并把第17位舍棄掉,結(jié)果為1E04h。 30以字長(zhǎng)為4位和8位累加器為例,先看一個(gè)小數(shù)乘法的例子。 0 1 0 0(0.5230.5=(4)10=(0100)2) 1 1 0 1(-0.37523(-0.375)=(-3)10 0 1 0 0 =(1101)補(bǔ)) 0 0 0 0 0 1 0 0 1 1 0 0 (-0100)?1 1 1 0 1 0 0 (-0.1875=-12/26-12=(1110100)補(bǔ))(2)小數(shù)乘法與冗余符號(hào)位0001011+ 10001100保留

24、符號(hào)3+3=6 0.5 0.375 0.187531上述乘積是7位,當(dāng)將其送到8位累加器時(shí),為保持乘積的符號(hào),必須進(jìn)行符號(hào)位擴(kuò)展,這樣,累加器中的值為11110100(-0.09375=-12/27),出現(xiàn)了冗余符號(hào)位。原因是: S x x x (Q3) S y y y (Q3)S S z z z z z z (Q6格式)即兩個(gè)帶符號(hào)數(shù)相乘,得到的乘積帶有2個(gè)符號(hào)位,造成錯(cuò)誤的結(jié)果。同樣,對(duì)于兩個(gè)十六位數(shù)相乘,乘積只有30位,在最高的兩位也是符號(hào)位,同樣會(huì)造成錯(cuò)誤的結(jié)果。不等于-0.1875添加32解決冗余符號(hào)的辦法是:在程序中設(shè)定狀態(tài)寄存器ST1中的FRCT(小數(shù)方式)位1,在乘法器將結(jié)果傳

25、送至累加器時(shí)就能自動(dòng)地左移1位,累加器中的結(jié)果為:zzzzzz0(Q7格式),即11101000(-0.1875=-24/27-24=(11101000)補(bǔ)),自動(dòng)地消去了兩個(gè)帶符號(hào)數(shù)相乘時(shí)產(chǎn)生的冗余符號(hào)位。所以在小數(shù)乘法編程時(shí),應(yīng)當(dāng)事先設(shè)置FRCT位:SSBX FRCT MPY *AR2,*AR3,ASTH A,Z這樣,C54x就完成了Q15*Q15=Q15的小數(shù)乘法。33例5-13 編制計(jì)算 的程序段,其中數(shù)據(jù)均為小數(shù):a1=0.1,a2=0.2,a3=-0.3,a4=0.4,x1=0.8,x2=0.6,x3=-0.4,x4=-0.2。 .title “cjy4.asm” .mmregsS

26、TACK .usect “STACK”,10H .bss a,4 ;為a分配4個(gè)存儲(chǔ)單元 .bss x,4 ;為x分配4個(gè)存儲(chǔ)單元 .bss y,1 ;為結(jié)果y分配1個(gè)存儲(chǔ)單元 .def start .data ;定義數(shù)據(jù)代碼段34table: .word 1*32768/10 ;在table開(kāi)始的8個(gè) .word 2*32768/10 ;地址放數(shù)據(jù) .word -3*32768/10 .word 4*32768/10 .word 8*32768/10 .word 6*32768/10 .word -4*32768/10 .word -2*32768/1035 .text ;定義可執(zhí)行程序代碼

27、段start:SSBX FRCT ;設(shè)置FRCT位,表示進(jìn)行小數(shù)乘 STM #x,AR1 ;將x的首地址傳給AR1 RPT #7 ;重復(fù)8次下條指令 MVPD table,*AR1+ ;將程序空間8個(gè)數(shù)傳給數(shù)據(jù)存儲(chǔ)器 STM #x,AR2 ;將數(shù)據(jù)存儲(chǔ)器第一個(gè)數(shù)x1的地址傳給AR2 STM #a,AR3 ;將數(shù)據(jù)存儲(chǔ)器第五個(gè)數(shù)a1的地址傳給AR3 RPTZ A,#3 ;將A清零,重復(fù)4次下條指令 MAC *AR2+,*AR3+,A ;執(zhí)行乘法累加和,結(jié)果放在A中 STH A,y ;將A的高端字存入結(jié)果y,低端字省去end: B end ;原處循環(huán)等待 .end 結(jié)果y=0 x1EB7。轉(zhuǎn)換為十

28、進(jìn)制數(shù): y=(1163+14162+11161+7160)/32768=0.2436 10 除法運(yùn)算 條件減法指令的功能如下:SUBC Smem,src ;(src)-(Smem)15 ALU;輸出端,如果ALU輸出端0, ;則(ALU輸出端)1+1src,;否則(src)1src。方法:減法指令加重復(fù)指令實(shí)現(xiàn)無(wú)符號(hào)運(yùn)算(1)當(dāng)被除數(shù)除數(shù) 此時(shí)商為小數(shù)。37例5-14 編寫(xiě)0.4(-0.8)的程序段。.title “cjy5.asm”.mmregsSTACK .usect “STACK”,10H.bss num,1 ;為分子分配單元.bss den,1 ;為分母分配單元.bss quot,1

29、 ;為商分配單元.data ;定義數(shù)據(jù)段起始地址table:.word 4*32768/10 ;在以table為地址的;單元放入 0.4.word -8*32768/10 ;在以table為地址的;下一單元放入-0.8.def start38 .text ;定義數(shù)據(jù)段起始地址start: STM #num,AR1 ;將分子所在單元的地址傳給AR1 RPT #1 ;重復(fù)執(zhí)行下一指令2次 MVPD table,*AR1+;傳送程序空間的2個(gè)數(shù)據(jù)(分子、分母) ;至地址為num開(kāi)始的數(shù)據(jù)存儲(chǔ)器單元 LD den,16,A ;將分母移到累加器A(3116) MPYA num ;(num)*( A(31

30、16)B, ;獲取商的符號(hào)(在累加器B中) ABS A ;分母取絕對(duì)值 STH A,den ;分母絕對(duì)值存回原處 LD num,16,A ;分子加載到A(3116) ABS A ;分子取絕對(duì)值 RPT #14 ;15次減法循環(huán),完成除法 SUBC den,A ;num-den XC 1,BLT ;如果B0(商是負(fù)數(shù)),則需要變號(hào) NEG A ;如果B0執(zhí)行求反,否則跳過(guò)此指令 STL A,quot ;保存商end: B end .end 取商的符號(hào)除法運(yùn)算還原商的符號(hào)39a)被除數(shù)除數(shù)商為小數(shù)第一次(src) 分子左移4位 0011 0000第二次(Smem)分母左移3位 - 011 0 AL

31、U 0000 0000 ALU0 ALU左移1位 0000 0000 + 1第三次(src) 0000 0001 (Smem)分母左移3位 - 011 0 ALU 1101 0001ALU0 (src) 左移一位 0000 0001 0000 0010第四次(src) 0000 0010 (Smem)分母左移3位 - 011 0 ALU 1101 0010ALU0 (src) 左移一位 0000 0010 0000 0100 (src) 0000 0100取符號(hào) - 0000 0100保存商(src) 低字節(jié)商 quot= - 0100十進(jìn)制轉(zhuǎn)換輸出 -0100=-4 -4/8= - 0.5以

32、Q3格式為例0.4/(-0.8) 被除數(shù)0.48=3.20011 運(yùn)算 除數(shù)0.88=6.40110 累加器A累加器A累加器A累加器A40(2)當(dāng)被除數(shù)除數(shù)時(shí) 商為整數(shù)。 例5-15 編寫(xiě)16384512的程序段。將上例程序段僅作兩處修改,其它不變,就得本例的程序段:LD num,16,A 改成 LD num,ARPT #14 改成 RPT #15本例的程序段為: .title “cjy6.asm” .mmregsSTACK .usect “STACK”,10H41 .bss num,1 ;為分子分配單元 .bss den,1 ;為分母分配單元 .bss quot,1 ;為商分配單元 .dat

33、a ;定義數(shù)據(jù)段起始地址table: .word 16384 ;在以table為地址 ;的單元放入16384 .word 512 ;在以table為地址 ;的下一單元放入512 .def start .text ;定義數(shù)據(jù)段起始地址start: STM #num,AR1;將分子所在單元地址傳給AR1 RPT #1 ;重復(fù)執(zhí)行下一指令2次 MVPD able,*AR1+ ;傳送程序空間的2 ;數(shù)據(jù)(分子、分母)至地址為 ; num開(kāi)始的數(shù)據(jù)存儲(chǔ)器單元 42 LD den,16,A ;將分母移到累加器A(3116) MPYA num ;(num)*( A(3116)B, ;獲取商的符號(hào)(在累加器B

34、中) ABS A ;分母取絕對(duì)值 STH A,den ;分母絕對(duì)值存回原處 LD num,A ;分子加載到A(150) ABS A ;分子取絕對(duì)值 RPT #15 ;16次減法循環(huán),完成除法 SUBC den,A ;num-den XC 1,BLT ;如果B0(商是負(fù)數(shù)),則需要變號(hào) NEG A ;如果B VECS PAGE 0 .text: EPROM PAGE 0 .data: EPROM PAGE 0 .bss: SPRAM PAGE 1 .XN: DARAM align(8) PAGE 1 .A0: DARAM align(8) PAGE 1 77(2)用線性緩沖區(qū)和間接尋址方法實(shí)現(xiàn)F

35、IR例5-26 編寫(xiě)y(n)=a0*x(n)+ a1*x(n-1)+ a2*x(n-2)+ a3*x(n-3)+ a4*x(n-4)的計(jì)算程序,其中N=5。 將系數(shù)a0a4存放在數(shù)據(jù)存儲(chǔ)器中,并設(shè)置線性緩沖區(qū)存放輸入數(shù)據(jù)。利用AR1和AR2分別作為間接尋址線性緩沖區(qū)和系數(shù)區(qū)的輔助寄存器。 線性緩沖區(qū)安排y(n)x(n)x(n-1)x(n-2)x(n-3)x(n-4)數(shù)據(jù)存儲(chǔ)器yxAR1a0a1a2a3a4數(shù)據(jù)存儲(chǔ)器a:AR278 .title “FIR2.ASM” ;定義源程序名 .mmregs ;定義存儲(chǔ)器映象寄存器 .def start ;定義語(yǔ)句標(biāo)號(hào)start .bss y,1 ;為結(jié)果

36、y預(yù)留1個(gè)單元的空間x .usect “x”,5 ;在自定義的未初始化段“x”中保留5個(gè)單元的空間a .usect “a”,5 ;在自定義的未初始化段“a”中保留5個(gè)單元的空間PA0 .set 0 ;定義PA0為輸出端口PA1 .set 1 ;定義PA1為輸入端口 .datatable: .word 2*32768/10 ;假定程序空間有五個(gè)參數(shù) .word -3*32768/10 .word 4*32768/10 .word -3*32768/10 .word 2*32768/1079 .textstart: STM #a,AR2 ;將數(shù)據(jù)空間用于放參數(shù) ;的首地址送AR2 RPT #4 ;

37、重復(fù)下條指令5次傳送 MVPD table,*AR2+ ;傳送程序空間的參數(shù)到數(shù)據(jù)空間 STM #x+4,AR1 ;AR1指向x(n-4) STM #a+4,AR2 ;AR2指向a4 STM #4,AR0 ;指針復(fù)位值4AR0 SSBX FRCT ;小數(shù)相乘 LD #x,DP ;設(shè)置數(shù)據(jù)存儲(chǔ)器頁(yè)指針 ;的起始位置 PORTR PA1,x ;從端口PA1輸入最新值x(n)80FIR2: LD *AR1-,T ;x(n-4)T MPY *AR2-,A ;a4*x(n-4)A LTD *AR1- ;x(n-3)T,x(n-3)x(n-4) MAC *AR2-,A ;A+a3*x(n-3)A LTD

38、*AR1- ;x(n-2)T,x(n-2)x(n-3) MAC *AR2-,A ;A+a2*x(n-2)A LTD *AR1- ;x(n-1)T,x(n-1)x(n-2) MAC *AR2-,A ;A+a1*x(n-1)A LTD *AR1 ;x(n)T, x(n)x(n-1) MAC *AR2+0,A ;A+a0*x(n)A ,AR2復(fù)原,指向a4 STH A,y ;保存運(yùn)算結(jié)果的高位字到y(tǒng)(n) PORTW y(n),PA0 ;將結(jié)果y(n)輸出到端口PA0 BD FIR2 ;執(zhí)行完下條指令后,從FIR2開(kāi)始循環(huán) PORTR PA1,*AR1+0;輸入新值x(n),AR1復(fù)原指向x+4 .

39、end81(3) 用線性緩沖區(qū)和帶移位雙操作數(shù)尋址方法實(shí)現(xiàn) FIR例5-27 編寫(xiě)y(n)=a0*x(n)+ a1*x(n-1)+ a2*x(n-2)+ a3*x(n-3)+ a4*x(n-4)的計(jì)算程序,其中N=5。 本例中,系數(shù)a0a4存放在程序存儲(chǔ)器中,輸入數(shù)據(jù)存放在數(shù)據(jù)存儲(chǔ)器的線性緩沖區(qū)中。乘法累加利用MACD指令,該指令完成數(shù)據(jù)存儲(chǔ)器單元與程序存儲(chǔ)器單元相乘,并累加、移位的功能。 暫存y(n)x(n)x(n-1)x(n-2)x(n-3)x(n-4)數(shù)據(jù)存儲(chǔ)器xAR1a4a3a2a1a0程序存儲(chǔ)器PARCOEF82 .title “FIR3.ASM” ;定義源程序名 .mmregs ;

40、定義存儲(chǔ)器映象寄存器 .def start ;定義語(yǔ)句標(biāo)號(hào)start .bss y,1 ;為結(jié)果y預(yù)留1個(gè)單元的空間x .usect “x”,6 ;在自定義的未初始化 ;段“x”中保留6個(gè)單元PA0 .set 0 ;定義PA0為輸出端口PA1 .set 1 ;定義PA1為輸入端口 .dataCOEF: .word 1*32768/10 ;假定程序空間有五個(gè)參數(shù),a4 .word -4*32768/10 ;a3 .word 3*32768/10 ;a2 .word -4*32768/10 ;a1 .word 1*32768/10 ;a083 .textstart: SSBX FRCT ;小數(shù)乘法

41、 STM #x+5,AR1 ;AR1指向x(n-4) STM #4,AR0 ;設(shè)置AR1復(fù)位值 LD #x+1,DP ;設(shè)置數(shù)據(jù)存儲(chǔ)器頁(yè)指針的起始位置 PORTR PA1,x+1 ;輸入最新值x(n)FIR3: RPTZ A,#4 ;累加器A清0,設(shè)置重復(fù)下條指令5次 MACD *AR1-,COEF,A ;x(n-4)T,A= x(n-4)*a4 +A ;(PAR)+1PAR,x(n-4)x(n-5) STH A,*AR1 ;暫存結(jié)果到y(tǒng)(n) PORTW *AR1+,PA0;輸出y(n)到PA0,AR1指向x(n) BD FIR3 ;執(zhí)行下條指令后循環(huán) PORTR PA1,*AR1+0;輸入

42、新數(shù)據(jù)到x(n),AR1指向x(n-4)84(4) 用循環(huán)緩沖區(qū)和雙操作數(shù)尋址方法實(shí)現(xiàn) FIR例5-28 編寫(xiě)y(n)=a0*x(n)+ a1*x(n-1)+ a2*x(n-2)+ a3*x(n-3)+ a4*x(n-4)的計(jì)算程序,其中N=5。 本例中,存放a0a4的系數(shù)表以及存放數(shù)據(jù)的循環(huán)緩沖區(qū)均設(shè)在DARAM中。 x(n)x(n-1)x(n-2)x(n-3)x(n-4)數(shù)據(jù)存儲(chǔ)器yxnAR3a0a1a2a3a4數(shù)據(jù)存儲(chǔ)器a0AR488h89h8Ah8Bh8Ch80h81h82h83h84hy(n)60h85.title “FIR4.ASM” ;給匯編程序取名 .mmregs ;定義存儲(chǔ)器

43、映象寄存器 .def start ;定義標(biāo)號(hào)start的起始位置 .bss y,1 ;為未初始化變量y保留空間xn .usect “xn”,5 ;自定義5個(gè)單元空間的數(shù)據(jù)段xna0 .usect “a0”,5 ;自定義5個(gè)單元空間的數(shù)據(jù)段a0PA0 .set 0 ;設(shè)置數(shù)據(jù)輸出端口I/O,PA0=0PA1 .set 1 ;設(shè)置數(shù)據(jù)輸入端口I/O,PA1=1 .datatable: .word 1*32768/10 ;a0=0.1=0 x0CCC .word 2*32768/10 ;a1=0.2=0 x1999 .word 3*32768/10 ;a2=0.3=0 x2666 .word 4*3

44、2768/10 ;a3=0.4=0 x3333 .word 5*32768/10 ;a4=0.5=0 x4000 .text86start: SSBX FRCT ;小數(shù)乘法 STM #a0,AR1 ;AR1指向a0 RPT #4 ;從程序存儲(chǔ)器table開(kāi)始的地址傳送 MVPD table,*AR1+ ;5個(gè)系數(shù)至數(shù)據(jù)空間a0開(kāi)始的數(shù)據(jù)段 STM #xn+4,AR3 ;AR3指向x(n-4) STM #a0+4,AR4 ;AR4指向a4 STM #5,BK ;設(shè)循環(huán)緩沖區(qū)長(zhǎng)度BK=5 STM #-1,AR0 ;AR0=-1,雙操作數(shù)減量 LD #xn,DP ;設(shè)置數(shù)據(jù)存儲(chǔ)器頁(yè)指針的起始位置 P

45、ORTR PA1,xn ;輸入新數(shù)據(jù)到x(n)FIR4: RPTZ A,#4 ;A清0,重復(fù)執(zhí)行下條指令5次 MAC *AR3+0%,*AR4+0%,A ;系數(shù)與輸入數(shù)據(jù)雙 ;操作數(shù)相乘并累加 STH A,y ;保存結(jié)果的高字節(jié)到 y(n) PORTW y,PA0 ;輸出y(n)到端口PA0 BD FIR4 ;執(zhí)行完下條指令后循環(huán) PORTR PA1,*AR3+0% ;從端口PA1輸入新數(shù)據(jù)到x(n) .end87 4.系數(shù)對(duì)稱FIR濾波器設(shè)計(jì)系數(shù)對(duì)稱的FIR濾波器具有線性相位特性,這種濾波器是用得最多的FIR濾波器,特別是對(duì)相位失真要求很高的場(chǎng)合。如果FIR濾波器的h(n)是實(shí)數(shù),且滿足偶對(duì)

46、稱h(n)=h(N-1-n)或奇對(duì)稱h(n)=-h(N-1-n)的條件,則濾波器具有線性相位特性。 一個(gè)對(duì)稱FIR濾波器滿足h(n)=h(N-1-n)。 88h(n)=h(N-1-n)n0246810h(n)N=11奇數(shù)偶對(duì)稱中心N-1n024679h(n)N=10偶數(shù)偶對(duì)稱中心N-11358(b)(a)h(n)偶對(duì)稱h(n)N=11奇數(shù)奇對(duì)稱中心N-1n024679h(n)N=10偶數(shù)奇對(duì)稱中心N-11358(b)(a)h(n)奇對(duì)稱100246791358n89例如,N=8的FIR濾波器,其輸出方程為:y(n)=h0 x(n)+h1x(n-1)+h2x(n-2)+h3x(n-3)+h3x(

47、n-4)+h2x(n-5)+h1x(n-6)+h0 x(n-7)總共有8次乘法和7次加法。如果利用對(duì)稱性,可將其改寫(xiě)成: y(n)=h0 x(n)+x(n-7)+h1x(n-1)+x(n-6)+h2x(n-2)+x(n-5)+h3x(n-3)+x(n-4)變成4次乘法和7次加法??梢?jiàn)乘法運(yùn)算的次數(shù)少了一半。這是對(duì)稱FIR的一個(gè)優(yōu)點(diǎn)。 90對(duì)稱FIR濾波器的實(shí)現(xiàn)可按如下步驟進(jìn)行:(1) 將數(shù)據(jù)存儲(chǔ)器分為新舊兩個(gè)循環(huán)緩沖區(qū),New循環(huán)緩沖區(qū)中存放N/2=4個(gè)新數(shù)據(jù);Old循環(huán)緩沖區(qū)中存放N/2=4個(gè)老數(shù)據(jù)。每個(gè)循環(huán)緩沖區(qū)的長(zhǎng)度為N/2。New循環(huán)緩沖區(qū)AR288h89h8Ah8Bh80h81h82

48、h83hx(n-4)x(n-5)x(n-6)x(n-7)Old循環(huán)緩沖區(qū)COEF低地址h0h1h2h3系數(shù)表AR3x(n)x(n-3)x(n-2)x(n-1)程序存儲(chǔ)器New數(shù)據(jù)存儲(chǔ)器高地址91(2) 設(shè)置循環(huán)緩沖區(qū)指針,以AR2指向New循環(huán)緩沖區(qū)中最新的數(shù)據(jù);以AR3指向Old循環(huán)緩沖區(qū)中最老的數(shù)據(jù)。(3) 在程序存儲(chǔ)器中設(shè)置系數(shù)表。(4)(AR2)+(AR3)AH(累加器A的高位),AR2-1AR2,AR3-1AR3。(5) 將累加器B清0,重復(fù)執(zhí)行4次(i=0,1,2,3)下面的運(yùn)算:(AH)*系數(shù)hi+(B)B,系數(shù)指針(PAR)加1,(AR2)+(AR3)AH,AR2和AR3減。9

49、2(6) 保存和輸出結(jié)果(結(jié)果在BH中)。(7) 修正數(shù)據(jù)指針,讓AR2和AR3分別指向New循環(huán)緩沖區(qū)最新的數(shù)據(jù)和Old循環(huán)緩沖區(qū)中最老的數(shù)據(jù)。(8) 用New循環(huán)緩沖區(qū)中最老的數(shù)據(jù)替代Old循環(huán)緩沖區(qū)中最老的數(shù)據(jù)。Old循環(huán)緩沖區(qū)指針減1。(9) 輸入一個(gè)新數(shù)據(jù)替代New循環(huán)緩沖區(qū)中最老的數(shù)據(jù)。重復(fù)執(zhí)行(4)(9)步。93在編程中要用到系數(shù)對(duì)稱有限沖激響應(yīng)濾波器指令FIRS,其操作為:FIRS Xmem,Ymem,Pmad該指令執(zhí)行 PmadPAR(程序存儲(chǔ)器地址寄存器)當(dāng)(RC)0(B)+(A(3216)(由PAR尋址Pmem)B(Xmem)+(Ymem)16A(PAR)+1PAR(RC

50、)-1RCFIRS指令在同一個(gè)機(jī)器周期內(nèi),通過(guò)C和D總線讀2次數(shù)據(jù)存儲(chǔ)器,同時(shí)通過(guò)P總線讀一個(gè)系數(shù)。94例5-29 設(shè)計(jì)對(duì)稱FIR濾波器(N=8)。 .title “FIR5.ASM” ;給匯編程序取名 .mmregs ;定義存儲(chǔ)器映象寄存器 .def start ;定義標(biāo)號(hào)start的起始位置 .bss y,1 ;為未初始化變量y保留空間x_new .usect “DATA1”,4 ;自定義4個(gè)單元的未初始化段DTAT1x_old .usect “DATA2”,4 ;自定義4個(gè)單元的未初始化段DATA2size .set 4 ;定義符號(hào)size=4PA0 .set 0 ;設(shè)置數(shù)據(jù)輸出端口I/

51、O,PA0=0PA1 .set 1 ;設(shè)置數(shù)據(jù)輸入端口I/O,PA1=1 .dataCOEF .word 1*32768/10,2*32768/10;系數(shù)對(duì)稱,只需 .word 3*32768/10,4*32768/10 ;給出N/2=4個(gè)系數(shù)95 .textstart: LD #y,DP ;設(shè)置數(shù)據(jù)存儲(chǔ)器頁(yè)指針的起始位置 SSBX FRCT ;小數(shù)乘法 STM #x_new,AR2 ;AR2指向新緩沖區(qū)第1個(gè)單元 STM #x_old+(size-1),AR3 ;AR3指向老緩 ;沖區(qū)最后1個(gè)單元 STM #size,BK ;設(shè)置循環(huán)緩沖區(qū)長(zhǎng)度BK =size STM #-1,AR0 ;循環(huán)

52、控制增量AR0=-1 PORTR PA1,#x_new ;從I/O輸入端口PA1 ;輸入數(shù)據(jù)到x(n)96FIR5: ADD *AR2+0%,*AR3+0%,A ;AH=x(n)+ ;x(n-7)(第一次) RPTZ B,#(size-1) ;B=0,下條指令執(zhí)行size次 FIRS *AR2+0%,*AR3+0%,COEF ;B+=AH*h0, ;AH=x(n-1)+x(n-6) STH B,y ;保存結(jié)果到y(tǒng) PORTW y,PA0 ;輸出結(jié)果到PA0 MAR *+AR2(2)% ;修正AR2,指向新緩 ; 沖區(qū)最老的數(shù)據(jù) MAR *AR3+% ;修正AR3,指向老緩 ;沖區(qū)最老的數(shù)據(jù) M

53、VDD *AR2,*AR3+0% ; 新緩沖區(qū)向老緩 ;沖區(qū)傳送一個(gè)數(shù) BD FIR5 ;執(zhí)行完下條指令后轉(zhuǎn)移FIR5并循環(huán) PORTR PA1,*AR2 ;輸入新數(shù)據(jù)至新緩沖區(qū) .end97第五節(jié) 用DSP實(shí)現(xiàn)IIR濾波器 1IIR濾波器的基本概念 N階無(wú)限沖激響應(yīng)(IIR)濾波器的脈沖響應(yīng)傳輸函數(shù)表達(dá)式為:其差分方程表達(dá)式可寫(xiě)為:98特 點(diǎn)y(n)由兩部分構(gòu)成:第一部分 是一個(gè)對(duì)x(n)的M節(jié)延時(shí)鏈結(jié)構(gòu),每節(jié)延時(shí)抽頭后加權(quán)相加,是一個(gè)橫向結(jié)構(gòu)網(wǎng)絡(luò);第二部分 也是一個(gè)N節(jié)延時(shí)鏈的橫向結(jié)構(gòu)網(wǎng)絡(luò),不過(guò)它是對(duì)y(n)的延時(shí),是個(gè)反饋網(wǎng)絡(luò)。若ai=0,IIR濾波器就變?yōu)镕IR濾波器,其脈沖傳輸函數(shù)只

54、有零點(diǎn),系統(tǒng)總是穩(wěn)定的,其單位沖激響應(yīng)是有限長(zhǎng)序列。而IIR濾波器的脈沖傳遞在Z平面上有極點(diǎn)存在,ai0,其單位沖激響應(yīng)是無(wú)限長(zhǎng)序列。99特 點(diǎn)IIR濾波器與FIR濾波器的一個(gè)重要區(qū)別是,IIR濾波器可以用較少的階數(shù)獲得很高的選擇特性,所用的存儲(chǔ)單元少,運(yùn)算次數(shù)少,具有經(jīng)濟(jì)、高效的特點(diǎn)。但是,在有限精度的運(yùn)算中,可能出現(xiàn)不穩(wěn)定現(xiàn)象。而且,選擇性越好,相位的非線性越嚴(yán)重,不像FIR濾波器可以得到嚴(yán)格的線性相位。因此,在相位要求不敏感的場(chǎng)合,如語(yǔ)言通信等,選用IIR濾波器較為合適;而對(duì)于圖像信號(hào)處理、數(shù)據(jù)傳輸?shù)纫圆ㄐ螖y帶信息的系統(tǒng),對(duì)線性相位要求較高,在條件許可的情況下,采用系數(shù)對(duì)稱FIR濾波器較

55、好。100 2 二階IIR濾波器的實(shí)現(xiàn)方法 對(duì)于一個(gè)高階的IIR濾波器,總可化成多個(gè)二階基本節(jié)(或稱二階節(jié))相級(jí)聯(lián)或并聯(lián)的形式 3個(gè)二階節(jié)級(jí)聯(lián)的六階IIR濾波器+z-1b0a1x(n)z-1b1+b2a2+z-1d0c1x1(n)z-1d1+d2c2+z-1f0e1x2(n)z-1f1+f2e2y(n)101二階節(jié)的標(biāo)準(zhǔn)形式由反饋通道和前向通道的差分方程構(gòu)成:反饋通道: x0=w(n)=x(n)+A1*x1+A2*x2前向通道: y(n)=B0*x0+B1*x1+B2*x2二階節(jié)IIR濾波器+z-1x0 x(n)x1z-1x2w(n)A1A2反饋通道B2B1B0+前向通道y(n)102(1)二

56、階IIR濾波器的單操作數(shù)指令實(shí)現(xiàn)法如存儲(chǔ)器分配圖所示。x0單元有三個(gè)用處:1)存放輸入數(shù)據(jù)x(n)2)暫時(shí)存放相加器的輸出x03)輸出數(shù)據(jù)y(n)。例5-30 編寫(xiě)二階IIR濾波器的程序。存儲(chǔ)器分配圖COEFB2B1B0A2數(shù)據(jù)存儲(chǔ)器A1x0 x1x2數(shù)據(jù)存儲(chǔ)器x(n),y(n)103 .title “IIR1.asm” ;給匯編程序取名 .mmregs ;定義存儲(chǔ)器映象寄存器 .def start ;定義標(biāo)號(hào)start的起始位置X0 .usect “x”,1 ;自定義3個(gè)單元的未初始化段xX1 .usect “x”,1 ;X2 .usect “x”,1 ;B2 .usect “COEF”,1

57、 ;自定義5個(gè)單元的未初始化段COEFB1 .usect “COEF”,1 ;B0 .usect “COEF”,1 ;A2 .usect “COEF”,1 ;A1 .usect “COEF”,1 ;PA0 .set 0 ;設(shè)置數(shù)據(jù)輸出端口I/O,PA0=0PA1 .set 1 ;設(shè)置數(shù)據(jù)輸入端口I/O,PA1=1 .datatable: .word 0, 0 ;x(n-1), x(n-2) .word 1*32768/10,2*32768/10,3*32768/10 ;B2,B1,B0 .word 5*32768/10,-4*32768/10 ;A2,A1104 .textstart: LD

58、#x0,DP ;以x0的地址為數(shù)據(jù)存儲(chǔ)器 ;頁(yè)指針起始位置 SSBX FRCT ;小數(shù)乘法 STM #x1,AR1 ;x1首地址傳給AR1 RPT #1 ;重復(fù)2次下條指令 MVPD #table,*AR1+ ;用程序空間的2個(gè) ;系數(shù)0對(duì)x1, x2單元清零 STM #B2,AR1 ;B2首地址傳給AR1 RPT #4 ;重復(fù)5次下條指令 MVPD #table+2,*AR1+ ;用5個(gè)系數(shù)對(duì) ; B2,B1,B0,A2,A1單元賦值105IIR1: PORTR PA1,x0 ;從PA1輸入數(shù)據(jù)到x(n) LD x0,16,A ;計(jì)算反饋通道,x0送A的16位高端字 LD x1,T ;x1送

59、T寄存器 MAC A1,A ;x0+x1*A1A LD x2,T ;x2送T寄存器 MAC A2,A ;x0+x1*A1+x2*A2A STH A,x0 ;暫存x0+x1*A1+x2*A2x0單元 MPY B2,A ;計(jì)算前向通道,x2*B2A LTD x1 ;x1送T寄存器,x1移至x2單元 MAC B1,A ;x2*B2+x1*B1A LTD x0 ;x0送T寄存器,x0移至x1單元 MAC B0,A ;x2*B2+x1*B1+x0*B0A STH A,x0 ;暫存y(n)=x2*B2+x1*B1+x0*B0 x0單元 BD IIR1 ;執(zhí)行完下條指令后循環(huán) PORTW x0,PA0 ;給

60、出結(jié)果y(n)到PA0端口 .end后向運(yùn)算前向運(yùn)算106(2)二階IIR濾波器的雙操作數(shù)指令實(shí)現(xiàn)法 乘法累加運(yùn)算利用雙操作數(shù)指令,數(shù)據(jù)和系數(shù)表在數(shù)據(jù)存儲(chǔ)器(DARAM),其存儲(chǔ)器分配圖如圖: 特 點(diǎn)COEFB2B1B0A2A1x2x1x0數(shù)據(jù)存儲(chǔ)器(DARAM)起始狀態(tài)數(shù)據(jù)存儲(chǔ)器(DARAM)AR3x(n)x1x0AR3x0y(n)AR4第1次迭代107例5-31 用雙操作數(shù)指令實(shí)現(xiàn)二階IIR濾波器。H(z)= .title “IIR2.ASM” ;給匯編程序取名 .mmregs ;定義存儲(chǔ)器映象寄存器 .def start ;定義標(biāo)號(hào)start的起始位置x2 .usect “x”,1 ;自

溫馨提示

  • 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)論