dsp实验1

  • 格式:pdf
  • 大小:144.30 KB
  • 文档页数:6

dsp实验1

DSP程序的调试和分析⽅法

⼀、实验⽬的1.了解TMS320C5400系列汇编语⾔程序的基本格式,以及编译、连接的基本过程;

2.熟悉Code Composer Studio的使⽤;

3.了解C5400中标志位对计算的影响,以及计算对标志位的影响;

4. 熟悉CCS 集成开发环境,掌握⼯程的建⽴、编译、链接等⽅法;

5. 掌握DSP 程序调试的基本⽅法;

6. 利⽤DSP 实现DFT 算法对离散信号进⾏频谱分析。

⼆、实验设备1.集成开发环境CCS;

2.实验代码;

3.PC⼀台;

4.实验开发板以及所需电源线和导线。

三、实验原理1、DSP CPU基础实验

与运算相关的标志位:SXM :当SXM置1时,数据读写按照符号扩展的⽅式,因此A=0xff ffff ff80 ;当SXM置0时,数据读写为⽆符号扩展的⽅式,因此A =0x00 0000 ff80。OVM:当OVM置1时,数据运算的结果将按照32位饱和,因此A=0xff 80000000 ;当OVM

置0时,数据运算不饱和,因此B=0x00 fffe 0000;C16:双16位计算⽐较;FRCT:乘法移位⽐较;TC:⽐特测试⽐较;C:进位、借位和⼤⼩⽐较;OVA, OVB:溢出标志⽐较;SMUL:(软件仿真器⽆法模拟该标志位,需⽤DSK开发板观察该位的影响) 乘法饱和。2、DSP程序的调试和分析⽅法

输⼊信号的构造⽅法:离散时间信号可以⽤若⼲个幅值不同的正弦信号叠加⽽

成,单个正弦信号的离散时间表⽰⽅式为:,其中f 表⽰信号频率, s f 表⽰采样频率。

离散傅⾥叶变换公式:

离散傅⾥叶变换的⽬的是把信号由时域变换到频域,在频域分析信号信号特征,是数字信号处理领域常⽤的⽅法。

四、实验内容1、DSP CPU基础

(1).基本操作

运⾏CCS,选择C54xx Simulator

建⽴⼀个新的项⽬,并加⼊⽂件cpu_basic.s54和cpu_basic.cmd

载⼊cpu_basic.gel

在Project→Option中加⼊适当的编译和连接的选项Build整个项⽬,产⽣可执⾏代码(.out)File→Load Program,装载可执⾏代码,并运⾏。

(2).基本调试

设置断点

单步执⾏

(3).练习

观察并理解程序和数据空间安排

测试SXM、OVM、C16、FRCT对计算结果的影响

测试计算和逻辑运算对TC、C、OVA、OVB的影响

(4). DSK仿真练习a) 测试SMUL标志对计算的影响

b) 测试MP/MC、OVLY、DROM对计算结果的影响

MP/MC=0,切换DROM的数值,观测0xfc00地址存放的A、U律数据是否存在

MP/MC=0,OVLY=1, 观测0x1000地址存放程序是否存在(改变该处为只读)

2、DSP程序的调试和分析⽅法

(1)、输⼊信号的模拟;

(2)、输出信号的图形显⽰和分析;

(3)、对DSP 程序进⾏剖析。

五、实验步骤1、DSP CPU基础实验

将实验开发板接到PC上,运⾏CCS,新建项⽬,并在保存⽬录下编写ccs_basic.s54和ccs_basic.cmd,并将其加⼊到当前⼯程中进⾏操作。根据要求,在Project→Option中加⼊适当的编译和连接的选项,点击Bulid图标,编译整个项⽬,产⽣可执⾏代码(.out),编译⽆误后,File→Load Program,装载可执⾏代码,并运⾏。View下拉菜单中,Graph---Time/Frequency,打开图形分析窗⼝在时域或频域显⽰信号,⾸先弹出的是”GraphProperty”对话框,将其中Start Address 改为0xfe00。正弦表的长度为0x0100即256。Acquisition Buffer Size和Display Datasize设为256,点击确定后⽣成图形。改变MP/MC、OVLY、DROM等的值观察图形的变化并分析结果。

2、DSP程序的调试和分析⽅法

(1). 选择Project→New 命令,设置保存路径、⼯程名(如DFT),建⽴⼀个⼯

程。

(2). 选择File→New→Source File 命令,建⽴源代码⽂件,编写DFT 函数源代码。

(3). 保存源⽂件到当前⼯程所在的⽂件夹,然后在⼯程窗⼝选择当前⼯程,调⽤右键菜单,选择Add Files to Project 命令,打开⼀个⽂件选择对话框,选择刚保存的源⽂件加⼊⼯程中。

