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