運用TMS320C54x匯編語言編寫定點數(shù)運算、浮點數(shù)運算程._第1頁
運用TMS320C54x匯編語言編寫定點數(shù)運算、浮點數(shù)運算程._第2頁
運用TMS320C54x匯編語言編寫定點數(shù)運算、浮點數(shù)運算程._第3頁
運用TMS320C54x匯編語言編寫定點數(shù)運算、浮點數(shù)運算程._第4頁
運用TMS320C54x匯編語言編寫定點數(shù)運算、浮點數(shù)運算程._第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一、定點數(shù)的運算在定點DSP芯片中,采用定點數(shù)進行數(shù)值運算,其操作數(shù)一般采用整數(shù)來表示。 一個整 數(shù)的最大表示范圍取決于 DSP芯片所給定的字長,一般為16位或24位。顯 然,字長越長,所能表示的數(shù)的范圍越大,精度也越高。在字長固定的前提下,所需要 達到的精度越高,那么所能表示的浮點數(shù)的范圍就會越小。DSP芯片的數(shù)以2的補碼形式表示。每個16位數(shù)用一個符號位來表示數(shù)的正 負,0表示數(shù) 值為正,l則表示數(shù)值為負。其余15位表示數(shù)值的大小。如:二進制數(shù) 0010000000000011b=8195二進制數(shù) 1111111111111100b= -4為了使得無論是無符號數(shù)還是符號數(shù),都可以使用同樣的

2、加法減法規(guī)則,符號數(shù) 中的負 數(shù)用正數(shù)的補碼表示。對DSP芯片而言,參與數(shù)值運算的數(shù)就是16位的整數(shù)。但在許多情況下,數(shù)學(xué)運算過程中的數(shù)不一定都是整數(shù)。那么,DSP芯片是如何處理小數(shù)的呢?這其中的關(guān)鍵就是數(shù)的定標,由程序員來 確定一個數(shù)的小數(shù)點處于16位中的哪一位。通過設(shè)定小數(shù)點在16位數(shù)中的不同位置,就可以表示不同大小和不同精度的小 數(shù)了。數(shù)的定標有Q表示法和S表示法兩種。定點數(shù)的加減法運算較為簡單,只需遵循二進制數(shù)加減法運算規(guī)則相加減即 可。如倆個8位數(shù)具有相同的Qn格式保證隱含的小數(shù)點對齊。下圖中兩個8位數(shù)相加,有溢出。溢出是由于字長有限運算結(jié)果超出數(shù)值的表 示范圍引起的。定點數(shù)的乘法運

