基本算術(shù)運(yùn)算_第1頁
基本算術(shù)運(yùn)算_第2頁
基本算術(shù)運(yùn)算_第3頁
基本算術(shù)運(yùn)算_第4頁
基本算術(shù)運(yùn)算_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、電子科技大學(xué) 通信 學(xué)院標(biāo) 準(zhǔn) 實(shí) 驗(yàn) 報(bào) 告(實(shí)驗(yàn))課程名稱 DSP設(shè)計(jì)與實(shí)踐 電子科技大學(xué)教務(wù)處制表電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師:向超實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)時(shí)間:1、 實(shí)驗(yàn)室名稱:科研樓B-341 二、實(shí)驗(yàn)項(xiàng)目名稱:基本算術(shù)運(yùn)算三、實(shí)驗(yàn)學(xué)時(shí):4四、實(shí)驗(yàn)原理:(1)定點(diǎn)DSP中數(shù)據(jù)表示方法 C54X是16位的定點(diǎn)DSP。一個(gè)16位的二進(jìn)制數(shù)既可以表示一個(gè)整數(shù),也可以表示一個(gè)小數(shù)。當(dāng)它表示一個(gè)整數(shù)時(shí),其最低位(D0)表示,D1位表示,次高位(D14)表示。如果表示一個(gè)有符號(hào)數(shù)時(shí),最高位(D15)為符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)。例如,07FFFH表示最大的正數(shù)3

2、2767(十進(jìn)制),而0FFFFH表示最大的負(fù)數(shù)-1(負(fù)數(shù)用2的補(bǔ)碼方式顯示)。當(dāng)需要表示小數(shù)時(shí),小數(shù)點(diǎn)的位置始終在最高位后,而最高位(D15)表示符號(hào)位。這樣次高位(D14)表示,然后是,最低位(D0)表示。所以04000H表示小數(shù)0.5,01000H表示小數(shù),而0001H表示16位定點(diǎn)DSP能表示的最小的小數(shù)(有符號(hào))=0.000030517578125。在后面的實(shí)驗(yàn)中,除非有特別說明,我們指的都是有符號(hào)數(shù)。在C54X中,將一個(gè)小數(shù)用16位定點(diǎn)格式來表示的方法是用乘以該小數(shù),然后取整。 從上面的分析可以看出,在DSP中一個(gè)16進(jìn)制的數(shù)可以表示不同的十進(jìn)制數(shù),或者是整數(shù),或者是小數(shù)(如果表示

3、小數(shù),必定小于1),但僅僅是在做整數(shù)乘除或小數(shù)乘除時(shí),系統(tǒng)對(duì)它們的處理才是有所區(qū)別的,而在加減運(yùn)算時(shí),系統(tǒng)都當(dāng)成整數(shù)來處理。 (2)實(shí)現(xiàn)16定點(diǎn)加法 C54X中提供了多條用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于無符號(hào)數(shù)的加法運(yùn)算,ADDC用于帶進(jìn)位的加法運(yùn)算(如32位擴(kuò)展精度加法),而ADDM專用于立即數(shù)的加法。ADD指令的尋址方式很多,其詳細(xì)使用說明請(qǐng)參考TMS320C54X實(shí)用教程。在本實(shí)驗(yàn)中,我們使用下列代碼來說明加法運(yùn)算:ldtemp1,a;將變量temp1裝入寄存器Aaddtemp2,a;將變量temp2與寄存器A相加,結(jié)果放入A中stla,add_r

4、esult ;將結(jié)果(低16位)存入變量add_result中。注意,這里完成計(jì)算temp3=temp1+temp2,我們沒有特意考慮temp1和temp2是整數(shù)還是小數(shù),在加法和下面的減法中整數(shù)運(yùn)算和定點(diǎn)的小數(shù)運(yùn)算都是一樣的。(3)實(shí)現(xiàn)16位定點(diǎn)減法C54X中提供了多條用于減法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于無符號(hào)數(shù)的減法運(yùn)算,SUBB用于帶進(jìn)位的減法運(yùn)算(如32位擴(kuò)展精度的減法),而SUBC為移位減,DSP中的除法就是用該指令來實(shí)現(xiàn)的。SUB指令與ADD指令一樣,有許多的尋址方式,其詳細(xì)使用說明請(qǐng)參考TMS320C54X實(shí)用教程。在本實(shí)驗(yàn)中,我們使用下列代碼

