久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

DSP芯片教學

時間:2019-05-15 07:04:52下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《DSP芯片教學》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《DSP芯片教學》。

第一篇:DSP芯片教學

DSP芯片的特點

1采用哈佛結構 2采用多總線結構 3采用流水線結構 4配有專用的硬件乘法-累加器 5具有特殊的尋址方式和指令 6支持并行指令操作 7硬件配置強,具有較強的接口功能 8支持多處理器結構。

數字信號處理的特點

抗干擾、可靠性強、便于大規模集成精度高靈活性強

可以實現模擬系統很難達到的指標或特性

可以實現多維信號處理

缺點:增加了系統的復雜性

應用的頻率范圍受到限制

系統的功率消耗比較大 CPU包含5個功能單元

指令緩沖單元

程序流單元

地址-數據流單元

數據運算單元

存儲器接口單元

指令流水線分為兩個階段。

1取指階段從存儲器取來32位指令包,將其存入指令緩沖隊列

2執行階段:對指令進行譯碼,并完成數據訪問和計算

預取指1 預取指2 取指 預解碼

解碼 尋址 訪問1 訪問2 讀 執行 寫 寫+

當D單元ALU做加法運算 產生進位 置位CARRY 不進位 CARRY清0

當D單元ALU做減法運算 產生借位 CARRY清0 不借位 CARRY置位

當CPU讀取程序代碼時,使用24位的地址訪問相關的字節;

而CPU讀/寫I/O空間時,將16位地址前補0來擴展成24位地址

CPU讀程序指令每次固定讀取32位長的指令,且固定以最低的2個字節為00h的地址為首地址讀取訪問數據堆棧時,CPU將SPH和SP連接成XSP。XSP包含了一個最后推入數據堆棧的23位地址,其中SPH中是7位的主 數據頁,SP指向該頁上的一個字。CPU在每推入一個值入堆棧前,減小SP值;從堆棧彈出一個值以后,增加SP值。在堆棧操作中,SPH的值不變。

訪問系統堆棧時,CPU將SPH和SSP連接成XSSP。XSSP包含了一個最后推入系統堆棧的值的地址。CPU在每推入一個值進堆棧前,減小SSP值;從堆棧彈出一個值以后,增加SSP值。在堆棧操作中,SPH的值不變。

快返回與慢返回過程的區別在于:CPU怎樣保存和恢復2個內部存儲器(即程序計數器PC和一個循環現場寄存器)的值。慢返回,返回地址和循環現場保存在堆棧中快返回過程中,返回地址和循環現場保存在寄存器里

DSP處理中斷過程

1接收中斷請求

2響應中斷請求

3準備進入中斷服務子程序。CPU要執行的主要任務有: 完成當前指令的執行,并沖掉流水線上還未解碼的指令。自動將某些必要的寄存器的值保存到數據堆棧和系統堆棧。

從用戶事先設置好的向量地址獲取中斷向量,該中斷向量指向中斷服務子程序 4執行中斷服務子程序

所有的可屏蔽中斷都是硬件中斷。

不可屏蔽中斷

1硬件中斷 RESET 2硬件中斷 NMI

3軟件中斷

硬件復位后,DSP處于一個已知狀態,即所有當前指令全部終止,指令流水清空,CPU寄存器復位。然后CPU執行中斷服務子程序,讀復位中斷向量時,CPU用32位復位向量的第29、28位來確定堆棧配置模式。

使用const關鍵字可以定義大常數表并將它們分配到系統ROM中。ioport關鍵字來支持I/O尋址模式

ioport類型限定詞只能用于全局或靜態變量。局部變量不能用ioport限制,除非變量是個指針 增加了interrupt關鍵字,來指定某個函數為中斷函數。

Onchip關鍵字聲明一個特殊指針,在鏈接時這些數據必須被鏈接到DSP片上存儲器,否則會導致總線錯誤。volatile在任何情況下,優化器會通過分析數據流來避免存儲器訪問。如果程序依靠存儲器訪問,則必須使用volatile關鍵字來指明這些訪問。系統初始化

1變量的自動初始化2.全局構建器(Global Constructors)3.初始化表(Initialization Tables)4.運行時間變量初始化5.裝載時間變量初始化 小數定標的概念

設定一個16位數的小數點處于該數中的哪一位 可以表示不同大小和不同精度的小數 Q表示法

不同的Q所表示的數不僅范圍不同,而且精度也不相同

Q越大,數值范圍越小,但精度越高Q越小,數值范圍越大,但精度就越低 溢出處理機制

1保護位

2溢出標志位

3飽和方式位SATD和SATA

第二篇:DSP實驗報告

實驗0 實驗設備安裝才CCS調試環境 實驗目的:

按照實驗講義操作步驟,打開CCS軟件,熟悉軟件工作環境,了解整個工作環境內容,有助于提高以后實驗的操作性和正確性。實驗步驟:

以演示實驗一為例:

1. 使用配送的并口電纜線連接好計算機并口與實驗箱并口,打開實驗箱電源;

2.啟動CCS,點擊主菜單“Project->Open”在目錄“C5000QuickStartsinewave”下打開工程文件sinewave.pjt,然后點擊主菜單“Project->Build”編譯,然后點擊主菜單“File->Load Program”裝載debug目錄下的程序sinewave.out;

3. 打開源文件exer3.asm,在注釋行“set breakpoint in CCS!!”語句的NOP處單擊右鍵彈出菜單,選擇“Toggle breakpoint”加入紅色的斷點,如下圖所示;

4. 點擊主菜單“View->Graph->Time/Frequency…”,屏幕會出現圖形窗口設置對話框

5. 雙擊Start Address,將其改為y0;雙擊Acquisition Buffer Size,將其改為1;DSP Data Type設置成16-bit signed integer,如下圖所示;

6. 點擊主菜單“Windows->Tile Horizontally”,排列好窗口,便于觀察

7. 點擊主菜單“Debug->Animate”或按F12鍵動畫運行程序,即可觀察到實驗結果:

心得體會:

通過對演示實驗的練習,讓自己更進一步對CCS軟件的運行環境、編譯過程、裝載過程、屬性設置、動畫演示、實驗結果的觀察有一個醒目的了解和熟悉的操作方法。熟悉了DSP實驗箱基本模塊。讓我對DSP課程產生了濃厚的學習興趣,課程學習和實驗操作結合為一體的學習體系,使我更好的領悟到DSP課程的實用性和趣味性。實驗二 基本算數運算

2.1 實驗目的和要求

加、減、乘、除是數字信號處理中最基本的算術運算。DSP 中提供了大量的指令來

實現這些功能。本實驗學習使用定點DSP 實現16 位定點加、減、乘、除運算的基本方法

和編程技巧。本實驗的演示文件為exer1.out。

2.2 實驗原理 定點 DSP 中的數據表示方法

C54X 是16 位的定點DSP。一個16 位的二進制數既可以表示一個整數,也可以表

示一個小數。當它表示一個整數時,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。實現 16 位定點加法

C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中

ADDS 用于無符號數的加法運算,ADDC 用于帶進位的加法運算(如32 位擴展精度加

法),而ADDM 專用于立即數的加法。實現 16 位定點減法