3、算DSP處理器都有硬件乘法器和乘法指令,可實現(xiàn)單周期乘法運算,二進制乘法運 算包含一系列的移位和加法運算。 定點數(shù)乘法運算不要求相乘數(shù)有相同的 Qn格 式。兩個相乘數(shù)分別 為Qn和Qm格式,字長為N ,結(jié)果為Q(n+m格式,字長為 2N。如:以下兩個相乘數(shù)分別為Q7和Q6格式,8位字長。兩個定點小數(shù)作乘法運算,結(jié) 果左移一位,保存高位得到運算結(jié)果,結(jié)果為Qm (m nm格式。小數(shù)乘小數(shù),整數(shù)乘小數(shù)都要求 對乘積結(jié)果左移一位后,保存高位。 整數(shù)與整數(shù)相乘,須查詢標志位確定保存的位數(shù),結(jié)果不需要左移一位。DSP處理器帶有可選的自動左移一位的功能,消除移位操作 的時間開銷0/000000b (05

4、QXOUOOOOOb (1.5 Q(000F00000000000b (0.75 Q 左移一位:00.11000000000000b (075 Q 取高8位:00.110000b (0.75 QI定點數(shù)的除法運算除法是乘法的逆運算,包括一系列移位和條件減法運算,需要用除法子程序?qū)?現(xiàn)。大多數(shù)DSP處理器不提供單周期除法指令。如果除法運算中包含負數(shù),應(yīng)將負數(shù)變換為等值的正數(shù),然后作除法運算,最后加上正確的符號。下面詳細分析32位整數(shù)乘法,32位小數(shù)乘法以及有符號/無符號整數(shù)除法的程 序指令。X000/1100(左移一位:00,11000(X1xoY1YDX0 x Y0Lnsin-d multi

5、plicationXlxYO32位定點數(shù)乘法運算示意圖32位整數(shù)乘法參考程序:;This rout ine multiplies two 32-bit sig ned in tegers result ing;in a 64-bit product. The opera nds are fetched from data memory and;the result is written back to data memory.;Data Storage:;X1,X0 32-bit opera nd;Y1,Y0 32-bit opera nd;W3,W2,W1,W0 64-bit product

6、;Entry Con diti ons:;SXM = 1 , OVM = 0.mmregsSTACK: .usect “STACK ,10設(shè)置堆棧段.bss X0,1.bss X1,1.bss Y0,1.bss Y1,1.bss W0,1.bss W1,1.bss W2,1.bss W3,1.def start.datatable1: .word 1.word 2table2: .word 3.word 4.textstart: STM #X0,AR2 ;將 X0 的首地址存入 AR2STM #Y0,AR3 ;將Y0的首地址存入 AR3RPT #1 ;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPD tabl

7、e1,*AR2+ ;將tablel開始的兩個值傳給 X0RPT #1 ;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPD table2,*AR3+ ;將table2開始的兩個值傳給 Y0STM #X0,AR2 ;將X0的首地址存入 AR2STM #Y0,AR3 ;將Y0的首地址存入 AR3LD *AR2,T ; T=X0MPYU *AR3+,A ; A=無符號數(shù)X0?無符號數(shù) Y0STL A,W0 ;將 A 送入 W0LD A,-16,A ; A 值左移 16 位MACSU *AR2+,*AR3-,A ; A+= Y1 ?無符號數(shù) X0MACSU *AR3+,*AR2,A ; A+= X1 ?無符號數(shù) Y0S

8、TL A,W1 ;將 A 送入 W1LD A,-16,A ; A 值左移 16 位MAC *AR2,*AR3,A ; A+=11X Y ?STL A,W2 ; W2=A 的低 16 位STH A,W3 ; W3=A 的高 16位here: B here程序分析:如原理圖所示,32位整數(shù)乘法的計算過程是將兩個 32位的數(shù)X和丫 各自分成XO、X1和Y0、丫1的16位數(shù)。然后進行XO?YO, A值左移16位, Y1?X0, X1?Y0, A值再左移16位,X1? Y1的操作。需要注意的是在32位乘法運 算中,實際上包括了三種乘法運算:U ?U、S ?U和S ?S。 U指無符號數(shù),S指帶 符號數(shù)。在

9、編程時,要用到以下三條乘法指令:MACSU Xmem,Ymem,src ;無符號數(shù)與帶符號數(shù)相乘并累加 ;MPYU Smem,dst ; 無符號數(shù)相乘;MAC Xmem,Ymem,src ;兩個帶符號數(shù)數(shù)相乘并累加。32位小數(shù)乘法參考程This routine multiplies two Q31 signed integers;result ing in a Q30 product. The opera nds are fetched from data memory and ; the result is writte n back to data memory;data storege:

10、;X1,X0 Q31 opera nd;Y1,Y0 Q31 opera nd;W1,W0 Q30 product;Entry Con diti ons:;SXM = 1 , OVM =0 ; .mmregsSTACK: .usect“STACK ,100h.bss X0,1.bss X1,1.bss Y0,1.bss Y1,1.bss W0,1.bss W1,1.def start.datatablel: .word 1.word 2table2: .word 3.word 4.textstart: STM #X0,AR2 ;將 X0 的首地址存入 AR2STM #Y0,AR3 ;將Y0的首地

11、址存入 AR2RPT #1 ;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPD table1,*AR2+ ;將table1開始的兩個值傳給 X0RPT #1 ;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPD table2,*AR3+ ;將tablel開始的兩個值傳給 YOSTM #X0,AR2 ;將XO的首地址存入 AR2STM #Y1,AR3 ;將Y1的首地址存入 AR3LD #0,A ;將 A 置 0MACSU *AR2+,*AR3-,A ; A=X0 ? Y1MACSU *AR3+,*AR2,A ; A+=X1? Y0LD A,-16,A ;將 A 左移 16 位MAC *AR2,*AR3,A ; A+=X1 ? Y

12、1STL A,W0 ;將結(jié)果A的低16位送入 W0STH A,W1 ;將結(jié)果A的高16位送入 W0here: B here程序分析:小數(shù)乘法與整數(shù)乘法的程序設(shè)計大致類似,不同在于小數(shù)乘法少了 X 與丫的低位相乘部分,即X0與Y0的相乘部分。這是因為兩個整數(shù)相乘時,乘積總 是向左增長”這意味著多次相乘后,乘積將會很快超出定點器件的控制范圍。但是,當兩個小數(shù)相乘時,乘積總是向右增長”這就意味著超出定點器件數(shù)據(jù)范圍 將是我們不感興趣的部分,也就是指X0與Y0相乘得到的結(jié)果那部分,因此可不必 計算這部分乘積。有符號/無符號整數(shù)除法參考程序丿 J J J J J J J J J J J J J J J

13、J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J;Descriptio n: 32 bit by 16 bit Un sig ned In teger Divide And Modulus;32位除16位的無符號整數(shù)除法.

14、mmregsSTACK: .usect “STACK ,100h.bss d_NumL,1為分子低16位分配1個單元.bss d_NumH,1為分子高16位分配1個單元.bss d_De n,1為分母分配1個單元.bss d_QuotL,1為商的低16位分配1個單元.bss d_QuotH,1為商的高16位分配1個單元.bss d_Rem,1 ;.def DivModUI32.def start.datatable1: .word 1.word 2table2: .word 3.textDivModUI32: RSBX SXM ; sign extention mode offLD d_Num

15、H,A ;將分子高位移到累加器 ARPT #(16-1 ;重復(fù)執(zhí)行下一條指令15次SUBC d_De n,A ; A減去分母的值STL A, d_QuotH ;將A的值存到商的高位XOR d_QuotH,A ;將A的低16位清零OR d_NumL,A ; AL = NumLRPT #(16-1 ;重復(fù)執(zhí)行下一條指令15次SUBC d_De n,A ; A減去分母的值STL A, d_QuotL ;將A的值存到商的低位STH A,d_Rem ;RETstart: STM d_NumL,AR2 ;將分子低16位所在單元的地址傳給 AR2STM d_De n, AR3 ;將分母所在單元的地址傳給 A

16、R2RPT #1 ;重復(fù)執(zhí)行兩次下一條指令MVPD table1,*AR2+ ;將table1開始的兩個值傳給 AR2MVPD table2,*AR3 ;將 table2開始的值傳給 AR3CALL DivModUI32 ;調(diào)用除法子程序here: B here;Descriptio n: 16 bit by 16 bit Un sig ned In teger Divide And Modulus;16位除16位的無符號整數(shù)除法.mmregsSTACK: .usect “STACK ,100h.bss d_Num,1為分子分配單元.bss d_De n,1為分母分配單元.bss d_Quot

17、,1為商分配單元.bss d_Rem,1.def DivModUI16 ;定義16位除法子程序.def start.datatable1: .word 1000table2: .word 5.textDivModUI16: RSBX SXM ; sign extention mode offLD d_Num,A ;將分子移到累加器ARPT #(16-1 ;重復(fù)執(zhí)行下面指令16次SUBC d_Den,A ; 16次的減法循環(huán),完成除法STL A,d_Quot ;將A的結(jié)果保存為商STH A,d_RemRETsta比STM d_NumL,AR2 ;將分子低16位所在單元的首地址傳給 AR2STM

18、d_De n,AR3 ;將分子低16位所在單元的首地址傳給 AR3MVPD table1,*AR2 ;將 tablel 開始的值傳給 AR2MVPD table2,*AR3 ;將 table2開始的值傳給 AR3CALL DivModUI16 ;調(diào)用除法子程序here: B here程序分析:DSP做除法運算時,通過減法指令與重復(fù)循環(huán)指令實現(xiàn)無符號除法運 算。需要注意的是,當被除數(shù)的絕對值 除數(shù)的絕對值時,商為小數(shù);當被除數(shù)的絕對 值 除數(shù)的絕對 值時,商為整數(shù)。;Description: 32 bit by 16 bit signed Integer Divide And Modulus;3

19、2位除16位有符號除法.mmregsSTACK: .usect “STACK ,100h.bss d_NumL,1為分子低16位分配單元.bss d_NumH,1為分子高16位分配單元.bss d_De n,1為分母分配單元.bss d_QuotL,1為商低16位分配單元.bss d_QuotH,1為商高16位分配單元.bss d_Rem,1.def DivModl32 ;定義32位除法子程序.def start.datatablel: .word 1.word 2table2: .word 3.textDivModI32: SSBX SXM ; sign extention mode onL

20、D d_De n,16,A ;將分母移到累加器MPYA d_NumH ; B has sign of quotie ntABS A ;分母取絕對值STH A ,d_Rem ; d_Rem = abs(De n temporarilyLD d_NumH,16,A ;將分子高16位移到AADDS d_NumL,A ; A 加上分子低16位ABS A ;取A絕對值STH A,d_QuotH ; d_QuotH = abs(NumH temporarilySTL A,d_QuotL ; d_QuotL = abs(NumLtemporarilyLD d_QuotH,A ;將商的高位移到 ARPT #(

21、16-1 ;重復(fù)執(zhí)行下條指令16次SUBC d_Rem,A ; 16次減法循環(huán)運算,完成除法STL A,d_QuotH ; AH = abs(QuotH ;XOR d_QuotH,A ; clear ALOR d_QuotL,A ; AL = abs(NumLRPT #(16-1 ;重復(fù)執(zhí)行下條指令16次SUBC d_Rem,A ; 16次減法循環(huán)運算,完成除法STL A,d_QuotL ; AL = abs(QuotLSTH A,d_Rem ; AH = RemBCD DivModl32Skip,BGEQ ; if B neg, then Quot = -abs(Quot LD d_Quot

22、H,16,A ;將商的高16位移到AADDS d_QuotL,A ; A加上商的低16位NEG A ;如果B0執(zhí)行求反,否則跳過此指令STH A,d_QuotH ;商的高位存回原處STL A,d_QuotL ;商的低16位存回原處DivModl32Skip: RET ;定義32位除法返回子程序start: STM d_NumL,AR2 ;將分子低16位首地址傳給 AR2STM d_Den,AR3 ;將分母首地址傳給 AR2RPT #1 ;重復(fù)執(zhí)行下條指令兩次MVPD table1,*AR2+ ;將 tablel 開始的兩個值傳給 AR2 MVPD table2,*AR3 ;將 table2開始

23、的值傳給 AR2CALL DivModl32 ;調(diào)用32位除法指令here: B here;Description: 16 bit by 16 bit signed Integer Divide And Modulus;16位除16位有符號除法.mmregsSTACK: .usect“STACK ,100h.bss d_Num,1為分子分配單元.bss d_De n,1為分母分配單元.bss d_Quot,1為商分配單元.bss d_Rem,1.def DivModI16 ;定義16位除法子程序.def start.datatable1: .word 16table2: .word -2.te

24、xtDivModl16: SSBX SXM ; sign extention mode onSTM #d_Quot,AR2 ;將商的值傳給AR2LD d_Den,16,A ;將分母移到 A累加器MPYA d_Num ; B has sign of quotie ntABS A ;分母取絕對值STH A,d_Rem ; d_Rem = abs(De n temporarily ;LD d_Num,A ;將分子移到A累加器ABS A ;分子取絕對值RPT #(16-1 ;重復(fù)執(zhí)行下條指令16次SUBC d_Rem,A汾子循環(huán)相減16次,完成除法STL A,d_Quot ;將A的值保存到商STH A

25、,d_Rem ; AH = RemLD #0,A ;將A清零SUB d_Quot,16,A ; AH = -abs(QuotSACCD A,*AR2,BLT ; If B neg, Quot =-abs(QuotRETstart: STM d_NumL,AR2 ;將分子低16位首地址傳給 AR2STM d_Den,AR3 ;將分母16位首地址傳給 AR2MVPD table1,*AR2 ;將 table1 開始的值傳給 AR2MVPD table2,*AR3 ;將 tablel 開始的值傳給 AR2CALL DivModl16 ;調(diào)用除法子程序here: B here程序分析:有符號數(shù)除法與無

26、符號數(shù)出發(fā)類似。不同在于,有符號數(shù)除法得到的商的結(jié)果可能為正,也可能為負。因此在用絕對值求出商后,不能直接存入quot 段。先要判斷商值為正 還是為負。如果有符號數(shù)的商為負值時,需要變號,用到取反 指令neg A,然后才能將值存 入quote段中。二、浮點數(shù)的運算在數(shù)字信號處理中,定點運算是將數(shù)據(jù)的整數(shù)和小數(shù)部分分開,小數(shù)點在一個固 定位置,其優(yōu)點是硬件實現(xiàn)比較容易,但動態(tài)范圍受到限制。為了擴大數(shù)據(jù)的范圍和精度,需要采用浮點運算。在C54X上實現(xiàn)浮點運算,操 作數(shù)須先變成定點數(shù),然后再返回浮點數(shù)。通過規(guī)格化輸入數(shù)據(jù),可以將定點值變換 為浮點值。表示方法一個浮點數(shù)由尾數(shù) m、基數(shù)b和指數(shù)e三部分

27、組成,即bf N =me ?浮點數(shù)的加減法運算,計算過程是左移指數(shù)較小的操作數(shù)的尾數(shù),使得兩個操 作數(shù)的指數(shù)一致,相差幾位移幾位,再把尾數(shù)相加(減,歸一化后輸出。主要是要比較 兩個操作數(shù)指數(shù)的大小,這樣才能決定到底是尾數(shù)直接相加(減還是移位以后再相加 (減。如:若 e1e2則 b1b2-b1b1x1+x2=m1e +m2e e?(b2-b1b1=m1+m2e e?(。浮點數(shù)的乘法運算,要經(jīng)過分離指數(shù)和尾數(shù) 泄行算 術(shù)運算,估計結(jié)果的符號位,以及最后的歸一化存儲這幾個過程。做乘法運算時要遵 循乘法運算的規(guī)則把指數(shù)相加,尾數(shù)相乘。即:12x1x2=m m e b b +? (12。需要注意的是,由

28、于C54X的乘法器在一個指令周期內(nèi) 只能完成17bit*17bit 的二進制補碼運算,故相乘運算需要分步實現(xiàn)。浮點數(shù)的除法運算與乘法運算浮點數(shù)的乘法運算類似,同樣要經(jīng)過分離指數(shù)和 尾數(shù),估計結(jié)果的符號位,對指數(shù)進行相減運算,對尾數(shù)進行相除運算,以及最后的 歸一化存儲這幾個過程。即:12x1x2=m m e b b -爭(12。不同的是,在執(zhí)行除法運算的時候,需要將除數(shù)和被除數(shù)都由24bit左移成 32bit的形式,以減少誤差。不管是浮點數(shù)的加減運算還是乘除運算,完成對操作數(shù)之間的計算后就需要對 結(jié)果數(shù)進行歸一化操作。所謂歸一化操作就是把數(shù)據(jù)格式轉(zhuǎn)換為第一位為符號位,緊接著的一位是非零的數(shù)的格式

29、。歸一化完后要再把歸一化后的定點數(shù)轉(zhuǎn)變?yōu)楦?點數(shù)。下面來以浮點數(shù)的乘法運算為例具體分析浮點數(shù)的運算過程:設(shè)是對兩個數(shù)x1和x2進行乘法運算。將被乘數(shù)數(shù) x1的尾數(shù)分為Q , R和S 三部分,Q表示尾數(shù)的高位的8bit , R和S表示尾數(shù)低位的兩字節(jié)。同樣,乘數(shù)x2也 被分為X , 丫和Z三部分,X表示尾數(shù)的高位,丫和Z表示尾數(shù)低位的兩字節(jié)。于是 有需要注意的是,進行的這種32bit*32bit的運算是有精度損失的。如上圖所示,32 位數(shù)0 Q RS0 X 丫 ZRS * YZRS * OX0Q * YZOQ * OXresult op5的尾數(shù)op6的尾數(shù) 只存儲了結(jié)果 的高16位高16位 始終

30、為0結(jié)果只表示了 64bit中的32bit+0QRS乘以32位數(shù)0XYZ所得的結(jié)果應(yīng)該是一個64bit的值。由于0Q*0X的 高16bit始終為0,所以結(jié)果可以用一個48位的值準確表示。 但是用于存儲結(jié)果的 存儲單元長度只有32bit ,于是只有將最低的16bit省略掉,即把RS*YZ的低16bit 略去,因此最后得到的是一個有精度 損失的32bit結(jié)果。浮點數(shù)乘法源程序如下:.title “ float.asm ”.def startSTACK: .usect “STACK ,100.bss x1,1 ; x1是被乘數(shù).bss x2,1 ; x2是被乘數(shù).bss e1,1 ; e1是被乘數(shù)的

31、指數(shù).bss m1,1 ; m1是被乘數(shù)的尾數(shù).bss e2,1 ; e2是乘數(shù)的指數(shù).bss m2,1 ; m2是乘數(shù)的尾數(shù).bss ep,1 ; ep是乘積的指數(shù).bss mp,1 ; mp是成績的尾數(shù).bss product;product是乘積.bss temp,1 ; tempi暫存單元.datatable: .word 3*32768/10 ; 0.3.word -8*32768/10 ; -0.8.textsta rt: STM #STACK+100,SP ;設(shè)堆棧指針MVPD table,x1 ;將 x1 和 x2 送入 RAMMVPD table+1,x2LD x1,16,A ;將 x1 送入 A

溫馨提示

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

評論

0/150

提交評論