5、來說明減法運(yùn)算:stm#temp1,ar3;將變量temp1的地址裝入ar3寄存器stm#temp3,ar2;將變量temp3的地址裝入ar3寄存器sub*ar2+, *ar3,b ;將變量temp3左移16位同時(shí)變量temp1也左移16位,然后;相減,結(jié)果放入寄存器B(高16位)中,同時(shí)ar2加1。sthb,sub_result;將相減的結(jié)果(高16位)存入變量sub_result。(4)實(shí)現(xiàn)16定點(diǎn)整數(shù)乘法 在C54X中提供了大量的乘法運(yùn)算指令,其結(jié)果都是32位,放在A或B寄存器中。乘數(shù)在C54X的乘法指令很靈活,可以是T寄存器、立即數(shù)、存貯單元和A或B寄存器的高16位。有關(guān)乘法指令的詳細(xì)

6、使用說明請(qǐng)參考TMS320C54X實(shí)用教程。在C54X中,一般對(duì)數(shù)據(jù)的處理都當(dāng)做有符號(hào)數(shù),如果是無符號(hào)數(shù)乘時(shí),請(qǐng)使用MPYU指令。這是一條專用于無符號(hào)數(shù)乘法運(yùn)算的指令,而其它指令都是有符號(hào)數(shù)的乘法。在本實(shí)驗(yàn)中,我們使用下列代碼來說明整數(shù)乘法運(yùn)算:rsbxFRCT;清FRCT標(biāo)志,準(zhǔn)備整數(shù)乘ldtemp1,T;將變量temp1裝入T寄存器mpytemp2,a;完成temp2*temp1,結(jié)果放入A寄存器(32位)例如,當(dāng)temp1=1234H(十進(jìn)制的4660),temp2=9876H(十進(jìn)制的-26506),乘法的結(jié)果在A寄存器中為0F8A343F8H(十進(jìn)制的-123517960)。這是一個(gè)

7、32位的結(jié)果,需要兩個(gè)內(nèi)存單元來存放結(jié)果:stha,mpy_I_h;將結(jié)果(高16位)存入變量mpy_I_hstla,mpy_I_l;將結(jié)果(低16位)存入變量mpy_I_l當(dāng)temp1=10H(十進(jìn)制的16),temp2=05H(十進(jìn)制的5),乘法結(jié)果在A寄存器中為00000050H(十進(jìn)制的80)。對(duì)于這種情況,僅僅需要保存低16位即可:stla,mpy_I_l;將結(jié)果(低16位)存入變量mpy_I_l(5)實(shí)現(xiàn)16定點(diǎn)小數(shù)乘法 在C54X中,小數(shù)的乘法與整數(shù)乘法基本一致,只是由于兩個(gè)有符號(hào)的小數(shù)相乘,其結(jié)果的小數(shù)點(diǎn)的位置在次高的后面,所以必須左移一位,才能得到正確的結(jié)果。C54X中提供了

8、一個(gè)狀態(tài)位FRCT,將其設(shè)置為1時(shí),系統(tǒng)自動(dòng)將乘積結(jié)果左移移位。但注意整數(shù)乘法時(shí)不能這樣處理,所以上面的實(shí)驗(yàn)中一開始便將FRCT清除。兩個(gè)小數(shù)(16位)相乘后結(jié)果為32位,如果精度允許的話,可以只存高16位,將低16位丟棄,這樣仍可得到16位的結(jié)果。在本實(shí)驗(yàn)中,我們使用下列代碼來說明小數(shù)乘法運(yùn)算:ssbxFRCT;FRCT=1,準(zhǔn)備小數(shù)乘法ldtemp1,16,a;將變量temp1裝入寄存器A的高16位mpyatemp2;完成temp2乘寄存器A的高16位,結(jié)果在B中,同時(shí);將temp2裝入T寄存器sthb,mpy_f;將乘積結(jié)果的高16位存入變量mpy_f例如,temp1=temp2=400

9、0H(十進(jìn)制的0.5),兩數(shù)相乘后結(jié)果為20000000(十進(jìn)制的=0.25)。再如,temp1=0ccdH(十進(jìn)制的0.1),temp2=0599aH(十進(jìn)制的0.7),兩數(shù)相乘后B寄存器的內(nèi)容為08f5f0a4H(十進(jìn)制的0.07000549323857)。如果僅保存結(jié)果的高16位08f5H(十進(jìn)制的0.06997680664063)。有時(shí)為了提高精度,可以使用RND或使用MPYR指令對(duì)低16位做四舍五入的處理。(6)實(shí)現(xiàn)16定點(diǎn)整數(shù)除法 在C54X中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法來代替,除以某個(gè)數(shù)相當(dāng)于乘以其倒數(shù),所以先求出其倒數(shù),然后相乘。這種方法對(duì)于除