C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數的減法運算,SUBB 用于帶進位的減法運算(如32 位擴展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實現的。實現 16 位定點整數乘法

在C54X 中提供了大量的乘法運算指令,其結果都是32 位,放在A 或B 寄存器

中。乘數在C54X 的乘法指令很靈活,可以是T 寄存器、立即數、存貯單元和A 或B 寄存器的高16 位。實現 16 位定點小數乘法

在 C54X 中,小數的乘法與整數乘法基本一致,只是由于兩個有符號的小數相乘,其結果的小數點的位置在次高的后面,所以必須左移一位,才能得到正確的結果。C54X 中提供了一個狀態位FRCT,將其設置為1 時,系統自動將乘積結果左移一位。但注意

整數乘法時不能這樣處理,所以上面的實驗中一開始便將FRCT 清除。兩個小數(16 位)

相乘后結果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可

得到16 位的結果。6 實現 16 位定點整數除法

在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法

來代替,除以某個數相當于乘以其倒數,所以先求出其倒數,然后相乘。這種方法對于

除以常數特別適用。另一種方法是使用SUBC 指令,重復16 次減法完成除法運算。實現 16 位定點小數除法

在 C54X 中實現16 位的小數除法與前面的整數除法基本一致,也是使用循環的

SUBC 指令來完成。但有兩點需要注意:第一,小數除法的結果一定是小數(小于1),所以被除數一定小于除數。

2.3 實驗內容

本實驗需要使用C54X 匯編語言實現加、減、乘、除的基本運算,并通過DES 的存 貯器顯示窗口觀察結果。1 編寫實驗程序代碼 用 ccs simulator 調試運行并觀察結

2.4 實驗結果

1、加法結果

2、乘法結果

3、減法結果

4、除

2.5 思考題(0.5、0.25)

實驗三 C54X的浮點數的算術運

一、實驗目的 練習TMS320C54X 匯編程序的編寫與調試方法,重點練習C54X 程序流程控制的方法。學習并掌握應用 TMS320C54X 來進行浮點數的各種算術運算的算法實現。練習并掌握 TMS320C54X 的匯編語言的匯編指令系統的使用方法,重點練習具有C54X 特點的一些在功能上有所擴展的特殊指令,并了解這些指令在進行算術運算或各種控制時所帶來的方便。練習并掌握用 CCS 調試程序的一些基本操作。二.實驗原理 1 浮點數的表示方法

在定點運算中,小數點是在一個特定的固定位置。例如,如果一個 32-bit 的數把小數點放在最高有效位(也就是符號位)之后,那么就只有分數(絕對值小于1)才能被顯示。在定點運

算系統中,雖然在硬件上實現簡單,但是表示的操作數的動態范圍要受到限制。3 浮點數運算的步驟

程序代碼分成四個 ASM 文件輸入,通過編譯生成.obj 文件,連接生成.out 文件后就可以在DES320PP-U 實驗系統上調試運行(先要創建一個工程文件,然后加入四個工程文件,并且一起編譯,連接。因為每個文件都對下一個文件作了引用)。步驟如下:

a.首先啟動 setup CCS C5000,在其中設置目前需要的CCS 的工作狀態為C54xxsimulator,保存這一設置并退出。然后再啟動CCS 實驗系統軟件CCS C5000。

b.在下拉菜單中選擇“File”->“Load Program”以裝入所要調試的程序fc.out,這時,在反匯編窗口中能看到程序的源代碼。

c.在下拉菜單中選擇“View”->“CPU Registers”->“CPU Register”,可以看見在CCS 界面下部份會出現CPU 中的相關寄存器;選擇“View”->“Memory…”,在彈出的“Memory Window Options”窗口中選擇要觀察的區域為數據區,地址開始為0x80h,然后就可以看見出現一個Data Memory 窗口,其中顯示了從0x80h 開始的.bss 區。

d.在反匯編窗口中需要觀察的地方設置斷點:在這條指令處雙擊將其點為紅色即可。比如在加法程序中有指令nop 的位置都可以加一個斷點。

e.在下拉菜單中選擇“調試”——“連續運行”(或直接點擊“運行程序”按鈕)運行浮點數程序。如果編寫程序時在計算完畢后遇到一個斷點,那么程序到此會自動停止。

f.當示范程序在第一個斷點處停下來時,此時就可以看見程序初始化后的情況:被加數12.0 以浮點數的格式放在內存區0x08a-0x08b 中,其值為4140h 和0000h。加數12.0 放在內存區0x08c-0x08d 中,其值也為4140h 和0000h。

g.再點擊“運行程序”按鈕,之后程序會在下一個斷點處停下來,這時可以看見被加數被格式轉換后的變量op1hm、op1lm 和op1se 的值在內存區0x084-0x086 中,分別為00c0h、0000h 和0082h。同樣加數被格式轉換后的變量op2se、op2hm 和op2lm的值在內存區0x087-0x089 中,分別為0082h、00c0h 和0000h。

h.再點擊“運行程序”按鈕,程序停下來時就可以觀察到在存儲器窗口中表示結果的變量rlthm、rltlm、rltsign 和rltexp 的值在內存區0x080-0x083 中,其值分別為0040h、0000h、0180h 和0083h。

i.這時可以看到 A 寄存器中的值為AH=41c0h,AL=0000h 這就是最后的以浮點數的格式表示的結果值24(=12+12)。加法運算到此結束。

j.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的13.0 與12.0 進行減法運算的結果:AH=3f80h,AL=0000h。這是用浮點數格式表示的數1(=13-12)。減法運算的程序到此結束。

k.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與12.0 進行乘法運算的結果:AH=4310h,AL=0000h。這是用浮點數格式表示的數144(=12*12)。乘法運算的程序到此結束。

l.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與4.0 進行除法運算的結果:AH=4040h,AL=0000h。這是用浮點數格式表示的數3(=12/4)。至此加、減、乘、除四種運算都運行完畢。

m.如果程序運行不正確,請檢查源程序是否有誤,必要時可以在源程序中多插入斷點語句。程序在執行到斷點語句時自動暫停,此時可以通過檢查各個寄存器中的值以及內存單元中的值來判斷程序執行是否正確。

三.在 CCS 的C54xx simulator 上調試觀察實驗結果

浮點加法斷點一:

浮點加法斷點二:

浮點加法斷點三:

浮點減法

浮點數乘法

浮點數除法

四 心得體會

通過學習C54X的浮點數的算術運算,以及實驗結果的觀察,使我了解了浮點數運算的原理,學習并掌握用TMS320C54X來進行浮點數的各種算術運算的算法實現。實驗四用定時器實現數字振蕩器

實驗四 用定時器實現數字振蕩器

4.1 實驗目的

在數字信號處理中,會經常使用到正弦/余弦信號。通常的方法是將某個頻率的正弦/余弦值預先計算出來后制成一個表,DSP 工作時僅作查表運算即可。在本實驗中將介紹另一種獲得正弦/余弦信號的方法,即利用數字振蕩器用疊代方法產生正弦信號。本實驗除了學習數字振蕩器的DSP 實現原理外,同時還學習C54X 定時器使用以及中斷服務程序編寫。另外,在本實驗中我們將使用匯編語言和C 語言分別完成源程序的編寫。

4.2

本實驗利用定時器產生一個 2kHz 的正弦信號。定時器被設置成每25uS 產生一次中斷(等效于采樣速率為40K)。利用該中斷,在中斷服務程序中用疊代算法計算出一個SIN值,并利用CCS 的圖形顯示功能查看波形。

4.3 實驗原理 數字振蕩器原理

sinkωT,其

z 變換為

H(z=

其中,A=2cosωT, B=-1, C=sinωT。設初始條件為0,求出上式的反Z 變換得:

y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2 C54X 的定時器操作

C54X 的片內定時器利用CLKOUT 時鐘計數,用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表4-1。在表4-2 中列出了定時器控制寄存器的各個比特位的具體定義。‘VC5402 的另一個定時器(定時器1)的控制寄存器分別為:0x30

TIM1),0x31(PRD1),0x32(TCR1)。C54X 中斷的使用

C54X 中用戶可以通過中斷屏蔽寄存器 IMR 來決定開放或關閉一個中斷請求。圖 4-1 給出了 C5402 的 IMR 寄存器的各個比特位的定義。

圖 4-1 ‘C5402 的IMR 寄存器

其中,表示HPI 接口中斷,INT3-INT0 為外部引腳產生的中斷,TXINT 和TRINT 為TDM 串口的發送和接收中斷,BXINT0 和BRINT0 BSP 串口的發送和接收中斷,14

為定時器 0 中斷。在中斷屏蔽寄存器 IMR 中,1 表示允許 CPU 響應對應的中斷,0 表示禁止。當然要 CPU 響應中斷,INTM 還應該為 0(允許所有的中斷)。

本實驗的初始化程序讀取中斷向量表的啟始地址,然后設置的高

DSP 能正確響應中斷,代碼如下:

ld #0,dp ;設置DP 頁指針 ssbx intm ;關閉所有中斷

ld #vector, a ;讀出中斷向(地址vector 在中斷向量表程序中定義)

and #0FF80h, a ;保留高9 位(IPTR)andm #007Fh, pmst ;保留PMST 的低7 位 or pmst, a ;

stlm a, pmst ;設置PMST(其中包括IPTR)

4.4 實驗內容

C54X 匯編語言或C 語言實現數字振蕩器,并通過CCS 提供的圖形顯示窗口觀察出信號波形以及頻譜。實驗分下面幾步完成: 根據確定數字振蕩器的頻率,確定系數。2 啟動 CCS,新建工程文件。

選擇 Project 菜單中的Options 選項,或使用鼠標右鍵單擊工程文件名(如sinewave.pjt)并選擇build options 項來修改或添加編譯、連接中使用的參數。選擇Linker Output Filename”欄中寫入輸出OUT 文件的名字,如sine.out,你還可以設置生成的MAP 文件名。4 完成編譯、連接,正確生成OUT 文件。5 選 View→Graph→

5…打開圖形顯示設置窗口。在匯編源程序的中斷服務程序(_tint)中的“nop”語句處設置斷點。用右鍵單擊圖形顯示窗口,并選擇“Proporties”項以便修改顯示屬性。清除所有斷點,關閉除波形顯示窗口外的所有窗口,并關閉工程文件。完成編譯、連接,正確生成OUT 文件。

10打開 C 源程序(timer.c)窗口,在中斷服務程序(函數tint()的“con_buf=0

Start Address ”改為 buf ;“ Acquisition Buffer Size ”改為“ Display Data Size 128,“DSP DataType”為“32-bit floating point”

11選擇 Debug→Animate,運行程序,觀察輸出波形。

第三篇:DSP實驗報告

實驗0 實驗設備安裝才CCS調試環境

實驗目的:

按照實驗講義操作步驟,打開CCS軟件,熟悉軟件工作環境,了解整個工作環境內容,有助于提高以后實驗的操作性和正確性。實驗步驟:

以演示實驗一為例:

1. 使用配送的并口電纜線連接好計算機并口與實驗箱并口,打開實驗箱電源; 2.啟動CCS,點擊主菜單“Project->Open”在目錄“C5000QuickStartsinewave”下打開工程文件sinewave.pjt,然后點擊主菜單“Project->Build”編譯,然后點擊主菜單“File->Load Program”裝載debug目錄下的程序sinewave.out;

3. 打開源文件exer3.asm,在注釋行“set breakpoint in CCS!!”語句的NOP處單擊右鍵彈出菜單,選擇“Toggle breakpoint”加入紅色的斷點,如下圖所示; 4. 點擊主菜單“View->Graph->Time/Frequency?”,屏幕會出現圖形窗口設置對話框

5. 雙擊Start Address,將其改為y0;雙擊Acquisition Buffer Size,將其改為1;DSP Data Type設置成16-bit signed integer,如下圖所示;

6. 點擊主菜單“Windows->Tile Horizontally”,排列好窗口,便于觀察

7. 點擊主菜單“Debug->Animate”或按F12鍵動畫運行程序,即可觀察到實驗結果:

心得體會:

通過對演示實驗的練習,讓自己更進一步對CCS軟件的運行環境、編譯過程、裝載過程、屬性設置、動畫演示、實驗結果的觀察有一個醒目的了解和熟悉的操作方法。熟悉了DSP實驗箱基本模塊。讓我對DSP課程產生了濃厚的學習興趣,課程學習和實驗操作結合為一體的學習體系,使我更好的領悟到DSP課程的實用性和趣味性。

實驗二 基本算數運算

2.1 實驗目的和要求

加、減、乘、除是數字信號處理中最基本的算術運算。DSP 中提供了大量的指令來 實現這些功能。本實驗學習使用定點DSP 實現16 位定點加、減、乘、除運算的基本方法 和編程技巧。本實驗的演示文件為exer1.out。

2.2 實驗原理

1)定點 DSP 中的數據表示方法

C54X 是16 位的定點DSP。一個16 位的二進制數既可以表示一個整數,也可以表

示一個小數。當它表示一個整數時,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。

2)實現 16 位定點加法

