第一篇:DSP芯片教學(xué)
DSP芯片的特點(diǎn)
1采用哈佛結(jié)構(gòu) 2采用多總線結(jié)構(gòu) 3采用流水線結(jié)構(gòu) 4配有專用的硬件乘法-累加器 5具有特殊的尋址方式和指令 6支持并行指令操作 7硬件配置強(qiáng),具有較強(qiáng)的接口功能 8支持多處理器結(jié)構(gòu)。
數(shù)字信號處理的特點(diǎn)
抗干擾、可靠性強(qiáng)、便于大規(guī)模集成精度高靈活性強(qiáng)
可以實(shí)現(xiàn)模擬系統(tǒng)很難達(dá)到的指標(biāo)或特性
可以實(shí)現(xiàn)多維信號處理
缺點(diǎn):增加了系統(tǒng)的復(fù)雜性
應(yīng)用的頻率范圍受到限制
系統(tǒng)的功率消耗比較大 CPU包含5個功能單元
指令緩沖單元
程序流單元
地址-數(shù)據(jù)流單元
數(shù)據(jù)運(yùn)算單元
存儲器接口單元
指令流水線分為兩個階段。
1取指階段從存儲器取來32位指令包,將其存入指令緩沖隊(duì)列
2執(zhí)行階段:對指令進(jìn)行譯碼,并完成數(shù)據(jù)訪問和計(jì)算
預(yù)取指1 預(yù)取指2 取指 預(yù)解碼
解碼 尋址 訪問1 訪問2 讀 執(zhí)行 寫 寫+
當(dāng)D單元ALU做加法運(yùn)算 產(chǎn)生進(jìn)位 置位CARRY 不進(jìn)位 CARRY清0
當(dāng)D單元ALU做減法運(yùn)算 產(chǎn)生借位 CARRY清0 不借位 CARRY置位
當(dāng)CPU讀取程序代碼時,使用24位的地址訪問相關(guān)的字節(jié);
而CPU讀/寫I/O空間時,將16位地址前補(bǔ)0來擴(kuò)展成24位地址
CPU讀程序指令每次固定讀取32位長的指令,且固定以最低的2個字節(jié)為00h的地址為首地址讀取訪問數(shù)據(jù)堆棧時,CPU將SPH和SP連接成XSP。XSP包含了一個最后推入數(shù)據(jù)堆棧的23位地址,其中SPH中是7位的主 數(shù)據(jù)頁,SP指向該頁上的一個字。CPU在每推入一個值入堆棧前,減小SP值;從堆棧彈出一個值以后,增加SP值。在堆棧操作中,SPH的值不變。
訪問系統(tǒng)堆棧時,CPU將SPH和SSP連接成XSSP。XSSP包含了一個最后推入系統(tǒng)堆棧的值的地址。CPU在每推入一個值進(jìn)堆棧前,減小SSP值;從堆棧彈出一個值以后,增加SSP值。在堆棧操作中,SPH的值不變。
快返回與慢返回過程的區(qū)別在于:CPU怎樣保存和恢復(fù)2個內(nèi)部存儲器(即程序計(jì)數(shù)器PC和一個循環(huán)現(xiàn)場寄存器)的值。慢返回,返回地址和循環(huán)現(xiàn)場保存在堆棧中快返回過程中,返回地址和循環(huán)現(xiàn)場保存在寄存器里
DSP處理中斷過程
1接收中斷請求
2響應(yīng)中斷請求
3準(zhǔn)備進(jìn)入中斷服務(wù)子程序。CPU要執(zhí)行的主要任務(wù)有: 完成當(dāng)前指令的執(zhí)行,并沖掉流水線上還未解碼的指令。自動將某些必要的寄存器的值保存到數(shù)據(jù)堆棧和系統(tǒng)堆棧。
從用戶事先設(shè)置好的向量地址獲取中斷向量,該中斷向量指向中斷服務(wù)子程序 4執(zhí)行中斷服務(wù)子程序
所有的可屏蔽中斷都是硬件中斷。
不可屏蔽中斷
1硬件中斷 RESET 2硬件中斷 NMI
3軟件中斷
硬件復(fù)位后,DSP處于一個已知狀態(tài),即所有當(dāng)前指令全部終止,指令流水清空,CPU寄存器復(fù)位。然后CPU執(zhí)行中斷服務(wù)子程序,讀復(fù)位中斷向量時,CPU用32位復(fù)位向量的第29、28位來確定堆棧配置模式。
使用const關(guān)鍵字可以定義大常數(shù)表并將它們分配到系統(tǒng)ROM中。ioport關(guān)鍵字來支持I/O尋址模式
ioport類型限定詞只能用于全局或靜態(tài)變量。局部變量不能用ioport限制,除非變量是個指針 增加了interrupt關(guān)鍵字,來指定某個函數(shù)為中斷函數(shù)。
Onchip關(guān)鍵字聲明一個特殊指針,在鏈接時這些數(shù)據(jù)必須被鏈接到DSP片上存儲器,否則會導(dǎo)致總線錯誤。volatile在任何情況下,優(yōu)化器會通過分析數(shù)據(jù)流來避免存儲器訪問。如果程序依靠存儲器訪問,則必須使用volatile關(guān)鍵字來指明這些訪問。系統(tǒng)初始化
1變量的自動初始化2.全局構(gòu)建器(Global Constructors)3.初始化表(Initialization Tables)4.運(yùn)行時間變量初始化5.裝載時間變量初始化 小數(shù)定標(biāo)的概念
設(shè)定一個16位數(shù)的小數(shù)點(diǎn)處于該數(shù)中的哪一位 可以表示不同大小和不同精度的小數(shù) Q表示法
不同的Q所表示的數(shù)不僅范圍不同,而且精度也不相同
Q越大,數(shù)值范圍越小,但精度越高Q越小,數(shù)值范圍越大,但精度就越低 溢出處理機(jī)制
1保護(hù)位
2溢出標(biāo)志位
3飽和方式位SATD和SATA
第二篇:DSP實(shí)驗(yàn)報告
實(shí)驗(yàn)0 實(shí)驗(yàn)設(shè)備安裝才CCS調(diào)試環(huán)境 實(shí)驗(yàn)?zāi)康模?/p>
按照實(shí)驗(yàn)講義操作步驟,打開CCS軟件,熟悉軟件工作環(huán)境,了解整個工作環(huán)境內(nèi)容,有助于提高以后實(shí)驗(yàn)的操作性和正確性。實(shí)驗(yàn)步驟:
以演示實(shí)驗(yàn)一為例:
1. 使用配送的并口電纜線連接好計(jì)算機(jī)并口與實(shí)驗(yàn)箱并口,打開實(shí)驗(yàn)箱電源;
2.啟動CCS,點(diǎn)擊主菜單“Project->Open”在目錄“C5000QuickStartsinewave”下打開工程文件sinewave.pjt,然后點(diǎn)擊主菜單“Project->Build”編譯,然后點(diǎn)擊主菜單“File->Load Program”裝載debug目錄下的程序sinewave.out;
3. 打開源文件exer3.asm,在注釋行“set breakpoint in CCS!!”語句的NOP處單擊右鍵彈出菜單,選擇“Toggle breakpoint”加入紅色的斷點(diǎn),如下圖所示;
4. 點(diǎn)擊主菜單“View->Graph->Time/Frequency…”,屏幕會出現(xiàn)圖形窗口設(shè)置對話框
5. 雙擊Start Address,將其改為y0;雙擊Acquisition Buffer Size,將其改為1;DSP Data Type設(shè)置成16-bit signed integer,如下圖所示;
6. 點(diǎn)擊主菜單“Windows->Tile Horizontally”,排列好窗口,便于觀察
7. 點(diǎn)擊主菜單“Debug->Animate”或按F12鍵動畫運(yùn)行程序,即可觀察到實(shí)驗(yàn)結(jié)果:
心得體會:
通過對演示實(shí)驗(yàn)的練習(xí),讓自己更進(jìn)一步對CCS軟件的運(yùn)行環(huán)境、編譯過程、裝載過程、屬性設(shè)置、動畫演示、實(shí)驗(yàn)結(jié)果的觀察有一個醒目的了解和熟悉的操作方法。熟悉了DSP實(shí)驗(yàn)箱基本模塊。讓我對DSP課程產(chǎn)生了濃厚的學(xué)習(xí)興趣,課程學(xué)習(xí)和實(shí)驗(yàn)操作結(jié)合為一體的學(xué)習(xí)體系,使我更好的領(lǐng)悟到DSP課程的實(shí)用性和趣味性。實(shí)驗(yàn)二 基本算數(shù)運(yùn)算
2.1 實(shí)驗(yàn)?zāi)康暮鸵?/p>
加、減、乘、除是數(shù)字信號處理中最基本的算術(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)的演示文件為exer1.out。
2.2 實(shí)驗(yàn)原理 定點(diǎn) DSP 中的數(shù)據(jù)表示方法
C54X 是16 位的定點(diǎn)DSP。一個16 位的二進(jìn)制數(shù)既可以表示一個整數(shù),也可以表
示一個小數(shù)。當(dāng)它表示一個整數(shù)時,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。實(shí)現(xiàn) 16 位定點(diǎn)加法
C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中
ADDS 用于無符號數(shù)的加法運(yùn)算,ADDC 用于帶進(jìn)位的加法運(yùn)算(如32 位擴(kuò)展精度加
法),而ADDM 專用于立即數(shù)的加法。實(shí)現(xiàn) 16 位定點(diǎn)減法
C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數(shù)的減法運(yùn)算,SUBB 用于帶進(jìn)位的減法運(yùn)算(如32 位擴(kuò)展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實(shí)現(xiàn)的。實(shí)現(xiàn) 16 位定點(diǎn)整數(shù)乘法
在C54X 中提供了大量的乘法運(yùn)算指令,其結(jié)果都是32 位,放在A 或B 寄存器
中。乘數(shù)在C54X 的乘法指令很靈活,可以是T 寄存器、立即數(shù)、存貯單元和A 或B 寄存器的高16 位。實(shí)現(xiàn) 16 位定點(diǎn)小數(shù)乘法
在 C54X 中,小數(shù)的乘法與整數(shù)乘法基本一致,只是由于兩個有符號的小數(shù)相乘,其結(jié)果的小數(shù)點(diǎn)的位置在次高的后面,所以必須左移一位,才能得到正確的結(jié)果。C54X 中提供了一個狀態(tài)位FRCT,將其設(shè)置為1 時,系統(tǒng)自動將乘積結(jié)果左移一位。但注意
整數(shù)乘法時不能這樣處理,所以上面的實(shí)驗(yàn)中一開始便將FRCT 清除。兩個小數(shù)(16 位)
相乘后結(jié)果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可
得到16 位的結(jié)果。6 實(shí)現(xiàn) 16 位定點(diǎn)整數(shù)除法
在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法
來代替,除以某個數(shù)相當(dāng)于乘以其倒數(shù),所以先求出其倒數(shù),然后相乘。這種方法對于
除以常數(shù)特別適用。另一種方法是使用SUBC 指令,重復(fù)16 次減法完成除法運(yùn)算。實(shí)現(xiàn) 16 位定點(diǎn)小數(shù)除法
在 C54X 中實(shí)現(xiàn)16 位的小數(shù)除法與前面的整數(shù)除法基本一致,也是使用循環(huán)的
SUBC 指令來完成。但有兩點(diǎn)需要注意:第一,小數(shù)除法的結(jié)果一定是小數(shù)(小于1),所以被除數(shù)一定小于除數(shù)。
2.3 實(shí)驗(yàn)內(nèi)容
本實(shí)驗(yàn)需要使用C54X 匯編語言實(shí)現(xiàn)加、減、乘、除的基本運(yùn)算,并通過DES 的存 貯器顯示窗口觀察結(jié)果。1 編寫實(shí)驗(yàn)程序代碼 用 ccs simulator 調(diào)試運(yùn)行并觀察結(jié)
2.4 實(shí)驗(yàn)結(jié)果
1、加法結(jié)果
2、乘法結(jié)果
3、減法結(jié)果
4、除
2.5 思考題(0.5、0.25)
實(shí)驗(yàn)三 C54X的浮點(diǎn)數(shù)的算術(shù)運(yùn)
一、實(shí)驗(yàn)?zāi)康?練習(xí)TMS320C54X 匯編程序的編寫與調(diào)試方法,重點(diǎn)練習(xí)C54X 程序流程控制的方法。學(xué)習(xí)并掌握應(yīng)用 TMS320C54X 來進(jìn)行浮點(diǎn)數(shù)的各種算術(shù)運(yùn)算的算法實(shí)現(xiàn)。練習(xí)并掌握 TMS320C54X 的匯編語言的匯編指令系統(tǒng)的使用方法,重點(diǎn)練習(xí)具有C54X 特點(diǎn)的一些在功能上有所擴(kuò)展的特殊指令,并了解這些指令在進(jìn)行算術(shù)運(yùn)算或各種控制時所帶來的方便。練習(xí)并掌握用 CCS 調(diào)試程序的一些基本操作。二.實(shí)驗(yàn)原理 1 浮點(diǎn)數(shù)的表示方法
在定點(diǎn)運(yùn)算中,小數(shù)點(diǎn)是在一個特定的固定位置。例如,如果一個 32-bit 的數(shù)把小數(shù)點(diǎn)放在最高有效位(也就是符號位)之后,那么就只有分?jǐn)?shù)(絕對值小于1)才能被顯示。在定點(diǎn)運(yùn)
算系統(tǒng)中,雖然在硬件上實(shí)現(xiàn)簡單,但是表示的操作數(shù)的動態(tài)范圍要受到限制。3 浮點(diǎn)數(shù)運(yùn)算的步驟
程序代碼分成四個 ASM 文件輸入,通過編譯生成.obj 文件,連接生成.out 文件后就可以在DES320PP-U 實(shí)驗(yàn)系統(tǒng)上調(diào)試運(yùn)行(先要創(chuàng)建一個工程文件,然后加入四個工程文件,并且一起編譯,連接。因?yàn)槊總€文件都對下一個文件作了引用)。步驟如下:
a.首先啟動 setup CCS C5000,在其中設(shè)置目前需要的CCS 的工作狀態(tài)為C54xxsimulator,保存這一設(shè)置并退出。然后再啟動CCS 實(shí)驗(yàn)系統(tǒng)軟件CCS C5000。
b.在下拉菜單中選擇“File”->“Load Program”以裝入所要調(diào)試的程序fc.out,這時,在反匯編窗口中能看到程序的源代碼。
c.在下拉菜單中選擇“View”->“CPU Registers”->“CPU Register”,可以看見在CCS 界面下部份會出現(xiàn)CPU 中的相關(guān)寄存器;選擇“View”->“Memory…”,在彈出的“Memory Window Options”窗口中選擇要觀察的區(qū)域?yàn)閿?shù)據(jù)區(qū),地址開始為0x80h,然后就可以看見出現(xiàn)一個Data Memory 窗口,其中顯示了從0x80h 開始的.bss 區(qū)。
d.在反匯編窗口中需要觀察的地方設(shè)置斷點(diǎn):在這條指令處雙擊將其點(diǎn)為紅色即可。比如在加法程序中有指令nop 的位置都可以加一個斷點(diǎn)。
e.在下拉菜單中選擇“調(diào)試”——“連續(xù)運(yùn)行”(或直接點(diǎn)擊“運(yùn)行程序”按鈕)運(yùn)行浮點(diǎn)數(shù)程序。如果編寫程序時在計(jì)算完畢后遇到一個斷點(diǎn),那么程序到此會自動停止。
f.當(dāng)示范程序在第一個斷點(diǎn)處停下來時,此時就可以看見程序初始化后的情況:被加數(shù)12.0 以浮點(diǎn)數(shù)的格式放在內(nèi)存區(qū)0x08a-0x08b 中,其值為4140h 和0000h。加數(shù)12.0 放在內(nèi)存區(qū)0x08c-0x08d 中,其值也為4140h 和0000h。
g.再點(diǎn)擊“運(yùn)行程序”按鈕,之后程序會在下一個斷點(diǎn)處停下來,這時可以看見被加數(shù)被格式轉(zhuǎn)換后的變量op1hm、op1lm 和op1se 的值在內(nèi)存區(qū)0x084-0x086 中,分別為00c0h、0000h 和0082h。同樣加數(shù)被格式轉(zhuǎn)換后的變量op2se、op2hm 和op2lm的值在內(nèi)存區(qū)0x087-0x089 中,分別為0082h、00c0h 和0000h。
h.再點(diǎn)擊“運(yùn)行程序”按鈕,程序停下來時就可以觀察到在存儲器窗口中表示結(jié)果的變量rlthm、rltlm、rltsign 和rltexp 的值在內(nèi)存區(qū)0x080-0x083 中,其值分別為0040h、0000h、0180h 和0083h。
i.這時可以看到 A 寄存器中的值為AH=41c0h,AL=0000h 這就是最后的以浮點(diǎn)數(shù)的格式表示的結(jié)果值24(=12+12)。加法運(yùn)算到此結(jié)束。
j.繼續(xù)點(diǎn)擊“運(yùn)行程序”按鈕,當(dāng)程序再次停下來時就可以看見在A 寄存器中顯示的13.0 與12.0 進(jìn)行減法運(yùn)算的結(jié)果:AH=3f80h,AL=0000h。這是用浮點(diǎn)數(shù)格式表示的數(shù)1(=13-12)。減法運(yùn)算的程序到此結(jié)束。
k.繼續(xù)點(diǎn)擊“運(yùn)行程序”按鈕,當(dāng)程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與12.0 進(jìn)行乘法運(yùn)算的結(jié)果:AH=4310h,AL=0000h。這是用浮點(diǎn)數(shù)格式表示的數(shù)144(=12*12)。乘法運(yùn)算的程序到此結(jié)束。
l.繼續(xù)點(diǎn)擊“運(yùn)行程序”按鈕,當(dāng)程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與4.0 進(jìn)行除法運(yùn)算的結(jié)果:AH=4040h,AL=0000h。這是用浮點(diǎn)數(shù)格式表示的數(shù)3(=12/4)。至此加、減、乘、除四種運(yùn)算都運(yùn)行完畢。
m.如果程序運(yùn)行不正確,請檢查源程序是否有誤,必要時可以在源程序中多插入斷點(diǎn)語句。程序在執(zhí)行到斷點(diǎn)語句時自動暫停,此時可以通過檢查各個寄存器中的值以及內(nèi)存單元中的值來判斷程序執(zhí)行是否正確。
三.在 CCS 的C54xx simulator 上調(diào)試觀察實(shí)驗(yàn)結(jié)果
浮點(diǎn)加法斷點(diǎn)一:
浮點(diǎn)加法斷點(diǎn)二:
浮點(diǎn)加法斷點(diǎn)三:
浮點(diǎn)減法
浮點(diǎn)數(shù)乘法
浮點(diǎn)數(shù)除法
四 心得體會
通過學(xué)習(xí)C54X的浮點(diǎn)數(shù)的算術(shù)運(yùn)算,以及實(shí)驗(yàn)結(jié)果的觀察,使我了解了浮點(diǎn)數(shù)運(yùn)算的原理,學(xué)習(xí)并掌握用TMS320C54X來進(jìn)行浮點(diǎn)數(shù)的各種算術(shù)運(yùn)算的算法實(shí)現(xiàn)。實(shí)驗(yàn)四用定時器實(shí)現(xiàn)數(shù)字振蕩器
實(shí)驗(yàn)四 用定時器實(shí)現(xiàn)數(shù)字振蕩器
4.1 實(shí)驗(yàn)?zāi)康?/p>
在數(shù)字信號處理中,會經(jīng)常使用到正弦/余弦信號。通常的方法是將某個頻率的正弦/余弦值預(yù)先計(jì)算出來后制成一個表,DSP 工作時僅作查表運(yùn)算即可。在本實(shí)驗(yàn)中將介紹另一種獲得正弦/余弦信號的方法,即利用數(shù)字振蕩器用疊代方法產(chǎn)生正弦信號。本實(shí)驗(yàn)除了學(xué)習(xí)數(shù)字振蕩器的DSP 實(shí)現(xiàn)原理外,同時還學(xué)習(xí)C54X 定時器使用以及中斷服務(wù)程序編寫。另外,在本實(shí)驗(yàn)中我們將使用匯編語言和C 語言分別完成源程序的編寫。
4.2
本實(shí)驗(yàn)利用定時器產(chǎn)生一個 2kHz 的正弦信號。定時器被設(shè)置成每25uS 產(chǎn)生一次中斷(等效于采樣速率為40K)。利用該中斷,在中斷服務(wù)程序中用疊代算法計(jì)算出一個SIN值,并利用CCS 的圖形顯示功能查看波形。
4.3 實(shí)驗(yàn)原理 數(shù)字振蕩器原理
sinkωT,其
z 變換為
H(z=
其中,A=2cosωT, B=-1, C=sinωT。設(shè)初始條件為0,求出上式的反Z 變換得:
y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2 C54X 的定時器操作
C54X 的片內(nèi)定時器利用CLKOUT 時鐘計(jì)數(shù),用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表4-1。在表4-2 中列出了定時器控制寄存器的各個比特位的具體定義?!甐C5402 的另一個定時器(定時器1)的控制寄存器分別為:0x30
TIM1),0x31(PRD1),0x32(TCR1)。C54X 中斷的使用
C54X 中用戶可以通過中斷屏蔽寄存器 IMR 來決定開放或關(guān)閉一個中斷請求。圖 4-1 給出了 C5402 的 IMR 寄存器的各個比特位的定義。
圖 4-1 ‘C5402 的IMR 寄存器
其中,表示HPI 接口中斷,INT3-INT0 為外部引腳產(chǎn)生的中斷,TXINT 和TRINT 為TDM 串口的發(fā)送和接收中斷,BXINT0 和BRINT0 BSP 串口的發(fā)送和接收中斷,14
為定時器 0 中斷。在中斷屏蔽寄存器 IMR 中,1 表示允許 CPU 響應(yīng)對應(yīng)的中斷,0 表示禁止。當(dāng)然要 CPU 響應(yīng)中斷,INTM 還應(yīng)該為 0(允許所有的中斷)。
本實(shí)驗(yàn)的初始化程序讀取中斷向量表的啟始地址,然后設(shè)置的高
DSP 能正確響應(yīng)中斷,代碼如下:
ld #0,dp ;設(shè)置DP 頁指針 ssbx intm ;關(guān)閉所有中斷
ld #vector, a ;讀出中斷向(地址vector 在中斷向量表程序中定義)
and #0FF80h, a ;保留高9 位(IPTR)andm #007Fh, pmst ;保留PMST 的低7 位 or pmst, a ;
stlm a, pmst ;設(shè)置PMST(其中包括IPTR)
4.4 實(shí)驗(yàn)內(nèi)容
C54X 匯編語言或C 語言實(shí)現(xiàn)數(shù)字振蕩器,并通過CCS 提供的圖形顯示窗口觀察出信號波形以及頻譜。實(shí)驗(yàn)分下面幾步完成: 根據(jù)確定數(shù)字振蕩器的頻率,確定系數(shù)。2 啟動 CCS,新建工程文件。
選擇 Project 菜單中的Options 選項(xiàng),或使用鼠標(biāo)右鍵單擊工程文件名(如sinewave.pjt)并選擇build options 項(xiàng)來修改或添加編譯、連接中使用的參數(shù)。選擇Linker Output Filename”欄中寫入輸出OUT 文件的名字,如sine.out,你還可以設(shè)置生成的MAP 文件名。4 完成編譯、連接,正確生成OUT 文件。5 選 View→Graph→
5…打開圖形顯示設(shè)置窗口。在匯編源程序的中斷服務(wù)程序(_tint)中的“nop”語句處設(shè)置斷點(diǎn)。用右鍵單擊圖形顯示窗口,并選擇“Proporties”項(xiàng)以便修改顯示屬性。清除所有斷點(diǎn),關(guān)閉除波形顯示窗口外的所有窗口,并關(guān)閉工程文件。完成編譯、連接,正確生成OUT 文件。
10打開 C 源程序(timer.c)窗口,在中斷服務(wù)程序(函數(shù)tint()的“con_buf=0
Start Address ”改為 buf ;“ Acquisition Buffer Size ”改為“ Display Data Size 128,“DSP DataType”為“32-bit floating point”
11選擇 Debug→Animate,運(yùn)行程序,觀察輸出波形。
第三篇:DSP實(shí)驗(yàn)報告
實(shí)驗(yàn)0 實(shí)驗(yàn)設(shè)備安裝才CCS調(diào)試環(huán)境
實(shí)驗(yàn)?zāi)康模?/p>
按照實(shí)驗(yàn)講義操作步驟,打開CCS軟件,熟悉軟件工作環(huán)境,了解整個工作環(huán)境內(nèi)容,有助于提高以后實(shí)驗(yàn)的操作性和正確性。實(shí)驗(yàn)步驟:
以演示實(shí)驗(yàn)一為例:
1. 使用配送的并口電纜線連接好計(jì)算機(jī)并口與實(shí)驗(yàn)箱并口,打開實(shí)驗(yàn)箱電源; 2.啟動CCS,點(diǎn)擊主菜單“Project->Open”在目錄“C5000QuickStartsinewave”下打開工程文件sinewave.pjt,然后點(diǎn)擊主菜單“Project->Build”編譯,然后點(diǎn)擊主菜單“File->Load Program”裝載debug目錄下的程序sinewave.out;
3. 打開源文件exer3.asm,在注釋行“set breakpoint in CCS!!”語句的NOP處單擊右鍵彈出菜單,選擇“Toggle breakpoint”加入紅色的斷點(diǎn),如下圖所示; 4. 點(diǎn)擊主菜單“View->Graph->Time/Frequency?”,屏幕會出現(xiàn)圖形窗口設(shè)置對話框
5. 雙擊Start Address,將其改為y0;雙擊Acquisition Buffer Size,將其改為1;DSP Data Type設(shè)置成16-bit signed integer,如下圖所示;
6. 點(diǎn)擊主菜單“Windows->Tile Horizontally”,排列好窗口,便于觀察
7. 點(diǎn)擊主菜單“Debug->Animate”或按F12鍵動畫運(yùn)行程序,即可觀察到實(shí)驗(yàn)結(jié)果:
心得體會:
通過對演示實(shí)驗(yàn)的練習(xí),讓自己更進(jìn)一步對CCS軟件的運(yùn)行環(huán)境、編譯過程、裝載過程、屬性設(shè)置、動畫演示、實(shí)驗(yàn)結(jié)果的觀察有一個醒目的了解和熟悉的操作方法。熟悉了DSP實(shí)驗(yàn)箱基本模塊。讓我對DSP課程產(chǎn)生了濃厚的學(xué)習(xí)興趣,課程學(xué)習(xí)和實(shí)驗(yàn)操作結(jié)合為一體的學(xué)習(xí)體系,使我更好的領(lǐng)悟到DSP課程的實(shí)用性和趣味性。
實(shí)驗(yàn)二 基本算數(shù)運(yùn)算
2.1 實(shí)驗(yàn)?zāi)康暮鸵?/p>
加、減、乘、除是數(shù)字信號處理中最基本的算術(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)的演示文件為exer1.out。
2.2 實(shí)驗(yàn)原理
1)定點(diǎn) DSP 中的數(shù)據(jù)表示方法
C54X 是16 位的定點(diǎn)DSP。一個16 位的二進(jìn)制數(shù)既可以表示一個整數(shù),也可以表
示一個小數(shù)。當(dāng)它表示一個整數(shù)時,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。
2)實(shí)現(xiàn) 16 位定點(diǎn)加法
C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中
ADDS 用于無符號數(shù)的加法運(yùn)算,ADDC 用于帶進(jìn)位的加法運(yùn)算(如32 位擴(kuò)展精度加 法),而ADDM 專用于立即數(shù)的加法。
3)實(shí)現(xiàn) 16 位定點(diǎn)減法
C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數(shù)的減法運(yùn)算,SUBB 用于帶進(jìn)位的減法運(yùn)算(如32 位擴(kuò)展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實(shí)現(xiàn)的。
4)實(shí)現(xiàn) 16 位定點(diǎn)整數(shù)乘法
在C54X 中提供了大量的乘法運(yùn)算指令,其結(jié)果都是32 位,放在A 或B 寄存器 中。乘數(shù)在C54X 的乘法指令很靈活,可以是T 寄存器、立即數(shù)、存貯單元和A 或B 寄存器的高16 位。
5)實(shí)現(xiàn) 16 位定點(diǎn)小數(shù)乘法
在 C54X 中,小數(shù)的乘法與整數(shù)乘法基本一致,只是由于兩個有符號的小數(shù)相乘,其結(jié)果的小數(shù)點(diǎn)的位置在次高的后面,所以必須左移一位,才能得到正確的結(jié)果。C54X 中提供了一個狀態(tài)位FRCT,將其設(shè)置為1 時,系統(tǒng)自動將乘積結(jié)果左移一位。但注意 整數(shù)乘法時不能這樣處理,所以上面的實(shí)驗(yàn)中一開始便將FRCT 清除。兩個小數(shù)(16 位)相乘后結(jié)果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可 得到16 位的結(jié)果。
6)實(shí)現(xiàn) 16 位定點(diǎn)整數(shù)除法
在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法 來代替,除以某個數(shù)相當(dāng)于乘以其倒數(shù),所以先求出其倒數(shù),然后相乘。這種方法對于 除以常數(shù)特別適用。另一種方法是使用SUBC 指令,重復(fù)16 次減法完成除法運(yùn)算。
7)實(shí)現(xiàn) 16 位定點(diǎn)小數(shù)除法
在 C54X 中實(shí)現(xiàn)16 位的小數(shù)除法與前面的整數(shù)除法基本一致,也是使用循環(huán)的
SUBC 指令來完成。但有兩點(diǎn)需要注意:第一,小數(shù)除法的結(jié)果一定是小數(shù)(小于1),所以被除數(shù)一定小于除數(shù)。
2.3 實(shí)驗(yàn)內(nèi)容
本實(shí)驗(yàn)需要使用C54X 匯編語言實(shí)現(xiàn)加、減、乘、除的基本運(yùn)算,并通過DES 的存 貯器顯示窗口觀察結(jié)果。
1)編寫實(shí)驗(yàn)程序代碼
2)用 ccs simulator 調(diào)試運(yùn)行并觀察結(jié)
2.4 實(shí)驗(yàn)結(jié)果
1、加法結(jié)果
2、乘法結(jié)果
3、減法結(jié)果
4、除2.5 思考題(0.5、0.25)實(shí)驗(yàn)三 C54X的浮點(diǎn)數(shù)的算術(shù)運(yùn)
一、實(shí)驗(yàn)?zāi)康?/p>
1)練習(xí)TMS320C54X 匯編程序的編寫與調(diào)試方法,重點(diǎn)練習(xí)C54X 程序流程控制的方法。2)學(xué)習(xí)并掌握應(yīng)用 TMS320C54X 來進(jìn)行浮點(diǎn)數(shù)的各種算術(shù)運(yùn)算的算法實(shí)現(xiàn)。
3)練習(xí)并掌握 TMS320C54X 的匯編語言的匯編指令系統(tǒng)的使用方法,重點(diǎn)練習(xí)具有C54X 特點(diǎn)的一些在功能上有所擴(kuò)展的特殊指令,并了解這些指令在進(jìn)行算術(shù)運(yùn)算或各種控制時所帶來的方便。
4)練習(xí)并掌握用 CCS 調(diào)試程序的一些基本操作。
二.實(shí)驗(yàn)原理
1)浮點(diǎn)數(shù)的表示方法
在定點(diǎn)運(yùn)算中,小數(shù)點(diǎn)是在一個特定的固定位置。例如,如果一個 32-bit 的數(shù)把小數(shù)點(diǎn)放在最高有效位(也就是符號位)之后,那么就只有分?jǐn)?shù)(絕對值小于1)才能被顯示。在定點(diǎn)運(yùn)算系統(tǒng)中,雖然在硬件上實(shí)現(xiàn)簡單,但是表示的操作數(shù)的動態(tài)范圍要受到限制。
3)浮點(diǎn)數(shù)運(yùn)算的步驟
程序代碼分成四個 ASM 文件輸入,通過編譯生成.obj 文件,連接生成.out 文件后就可以在DES320PP-U 實(shí)驗(yàn)系統(tǒng)上調(diào)試運(yùn)行(先要創(chuàng)建一個工程文件,然后加入四個工程文件,并且一起編譯,連接。因?yàn)槊總€文件都對下一個文件作了引用)。步驟如下:
a.首先啟動 setup CCS C5000,在其中設(shè)置目前需要的CCS 的工作狀態(tài)為C54xxsimulator,保存這一設(shè)置并退出。然后再啟動CCS 實(shí)驗(yàn)系統(tǒng)軟件CCS C5000。
b.在下拉菜單中選擇“File”->“Load Program”以裝入所要調(diào)試的程序fc.out,這時,在反匯編窗口中能看到程序的源代碼。
c.在下拉菜單中選擇“View”->“CPU Registers”->“CPU Register”,可以看見在CCS 界面下部份會出現(xiàn)CPU 中的相關(guān)寄存器;選擇“View”->“Memory…”,在彈出的“Memory Window Options”窗口中選擇要觀察的區(qū)域?yàn)閿?shù)據(jù)區(qū),地址開始為0x80h,然后就可以看見出現(xiàn)一個Data Memory 窗口,其中顯示了從0x80h 開始的.bss 區(qū)。
d.在反匯編窗口中需要觀察的地方設(shè)置斷點(diǎn):在這條指令處雙擊將其點(diǎn)為紅色即可。比如在加法程序中有指令nop 的位置都可以加一個斷點(diǎn)。
e.在下拉菜單中選擇“調(diào)試”——“連續(xù)運(yùn)行”(或直接點(diǎn)擊“運(yùn)行程序”按鈕)運(yùn)行浮點(diǎn)數(shù)程序。如果編寫程序時在計(jì)算完畢后遇到一個斷點(diǎn),那么程序到此會自動停止。
f.當(dāng)示范程序在第一個斷點(diǎn)處停下來時,此時就可以看見程序初始化后的情況:被加數(shù)12.0 以浮點(diǎn)數(shù)的格式放在內(nèi)存區(qū)0x08a-0x08b 中,其值為4140h 和0000h。加數(shù)12.0 放在內(nèi)存區(qū)0x08c-0x08d 中,其值也為4140h 和0000h。g.再點(diǎn)擊“運(yùn)行程序”按鈕,之后程序會在下一個斷點(diǎn)處停下來,這時可以看見被加數(shù)被格式轉(zhuǎn)換后的變量op1hm、op1lm 和op1se 的值在內(nèi)存區(qū)0x084-0x086 中,分別為00c0h、0000h 和0082h。同樣加數(shù)被格式轉(zhuǎn)換后的變量op2se、op2hm 和op2lm的值在內(nèi)存區(qū)0x087-0x089 中,分別為0082h、00c0h 和0000h。
h.再點(diǎn)擊“運(yùn)行程序”按鈕,程序停下來時就可以觀察到在存儲器窗口中表示結(jié)果的變量rlthm、rltlm、rltsign 和rltexp 的值在內(nèi)存區(qū)0x080-0x083 中,其值分別為0040h、0000h、0180h 和0083h。
i.這時可以看到 A 寄存器中的值為AH=41c0h,AL=0000h 這就是最后的以浮點(diǎn)數(shù)的格式表示的結(jié)果值24(=12+12)。加法運(yùn)算到此結(jié)束。
j.繼續(xù)點(diǎn)擊“運(yùn)行程序”按鈕,當(dāng)程序再次停下來時就可以看見在A 寄存器中顯示的13.0 與12.0 進(jìn)行減法運(yùn)算的結(jié)果:AH=3f80h,AL=0000h。這是用浮點(diǎn)數(shù)格式表示的數(shù)1(=13-12)。減法運(yùn)算的程序到此結(jié)束。
k.繼續(xù)點(diǎn)擊“運(yùn)行程序”按鈕,當(dāng)程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與12.0 進(jìn)行乘法運(yùn)算的結(jié)果:AH=4310h,AL=0000h。這是用浮點(diǎn)數(shù)格式表示的數(shù)144(=12*12)。乘法運(yùn)算的程序到此結(jié)束。
l.繼續(xù)點(diǎn)擊“運(yùn)行程序”按鈕,當(dāng)程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與4.0 進(jìn)行除法運(yùn)算的結(jié)果:AH=4040h,AL=0000h。這是用浮點(diǎn)數(shù)格式表示的數(shù)3(=12/4)。至此加、減、乘、除四種運(yùn)算都運(yùn)行完畢。
m.如果程序運(yùn)行不正確,請檢查源程序是否有誤,必要時可以在源程序中多插入斷點(diǎn)語句。程序在執(zhí)行到斷點(diǎn)語句時自動暫停,此時可以通過檢查各個寄存器中的值以及內(nèi)存單元中的值來判斷程序執(zhí)行是否正確。
三.在 CCS 的C54xx simulator 上調(diào)試觀察實(shí)驗(yàn)結(jié)果
浮點(diǎn)加法斷點(diǎn)一: 浮點(diǎn)加法斷點(diǎn)二:
浮點(diǎn)加法斷點(diǎn)三: 浮點(diǎn)減法
浮點(diǎn)數(shù)乘法 浮點(diǎn)數(shù)除法
四 心得體會
通過學(xué)習(xí)C54X的浮點(diǎn)數(shù)的算術(shù)運(yùn)算,以及實(shí)驗(yàn)結(jié)果的觀察,使我了解了浮點(diǎn)數(shù)運(yùn)算的原理,學(xué)習(xí)并掌握用TMS320C54X來進(jìn)行浮點(diǎn)數(shù)的各種算術(shù)運(yùn)算的算法實(shí)現(xiàn)。實(shí)驗(yàn)四用定時器實(shí)現(xiàn)數(shù)字振蕩器 實(shí)驗(yàn)四 用定時器實(shí)現(xiàn)數(shù)字振蕩器
4.1 實(shí)驗(yàn)?zāi)康?/p>
在數(shù)字信號處理中,會經(jīng)常使用到正弦/余弦信號。通常的方法是將某個頻率的正弦/余弦值預(yù)先計(jì)算出來后制成一個表,DSP 工作時僅作查表運(yùn)算即可。在本實(shí)驗(yàn)中將介紹另一種獲得正弦/余弦信號的方法,即利用數(shù)字振蕩器用疊代方法產(chǎn)生正弦信號。本實(shí)驗(yàn)除了學(xué)習(xí)數(shù)字振蕩器的DSP 實(shí)現(xiàn)原理外,同時還學(xué)習(xí)C54X 定時器使用以及中斷服務(wù)程序編寫。另外,在本實(shí)驗(yàn)中我們將使用匯編語言和C 語言分別完成源程序的編寫。
4.2 實(shí)驗(yàn)要求
本實(shí)驗(yàn)利用定時器產(chǎn)生一個 2kHz 的正弦信號。定時器被設(shè)置成每25uS 產(chǎn)生一次中斷(等效于采樣速率為40K)。利用該中斷,在中斷服務(wù)程序中用疊代算法計(jì)算出一個SIN值,并利用CCS 的圖形顯示功能查看波形。
4.3 實(shí)驗(yàn)原理
1)數(shù)字振蕩器原理
設(shè)一個傳遞函數(shù)為正弦序列 sinkωT,其z 變換為 H(z)=
其中,A=2cosωT, B=-1, C=sinωT。設(shè)初始條件為0,求出上式的反Z 變換得:
y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2)C54X 的定時器操作
C54X 的片內(nèi)定時器利用CLKOUT 時鐘計(jì)數(shù),用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表4-1。在表4-2 中列出了定時器控制寄存器的各個比特位的具體定義?!甐C5402 的另一個定時器(定時器1)的控制寄存器分別為:0x30(TIM1),0x31(PRD1),0x32(TCR1)。
3)C54X 中斷的使用
在 C54X 中用戶可以通過中斷屏蔽寄存器IMR 來決定開放或關(guān)閉一個中斷請求。圖4-1 給出了C5402 的IMR 寄存器的各個比特位的定義。
圖 4-1 ‘C5402 的IMR 寄存器
其中,HPINT 表示HPI 接口中斷,INT3-INT0 為外部引腳產(chǎn)生的中斷,TXINT 和TRINT 為TDM 串口的發(fā)送和接收中斷,BXINT0 和BRINT0 為BSP 串口的發(fā)送和接收中斷,TINT0 為定時器0 中斷。在中斷屏蔽寄存器IMR 中,1 表示允許CPU 響應(yīng)對應(yīng)的中斷,0 表示禁止。當(dāng)然要CPU 響應(yīng)中斷,ST1 寄存器中的INTM 還應(yīng)該為0(允許所有的中斷)。
本實(shí)驗(yàn)的初始化程序讀取中斷向量表的啟始地址,然后設(shè)置PMST 的高9 位,以便DSP 能正確響應(yīng)中斷,代碼如下:
ld #0,dp ;設(shè)置DP 頁指針 ssbx intm ;關(guān)閉所有中斷 ld #vector, a ;讀出中斷向(地址vector 在中斷向量表程序中定義)and #0FF80h, a ;保留高9 位(IPTR)andm #007Fh, pmst ;保留PMST 的低7 位 or pmst, a ;
stlm a, pmst ;設(shè)置PMST(其中包括IPTR)
4.4 實(shí)驗(yàn)內(nèi)容
本實(shí)驗(yàn)需要使用 C54X 匯編語言或C 語言實(shí)現(xiàn)數(shù)字振蕩器,并通過CCS 提供的圖形顯示窗口觀察出信號波形以及頻譜。實(shí)驗(yàn)分下面幾步完成:
1)根據(jù)確定數(shù)字振蕩器的頻率,確定系數(shù)。2)啟動 CCS,新建工程文件。
3)選擇 Project 菜單中的Options 選項(xiàng),或使用鼠標(biāo)右鍵單擊工程文件名(如sinewave.pjt)并選擇build options 項(xiàng)來修改或添加編譯、連接中使用的參數(shù)。選擇Linker 窗口,在“Output Filename”欄中寫入輸出OUT 文件的名字,如sine.out,你還可以設(shè)置生成的MAP 文件名。
4)完成編譯、連接,正確生成OUT 文件。
5)選 View→Graph→Time/Frequency?打開圖形顯示設(shè)置窗口。6)在匯編源程序的中斷服務(wù)程序(_tint)中的“nop”語句處設(shè)置斷點(diǎn)。7)用右鍵單擊圖形顯示窗口,并選擇“Proporties”項(xiàng)以便修改顯示屬性。8)清除所有斷點(diǎn),關(guān)閉除波形顯示窗口外的所有窗口,并關(guān)閉工程文件。9)完成編譯、連接,正確生成OUT 文件。
10)打開 C 源程序(timer.c)窗口,在中斷服務(wù)程序(函數(shù)tint())的“con_buf=0;”語句處增加一個斷點(diǎn)。同樣打開圖形顯示窗口,并將“Start Address”改為buf;“Acquisition Buffer Size”改為“Display Data Size”改為128,“DSP DataType”為“32-bit floating point”
11)選擇 Debug→Animate,運(yùn)行程序,觀察輸出波形。
第四篇:dsp報告
目
錄
第一章、基本算術(shù)運(yùn)算.....................................1 1.1、實(shí)驗(yàn)?zāi)康暮鸵?..................................1 1.2、實(shí)驗(yàn)原理.........................................1 1.3、實(shí)驗(yàn)內(nèi)容.........................................2 第二章、C54X的匯編語言程序設(shè)計(jì)...........................7 2.1、實(shí)驗(yàn)?zāi)康暮鸵?..................................7 2.2、實(shí)驗(yàn)原理.........................................7 2.3、實(shí)驗(yàn)內(nèi)容.........................................8 第三章、FFT算法的實(shí)現(xiàn)..................................13 3.1、實(shí)驗(yàn)?zāi)康暮鸵?.................................13 3.2、實(shí)驗(yàn)原理........................................13 3.3、實(shí)驗(yàn)內(nèi)容........................................14 第四章、ASK、PSK、FSK調(diào)制的實(shí)現(xiàn)........................16 4.1、實(shí)驗(yàn)?zāi)康?.......................................16 4.2、實(shí)驗(yàn)原理........................................16 4.3、實(shí)驗(yàn)內(nèi)容........................................16 心得體會................................................20
0
第一章、基本算術(shù)運(yùn)算
1.1、實(shí)驗(yàn)?zāi)康暮鸵?/p>
加、減、乘、除是數(shù)字信號處理中最基本的算術(shù)運(yùn)算。DSP 中提供了大量的指令來 實(shí)現(xiàn)這些功能。本實(shí)驗(yàn)學(xué)習(xí)使用定點(diǎn)DSP 實(shí)現(xiàn)16 位定點(diǎn)加、減、乘、除運(yùn)算的基本方法 和編程技巧。
1.2、實(shí)驗(yàn)原理
(1)、定點(diǎn) DSP 中的數(shù)據(jù)表示方法
54X 是16 位的定點(diǎn)DSP。一個16 位的二進(jìn)制數(shù)既可以表示一個整數(shù),也可以表示一個小數(shù)。當(dāng)它表示一個整數(shù)時,其最低位(D0)表示2,D1 位表示2,次高位(D14)表示2。如果表示一個有符號數(shù)時,最高位(D15)為符號位,0 表示正數(shù),1 表示負(fù) 數(shù)。例如,07FFFH 表示最大的正數(shù)32767(十進(jìn)制),而0FFFFH 表示最大的負(fù)數(shù)-1(負(fù)
數(shù)用2 的補(bǔ)碼方式顯示)。當(dāng)需要表示小數(shù)時,小數(shù)點(diǎn)的位置始終在最高位后,而最高位D15)表示符號位。這樣次高位(D14)表示2,然后是2,最低位(D0)表示2?30114?1?2?15。所以 04000H 表示小數(shù) 0.5,01000H 表示小數(shù)2 = 0.125,而0001H 表示16 位定點(diǎn)(DSP 能表示的最小的小數(shù)(有符號)2?15 =0.***。在后面的實(shí)驗(yàn)中,除非有特別說明,我們指的都是有符號數(shù)。在C54X 中,將一個小數(shù)用16 位定點(diǎn)格式來表示的方法是用2乘以該小數(shù),然后取整。
從上面的分析可以看出,在DSP 中一個16 進(jìn)制的數(shù)可以表示不同的十進(jìn)制數(shù),或 者是整數(shù),或者是小數(shù)(如果表示小數(shù),必定小于1),但僅僅是在做整數(shù)乘除或小數(shù)乘 除時,系統(tǒng)對它們的處理才是有所區(qū)別的,而在加減運(yùn)算時,系統(tǒng)都當(dāng)成整數(shù)來處理。(2)實(shí)現(xiàn) 16 位定點(diǎn)加法
C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中
ADDS 用于無符號數(shù)的加法運(yùn)算,ADDC 用于帶進(jìn)位的加法運(yùn)算(如32 位擴(kuò)展精度加 法),而ADDM 專用于立即數(shù)的加法。(3)實(shí)現(xiàn) 16 位定點(diǎn)減法
C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數(shù)的減法運(yùn)算,SUBB 用于帶進(jìn)位的減法運(yùn)算(如32 位擴(kuò)展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實(shí)現(xiàn)的。SUB 指令與ADD 指令一樣,有許多的尋址方式。
(4)實(shí)現(xiàn) 16 位定點(diǎn)整數(shù)乘法 15 1
在C54X 中提供了大量的乘法運(yùn)算指令,其結(jié)果都是32 位,放在A 或B 寄存器 中。乘數(shù)在C54X 的乘法指令很靈活,可以是T 寄存器、立即數(shù)、存貯單元和A 或B 寄存器的高16 位。有關(guān)乘法指令的詳細(xì)使用說明請參考《TMS320C54X 實(shí)用教程》。在C54X 中,一般對數(shù)據(jù)的處理都當(dāng)做有符號數(shù),如果是無符號數(shù)乘時,要使用MPYU 指令。這是一條專用于無符號數(shù)乘法運(yùn)算的指令,而其它指令都是有符號數(shù)的乘法。5)實(shí)現(xiàn) 16 位定點(diǎn)小數(shù)乘法
在 C54X 中,小數(shù)的乘法與整數(shù)乘法基本一致,只是由于兩個有符號的小數(shù)相乘,其結(jié)果的小數(shù)點(diǎn)的位置在次高的后面,所以必須左移一位,才能得到正確的結(jié)果。C54X 中提供了一個狀態(tài)位FRCT,將其設(shè)置為1 時,系統(tǒng)自動將乘積結(jié)果左移一位。但注意 整數(shù)乘法時不能這樣處理,所以上面的實(shí)驗(yàn)中一開始便將FRCT 清除。兩個小數(shù)(16 位)相乘后結(jié)果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可 得到16 位的結(jié)果。
(6)實(shí)現(xiàn) 16 位定點(diǎn)整數(shù)除法
在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法 來代替,除以某個數(shù)相當(dāng)于乘以其倒數(shù),所以先求出其倒數(shù),然后相乘。這種方法對于 除以常數(shù)特別適用。另一種方法是使用SUBC 指令,重復(fù)16 次減法完成除法運(yùn)算。下 面我們以temp1/temp2 為例,說明如何使用SUBC 指令實(shí)現(xiàn)整數(shù)除法。其中變量temp1為被除數(shù),temp2 為除數(shù),結(jié)果即商存放在變量temp3 中。在完成整數(shù)除法時,先判斷
結(jié)果的符號。方法是將兩數(shù)相乘,保存A 或B 的高16 位以便判斷結(jié)果的符號。然后只 做兩個正數(shù)的除法,最后修正結(jié)果的符號。為了實(shí)現(xiàn)兩個數(shù)相除,先將被除數(shù)裝入A 或 B 的低16 位,接著重復(fù)執(zhí)行SUBC 指令,用除數(shù)重復(fù)減16 次后,除法運(yùn)算的商在累加 器的低16 位,余數(shù)在高16 位。(7)實(shí)現(xiàn) 16 位定點(diǎn)小數(shù)除法
在 C54X 中實(shí)現(xiàn)16 位的小數(shù)除法與前面的整數(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)考慮符號位對 結(jié)果小數(shù)點(diǎn)的影響。所以應(yīng)對商右移一位,得到正確的有符號數(shù)。
1.3、實(shí)驗(yàn)內(nèi)容
本實(shí)驗(yàn)需要使用C54X匯編語言實(shí)現(xiàn)加、減、乘、除的基本運(yùn)算,并通過DES的存 貯器顯示窗口觀察結(jié)果。實(shí)驗(yàn)分兩步完成:(1)編寫實(shí)驗(yàn)程序代碼
本實(shí)驗(yàn)的匯編源程序代碼主要分為六個部分:加法、減法、整數(shù)乘法、小數(shù)乘法 整數(shù)除法和小數(shù)除法。每個部分后面都有一條需要加斷點(diǎn)的標(biāo)志語句:nop 當(dāng)執(zhí)行到這條加了斷點(diǎn)的語句時,程序?qū)⒆詣訒和!_@時你可以通過“存貯器窗口”檢 查計(jì)算結(jié)果。當(dāng)然你看到的結(jié)果都是十六進(jìn)制的數(shù)。實(shí)驗(yàn)源程序請參見附錄。(2)用ccs simulator調(diào)試運(yùn)行并觀察結(jié)果
在完成實(shí)驗(yàn)程序代碼的輸入,并使用ccs進(jìn)行編譯并連接,得到out文件后,就可 以在simulator 上調(diào)試運(yùn)行。調(diào)試步驟如下:
a.啟動ccs simulator。
b.點(diǎn)擊file->load program,找到exer1.out(在產(chǎn)品光盤的codebase_operationdebug下)并裝入。這時可在反匯編窗口看到程序代碼。
c.打開“Memory”窗口,并在其中選擇要查看的存貯器地址段:0x080-0x08e。
d.在反匯編窗口中在每個“nop”指令處都設(shè)一個斷點(diǎn),方法有兩種:1.用鼠標(biāo)雙擊該 指令將其點(diǎn)亮即可。2.在菜單欄中選擇debug?breakpoint,然后在彈出的對話框中 鍵入欲加斷點(diǎn)的地址即可(注意地址的格式)。e.單擊Run快捷鍵(或者F5按鈕),啟動執(zhí)行基本算術(shù)運(yùn)算程序,程序在執(zhí)行完加法 運(yùn)算后自動暫停。通過register window窗口可以看到寄存器A的內(nèi)容為0x46,這 正是加法運(yùn)算的結(jié)果。(注意,若在硬件仿真器環(huán)境下調(diào)試,受DSP指令流水線的影響,斷點(diǎn)處可能看不到A寄存器的變化。)同樣,在Memory窗口中,可以看到0x81,0x82,0x88的內(nèi)容為分別為0012,0034,0x46。執(zhí)行加法運(yùn)算后,將0x81和0x82的內(nèi)容相加結(jié)果放在0x88單元。實(shí)驗(yàn)結(jié)果如下:
f.在Memory窗口中用鼠標(biāo)左鍵雙擊0x81單元,這時可以修改該內(nèi)存單元的內(nèi)容。輸 入新的數(shù)據(jù)0x0ffee(十進(jìn)制的-18),編輯內(nèi)容時請直接輸入FFEE(十六進(jìn)制),然 后回車確認(rèn),便完成對0x81單元的修改。
g.在register window窗口中修改PC值,方法也是鼠標(biāo)左鍵雙擊PC寄存器的內(nèi)容,輸入新的PC值0x1085(編輯內(nèi)容時直接輸入1805),并用回車鍵確認(rèn)。h.單擊Run快捷鍵(或者F5按鈕),程序從當(dāng)前PC繼續(xù)運(yùn)行,重新計(jì)算0x81和0x82 的和,結(jié)果在0x88中。當(dāng)程序再次暫停時,可以看到A寄存器和0x88的內(nèi)容為0x22(十進(jìn)制的34),這正是我們希望的結(jié)果:-18+52=34。實(shí)驗(yàn)結(jié)果如下:
i.單擊Run快捷鍵(或者F5按鈕),程序從當(dāng)前PC繼續(xù)運(yùn)行,完成減法運(yùn)算。當(dāng)程 序再次暫停時(斷點(diǎn)位于0x1093),可以看到0x83和0x84單元的內(nèi)容分別為FFEE 和0012,B寄存器的內(nèi)容為ffdc0000,而0x89的內(nèi)容為0xffdc(十進(jìn)制-36),這正
是我們希望的結(jié)果:-18-18=-36。注意,該減法操作使用了輔助寄存器尋址,所以計(jì)算結(jié)果在B寄存器的高16位。是實(shí)驗(yàn)結(jié)果如下:
j.單擊Run快捷鍵(或者F5按鈕),程序從當(dāng)前PC繼續(xù)運(yùn)行,完成整數(shù)乘法運(yùn)算。當(dāng)程序再次暫時(斷點(diǎn)位于0x109d),可以看到0x81和0x82單元的內(nèi)容分別為0012和0034,A寄存器的內(nèi)容為000003A8,這正是我們希望的結(jié)果:18*52=936(0x3a8)。這時我們可以用1個16位的內(nèi)容單元來保存結(jié)果,如將A寄存器的低16位存入0x8b單元。實(shí)驗(yàn)結(jié)果如下:
但如果將0x81的內(nèi)容修改為0x2000(十進(jìn)制的8192),在register window中將PC修改為1098,然后繼續(xù)運(yùn)行,重新計(jì)算乘法。當(dāng)程序完成乘法暫停時,可以看到A寄存器的內(nèi)容為00068000,這也是一個正確的結(jié)果:8192*52=425984(0x68000)。此時將無法用一個16位的存貯單元來保存A寄存器中的結(jié)果。
實(shí)驗(yàn)結(jié)果如下:
k.單擊Run快捷鍵或者(F5按鈕),程序從當(dāng)前PC繼續(xù)運(yùn)行,完成小數(shù)乘法運(yùn)算。當(dāng)程序再次暫停時(斷點(diǎn)位于0x10A6),可以看到0x83和0x84單元的內(nèi)容分別為4000和b548,A寄存器的內(nèi)容為40000000,乘法的結(jié)果在B寄存器中為daa40000,這正是我們希望的結(jié)果:0.5*(-0.58374)=-0.29187(0x0daa4)。對于小數(shù)乘法,一般情況都可以用1個16位的內(nèi)容單元將B寄存器的高16保存(如存入0x8c單元)。實(shí)驗(yàn)結(jié)果如下:
l.單擊Run快捷鍵(或者F5按鈕),程序從當(dāng)前PC繼續(xù)運(yùn)行,完成整數(shù)除法運(yùn)算。當(dāng)程序再次暫時(斷點(diǎn)位于0x10bb),可以看到0x81,0x82,0x8d和0x8e單元的內(nèi)容分別為0034,0012,FFFE 和0010,這正是我們希望的結(jié)果:52 除以-18,商為-2(0xfffe),余數(shù)為16(0x10)。
m.單擊Run快捷鍵(或者F5按鈕),程序從當(dāng)前PC繼續(xù)運(yùn)行,完成小數(shù)除法運(yùn)算。當(dāng)程序再次暫停時(斷點(diǎn)位于0x10d2),可以看到0x81,0x82和0x8f單元的內(nèi)容分別為4000,4ab8和6da3,這正是我們希望的結(jié)果:0.5/0.58374=0.8565457(0x6da3)。實(shí)驗(yàn)結(jié)果如下:
n.如果以上程序運(yùn)行不正確,請檢查代碼是否輸入正確,還可以在源代碼中插入斷點(diǎn) 調(diào)試,注意對中間結(jié)果的觀察。思考題 :
(1)在減法操作中使用了輔助寄存器ar2,ar3,請說明在執(zhí)行完減法計(jì)算后輔助寄存器 ar2和ar3的值為多少?
結(jié)果如下:
(2)在小數(shù)乘法中使用了置FRCT標(biāo)志為1的指令。如果將該語句取消,那么B寄存器的結(jié)果是多少?想想什么時候應(yīng)該設(shè)置FRCT標(biāo)志? 結(jié)果如下:
取消之前:
取消之后:
(3)如何實(shí)現(xiàn)無符號數(shù)的乘法?
答:輸入指令MPYU Smem,dst,輸出結(jié)果為uns(T)*uns(Smem)(4)
請利用本實(shí)驗(yàn)程序計(jì)算以下算式的結(jié)果
①、0.25*0.58374
②、0.25/0.5
③、4653/345
④、0.789687/0.876
第二章、C54X的匯編語言程序設(shè)計(jì)
2.1、實(shí)驗(yàn)?zāi)康暮鸵?/p>
匯編語言程序設(shè)計(jì)是應(yīng)用軟件的基礎(chǔ),主要任務(wù)是利用匯編指令和偽指令編寫源程序以完成指定的功能。本屆實(shí)訓(xùn)我們將采用匯編語言指令、匯編偽指令、宏偽指令和規(guī)定的數(shù)字與字符來完成實(shí)驗(yàn)。通過實(shí)驗(yàn)幫助我們對匯編語言的理解和運(yùn)用。
2.2、實(shí)驗(yàn)原理
1、匯編語言源程序由.asm為擴(kuò)展名,可以用任意的編輯器編寫源代碼。源文件格式中助記符指令源語句的每行通常包含4個部分:標(biāo)記區(qū)、助記符區(qū)、操作數(shù)區(qū)和注釋區(qū)。
2、匯編語言中的常數(shù)與字符串
匯編器支持8種類型的常數(shù):①二進(jìn)制整數(shù);②八進(jìn)制整數(shù);③十進(jìn)制整數(shù);④十六進(jìn)制整數(shù);⑤浮點(diǎn)數(shù);⑥匯編時間常數(shù);⑦字符常數(shù);⑧字符串
3、匯編源程序中的符號用于標(biāo)號、常數(shù)和替代字符。符號名最多可長達(dá)200個字符,由字母、數(shù)字以及下劃線和美元符號等組成。
4、堆棧的使用方法
當(dāng)程序調(diào)用中斷服務(wù)程序或子程序時,需要將程序計(jì)數(shù)器PC的值和一些重要的寄存器值進(jìn)行壓棧保護(hù),以便程序返回時能從間斷處繼續(xù)執(zhí)行。
5、控制程序
TMS320C54x具有豐富的程序控制指令利用這些指令可以執(zhí)行分支轉(zhuǎn)移、子程序調(diào)用子程序返回、條件操作及循環(huán)操作等控制操作。控制程序包括:分支操作程序、循環(huán)操作程序。
6、算術(shù)運(yùn)算程序
基本算術(shù)運(yùn)算包括:加減法運(yùn)算、乘法運(yùn)算、除法運(yùn)算、長字和并行運(yùn)算。
7、實(shí)驗(yàn)中所需的“.cmd”文件如下: MEMORY { PAGE 0: EPROM: org=01000H len=01F80H VECS: org=0FF80H len=0004H PAGE 1: SPRAM: org=0060H len=0030H DARAM: org=0090H len=0200H } SECTIONS {.text :>EPROM PAGE 0.data :>EPROM PAGE 0.bss :>SPRAM PAGE 1 } 7
2.3、實(shí)驗(yàn)內(nèi)容
1、計(jì)算z?(x?y)*8?w
程序如下:
.title “mjj.asm”.mmregs STACK.usect “STACK”,10h.bss x,1.bss y,1.bss w,1.bss z,1.def _c_int00.data table:.word 6,7,9 _c_int00: 結(jié)果圖如下:
start: STM #0,SWWSR
STM #STACK+10h,SP STM #x,AR1
MVPD table,*AR1+ LD @x,A ADD @y,A LD A,3 SUB @w,A STL A,@z.end
2、計(jì)算y?
?ax。iii?14程序如下:
.title “jj.asm”.mmregs STACK.usect “STACK”,10h.bss a,4.bss x,4.bss y,1.def _c_int00.data table:.word 1,2,3,4.word 8,6,4,2.text _c_int00: start: STM #0,SWWSR 結(jié)果圖如下:
STM #STACK+10h,SP STM #a,AR1 RPT #7
MVPD table,*AR1+ CALL SUM end: B end
SUM: STM #a,AR2 STM #x,AR3 RPTZ A,#3
MAC *AR2+,*AR3+,A STL A,@y RET.end
3、計(jì)算y??ax iii?14程序如下:
.title “2xh.asm”.mmregs STACK.usect “STACK”,10H;a1=0.3 a2=0.2 a3=-0.4 a4=0.1;x1=0.6 x2=0.5 x3=-0.1 x4=-0.2.bss x,4.bss a,4.bss y,1.def _c_int00.data table:.word 3*32768/10.word 2*32768/10.word-4*32768/10
.word 1*32768/10
.word 6*32768/10
.word 5*32768/10 結(jié)果圖如下:
.word-1*32768/10
.word-2*32768/10.text _c_int00:
start: SSBX FRCT STM #x,AR3
RPT #7
MVPD table,*AR3+
STM #x,AR4
STM #a,AR5 RPTZ A,#3
MAC *AR4+,*AR5+,A
STH A,@y end: B end.end
4、計(jì)算y?x1*a1?x2*a2 程序如下:
.title “cc.asm”.mmregs STACK.usect “STACK”,10h.bss x1,1.bss a1,1.bss x2,1.bss a2,1.bss y,1.def _c_int00.data table:.word 1,2,3,4 _c_int00: 結(jié)果圖如下:
start: STM #0,SWWSR
STM #STACK+10h,SP STM #x1,AR1 MVPD table,*AR1+ LD @x1,T MPY @a1,B LD @x2,T MAC @a2,B STL B,@y STH B,@y+1.end 9
5、計(jì)算y?
?ax iii?110.title “ cj.asm”.mmregs STACK.usect “STACK”,10h.bss a,10.bss x,10.bss y,1.def _c_int00.data table:.word 1,2,3,4,5,6,7,8,9,2.word 8,6,4,2,3,1,5,2,1,3.text _c_int00: start: STM #0,SWWSR
結(jié)果圖如下:
STM #STACK+10h,SP STM #a,AR1 RPT #19
MVPD table,*AR1+ CALL SUM end: B end
SUM: STM #a,AR2 STM #x,AR3 RPTZ A,#9
MAC *AR2+,*AR3+,A STL A,@y RET.end
6、求一個數(shù)的絕對值 程序如下:
.title “jj.asm”.mmregs STACK.usect “STACK”,10h.bss x,1.def _c_int00.data table:.word-9.text _c_int00: start: STM #0,SWWSR 結(jié)果圖如下:
STM #STACK+10h,SP STM #x,AR1 MVPD table,*AR1 LD *AR1,A BC end,AGT ABS A STL A,@x end: B end.end 10
7、aixi(i=1,2,3,4)找出最大值 程序如下:
.title “mm.asm”.mmregs STACK.usect “STACK”,10h.bss a,4.bss x,4.bss y,1.def _c_int00.data table:.word 1,2,3,4.word 6,4,5,3.text _c_int00: start: STM #0,SWWSR STM #STACK+10h,SP STM #2,AR4
結(jié)果圖如下:
STM #a,AR1 RPT #7
MVPD table,*AR1+ STM #a,AR2 STM #x,AR3 LD *AR2+,T MPY *AR3+,A LOOP1: LD *AR2+,T MPY *AR3+,B MAX A STL A,@y
BANZ LOOP1,*AR4-end: B end.end
8、對一個數(shù)組進(jìn)行初始化:x[8]={0,0,0,0,0,0,0,0}.程序如下:
.title “hh.asm” start: STM #0,SWWSR.mmregs STM #STACK+10h,SP STACK.usect “STACK”,10h STM #x,AR1.bss x,8 LD #0,A.def _c_int00 RPTZ A,#7.data STL A,*AR1+ table:.word 1,2,3,4,5,6,7,8 end: B end.text.end _c_int00: 結(jié)果圖如下:
9、對數(shù)組X[8]中的每個元素加1.程序如下:
.title “hh.asm”.mmregs STACK.usect “STACK”,10h.bss x,8.def _c_int00.data table:.word 1,2,3,4,5,6,7,8.text _c_int00: start: STM #0,SWWSR STM #STACK+10h,SP STM #x,AR1 結(jié)果圖如下:
RPT #7
MVPD table, *AR1+ LD #1,16,B STM #7,BRC STM #x,AR4 RPTB next-1
ADD *AR4,16,B,A STH A,*AR4+
next: LD #0,B end: B end.end
10、編寫16348/512的程序段 程序如下:.title “mm.asm”.mmregs STACK.usect “STACK”,10h.bss num,1.bss den,1.bss quot,1.def _c_int00.def start.data table:.word 16384.word 512.text _c_int00: start: STM #0,SWWSR STM #STACK+10h,SP 結(jié)果圖如下:
STM #num,AR1 RPT #1
MVPD table,*AR1+ LD @den,16,A MPYA @num ABS A
STH A,@den LD @num,A ABS A RPT #15 SUBC @den,A XC 1,BLT NEG A
STL A,@quot.end 12
第三章、FFT算法的實(shí)現(xiàn)
3.1、實(shí)驗(yàn)?zāi)康暮鸵?/p>
在數(shù)字信號處理系統(tǒng)中,F(xiàn)FT 作為一個非常重要的工具經(jīng)常使用,甚至成為DSP 運(yùn) 算能力的一個考核因素。FFT 是一種高效實(shí)現(xiàn)離散付氏變換的算法。離散付氏變換的目 的是把信號由時域變換到頻域,從而可以在頻域分析處理信息,得到的結(jié)果再由付氏逆 變換到時域。
本實(shí)驗(yàn)的目的在于學(xué)習(xí)FFT 算法,及其在TMS320C54X 上的實(shí)現(xiàn),并通過編程掌握C54X的存儲器管理、輔助寄存器的使用、位倒序?qū)ぶ贩绞降燃记?,同時練習(xí)使用CCS 的探針和圖形工具。另外在BIOS 子目錄下是一個使用DSP/BIOS 工具實(shí)現(xiàn)FFT 的程序。通過該程序,你可以使用DSP/BIOS 提供的分析工具評估FFT 代碼執(zhí)行情況。
3.2、實(shí)驗(yàn)原理
1、基 2 按時間抽取FFT 算法
對于有限長離散數(shù)字信號{x[n]},0 ≤ n ≤ N-1,其離散譜{x[k]}可以由離散付氏變換(DFT)求得。DFT 的定義為:X(K)?N?1n?0?x[n]en?0nkNN?1?j(2?)nkN K=0,1,.....N-1可以方便的把它改寫為如下形式:X(K)??x[n]W k=0,1,....,N-1不難看出,WN 是周期性(n?mN)(k?LN)nk的,且周期為N,即WN m,l=0,?1,?2....WN的周期性是DFT 的關(guān)?WN鍵性質(zhì)之一。為了強(qiáng)調(diào)起見,常用表達(dá)式WN取代W 以便明確其周期是N。
由 DFT 的定義可以看出,在x[n]為復(fù)數(shù)序列的情況下,完全直接運(yùn)算N 點(diǎn)DFT 需要(N?1)2 次復(fù)數(shù)乘法和N(N-1)次加法。因此,對于一些相當(dāng)大的N 值(如1024)來說,直接計(jì)算它的DFT 所作的計(jì)算量是很大的。FFT 的基本思想在于,將原有的N點(diǎn)序列分成兩個較短的序列,這些序列的DFT 可以很簡單的組合起來得到原序列的DFT。例如,若N 為偶數(shù),將原有的N 點(diǎn)序列分成兩個(N/2)點(diǎn)序列,那么計(jì)算N 點(diǎn)DFT 將只需要約
[(N/2)2 ·2]=N/2 次復(fù)數(shù)乘法。即比直接計(jì)算少作一半乘法。因子(N/2)2表示直接計(jì)算(N/2)點(diǎn)DFT 所需要的乘法次數(shù),而乘數(shù)2 代表必須完成兩個DFT。
上述處理方法可以反復(fù)使用,即(N/2)點(diǎn)的DFT 計(jì)算也可以化成兩個(N/4)點(diǎn)的DFT(假定N/2 為偶數(shù)),從而又少作一半的乘法。這樣一級一級的劃分下去一直到最后就劃分成兩點(diǎn)的FFT 運(yùn)算的情況。
2、實(shí)數(shù) FFT 運(yùn)算
對于離散傅立葉變換(DFT)的數(shù)字計(jì)算,F(xiàn)FT 是一種有效的方法。一般假定輸入序列是復(fù)數(shù)。當(dāng)實(shí)際輸入是實(shí)數(shù)時,利用對稱性質(zhì)可以使計(jì)算DFT 非常有效。一個優(yōu)化的實(shí)數(shù)FFT 算法是一個組合以后的算法。原始的2N 個點(diǎn)的實(shí)輸入序列組合成一個N 點(diǎn)的復(fù)序列,之后對復(fù)序列進(jìn)行N 點(diǎn)的FFT 運(yùn)算,最后再由N 點(diǎn)的復(fù)數(shù)輸出拆散成2N 點(diǎn)的復(fù)數(shù)序列,這2N 點(diǎn)的復(fù)數(shù)序列與原始的2N 點(diǎn)的實(shí)數(shù)輸入序列的DFT輸出一致。使用這種方法,在組合輸入和拆散輸出的操作中,F(xiàn)FT 運(yùn)算量減半。這樣利用實(shí)數(shù)FFT算法來計(jì)算實(shí)輸入序列的DFT 的速度幾乎是一般復(fù)FFT 算法的兩倍。本實(shí)驗(yàn)就用這種方法實(shí)現(xiàn)了一個256 點(diǎn)實(shí)數(shù)FFT(2N = 256)運(yùn)算。
a.實(shí)數(shù) FFT 運(yùn)算序列的存儲分配
如何利用有限的 DSP 系統(tǒng)資源,合理的安排好算法使用的存儲器是一個比較重要的問題。b.基二實(shí)數(shù) FFT 運(yùn)算的算法
該算法主要分為四步:第一步,輸入數(shù)據(jù)的組合和位倒序;第二步,N 點(diǎn)復(fù)數(shù)FFT;第三步,分離復(fù)數(shù) FFT 的輸出為奇部分和偶部分;第四步,產(chǎn)生最后的 N = 256 點(diǎn)的復(fù)數(shù)FFT 結(jié)果。
3、計(jì)算所求信號的功率
由于最后所得的 FFT 數(shù)據(jù)是一個復(fù)數(shù),為了能夠方便的在虛擬頻譜儀上觀察該信號的特征,我們通常對所得的FFT 數(shù)據(jù)進(jìn)行處理取其實(shí)部和虛部的平方和,即求得該信號的功率。23.3、實(shí)驗(yàn)內(nèi)容
本實(shí)驗(yàn)在CCS 下完成256 點(diǎn)的實(shí)數(shù)FFT,并通過CCS 的圖形顯示工具觀察結(jié)果。
其主程序?yàn)槌跏蓟?,并通過探針工具讀入256 點(diǎn)方波數(shù)據(jù)(在文件fft.dat 中,該數(shù)據(jù)文 件可以通過程序fft_data.c 修改,但注意數(shù)據(jù)的絕對值不要超過0x23ff)。FFT 的實(shí)現(xiàn)由 四個子程序代碼bit_rev、fft、unpack 和power 代碼完成。實(shí)驗(yàn)可以分為以下幾步:(1)啟動 CCS,在Project 菜單選項(xiàng)中打開FFT 目錄下的fft.pjt 文件。(2)用鼠標(biāo)展開左面項(xiàng)目欄,打開 fft.asm 源程序。
(3)使用 Bulid 命令完成編譯、連接,并使用Load Program 將生成的fft.out 裝入5410 片內(nèi)存儲器。
(4)將光標(biāo)移動到“call get_input”行,并設(shè)置一個探針點(diǎn)。將光標(biāo)移動到下一行“nop”語句,使用工具設(shè)置一個斷點(diǎn)。
(5)在 File 菜單中打開選項(xiàng)“File I/O”,使用“Add File”在FFT 目錄下打開數(shù)據(jù)文件 fft.dat,然后修改“Address”參數(shù)為0x2300,修改“Length”參數(shù)為256。這表示程序執(zhí)行到探針點(diǎn)時,將從fft.dat 文件中讀出256 個數(shù)據(jù),并將數(shù)據(jù)放入0x2300開始的存儲器中。你可以選擇“Wrap Around”,循環(huán)使用該數(shù)據(jù)文件。(6)選擇“Add Probe Point”,將探針點(diǎn)與數(shù)據(jù)文件連接起來。選擇探針點(diǎn),然后在“Connect”選項(xiàng)中選擇需要使用的數(shù)據(jù)文件名,再選擇“Replace”,按確定鍵完成。可以看到“Probe”項(xiàng)被自動修改為“Connected”,表示探針已經(jīng)與數(shù)據(jù)文件成功相連。
(7)完成探針設(shè)置后,可以使用F5 或“Run”命令啟動程序運(yùn)行。程序執(zhí)行到探針點(diǎn)時
自動從數(shù)據(jù)文件讀出256 個點(diǎn)的數(shù)據(jù)放入輸入緩沖0x2300。(8)在“View”菜單項(xiàng)下選擇“Graph-> Time/Frequency”,打開一個圖形工具以便顯示 輸入數(shù)據(jù)波形。將“Start Address”改為0x2300,將“Acquisition Buffer Size”改為128,將“DSP Data Type”改為“16-bit signed integer”,這樣即可顯示128 個輸入點(diǎn)波形。實(shí)驗(yàn)結(jié)果圖如下:
(9)調(diào)整窗口顯示大小,將光標(biāo)移動到源程序的“b _c_int00”這行,使用Debug 中的 “Run to Cursor”項(xiàng),程序?qū)?zhí)行到這行并停下。這時FFT 程序已經(jīng)計(jì)算完成。
再打開一個波形顯示窗口,這次僅僅將“Start Address”改為0x2200,便可以顯示計(jì)算 完成后的譜波形。
(10)選擇“Debug”下的“Animate”運(yùn)行程序,這時程序?qū)⒀h(huán)運(yùn)行,不斷從數(shù)據(jù)文件 fft.dat 中讀出數(shù)據(jù),并計(jì)算其頻譜。這時你可以看到連續(xù)的輸入/輸出波形。
(11)選擇原始數(shù)據(jù)波形窗口,單擊鼠標(biāo)右鍵,進(jìn)入“Properties”屬性對話框。你可以將 “Display Type”改為“FFT Magnitude”,這時輸入數(shù)據(jù)將顯示其頻譜。
思考題:
||SUB *AR2+0%,B
答:SACDD B,*AR2,#1
DST B,*AR1,LD *AR2+0%,16,B
SUB AR1,B(1)ST B,*AR3+
||LD *AR2,A 答:SACDD B,*AR3+,#1
LD *AR2,16,A
(2)ST B,*AR2(3)ST B,*PX+ ||MPY *QX+,A 答:SACCD B,*PX+,BNEQ
MPY *QX+,A
第四章、ASK、PSK、FSK調(diào)制的實(shí)現(xiàn)
4.1、實(shí)驗(yàn)?zāi)康?/p>
數(shù)字調(diào)制信號又稱為鍵控信號,其調(diào)制過程是用鍵控的方法由基帶信號對載頻信號的振幅、頻率及相位進(jìn)行調(diào)制。這種調(diào)制的最基本方法有三種:振幅鍵控(ASK)、相移鍵控(PSK)、頻移鍵控(FSK)。本節(jié)實(shí)訓(xùn)將通過CCS軟件來實(shí)現(xiàn)對ASK、PSK、FSK的調(diào)制,并掌握它們之間的聯(lián)系與不同。
4.2、實(shí)驗(yàn)原理
1、FSK頻移鍵控的基本原理:用數(shù)字基帶信號來控制高頻載波頻率的變化,使載波的頻率在f1和f2之間變化。二進(jìn)制頻移信號可以看成兩個不同載波的二進(jìn)制振幅鍵控信號的疊加。
2、PSK相移鍵控的基本原理:用數(shù)字調(diào)制信號的正負(fù)控制載波相位。當(dāng)數(shù)字信號的振幅為正時載波起始相位取0;當(dāng)數(shù)字信號的振幅為負(fù)時,載波起始相位取180度。相移鍵控抗干擾能力強(qiáng),但在解調(diào)是需要有一個正確的參考相位,即需要相干解調(diào)。
3、ASK振幅鍵控的基本原理:是用調(diào)制信號去控制高頻正弦載波的幅度,使其按調(diào)制信號的規(guī)律變化的過程。
4.3、實(shí)驗(yàn)內(nèi)容
1、FSK的實(shí)現(xiàn)
匯編語言程序:
.title“fsk_asm.asm”.global _fsk;定義為全局變量,提供給C調(diào)用.global _y1;C程序變量.global _y2;C程序變量.global _Pulse;C程序變量.global _FskSignal;C程序變量.mmregs.text _fsk: rsbx CPL stm #8-1,AR1;循環(huán)變量 256/32=8 stm #_y1, AR4
stm #_y2, AR2 stm #_Pulse, AR3 stm #_FskSignal, AR5 loop: ld *AR3, A bc freq500, AEQ;若原始數(shù)字信號為0,則調(diào)頻信號為頻率為500Hz的正弦波 sub #1, A bc freq1000, AEQ;若原始數(shù)字信號為1,則調(diào)頻信號為頻率為1000Hz的正弦波 fskend: addm #32, AR3 banz loop, *AR1-ret freq500: rpt #32-1 freq1000: rpt #32-1 mvdd *AR4+, *AR5+ mvdd *AR2+, *AR5+ addm #-32,AR4 addm #-32,AR2 b fskend b fskend.end C語言程序:
extern void fsk();// fc=(0x2000/0x10000)*fs=1000Hz, fs#include “C54MATH.H” 固定在8000 DATA x[256];} DATA y1[256];//正弦信號1 sine(x, y2, N);DATA y2[256];//正弦信號2 //原始信號 DATA Pulse[256];//被調(diào)信號 for(i=0;i
//按照當(dāng)前文件夾內(nèi)給出的圖 for(i=0;i { for(;;){};x[i]=i*0x2000;} 結(jié)果圖如下: 2、PSK的實(shí)現(xiàn) 程序如下: extern void fsk(); #include “C54MATH.H” DATA x[256];DATA y1[256]; //正弦信號1 DATA y2[256]; //正弦信號2 DATA Pulse[256];//被調(diào)信號 DATA FskSignal[256];//2FSK調(diào)制信號 #define N 256 void main(){ int i,j; //產(chǎn)生一個500Hz的正弦信號作為調(diào)制信號 for(i=0;i x[i]=i*0x1000; // fc=(0x1000/0x10000)*fs=500Hz, fs固定在8000 } sine(x, y1, N);//產(chǎn)生一個1000Hz的正弦信號作為調(diào)制信號 for(i=0;i x[i]=-i*0x1000; // fc=(0x2000/0x10000)*fs=1000Hz, fs固定在8000 實(shí)驗(yàn)結(jié)果圖如下: } sine(x, y2, N);//原始信號 for(i=0;i { j=i/32; switch(j%2) { case 0: Pulse[i]=0; break; case 1: Pulse[i]=1; break; } } fsk();//運(yùn)行到此處后,打開View->Graph->Time/Frequency Graph,//按照當(dāng)前文件夾內(nèi)給出的圖形屬性設(shè)置,即可顯示2FSK信號 for(;;){}; } 18 3、ASK的實(shí)現(xiàn) extern void fsk();#include “C54MATH.H” DATA x[256];DATA y1[256];//正弦信號1 DATA y2[256];//正弦信號2 DATA Pulse[256];//被調(diào)信號 DATA FskSignal[256];//2FSK調(diào)制信號 #define N 256 void main(){ int i,j;//產(chǎn)生一個500Hz的正弦信號作為調(diào)制信號 for(i=0;i case 0: y1[i]=0;break;} } //產(chǎn)生一個1000Hz的正弦信號作為調(diào)制信號 for(i=0;i 實(shí)驗(yàn)結(jié)果圖如下: // fc=(0x2000/0x10000)*fs=1000Hz, fs固定在8000 } sine(x, y2, N);//原始信號 for(i=0;i j=i/32; switch(j%2){ case 0: Pulse[i]=0;break; case 1: Pulse[i]=1;break;} } fsk();//運(yùn)行到此處后,打開View->Graph->Time/Frequency Graph,//按照當(dāng)前文件夾內(nèi)給出的圖形屬性設(shè)置,即可顯示2FSK信號 for(;;){};} 19 心得體會 為期兩個星期的實(shí)訓(xùn)結(jié)束了,這兩個周的實(shí)訓(xùn)讓我收獲頗多。在實(shí)訓(xùn)中我深深體會到了DSP技術(shù)及應(yīng)用這門課的博大精深,里面包含的知識很多,緊靠平時的理論課程來理解是遠(yuǎn)遠(yuǎn)不夠的。在理論課程中我們主要學(xué)習(xí)了TMS320C54x的硬件結(jié)構(gòu)、它的指令系統(tǒng),匯編語言程序的開發(fā)工具、匯編語言的程序設(shè)計(jì)還有應(yīng)用程序設(shè)計(jì)等內(nèi)容。這次實(shí)訓(xùn)的內(nèi)容主要是基本算術(shù)運(yùn)算、C54X算法的匯編語言程序設(shè)計(jì)、FFT算法的實(shí)現(xiàn)以及ASK、FSK、PSK調(diào)制的實(shí)現(xiàn)。 這次的實(shí)訓(xùn)課程說難也不是很難但說簡單它也絕對不簡單,看似簡單是東西做起來就不一定了,在實(shí)驗(yàn)的過程中也出現(xiàn)不少的問題。因?yàn)橹皼]有接觸過這個軟件,所以在開始實(shí)驗(yàn)前我們是先對CCS軟件進(jìn)行了了解,再通過實(shí)際操作熟悉軟件,然后再做實(shí)訓(xùn)內(nèi)容。在這次實(shí)訓(xùn)中我學(xué)到了如何使用CCS軟件來進(jìn)行簡單的運(yùn)算,并且能通過該軟件來查看實(shí)驗(yàn)結(jié)果和修改結(jié)果。我們還做了FFT算法的實(shí)現(xiàn)并且對ASK、FSK、PSK進(jìn)行了簡單的調(diào)制,調(diào)制過程中遇到了很多麻煩,比如圖形出不來或是出現(xiàn)不規(guī)則圖形等等的問題。但經(jīng)過我們不懈的努力、重復(fù)的實(shí)驗(yàn),在實(shí)驗(yàn)結(jié)果出來并且正確的時候我的心情是激動的。在實(shí)訓(xùn)過程中我們遇到了不少困難。因?yàn)閷浖牟皇煜?,?dǎo)致不知道從什么地方查看結(jié)果,查看結(jié)果不正確也不知道該從哪修改,不過在老師耐心的講解和同學(xué)的熱心幫助下,我們還是順利的完成了實(shí)訓(xùn)。 通過這次實(shí)訓(xùn)我收獲了很多,也成長了很多,明白了理論聯(lián)系實(shí)際的重要性,還知道了“團(tuán)結(jié)就是力量”的真理,希望在以后的學(xué)習(xí)工作中我能將我所學(xué)到的知識發(fā)揮得淋漓盡致。最后感謝老師的諄諄教誨,沒有您耐心的教導(dǎo)我們不可能這么順利就完成任務(wù)。 .c圖 實(shí)驗(yàn)二 #define UINT unsigned int UINT i,*p,*n;void main(void){ p=(UINT *)0x0300; for(i=0;i<20;i++) { if(*p==0x8888) n=p; p++; } }.cmd圖 MEMORY { PAGE 0: PROG: origin = 1a00h, length = 2580h vectors: origin = 3f80h, length = 80h PAGE 1: DATA: origin = 0200h, length = 1800h } SECTIONS { .text > PROG PAGE 0 .cinit > PROG PAGE 0 //.switch > PROG PAGE 0 vect > vectors PAGE 0 .data > DATA PAGE 1 .bss > DATA PAGE 1 .const > DATA PAGE 1 .sysmem > DATA PAGE 1 .stack > DATA PAGE 1 } xf高低電平等時間循環(huán)變化截圖如下所示: 找出由地址0x0300~0x0320中存儲數(shù)據(jù)為0x8888的地址截圖如下所示: 心得體會: 經(jīng)過這次實(shí)驗(yàn),理解了對地址0x0300~0x0320中存儲數(shù)據(jù)為0x8888的尋找和設(shè)置。第五篇:dsp作業(yè)