10、以常數(shù)特別適用。另一種方法是使用SUBC指令,重復(fù)16次減法完成除法運(yùn)算。下面我們以temp1/temp2為例,說明如何使用SUBC指令實(shí)現(xiàn)整數(shù)除法。其中變量temp1為被除數(shù),temp2為除數(shù),結(jié)果即商存放在變量temp3中。在完成整數(shù)除法時(shí),先判斷結(jié)果的符號(hào)。方法是將兩數(shù)相乘,保存A或B的高16位以便判斷結(jié)果的符號(hào)。然后只做兩個(gè)正數(shù)的除法,最后修正結(jié)果的符號(hào)。為了實(shí)現(xiàn)兩個(gè)數(shù)相除,先將被除數(shù)裝入A或B的低16位,接著重復(fù)執(zhí)行SUBC指令,用除數(shù)重復(fù)減16次后,除法運(yùn)算的商在累加器的低16位,余數(shù)在高16位。詳細(xì)代碼如下:ldtemp1,T;將被除數(shù)裝入T寄存器mpytemp2,A;除數(shù)與被除

11、數(shù)相乘,結(jié)果放入A寄存器ldtemp2,B;將除數(shù)temp2裝入B寄存器的低16位absB;求絕對(duì)值stlB,temp2;將B寄存器的低16位存回temp2ldtemp1,B;將被除數(shù)temp1裝入B寄存器的低16位absB;求絕對(duì)值rpt#15;重復(fù)SUBC指令16次subctemp2,b;使用SUBC指令完成除法運(yùn)算bcddiv_end,agt;延時(shí)跳轉(zhuǎn),先執(zhí)行下面兩條指令,然后判斷A,若A>0,則;跳轉(zhuǎn)到標(biāo)號(hào)div_end,結(jié)束除法運(yùn)算stlB,quot_i;將商(B寄存器的低16位)存入變量quot_isthB,remain_i;將余數(shù)(B寄存器的高16位)存入變量remain_

12、ixorB;若兩數(shù)相乘的結(jié)果為負(fù),則商也應(yīng)為負(fù)。先將B寄存器清0subquot_i,B;將商反號(hào)stlB,quot_i;存回變量quot_i中div_end:上面給出的是整數(shù)除法的通用程序,在實(shí)際應(yīng)用中可以根據(jù)具體情況做簡化。如正數(shù)除法可以直接將被除數(shù)temp1裝入B寄存器的低16位,然后用SUBC指令循環(huán)減除數(shù)temp2,減完后B寄存器中低16位為商,高16位為余數(shù),不用判斷符號(hào),從而節(jié)省時(shí)間。例如temp1=10H(十進(jìn)制的16),temp2=5,兩數(shù)相除后商為3(在B寄存器的低16位),余數(shù)為1(在B寄存器的高16位)。(7)實(shí)現(xiàn)16定點(diǎn)小數(shù)除法 在C54X中實(shí)現(xiàn)16位的小數(shù)除法與前面的

13、整數(shù)除法基本一致,也是使用循環(huán)的SUBC指令來完成。但有兩點(diǎn)需要注意:第一,小數(shù)除法的結(jié)果一定是小數(shù)(小于1),所以被除數(shù)一定小于除數(shù)。這與整數(shù)除法正好相反。所以在執(zhí)行SUBC指令前,應(yīng)將被除數(shù)裝入A或B寄存器的高16位,而不是低16位。其結(jié)果的格式與整數(shù)除法一樣,A或B寄存器的高16位為余數(shù),低16位為商。第二,與小數(shù)乘法一樣,應(yīng)考慮符號(hào)位對(duì)結(jié)果小數(shù)點(diǎn)的影響。所以應(yīng)對(duì)商右移一位,得到正確的有符號(hào)數(shù)。其詳細(xì)代碼如下:ldtemp1,T;將被除數(shù)裝入T寄存器mpytemp2,A;除數(shù)與被除數(shù)相乘,結(jié)果放入A寄存器ldtemp2,B;將除數(shù)temp2裝入B寄存器的低16位absB;求絕對(duì)值stlB