C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中

ADDS 用于無符號數的加法運算,ADDC 用于帶進位的加法運算(如32 位擴展精度加 法),而ADDM 專用于立即數的加法。

3)實現 16 位定點減法

C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數的減法運算,SUBB 用于帶進位的減法運算(如32 位擴展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實現的。

4)實現 16 位定點整數乘法

在C54X 中提供了大量的乘法運算指令,其結果都是32 位,放在A 或B 寄存器 中。乘數在C54X 的乘法指令很靈活,可以是T 寄存器、立即數、存貯單元和A 或B 寄存器的高16 位。

5)實現 16 位定點小數乘法

在 C54X 中,小數的乘法與整數乘法基本一致,只是由于兩個有符號的小數相乘,其結果的小數點的位置在次高的后面,所以必須左移一位,才能得到正確的結果。C54X 中提供了一個狀態位FRCT,將其設置為1 時,系統自動將乘積結果左移一位。但注意 整數乘法時不能這樣處理,所以上面的實驗中一開始便將FRCT 清除。兩個小數(16 位)相乘后結果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可 得到16 位的結果。

6)實現 16 位定點整數除法

在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法 來代替,除以某個數相當于乘以其倒數,所以先求出其倒數,然后相乘。這種方法對于 除以常數特別適用。另一種方法是使用SUBC 指令,重復16 次減法完成除法運算。

7)實現 16 位定點小數除法

在 C54X 中實現16 位的小數除法與前面的整數除法基本一致,也是使用循環的

SUBC 指令來完成。但有兩點需要注意:第一,小數除法的結果一定是小數(小于1),所以被除數一定小于除數。

2.3 實驗內容

本實驗需要使用C54X 匯編語言實現加、減、乘、除的基本運算,并通過DES 的存 貯器顯示窗口觀察結果。

1)編寫實驗程序代碼

2)用 ccs simulator 調試運行并觀察結

2.4 實驗結果

1、加法結果

2、乘法結果

3、減法結果

4、除2.5 思考題(0.5、0.25)實驗三 C54X的浮點數的算術運

一、實驗目的

1)練習TMS320C54X 匯編程序的編寫與調試方法,重點練習C54X 程序流程控制的方法。2)學習并掌握應用 TMS320C54X 來進行浮點數的各種算術運算的算法實現。

3)練習并掌握 TMS320C54X 的匯編語言的匯編指令系統的使用方法,重點練習具有C54X 特點的一些在功能上有所擴展的特殊指令,并了解這些指令在進行算術運算或各種控制時所帶來的方便。

4)練習并掌握用 CCS 調試程序的一些基本操作。

二.實驗原理

1)浮點數的表示方法