(4). 把CCS 安装⽬录下的C5400\cgtools\librts_ext.lib ⽂件加⼊⼯程,选择Project→Build Options 命令,打开Build Options对话框,在Compiler 选项卡的Advanced 页选择使⽤远调⽤,即设置编译选项使⽤远调⽤(-mf)。(5). 编写链接配置⽂件,可参照课本3.4.4 节所⽰CMD ⽂件,保存到当前⼯程所在的⽂件夹,并加⼊⼯程中。

(6). 根据需要调⽤Build Options 对话框,对⼯程的编译、链接选项进⾏相应的设置,特别注意在Compiler 选项卡的Advanced 中选择远调⽤(-mf)。

(7). 对当前⼯程进⾏编译、链接,⽣成可执⾏程序。

(8). 选择File→Load Program 命令,选择⽣成的.out ⽂件下载到开发平台中并运⾏。(9). 定义探测点,利⽤File I/O ⼯具将准备好的数据⽂件输⼊到输⼊信号存储数组。

(10).在CCS 中利⽤图形分析⼯具显⽰输⼊信号、输出信号,并分析输出信号是否符合DFT算法输出。可以修改输⼊信号的图形分析类别为“FFT Magnitude”,根据输⼊信号的频谱图与输出信号⽐较,可以判断DFT 算法编写是否正确。(11). 选择File→Data→Load/Save 命令,对输⼊信号数据输⼊模拟信号,并将输出信号写⼊主机上的⼀个数据⽂件,然后刷新CCS 中的图形显⽰窗⼝。注意,可以在第3 章的实验中对输⼊信号数组使⽤File→Data→Save 命令,存储的数据⽂件作为本实验的输⼊数据。

(12). 编写GEL ⽂件,利⽤GEL ⽂件修改DSP 程序中的全局变量以及模拟输⼊信号,然后刷新CCS 中图形分析窗⼝。

(13). 对DFT 函数进⾏剖析,分析剖析结果。

需要从Profile 菜单中选择Start New Session,会出现测试窗⼝。该窗⼝有4 个表单:Files 表单说明项⽬中每个⽂件的测试范围信息;Functions 表单⼀般⽤于统计C 函数的测试信息;Ranges ⽤于统计“测试区域”信息;Setup 表单⽤于建⽴“测试段”。设置测试

区域最⽅便的⽅法时在源⽂件中选中感兴趣的代码段,然后将其拖⼊Ranges 表单即可。运⾏程序,程序运⾏时间的数据在窗⼝中显现。Count 表⽰该段程序在运⾏停⽌之前所运⾏过的次数,其他的各项均表⽰运⾏时间信息,以指令周期为单位。

注意:单句⽆法作Profile统计,只能⽤Clock来看执⾏所耗费的时钟周期。.保存⼯作区。

六、实验结果及分析1、DSP CPU基础实验

MP/MC=0时,实验图像为:

说明⽚内ROM可访问,⽚内ROM映射到数据空间。

若MC为0,DROM为0,page设为data,则⽆数据显⽰。说明⽚内ROM不映射到数据空间。MP/MC=1时,实验图形为:

2、DSP程序的调试和分析⽅法输⼊信号:输出信号:输⼊信号频域分析:

附录(主要程序代码):1、DSP CPU基础实验

源⽂件代码:;Target:

; Be familar with the use of CCS (Code Composer Studio);******************************************************************** **********

;An example to show how to write an assembly language source file

; y=a1*x1+a2*x2

;******************************************************************** **********

;----------- Const definition

STACK_ADDR .set 0x0500 ;bottom of stack

;allocate data in .bss section

.bss a,2 ;allocate 5 word for variates

.bss x,2

.bss y,1

;allocate data in .data section

.data

table: ;data follows ...

.word 10,3

.word 8,6

.mmregs ;enable memory mapped registers .global main ;define global symbols

;------------------------------------------------------------------------------

.text

main:

stm #STACK_ADDR, SP ;set stack

stm #0x00a8, PMST ;relocate Interrupt Vector Table

stm #0x0000, SWWSR ;no software wait for all memory

;================================================

stm #a, AR2 ;AR1 point to a

stm #table, AR3

rpt #1 ;move 2 ai values

mvdd *AR3+, *AR2+ ;from data memory into data memory

stm #x, AR2 ;AR1 point to a

rpt #1 ;move 2 xi values

mvdd *AR3+, *AR2+ ;from data memory into data memory

call SUM ;call function to do sum

;dead loop part to lock PC in a know area when program ends

dead_loop:

nop

nop