14、,temp2;將B寄存器的低16位存回temp2ldtemp1,16,B;將被除數(shù)temp1裝入B寄存器的高16位absB;求絕對(duì)值rpt#15;重復(fù)SUBC指令16次subctemp2,b;使用SUBC指令完成除法運(yùn)算and#0ffffh,B;將B寄存器的高16位清為0。這時(shí)余數(shù)被丟棄,僅保留商bcddiv_end,agt;延時(shí)跳轉(zhuǎn),先執(zhí)行下面兩條指令,然后判斷A,若A>0,則;跳轉(zhuǎn)到標(biāo)號(hào)div_end,結(jié)束除法運(yùn)算stlB,-1,quot_f;將商右移一位后存入變量quot_f,右移是為了修正符號(hào)位xorB;若兩數(shù)相乘的結(jié)果為負(fù),則商也應(yīng)為負(fù)。先將B寄存器清0subquot_f,B;

15、將商反號(hào)stlB,quot_f;存回變量quot_f中div_end: 注意,上面的C54X的16位定點(diǎn)有符號(hào)小數(shù)除法通用程序沒有保留余數(shù),商保存在變量temp3中。舉一個(gè)例子,當(dāng)temp1=2cccH(十進(jìn)制的0.35),temp2=55c2H(十進(jìn)制的0.67),兩數(shù)相除的結(jié)果為temp3=42dcH(十進(jìn)制的0x42dc0.52233)。五、實(shí)驗(yàn)?zāi)康模杭?、減、乘、除是數(shù)字信號(hào)處理中最基本的算術(shù)運(yùn)算。DSP中提供了大量的指令來實(shí)現(xiàn)這些功能。本實(shí)驗(yàn)學(xué)習(xí)使用定點(diǎn)DSP實(shí)現(xiàn)16位定點(diǎn)加、減、乘、除運(yùn)算的基本方法和編程技巧。六、實(shí)驗(yàn)內(nèi)容: 本實(shí)驗(yàn)需要使用C54X匯編語言實(shí)現(xiàn)加、減、乘、除的基本運(yùn)算

16、,并通過DES的存貯器顯示窗口觀察結(jié)果。 (1).編寫實(shí)驗(yàn)程序代碼本實(shí)驗(yàn)的匯編源程序代碼主要分為六個(gè)部分:加法、減法、整數(shù)乘法、小數(shù)乘法、整數(shù)除法和小數(shù)除法。每個(gè)部分后面都有一條需要加斷點(diǎn)的標(biāo)志語句:nop當(dāng)執(zhí)行到這條加了斷點(diǎn)的語句時(shí),程序?qū)⒆詣?dòng)暫停。這時(shí)你可以通過“存貯器窗口”檢查計(jì)算結(jié)果。當(dāng)然你看到的結(jié)果都是十六進(jìn)制的數(shù)。實(shí)驗(yàn)源程序請(qǐng)參見第5部分。 (2).在simulator上調(diào)試運(yùn)行,并觀察結(jié)果 在完成實(shí)驗(yàn)程序代碼的輸入,并使用匯編批處理ASM.BAT進(jìn)行編譯并連接后,就可以在simulator上調(diào)試運(yùn)行。七、實(shí)驗(yàn)器材(設(shè)備、元器件):計(jì)算機(jī)8、 實(shí)驗(yàn)步驟: a. 啟動(dòng)simulato

17、r實(shí)驗(yàn)系統(tǒng)軟件sim54Xw.exe。b. 在調(diào)試界面的左下腳命令行欄輸入load exer1.out,或單擊菜單欄下面的“Load”選項(xiàng),并在彈出的File Name對(duì)話框中鍵入exer1.out裝入基本算術(shù)運(yùn)算實(shí)驗(yàn)程序,這時(shí)應(yīng)能在“反匯編”窗口看到程序代碼。c. 用鼠標(biāo)選中“Memory”窗口,并在其中選擇要查看的存貯器地址段:0x0800x08e。d. 在反匯編窗口中在每個(gè)“nop”指令處都設(shè)一個(gè)斷點(diǎn),方法有兩種:1.用鼠標(biāo)單擊該指令將其點(diǎn)亮即可。2.在菜單欄中選擇“Break”à”Add”,然后在彈出的對(duì)話框中鍵入欲加斷點(diǎn)的地址即可。e. 單擊菜單欄下的“Run=F5”按鈕,