在定點運算中,小數點是在一個特定的固定位置。例如,如果一個 32-bit 的數把小數點放在最高有效位(也就是符號位)之后,那么就只有分數(絕對值小于1)才能被顯示。在定點運算系統中,雖然在硬件上實現簡單,但是表示的操作數的動態范圍要受到限制。

3)浮點數運算的步驟

程序代碼分成四個 ASM 文件輸入,通過編譯生成.obj 文件,連接生成.out 文件后就可以在DES320PP-U 實驗系統上調試運行(先要創建一個工程文件,然后加入四個工程文件,并且一起編譯,連接。因為每個文件都對下一個文件作了引用)。步驟如下:

a.首先啟動 setup CCS C5000,在其中設置目前需要的CCS 的工作狀態為C54xxsimulator,保存這一設置并退出。然后再啟動CCS 實驗系統軟件CCS C5000。

b.在下拉菜單中選擇“File”->“Load Program”以裝入所要調試的程序fc.out,這時,在反匯編窗口中能看到程序的源代碼。

c.在下拉菜單中選擇“View”->“CPU Registers”->“CPU Register”,可以看見在CCS 界面下部份會出現CPU 中的相關寄存器;選擇“View”->“Memory…”,在彈出的“Memory Window Options”窗口中選擇要觀察的區域為數據區,地址開始為0x80h,然后就可以看見出現一個Data Memory 窗口,其中顯示了從0x80h 開始的.bss 區。

d.在反匯編窗口中需要觀察的地方設置斷點:在這條指令處雙擊將其點為紅色即可。比如在加法程序中有指令nop 的位置都可以加一個斷點。

e.在下拉菜單中選擇“調試”——“連續運行”(或直接點擊“運行程序”按鈕)運行浮點數程序。如果編寫程序時在計算完畢后遇到一個斷點,那么程序到此會自動停止。

f.當示范程序在第一個斷點處停下來時,此時就可以看見程序初始化后的情況:被加數12.0 以浮點數的格式放在內存區0x08a-0x08b 中,其值為4140h 和0000h。加數12.0 放在內存區0x08c-0x08d 中,其值也為4140h 和0000h。g.再點擊“運行程序”按鈕,之后程序會在下一個斷點處停下來,這時可以看見被加數被格式轉換后的變量op1hm、op1lm 和op1se 的值在內存區0x084-0x086 中,分別為00c0h、0000h 和0082h。同樣加數被格式轉換后的變量op2se、op2hm 和op2lm的值在內存區0x087-0x089 中,分別為0082h、00c0h 和0000h。

h.再點擊“運行程序”按鈕,程序停下來時就可以觀察到在存儲器窗口中表示結果的變量rlthm、rltlm、rltsign 和rltexp 的值在內存區0x080-0x083 中,其值分別為0040h、0000h、0180h 和0083h。

i.這時可以看到 A 寄存器中的值為AH=41c0h,AL=0000h 這就是最后的以浮點數的格式表示的結果值24(=12+12)。加法運算到此結束。

j.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的13.0 與12.0 進行減法運算的結果:AH=3f80h,AL=0000h。這是用浮點數格式表示的數1(=13-12)。減法運算的程序到此結束。

k.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與12.0 進行乘法運算的結果:AH=4310h,AL=0000h。這是用浮點數格式表示的數144(=12*12)。乘法運算的程序到此結束。

l.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與4.0 進行除法運算的結果:AH=4040h,AL=0000h。這是用浮點數格式表示的數3(=12/4)。至此加、減、乘、除四種運算都運行完畢。

m.如果程序運行不正確,請檢查源程序是否有誤,必要時可以在源程序中多插入斷點語句。程序在執行到斷點語句時自動暫停,此時可以通過檢查各個寄存器中的值以及內存單元中的值來判斷程序執行是否正確。

三.在 CCS 的C54xx simulator 上調試觀察實驗結果

浮點加法斷點一: 浮點加法斷點二:

浮點加法斷點三: 浮點減法

浮點數乘法 浮點數除法

四 心得體會

通過學習C54X的浮點數的算術運算,以及實驗結果的觀察,使我了解了浮點數運算的原理,學習并掌握用TMS320C54X來進行浮點數的各種算術運算的算法實現。實驗四用定時器實現數字振蕩器 實驗四 用定時器實現數字振蕩器

4.1 實驗目的

在數字信號處理中,會經常使用到正弦/余弦信號。通常的方法是將某個頻率的正弦/余弦值預先計算出來后制成一個表,DSP 工作時僅作查表運算即可。在本實驗中將介紹另一種獲得正弦/余弦信號的方法,即利用數字振蕩器用疊代方法產生正弦信號。本實驗除了學習數字振蕩器的DSP 實現原理外,同時還學習C54X 定時器使用以及中斷服務程序編寫。另外,在本實驗中我們將使用匯編語言和C 語言分別完成源程序的編寫。

4.2 實驗要求

本實驗利用定時器產生一個 2kHz 的正弦信號。定時器被設置成每25uS 產生一次中斷(等效于采樣速率為40K)。利用該中斷,在中斷服務程序中用疊代算法計算出一個SIN值,并利用CCS 的圖形顯示功能查看波形。

4.3 實驗原理

1)數字振蕩器原理

設一個傳遞函數為正弦序列 sinkωT,其z 變換為 H(z)=

其中,A=2cosωT, B=-1, C=sinωT。設初始條件為0,求出上式的反Z 變換得:

y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2)C54X 的定時器操作

C54X 的片內定時器利用CLKOUT 時鐘計數,用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表4-1。在表4-2 中列出了定時器控制寄存器的各個比特位的具體定義。‘VC5402 的另一個定時器(定時器1)的控制寄存器分別為:0x30(TIM1),0x31(PRD1),0x32(TCR1)。

3)C54X 中斷的使用

在 C54X 中用戶可以通過中斷屏蔽寄存器IMR 來決定開放或關閉一個中斷請求。圖4-1 給出了C5402 的IMR 寄存器的各個比特位的定義。

圖 4-1 ‘C5402 的IMR 寄存器

其中,HPINT 表示HPI 接口中斷,INT3-INT0 為外部引腳產生的中斷,TXINT 和TRINT 為TDM 串口的發送和接收中斷,BXINT0 和BRINT0 為BSP 串口的發送和接收中斷,TINT0 為定時器0 中斷。在中斷屏蔽寄存器IMR 中,1 表示允許CPU 響應對應的中斷,0 表示禁止。當然要CPU 響應中斷,ST1 寄存器中的INTM 還應該為0(允許所有的中斷)。

本實驗的初始化程序讀取中斷向量表的啟始地址,然后設置PMST 的高9 位,以便DSP 能正確響應中斷,代碼如下:

ld #0,dp ;設置DP 頁指針 ssbx intm ;關閉所有中斷 ld #vector, a ;讀出中斷向(地址vector 在中斷向量表程序中定義)and #0FF80h, a ;保留高9 位(IPTR)andm #007Fh, pmst ;保留PMST 的低7 位 or pmst, a ;

stlm a, pmst ;設置PMST(其中包括IPTR)

4.4 實驗內容

本實驗需要使用 C54X 匯編語言或C 語言實現數字振蕩器,并通過CCS 提供的圖形顯示窗口觀察出信號波形以及頻譜。實驗分下面幾步完成:

1)根據確定數字振蕩器的頻率,確定系數。2)啟動 CCS,新建工程文件。

3)選擇 Project 菜單中的Options 選項,或使用鼠標右鍵單擊工程文件名(如sinewave.pjt)并選擇build options 項來修改或添加編譯、連接中使用的參數。選擇Linker 窗口,在“Output Filename”欄中寫入輸出OUT 文件的名字,如sine.out,你還可以設置生成的MAP 文件名。

4)完成編譯、連接,正確生成OUT 文件。

5)選 View→Graph→Time/Frequency?打開圖形顯示設置窗口。6)在匯編源程序的中斷服務程序(_tint)中的“nop”語句處設置斷點。7)用右鍵單擊圖形顯示窗口,并選擇“Proporties”項以便修改顯示屬性。8)清除所有斷點,關閉除波形顯示窗口外的所有窗口,并關閉工程文件。9)完成編譯、連接,正確生成OUT 文件。

10)打開 C 源程序(timer.c)窗口,在中斷服務程序(函數tint())的“con_buf=0;”語句處增加一個斷點。同樣打開圖形顯示窗口,并將“Start Address”改為buf;“Acquisition Buffer Size”改為“Display Data Size”改為128,“DSP DataType”為“32-bit floating point”

11)選擇 Debug→Animate,運行程序,觀察輸出波形。

第四篇:dsp報告

第一章、基本算術運算.....................................1 1.1、實驗目的和要求...................................1 1.2、實驗原理.........................................1 1.3、實驗內容.........................................2 第二章、C54X的匯編語言程序設計...........................7 2.1、實驗目的和要求...................................7 2.2、實驗原理.........................................7 2.3、實驗內容.........................................8 第三章、FFT算法的實現..................................13 3.1、實驗目的和要求..................................13 3.2、實驗原理........................................13 3.3、實驗內容........................................14 第四章、ASK、PSK、FSK調制的實現........................16 4.1、實驗目的........................................16 4.2、實驗原理........................................16 4.3、實驗內容........................................16 心得體會................................................20

0

第一章、基本算術運算

1.1、實驗目的和要求

加、減、乘、除是數字信號處理中最基本的算術運算。DSP 中提供了大量的指令來 實現這些功能。本實驗學習使用定點DSP 實現16 位定點加、減、乘、除運算的基本方法 和編程技巧。

1.2、實驗原理

(1)、定點 DSP 中的數據表示方法