18、啟動(dòng)執(zhí)行基本算術(shù)運(yùn)算程序,程序在執(zhí)行完加法運(yùn)算后自動(dòng)暫停。通過“CPU”窗口可以看到寄存器AHL的內(nèi)容為0x46,這正是加法運(yùn)算的結(jié)果。同樣,在“Memory”窗口中,可以看到0x81,0x82,0x88的內(nèi)容為分別為0012,0034,0x46。執(zhí)行加法運(yùn)算后,將0x81和0x82的內(nèi)容相加,結(jié)果放在0x88單元。f. 在“Memory”窗口中用鼠標(biāo)左鍵雙擊0x81單元,這時(shí)可以修改該內(nèi)存單元的內(nèi)容。輸入新的數(shù)據(jù)0x0ffee(十進(jìn)制的-18),編輯內(nèi)容時(shí)請(qǐng)直接輸入FFEE(十六進(jìn)制),然后回車確認(rèn),便完成對(duì)0x81單元的修改。 g. 在“CPU” 窗口中修改PC值,方法也是鼠標(biāo)左鍵雙擊PC

19、寄存器的內(nèi)容,輸入新的PC值0x1805(編輯內(nèi)容時(shí)直接輸入1805),并用回車鍵確認(rèn)。h. 單擊菜單欄下的“Run=F5”按鈕,程序從當(dāng)前PC繼續(xù)運(yùn)行,重新計(jì)算0x81和0x82的和,結(jié)果在0x88中。當(dāng)程序再次暫停時(shí),可以看到AHL寄存器和0x88的內(nèi)容為0x22(十進(jìn)制的34),這正是我們希望的結(jié)果:-18+52=34。 i. 單擊“Run=F5”按鈕,程序從當(dāng)前PC繼續(xù)運(yùn)行,完成減法運(yùn)算。當(dāng)程序再次暫時(shí)(斷點(diǎn)位于0x1813),可以看到0x83和0x84單元的內(nèi)容分別為FFEE和0012,B寄存器的內(nèi)容為ffdc0000,而0x89的內(nèi)容為ffdc(十進(jìn)制-36),這正是我們希望的結(jié)果

20、:。注意,該減法操作使用了輔助寄存器尋址,所以計(jì)算結(jié)果在B寄存器的高16位。 j. 單擊“Run=F5”按鈕,程序從當(dāng)前PC繼續(xù)運(yùn)行,完成整數(shù)乘法運(yùn)算。當(dāng)程序再次暫時(shí)(斷點(diǎn)位于0x181d),可以看到0x81和0x82單元的內(nèi)容分別為0012和0034,A寄存器的內(nèi)容為000003A8,這正是我們希望的結(jié)果:18*52=936(0x3a8)。這時(shí)我們可以用1個(gè)16位的內(nèi)容單元來保存結(jié)果,如將A寄存器的低16位存入0x8b單元。但如果將0x81的內(nèi)容修改為0x2000(十進(jìn)制的8192),在“CPU窗口”中將PC修改為1818,然后繼續(xù)運(yùn)行,重新計(jì)算乘法。當(dāng)程序完成乘法暫停時(shí),可以看到A寄存器的

21、內(nèi)容為00068000,這也是一個(gè)正確的結(jié)果:8192*52=425984(0x68000)。此時(shí)將無法用一個(gè)16位的存貯單元來保存A寄存器中的結(jié)果。 k. 單擊“Run=F5”按鈕,程序從當(dāng)前PC繼續(xù)運(yùn)行,完成小數(shù)乘法運(yùn)算。當(dāng)程序再次暫停時(shí)(斷點(diǎn)位于0x1826),可以看到0x83和0x84單元的內(nèi)容分別為4000和b548,A寄存器的內(nèi)容為40000000,乘法的結(jié)果在B寄存器中為daa40000,這正是我們希望的結(jié)果:0.5*(-0.58374)=-0.29187(0x0daa4)。對(duì)于小數(shù)乘法,一般情況都可以用1個(gè)16位的內(nèi)容單元將B寄存器的高16保存(如存入0x8c單元)。 l. 單擊“Run=F5”按鈕,程序從當(dāng)前PC繼續(xù)運(yùn)行,完成整數(shù)除法運(yùn)算。當(dāng)程序再次暫時(shí)(斷點(diǎn)位于0x183b),可以看到0x81,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論