54X 是16 位的定點DSP。一個16 位的二進制數既可以表示一個整數,也可以表示一個小數。當它表示一個整數時,其最低位(D0)表示2,D1 位表示2,次高位(D14)表示2。如果表示一個有符號數時,最高位(D15)為符號位,0 表示正數,1 表示負 數。例如,07FFFH 表示最大的正數32767(十進制),而0FFFFH 表示最大的負數-1(負

數用2 的補碼方式顯示)。當需要表示小數時,小數點的位置始終在最高位后,而最高位D15)表示符號位。這樣次高位(D14)表示2,然后是2,最低位(D0)表示2?30114?1?2?15。所以 04000H 表示小數 0.5,01000H 表示小數2 = 0.125,而0001H 表示16 位定點(DSP 能表示的最小的小數(有符號)2?15 =0.***。在后面的實驗中,除非有特別說明,我們指的都是有符號數。在C54X 中,將一個小數用16 位定點格式來表示的方法是用2乘以該小數,然后取整。

從上面的分析可以看出,在DSP 中一個16 進制的數可以表示不同的十進制數,或 者是整數,或者是小數(如果表示小數,必定小于1),但僅僅是在做整數乘除或小數乘 除時,系統對它們的處理才是有所區別的,而在加減運算時,系統都當成整數來處理。(2)實現 16 位定點加法

C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中

ADDS 用于無符號數的加法運算,ADDC 用于帶進位的加法運算(如32 位擴展精度加 法),而ADDM 專用于立即數的加法。(3)實現 16 位定點減法

C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數的減法運算,SUBB 用于帶進位的減法運算(如32 位擴展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實現的。SUB 指令與ADD 指令一樣,有許多的尋址方式。

(4)實現 16 位定點整數乘法 15 1

在C54X 中提供了大量的乘法運算指令,其結果都是32 位,放在A 或B 寄存器 中。乘數在C54X 的乘法指令很靈活,可以是T 寄存器、立即數、存貯單元和A 或B 寄存器的高16 位。有關乘法指令的詳細使用說明請參考《TMS320C54X 實用教程》。在C54X 中,一般對數據的處理都當做有符號數,如果是無符號數乘時,要使用MPYU 指令。這是一條專用于無符號數乘法運算的指令,而其它指令都是有符號數的乘法。5)實現 16 位定點小數乘法

在 C54X 中,小數的乘法與整數乘法基本一致,只是由于兩個有符號的小數相乘,其結果的小數點的位置在次高的后面,所以必須左移一位,才能得到正確的結果。C54X 中提供了一個狀態位FRCT,將其設置為1 時,系統自動將乘積結果左移一位。但注意 整數乘法時不能這樣處理,所以上面的實驗中一開始便將FRCT 清除。兩個小數(16 位)相乘后結果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可 得到16 位的結果。

(6)實現 16 位定點整數除法

在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法 來代替,除以某個數相當于乘以其倒數,所以先求出其倒數,然后相乘。這種方法對于 除以常數特別適用。另一種方法是使用SUBC 指令,重復16 次減法完成除法運算。下 面我們以temp1/temp2 為例,說明如何使用SUBC 指令實現整數除法。其中變量temp1為被除數,temp2 為除數,結果即商存放在變量temp3 中。在完成整數除法時,先判斷

結果的符號。方法是將兩數相乘,保存A 或B 的高16 位以便判斷結果的符號。然后只 做兩個正數的除法,最后修正結果的符號。為了實現兩個數相除,先將被除數裝入A 或 B 的低16 位,接著重復執行SUBC 指令,用除數重復減16 次后,除法運算的商在累加 器的低16 位,余數在高16 位。(7)實現 16 位定點小數除法

在 C54X 中實現16 位的小數除法與前面的整數除法基本一致,也是使用循環的 SUBC 指令來完成。但有兩點需要注意:第一,小數除法的結果一定是小數(小于1),所以被除數一定小于除數。這與整數除法正好相反。所以在執行SUBC 指令前,應將被 除數裝入A 或B 寄存器的高16 位,而不是低16 位。其結果的格式與整數除法一樣,A 或B 寄存器的高16 位為余數,低16 位為商。第二,與小數乘法一樣,應考慮符號位對 結果小數點的影響。所以應對商右移一位,得到正確的有符號數。

1.3、實驗內容

本實驗需要使用C54X匯編語言實現加、減、乘、除的基本運算,并通過DES的存 貯器顯示窗口觀察結果。實驗分兩步完成:(1)編寫實驗程序代碼

本實驗的匯編源程序代碼主要分為六個部分:加法、減法、整數乘法、小數乘法 整數除法和小數除法。每個部分后面都有一條需要加斷點的標志語句:nop 當執行到這條加了斷點的語句時,程序將自動暫停。這時你可以通過“存貯器窗口”檢 查計算結果。當然你看到的結果都是十六進制的數。實驗源程序請參見附錄。(2)用ccs simulator調試運行并觀察結果

在完成實驗程序代碼的輸入,并使用ccs進行編譯并連接,得到out文件后,就可 以在simulator 上調試運行。調試步驟如下:

a.啟動ccs simulator。

b.點擊file->load program,找到exer1.out(在產品光盤的codebase_operationdebug下)并裝入。這時可在反匯編窗口看到程序代碼。

c.打開“Memory”窗口,并在其中選擇要查看的存貯器地址段:0x080-0x08e。

d.在反匯編窗口中在每個“nop”指令處都設一個斷點,方法有兩種:1.用鼠標雙擊該 指令將其點亮即可。2.在菜單欄中選擇debug?breakpoint,然后在彈出的對話框中 鍵入欲加斷點的地址即可(注意地址的格式)。e.單擊Run快捷鍵(或者F5按鈕),啟動執行基本算術運算程序,程序在執行完加法 運算后自動暫停。通過register window窗口可以看到寄存器A的內容為0x46,這 正是加法運算的結果。(注意,若在硬件仿真器環境下調試,受DSP指令流水線的影響,斷點處可能看不到A寄存器的變化。)同樣,在Memory窗口中,可以看到0x81,0x82,0x88的內容為分別為0012,0034,0x46。執行加法運算后,將0x81和0x82的內容相加結果放在0x88單元。實驗結果如下:

f.在Memory窗口中用鼠標左鍵雙擊0x81單元,這時可以修改該內存單元的內容。輸 入新的數據0x0ffee(十進制的-18),編輯內容時請直接輸入FFEE(十六進制),然 后回車確認,便完成對0x81單元的修改。

g.在register window窗口中修改PC值,方法也是鼠標左鍵雙擊PC寄存器的內容,輸入新的PC值0x1085(編輯內容時直接輸入1805),并用回車鍵確認。h.單擊Run快捷鍵(或者F5按鈕),程序從當前PC繼續運行,重新計算0x81和0x82 的和,結果在0x88中。當程序再次暫停時,可以看到A寄存器和0x88的內容為0x22(十進制的34),這正是我們希望的結果:-18+52=34。實驗結果如下:

i.單擊Run快捷鍵(或者F5按鈕),程序從當前PC繼續運行,完成減法運算。當程 序再次暫停時(斷點位于0x1093),可以看到0x83和0x84單元的內容分別為FFEE 和0012,B寄存器的內容為ffdc0000,而0x89的內容為0xffdc(十進制-36),這正

是我們希望的結果:-18-18=-36。注意,該減法操作使用了輔助寄存器尋址,所以計算結果在B寄存器的高16位。是實驗結果如下:

j.單擊Run快捷鍵(或者F5按鈕),程序從當前PC繼續運行,完成整數乘法運算。當程序再次暫時(斷點位于0x109d),可以看到0x81和0x82單元的內容分別為0012和0034,A寄存器的內容為000003A8,這正是我們希望的結果:18*52=936(0x3a8)。這時我們可以用1個16位的內容單元來保存結果,如將A寄存器的低16位存入0x8b單元。實驗結果如下:

但如果將0x81的內容修改為0x2000(十進制的8192),在register window中將PC修改為1098,然后繼續運行,重新計算乘法。當程序完成乘法暫停時,可以看到A寄存器的內容為00068000,這也是一個正確的結果:8192*52=425984(0x68000)。此時將無法用一個16位的存貯單元來保存A寄存器中的結果。

實驗結果如下:

k.單擊Run快捷鍵或者(F5按鈕),程序從當前PC繼續運行,完成小數乘法運算。當程序再次暫停時(斷點位于0x10A6),可以看到0x83和0x84單元的內容分別為4000和b548,A寄存器的內容為40000000,乘法的結果在B寄存器中為daa40000,這正是我們希望的結果:0.5*(-0.58374)=-0.29187(0x0daa4)。對于小數乘法,一般情況都可以用1個16位的內容單元將B寄存器的高16保存(如存入0x8c單元)。實驗結果如下:

l.單擊Run快捷鍵(或者F5按鈕),程序從當前PC繼續運行,完成整數除法運算。當程序再次暫時(斷點位于0x10bb),可以看到0x81,0x82,0x8d和0x8e單元的內容分別為0034,0012,FFFE 和0010,這正是我們希望的結果:52 除以-18,商為-2(0xfffe),余數為16(0x10)。

m.單擊Run快捷鍵(或者F5按鈕),程序從當前PC繼續運行,完成小數除法運算。當程序再次暫停時(斷點位于0x10d2),可以看到0x81,0x82和0x8f單元的內容分別為4000,4ab8和6da3,這正是我們希望的結果:0.5/0.58374=0.8565457(0x6da3)。實驗結果如下:

n.如果以上程序運行不正確,請檢查代碼是否輸入正確,還可以在源代碼中插入斷點 調試,注意對中間結果的觀察。思考題 :

(1)在減法操作中使用了輔助寄存器ar2,ar3,請說明在執行完減法計算后輔助寄存器 ar2和ar3的值為多少?

結果如下:

(2)在小數乘法中使用了置FRCT標志為1的指令。如果將該語句取消,那么B寄存器的結果是多少?想想什么時候應該設置FRCT標志? 結果如下:

取消之前:

取消之后:

(3)如何實現無符號數的乘法?

答:輸入指令MPYU Smem,dst,輸出結果為uns(T)*uns(Smem)(4)

請利用本實驗程序計算以下算式的結果

①、0.25*0.58374

②、0.25/0.5

③、4653/345

④、0.789687/0.876

第二章、C54X的匯編語言程序設計

2.1、實驗目的和要求

匯編語言程序設計是應用軟件的基礎,主要任務是利用匯編指令和偽指令編寫源程序以完成指定的功能。本屆實訓我們將采用匯編語言指令、匯編偽指令、宏偽指令和規定的數字與字符來完成實驗。通過實驗幫助我們對匯編語言的理解和運用。

2.2、實驗原理

1、匯編語言源程序由.asm為擴展名,可以用任意的編輯器編寫源代碼。源文件格式中助記符指令源語句的每行通常包含4個部分:標記區、助記符區、操作數區和注釋區。

2、匯編語言中的常數與字符串

匯編器支持8種類型的常數:①二進制整數;②八進制整數;③十進制整數;④十六進制整數;⑤浮點數;⑥匯編時間常數;⑦字符常數;⑧字符串

3、匯編源程序中的符號用于標號、常數和替代字符。符號名最多可長達200個字符,由字母、數字以及下劃線和美元符號等組成。

4、堆棧的使用方法

當程序調用中斷服務程序或子程序時,需要將程序計數器PC的值和一些重要的寄存器值進行壓棧保護,以便程序返回時能從間斷處繼續執行。

5、控制程序

TMS320C54x具有豐富的程序控制指令利用這些指令可以執行分支轉移、子程序調用子程序返回、條件操作及循環操作等控制操作。控制程序包括:分支操作程序、循環操作程序。

6、算術運算程序

基本算術運算包括:加減法運算、乘法運算、除法運算、長字和并行運算。

7、實驗中所需的“.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、實驗內容

1、計算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: 結果圖如下:

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、計算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 結果圖如下:

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、計算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 結果圖如下:

.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、計算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: 結果圖如下:

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、計算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

結果圖如下:

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、求一個數的絕對值 程序如下:

.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 結果圖如下:

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

結果圖如下:

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、對一個數組進行初始化: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: 結果圖如下:

9、對數組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 結果圖如下:

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 結果圖如下:

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算法的實現

3.1、實驗目的和要求

在數字信號處理系統中,FFT 作為一個非常重要的工具經常使用,甚至成為DSP 運 算能力的一個考核因素。FFT 是一種高效實現離散付氏變換的算法。離散付氏變換的目 的是把信號由時域變換到頻域,從而可以在頻域分析處理信息,得到的結果再由付氏逆 變換到時域。

本實驗的目的在于學習FFT 算法,及其在TMS320C54X 上的實現,并通過編程掌握C54X的存儲器管理、輔助寄存器的使用、位倒序尋址方式等技巧,同時練習使用CCS 的探針和圖形工具。另外在BIOS 子目錄下是一個使用DSP/BIOS 工具實現FFT 的程序。通過該程序,你可以使用DSP/BIOS 提供的分析工具評估FFT 代碼執行情況。

3.2、實驗原理

1、基 2 按時間抽取FFT 算法

對于有限長離散數字信號{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 的關?WN鍵性質之一。為了強調起見,常用表達式WN取代W 以便明確其周期是N。

由 DFT 的定義可以看出,在x[n]為復數序列的情況下,完全直接運算N 點DFT 需要(N?1)2 次復數乘法和N(N-1)次加法。因此,對于一些相當大的N 值(如1024)來說,直接計算它的DFT 所作的計算量是很大的。FFT 的基本思想在于,將原有的N點序列分成兩個較短的序列,這些序列的DFT 可以很簡單的組合起來得到原序列的DFT。例如,若N 為偶數,將原有的N 點序列分成兩個(N/2)點序列,那么計算N 點DFT 將只需要約

[(N/2)2 ·2]=N/2 次復數乘法。即比直接計算少作一半乘法。因子(N/2)2表示直接計算(N/2)點DFT 所需要的乘法次數,而乘數2 代表必須完成兩個DFT。

上述處理方法可以反復使用,即(N/2)點的DFT 計算也可以化成兩個(N/4)點的DFT(假定N/2 為偶數),從而又少作一半的乘法。這樣一級一級的劃分下去一直到最后就劃分成兩點的FFT 運算的情況。

2、實數 FFT 運算

對于離散傅立葉變換(DFT)的數字計算,FFT 是一種有效的方法。一般假定輸入序列是復數。當實際輸入是實數時,利用對稱性質可以使計算DFT 非常有效。一個優化的實數FFT 算法是一個組合以后的算法。原始的2N 個點的實輸入序列組合成一個N 點的復序列,之后對復序列進行N 點的FFT 運算,最后再由N 點的復數輸出拆散成2N 點的復數序列,這2N 點的復數序列與原始的2N 點的實數輸入序列的DFT輸出一致。使用這種方法,在組合輸入和拆散輸出的操作中,FFT 運算量減半。這樣利用實數FFT算法來計算實輸入序列的DFT 的速度幾乎是一般復FFT 算法的兩倍。本實驗就用這種方法實現了一個256 點實數FFT(2N = 256)運算。

a.實數 FFT 運算序列的存儲分配

如何利用有限的 DSP 系統資源,合理的安排好算法使用的存儲器是一個比較重要的問題。b.基二實數 FFT 運算的算法

該算法主要分為四步:第一步,輸入數據的組合和位倒序;第二步,N 點復數FFT;第三步,分離復數 FFT 的輸出為奇部分和偶部分;第四步,產生最后的 N = 256 點的復數FFT 結果。

3、計算所求信號的功率

由于最后所得的 FFT 數據是一個復數,為了能夠方便的在虛擬頻譜儀上觀察該信號的特征,我們通常對所得的FFT 數據進行處理取其實部和虛部的平方和,即求得該信號的功率。23.3、實驗內容

本實驗在CCS 下完成256 點的實數FFT,并通過CCS 的圖形顯示工具觀察結果。

其主程序為初始化,并通過探針工具讀入256 點方波數據(在文件fft.dat 中,該數據文 件可以通過程序fft_data.c 修改,但注意數據的絕對值不要超過0x23ff)。FFT 的實現由 四個子程序代碼bit_rev、fft、unpack 和power 代碼完成。實驗可以分為以下幾步:(1)啟動 CCS,在Project 菜單選項中打開FFT 目錄下的fft.pjt 文件。(2)用鼠標展開左面項目欄,打開 fft.asm 源程序。

(3)使用 Bulid 命令完成編譯、連接,并使用Load Program 將生成的fft.out 裝入5410 片內存儲器。

(4)將光標移動到“call get_input”行,并設置一個探針點。將光標移動到下一行“nop”語句,使用工具設置一個斷點。

(5)在 File 菜單中打開選項“File I/O”,使用“Add File”在FFT 目錄下打開數據文件 fft.dat,然后修改“Address”參數為0x2300,修改“Length”參數為256。這表示程序執行到探針點時,將從fft.dat 文件中讀出256 個數據,并將數據放入0x2300開始的存儲器中。你可以選擇“Wrap Around”,循環使用該數據文件。(6)選擇“Add Probe Point”,將探針點與數據文件連接起來。選擇探針點,然后在“Connect”選項中選擇需要使用的數據文件名,再選擇“Replace”,按確定鍵完成。可以看到“Probe”項被自動修改為“Connected”,表示探針已經與數據文件成功相連。

(7)完成探針設置后,可以使用F5 或“Run”命令啟動程序運行。程序執行到探針點時

自動從數據文件讀出256 個點的數據放入輸入緩沖0x2300。(8)在“View”菜單項下選擇“Graph-> Time/Frequency”,打開一個圖形工具以便顯示 輸入數據波形。將“Start Address”改為0x2300,將“Acquisition Buffer Size”改為128,將“DSP Data Type”改為“16-bit signed integer”,這樣即可顯示128 個輸入點波形。實驗結果圖如下:

(9)調整窗口顯示大小,將光標移動到源程序的“b _c_int00”這行,使用Debug 中的 “Run to Cursor”項,程序將執行到這行并停下。這時FFT 程序已經計算完成。

再打開一個波形顯示窗口,這次僅僅將“Start Address”改為0x2200,便可以顯示計算 完成后的譜波形。

(10)選擇“Debug”下的“Animate”運行程序,這時程序將循環運行,不斷從數據文件 fft.dat 中讀出數據,并計算其頻譜。這時你可以看到連續的輸入/輸出波形。

(11)選擇原始數據波形窗口,單擊鼠標右鍵,進入“Properties”屬性對話框。你可以將 “Display Type”改為“FFT Magnitude”,這時輸入數據將顯示其頻譜。

思考題:

||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調制的實現

4.1、實驗目的

數字調制信號又稱為鍵控信號,其調制過程是用鍵控的方法由基帶信號對載頻信號的振幅、頻率及相位進行調制。這種調制的最基本方法有三種:振幅鍵控(ASK)、相移鍵控(PSK)、頻移鍵控(FSK)。本節實訓將通過CCS軟件來實現對ASK、PSK、FSK的調制,并掌握它們之間的聯系與不同。

4.2、實驗原理

1、FSK頻移鍵控的基本原理:用數字基帶信號來控制高頻載波頻率的變化,使載波的頻率在f1和f2之間變化。二進制頻移信號可以看成兩個不同載波的二進制振幅鍵控信號的疊加。

2、PSK相移鍵控的基本原理:用數字調制信號的正負控制載波相位。當數字信號的振幅為正時載波起始相位取0;當數字信號的振幅為負時,載波起始相位取180度。相移鍵控抗干擾能力強,但在解調是需要有一個正確的參考相位,即需要相干解調。

3、ASK振幅鍵控的基本原理:是用調制信號去控制高頻正弦載波的幅度,使其按調制信號的規律變化的過程。

4.3、實驗內容

1、FSK的實現

匯編語言程序:

.title“fsk_asm.asm”.global _fsk;定義為全局變量,提供給C調用.global _y1;C程序變量.global _y2;C程序變量.global _Pulse;C程序變量.global _FskSignal;C程序變量.mmregs.text _fsk: rsbx CPL stm #8-1,AR1;循環變量 256/32=8 stm #_y1, AR4

stm #_y2, AR2 stm #_Pulse, AR3 stm #_FskSignal, AR5 loop: ld *AR3, A bc freq500, AEQ;若原始數字信號為0,則調頻信號為頻率為500Hz的正弦波 sub #1, A bc freq1000, AEQ;若原始數字信號為1,則調頻信號為頻率為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];//被調信號 for(i=0;iGraph->Time/Frequency Graph,號

//按照當前文件夾內給出的圖 for(i=0;i

{ for(;;){};x[i]=i*0x2000;} 結果圖如下:

2、PSK的實現 程序如下:

extern void fsk();

#include “C54MATH.H” DATA x[256];DATA y1[256];

//正弦信號1 DATA y2[256];

//正弦信號2 DATA Pulse[256];//被調信號

DATA FskSignal[256];//2FSK調制信號 #define N 256 void main(){

int i,j;

//產生一個500Hz的正弦信號作為調制信號

for(i=0;i

x[i]=i*0x1000;

// fc=(0x1000/0x10000)*fs=500Hz, fs固定在8000

} sine(x, y1, N);//產生一個1000Hz的正弦信號作為調制信號

for(i=0;i

x[i]=-i*0x1000;

// 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();//運行到此處后,打開View->Graph->Time/Frequency Graph,//按照當前文件夾內給出的圖形屬性設置,即可顯示2FSK信號

for(;;){};

} 18

3、ASK的實現

extern void fsk();#include “C54MATH.H” DATA x[256];DATA y1[256];//正弦信號1 DATA y2[256];//正弦信號2 DATA Pulse[256];//被調信號

DATA FskSignal[256];//2FSK調制信號 #define N 256 void main(){ int i,j;//產生一個500Hz的正弦信號作為調制信號

for(i=0;i

case 0: y1[i]=0;break;}

} //產生一個1000Hz的正弦信號作為調制信號

for(i=0;i

實驗結果圖如下:

// 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();//運行到此處后,打開View->Graph->Time/Frequency Graph,//按照當前文件夾內給出的圖形屬性設置,即可顯示2FSK信號

for(;;){};} 19

心得體會

為期兩個星期的實訓結束了,這兩個周的實訓讓我收獲頗多。在實訓中我深深體會到了DSP技術及應用這門課的博大精深,里面包含的知識很多,緊靠平時的理論課程來理解是遠遠不夠的。在理論課程中我們主要學習了TMS320C54x的硬件結構、它的指令系統,匯編語言程序的開發工具、匯編語言的程序設計還有應用程序設計等內容。這次實訓的內容主要是基本算術運算、C54X算法的匯編語言程序設計、FFT算法的實現以及ASK、FSK、PSK調制的實現。

這次的實訓課程說難也不是很難但說簡單它也絕對不簡單,看似簡單是東西做起來就不一定了,在實驗的過程中也出現不少的問題。因為之前沒有接觸過這個軟件,所以在開始實驗前我們是先對CCS軟件進行了了解,再通過實際操作熟悉軟件,然后再做實訓內容。在這次實訓中我學到了如何使用CCS軟件來進行簡單的運算,并且能通過該軟件來查看實驗結果和修改結果。我們還做了FFT算法的實現并且對ASK、FSK、PSK進行了簡單的調制,調制過程中遇到了很多麻煩,比如圖形出不來或是出現不規則圖形等等的問題。但經過我們不懈的努力、重復的實驗,在實驗結果出來并且正確的時候我的心情是激動的。在實訓過程中我們遇到了不少困難。因為對軟件的不熟悉,導致不知道從什么地方查看結果,查看結果不正確也不知道該從哪修改,不過在老師耐心的講解和同學的熱心幫助下,我們還是順利的完成了實訓。

通過這次實訓我收獲了很多,也成長了很多,明白了理論聯系實際的重要性,還知道了“團結就是力量”的真理,希望在以后的學習工作中我能將我所學到的知識發揮得淋漓盡致。最后感謝老師的諄諄教誨,沒有您耐心的教導我們不可能這么順利就完成任務。

第五篇:dsp作業

.c圖

實驗二

#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高低電平等時間循環變化截圖如下所示:

找出由地址0x0300~0x0320中存儲數據為0x8888的地址截圖如下所示:

心得體會:

經過這次實驗,理解了對地址0x0300~0x0320中存儲數據為0x8888的尋找和設置。

下載DSP芯片教學word格式文檔
下載DSP芯片教學.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    DSP課程設計

    TMS320C54x與PC通信系統的設計(單號) 一、設計目的 本次課程設計的目的是為了進一步提高學生的自我開發能力,培養學生的查閱資料,獨立分析問題、解決問題以及實際動手的能力。也......

    dsp學習心得

    一. 我是已經從事DSP開發有幾年了,看到許多朋友對DSP的開發非常感興取,我結合這幾年對DSP的開發寫一寫自己的感受,一家之言,歡迎指教。我上研究生的第一天起根據老板的安排就開......

    DSP學習心得

    數字信號處理—DSP課程學習的認識 今年學習了DSP這門課程后,有了一些自己的認識和見解,并且體會到了它強大的功能和作用,它不但在高端的技術領域有很重要的地位,如通信、雷達、......

    DSP簡介

    DSP簡介 1. 什么是DSP芯片DSP芯片,也稱數字信號處理器,是一種具有特殊結構的微處理器。DSP芯片的內部采用程序和數據分開的哈佛結構,具有專門的硬件乘法器,廣泛采用流水線操作,提......

    芯片生產流程介紹

    芯片生產工藝流程介紹芯片的制造過程可概分為晶圓處理工序(Wafer Fabrication)、晶圓針測工序(Wafer Probe)、構裝工序(Packaging)、測試工序(Initial Test and Final Test)等幾個步......

    IC芯片知識

    IC基礎知識簡述 熔茗2010-09-14 14:42:36 我們通常所說的“芯片”是指集成電路,它是微電子技術的主要產品.所謂微電子是相對"強電"、"弱電"等概念而言,指它處理的電子信號極......

    常用芯片總結

    常用芯片總結1.音頻pcm編碼DA轉換芯片cirrus logic的cs4344,cs4334 4334是老封裝,據說已經停產,4344封裝比較小,非常好用。還有菲利譜的8211等。 2.音頻放大芯片4558,LM833,5532,......

    關于分析今天保定百度百度愛問愛第3章C54x DSP系統硬件結構DSP芯片

    關于分析今天保定百度百度愛問愛第3章C54x DSP系統硬件結構DSP芯片.txt -你腳踏倆只船,你劃得真漂亮。- 每個說不想戀愛的人 心里都裝著一個不可能的人。我心疼每一個不快樂......

主站蜘蛛池模板: 日韩欧美在线综合网| 欧美成人国产精品高潮| 中文字幕日韩三级片| 久久九九51精品国产免费看| 国产真实乱人偷精品人妻| 日本特黄特黄刺激大片| 巨胸喷奶水视频www免费网站| 伊在人天堂亚洲香蕉精品区| 色综合久久久久久久久五月| 国产日韩在线视看第一页| 亚洲精品无码不卡在线播he| 日本免费更新一二三区不卡| www.狠狠干| 国产凹凸在线一区二区| 国产熟睡乱子伦午夜视频在线| 人人妻人人澡人人爽久久av| 东京热无码av一区二区| 亚洲 小说 欧美 激情 另类| 久久久久成人片免费观看| 亚洲人成在线观看影院牛大爷| 护士奶头又白又大又好摸视频| 亚洲乱理伦片在线观看中字| 精品一区二区三区波多野结衣| 久久疯狂做爰xxxⅹ高潮直播| 国产成人午夜福利在线观看| 久久久国产一区二区三区四区小说| 欧美日韩精品一区二区在线播放| 亚洲高清一区二区三区不卡| 国产suv精品一区二区62| 亚洲熟女乱色一区二区三区| 亚洲av无码成人黄网站在线观看| 无码人妻一区二区三区免费看成人| 激情97综合亚洲色婷婷五| 无码午夜人妻一区二区不卡视频| 成人精品一区二区三区电影| 久久夜色撩人精品国产| 好爽好紧好大的免费视频国产| 久久婷婷综合缴情亚洲狠狠_| 欧美成人va免费看视频| 久久偷偷做嫩草影院免费看| 国产成人无码av在线播放不卡|