一、实验目的
掌握加减法运算指令。 掌握ccs编译环境的使用
二、实验设备
计算机、SEED-DTK 实验箱、5416EVM 板
三、实验原理
参见教材第3章
四、实验内容
编写程序,分别实现计算z=x+y-w、y=mx+b
五、实验步骤
1、用仿真机将计算机与SEED-DTK系列实验箱连接好,然后打开实验箱电源,再运行CCStudio v3.3 软件。
2、新建一个项目:点击Project-New,将项目命名为experiment2,然后点击OK,系统会自动生成一个与项目同名的文件夹。注意项目名要用英文名,不要将项目取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。
3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目同名的一个文件夹下面(experiment2),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM 为保存类型),我们在这里将保存名字命名为example4.asm 。
4、在项目中添加源文件:在新建立了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击experiment2.pjt,在弹出的菜单中选择Add Files to project,然后将刚才建立的example4.asm 文件添加到该项目中去。
5、编写源程序:
在工程管理器中双击example4.asm ,将出现文本编辑窗口,在该文本编辑窗口中输入 如下内容:
***************************************** * *
* 计算 z=x+y-w * * *
***************************************** .title \"example4.asm\" .mmregs
STACK .usect \"STACK\堆栈的设置 .bss x,1 ;为变量分配4 个字的存储空间 .bss y,1 .bss w,1 .bss z,1
.def _c_int00 .data
table .word 10,26,23 ;x,y,w .text
_c_int00: STM #0,SWWSR ;插入0 个等待状态 STM #STACK+10H,SP ;设置堆栈指针 STM #x,AR1 ;AR1指向x RPT #2
MVPD table,*AR1+ ;把程序存储器中的数据移动到数据存储器 CALL SUMB end: B end
SUMB: LD *(x),A
ADD *(y),A SUB *(w),A STL A,*(z) RET .end
6、编写链接配置文件:
新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目同名的一个文件夹下面(experiment2),保存类型选择*.cmd,我们在这里将保存名字命名为dec5416.cmd。输入以下文本内容:
MEMORY {
PAGE 0:
VECT: origin = 0x28100, len = 0x100 IPROG1: origin = 0x200, len = 0x7c00 IPROG2: origin = 0x28200, len = 0x7c00 IPROG3: origin = 0x38000, len = 0x8000 FLASHL: origin = 0x40000, len = 0x40000 FLASHH: origin = 0x4000000,len = 0x80000
PAGE 1:
SPRAM: origin = 0x60, len = 0x20 DARAM: origin = 0x80, len = 0x3f80 /*×öÏàÓ¦ÉèÖúóÒ²¿ÉÒÔÊÇFLASH¿Õ¼ä*/
SARAM: origin = 0x8000, len = 8000 }
SECTIONS {
.vector: {} > VECT PAGE 0 .text: {} > IPROG2 PAGE 0 .cinit: {} > IPROG2 PAGE 0 .switch: {} > IPROG2 PAGE 0 .const: {} > IPROG2 PAGE 0 .stack: {} > IPROG1 PAGE 0 .data: {} > DARAM PAGE 1 .bss: {} > DARAM PAGE 1 .cio: {} > IPROG1 PAGE 0 }
7、编写中断向量表文件
新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目同名的一个文件夹下面(experiment2),保存类型选择*.asm,我们在这里将保存名字命名为vector.asm。输入以下文本内容:
.title \"vector.asm\" ;/*中断向量表的文件名*/ .ref _c_int00 ;/*引用外部定义的标号*/ .sect \".vector\" ;/*定义初始化的段名*/ B _c_int00 ;/*引用start*/ .end
8、对项目进行编译和链接:
再从3.4.4 Convolve 文件夹下将dek-boot.gel文件拷到本项目所在的文件夹(experiment2)并添加该gel文件。把example4.asm、vector.asm、dec5416.cmd 依次添加到项目后,点击Project-Rebuild All,编译成功之后并对该项目进行链接,生成*.out 文件。 9、装载可执行文件:
要让程序代码在DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点击:File-Load Programe 再在项目文件夹下的子文件夹debug中选择生成的example4.out 文件就
可以将程序装载到DSP 的内部存储器中。 10、运行程序并查看结果:
a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options” 对话框,把欲查看的地址改为0x0080,如右图所示。
b)点击OK 按钮,然后点击Debug-Run 让程序在DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与下图一致:
11、修改汇编源程序文件
将以上项目源程序中SUMB子程序的寻址方式改成间接寻址方式,运行程序并查看程序运行结果。并记录下程序运行结束后CPU寄存器的结果。 12、建立其它项目工程文件
建立项目工程文件example5,使之实现计算y=mx+b; .title \"example4.asm\" .mmregs
STACK .usect \"STACK\堆栈的设置 .bss x,1 ;为变量分配4 个字的存储空间 .bss m,1 .bss b,1 .bss y,1
.def _c_int00 .data
table .word 15,3,20 ;x,m,b .text
_c_int00: STM #0,SWWSR ;插入0 个等待状态 STM #STACK+10H,SP ;设置堆栈指针 STM #x,AR1 ;AR1指向x RPT #2
MVPD table,*AR1+ ;把程序存储器中的数据移动到数据存储器 CALL SUMM end: B end
SUMM: LD *(x),T MPY *(m),A ADD *(b),A STL A,*(y) RET .end
操作步骤与前面相似,需要观察的数据存储器的地址均为0x0080; 下面是该项目程序的实验运行结果:example5 的结果
并记录下程序运行结束后CPU各寄存器的结果。
实验二 定点运算实验
一、实验目的
掌握各种乘法指令。
二、实验设备
计算机、SEED-DTK 实验箱、5416EVM 板
三、实验原理
参见教材第三章。
四、实验内容
编写程序,实现y=
Σa x 。
i
i
五、实验步骤
1、用仿真机将计算机与SEED-DTK 实验箱连接好,并依次打开实验箱电源、仿真机电 源,然后运行CCStudio v3 .3 软件。
2、新建一个项目:点击Project-New,将项目命名为zhao4,并将项目保存在自己定义
的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。
3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击 保存按键,保存在和项目相同的一个文件夹下面(zhao4),保存类型选择*.ASM(如果源文件 是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM 为保存类型),我们在这里将保存名字命名为zhao4.asm 。
4、在项目中添加源文件:在新建立了一个源文件以后,要想使用CCS 编译器对该源文件 进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击zhao4.pjt, 在弹出的菜单中选择Add Files,然后将刚才建立的zhao4.asm 文件添加到该项目中去。 5、编写源程序:
在工程管理器中双击zhao4.asm ,将出现文本编辑窗口,在该文本编辑窗口中输入如下 内容:
************************************************* * *
* 用单操作数指令方案实现 * * y=(a1*x1+a2*x2+···a19*x19+a20*x20) * * *
************************************************* .title \"zhao4.asm\" .mmregs
STACK .usect \"STACK\ .bss a,20 .bss x,20 .bss y,2 .data
table: .word 1,2,3,4,5,6,7,8,9,10,11 .word 12,13,14,15,16,17,18,19,20 .word 21,22,23,24,25,26,27,28 .word 29,30,1,2,3,4,5,6,7,8,9,10 .def _c_int00 .text
_c_int00: STM #a,AR1 RPT #39
MVPD table,*AR1+ LD #0,B STM #a,AR2 STM #x,AR3 STM #19,BRC RPTB done-1
LD *AR2+,T ;单操作数指令 MPY *AR3+,A ;单操作数指令 ADD A,B
done: STH B,*(y)
STL B,*(y+1) end: B end .end
6、编写链接配置文件: 参照实验二,可不作修改 7、编写中断向量表文件 参照实验二,可不作修改。 8、对项目进行编译和链接:
把zhao4.asm、vectors.asm、zhao4.cmd 依次添加到项目后,点击Project-Compile File, 在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。 9、装载可执行文件:
要让程序代码在DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点 击:File-Load Programe 再选择生成的zhao4.out 文件就可以将程序装载到DSP 的内部存储 器中。
10、运行程序并查看结果:
a ) 首先打开欲查看的数据空间: 点击View-
Memory,弹出“Memory Window Options”对话框,把欲 查看的地址改为0x0080,如右图所示。
b)点击OK 按钮,然后点击Debug-Run 让程序在
DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与下图一致:
11、查看执行的周期数:a)关闭上述数据观察窗口,在文件zhao4.asm 的“end: B end”处设置断点:在该语句的左边灰色区域双击鼠标即可,如下图所示:
b)点击菜单Profiler——Enable Clock , 使EnableClock上出现一个小钩(如右图所示);然后再点击Profiler——View Clock,则会在CCS 窗口中出现一个“Clock=0”的小窗口。
c)对项目进行重新编译下载:
点击Project-Rebuild All,编译成功后点击File——Reload Program,最后点击Debug
——Run 运行程序,则可发现Clock 窗口中出现“Clock=???”,显然这个数字即是程序运行所耗机器周期数N。
12、试使用双操作数指令方案实现上述程序的功能: 试用双操作数乘法指令和RPTZ指令来代替 RPTB done-1
LD *AR2+,T ;单操作数指令 MPY *AR3+,A ;单操作数指令 ADD A,B
并完成上述程序的功能。并查看程序运行的周期数。 13、试用分支指令实现上述程序的功能: 试用BANZ 指令来代替 RPTB done-1
LD *AR2+,T ;单操作数指令 MPY *AR3+,A ;单操作数指令 ADD A,B
并完成上述程序的功能。并查看程序运行的周期数。
实验三 FIR滤波器
一、实验目的
(1)了解FIR滤波器的原理及使用方法;
(2)了解使用Matlab语言设计FIR滤波器的方法; (3)了解DSP对FIR滤波器的设计及编程方法; (4)熟悉对FIR滤波器的调试方法; 二、 实验内容
本试验要求设计滤波器采样频率为8000hz,截止频率2400hz的高通滤波器,
并设计FIR滤波器实现上面要求。输入信号频率为 800HZ,1800 HZ 和 3300HZ 的合成信号,目的是通过我们设计的滤波器将800HZ和1800 HZ的信号滤掉,余下3300HZ的信号成分,达到滤波的效果。 三、 实验原理
一个线性位移不变系统的输出序列y(n)和输入序列x(n)之间的关系,应满 足常系数线性差分方程:
x(n): 输入序列,y(n): 输出序列,ai、bi: 滤波器系数, N: 滤波器的阶数。 在式上式中,若所有的 ai均为 0,则得 FIR 滤波器的差分方程:
对上式进行 z变换,可得FIR 滤波器的传递函数:
FIR 滤波器的结构
在数字滤波器中,FIR 滤波器具有如下几个主要特点: ① FIR 滤波器无反馈回路,是一种无条件稳定系统; ② FIR 滤波器可以设计成具有线性相位特性。
本实验程序设计的就是一种偶对称的线性相位滤波器。 程序算法实现采用循环缓冲区法。 算法原理:
① 在数据存储器中开辟一个N个单元的缓冲区(滑窗),用来存放最新的N个输入样本; ② 从最新样本开始取数;
③ 读完最老样本后,输入最新样本来代替最老样本,而其他数据位置不变; ④ 用BK寄存器对缓冲区进行间接寻址,使缓冲区地址首尾相邻。 四、实验步骤
1.滤波器的 Matlab 语言设计
编写matlab程序,生成FIR滤波器系数后,附到DSP汇编语言程序中。
2.输入数据为800HZ,1800 HZ 和 3300HZ 的合成信号合成信号,采样率为8000hz,160个样点。 Input
.word 0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1 .word 0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AC,0x0FBB,0x3216 .word 0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EE,0xEFE8,0x347D,0xD778,0x21D4 .word 0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190E,0xDC23,0xD14A,0x4D7E .word 0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688 .word 0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD85,0xDBB1,0x5BAF,0x058C .word 0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78E,0xFD3E,0xFD21,0x2889,0xCEF2 .word 0x48C3,0x42A1,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CF .word 0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1 .word 0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AB,0x0FBB,0x3216 .word 0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EF,0xEFE8,0x347D,0xD778,0x21D4 .word 0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190D,0xDC24,0xD149,0x4D7E .word 0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688 .word 0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD86,0xDBB1,0x5BAF,0x058C .word 0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78D,0xFD3E,0xFD21,0x2889,0xCEF1 .word 0x48C3,0x42A2,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CF 3.打开CCS,新建立一工程文件fir.pjt。
4.将汇编源文件fir.asm、中断向量表vectors.asm和链接命令文件fir.cmd 添加到fir.pjt中。
fir5.asm文件内容如下: .title \" fir5.asm \" .mmregs .def _c_int00 .data
fir_table .word -6,28,46,27,-35,-100,-93,26,191,240,52,-291
.word -497,-278,337,888,773,-210,-1486,-1895,-442,2870 .word 6793,9445,9445,6793,2870,-442,-1895,-1486,-210,773 .word 888,337,-278,-497,-291,52,240,191,26,-93
.word -100,-35,27,46,28,-6 .data
input .word 0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1 .word 0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AC,0x0FBB,0x3216 .word 0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EE,0xEFE8,0x347D,0xD778,0x21D4 .word 0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190E,0xDC23,0xD14A,0x4D7E .word 0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688 .word
0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD85,0xDBB1,0x5BAF,0x058C
.word 0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78E,0xFD3E,0xFD21,0x2889,0xCEF2 .word 0x48C3,0x42A1,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CF .word 0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1 .word 0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AB,0x0FBB,0x3216 .word 0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EF,0xEFE8,0x347D,0xD778,0x21D4 .word 0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190D,0xDC24,0xD149,0x4D7E .word 0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688 .word
0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD86,0xDBB1,0x5BAF,0x058C
.word 0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78D,0xFD3E,0xFD21,0x2889,0xCEF1 .word 0x48C3,0x42A2,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CF fir_coff .usect \"fir_coff\in_buf .usect \"in_buf\ .bss in,160
.bss out_buf,112 .text
_c_int00: SSBx FRCT;小数乘法编程时,设置FRCT(小数方式)位 STM #in,AR1 RPT #159
MVPD input,*AR1+
STM #fir_coff,AR1 RPT #47
MVPD fir_table,*AR1+ STM #in_buf,AR1 RPT #47
MVPD input,*AR1+
STM #in_buf+47,AR2 STM #fir_coff+47,AR3 STM #48,BK STM #-1,AR0
STM #out_buf,AR6 STM #in+48,AR5 STM #111,AR7
;MVDD *AR5+,*AR2+0% FIR2: ;FIR滤波运算 RPTZ A,#47
MAC *AR2+0%,*AR3+0%,A ; STH A,*AR6+
MVDD *AR5+,*AR2+0%;用最新的样本值替代最旧的样本值 BANZ FIR2,*AR7- NOP NOP .end
vector.asm文件内容如下:
.title \"vector.asm\" ;/*中断向量表的文件名*/ .ref _c_int00 ;/*引用外部定义的标号*/
.sect \".vector\" ;/*定义初始化的段名*/ B _c_int00 ;/*引用start*/ .end
Fir.cmd文件内容如下:
MEMORY { PAGE 0: VECT: origin = 0x28100, len = 0x100 IPROG1: origin = 0x200, len = 0x7c00 IPROG2: origin = 0x28200, len = 0x7c00 IPROG3: origin = 0x38000, len = 0x8000 FLASHL: origin = 0x40000, len = 0x40000 FLASHH: origin = 0x4000000,len = 0x80000
PAGE 1: SPRAM: origin = 0x60, len = 0x20 DARAM: origin = 0x80, len = 0x3f80 /*×??à???è???ó????????FLASH????*/ SARAM: origin = 0x8000, len = 8000 }
SECTIONS { .vector: {} > VECT PAGE 0 .text: {} > IPROG2 PAGE 0 .cinit: {} > IPROG2 PAGE 0 .switch: {} > IPROG2 PAGE 0 .const: {} > IPROG2 PAGE 0 STACK: {} > IPROG1 PAGE 0 .data: {} > DARAM PAGE 1 .bss: {} > DARAM PAGE 1 fir_coff: align(64) {} > IPROG1 PAGE 0 in_buf: align(64) {} > IPROG1 PAGE 0 }
5.在project菜单下选择rebuild all选项。
6.在 file 菜单下,选择 load program 选项,将生成的 fir.out 文件装载到DSP中。 7.运行程序,在 view 菜单下选择 watch window 选项来观测变量值。依次输入 input 和 output 来观测输入输出变量值,这两个变量分别为滤波前的输入数据和滤波后输出数据的首地址。 8.可以在 view菜单下选择graph/time frequence,按照要求,设置好相应的参数,来观测输入和输出数据的波形。
9.具体调试执行程序时,可使用断点,单步执行等方式。
实验四:定时器中断控制
一、实验目的:
1. 掌握长时间间隔的定时器的处理; 2. 掌握片内外设的设置方法。
3. 掌握 TMS320VC5416 的中断使用
二、实验内容:
1. 系统初始化; 2. 定时器中断初始化;
实验背景知识:
1.通用 TIMER 简介
TMS320VC5416 的定时器的说明:
VC5416 中有一个可编程的片上定时器,总共包含有三个可由用户设置的寄存器,并可 以申请主机的中断。这三个寄存器分别为 TIM、PRD、TCR。这些寄存器与对应的存贮空 间地址如下表所示:
时间寄存器(TIM)是一个 16 位的存贮器映射寄存器,它的值由周期寄存器来进行装 载,并且做减一操作。
周期寄存器(PRD)是一个 16 位的存贮器映射寄存器,它是用来重装时间寄存器(TIM) 寄存器的值的。
定时器控制寄存器(TCR)是一个 16 位的存贮器映射寄存器,包含了定时器的控制与 状态信息。
三、实验要求:
正确进行与定时器以及中断函数的配置。
51
四、实验程序功能与结构说明:
1.Timer 实验,包含文件
实验的主程序,主要包含 DSP 初始化,Timer 及 Timer 中断初 始化,Timer 中断程序。
2. vector.asm: 包含 5416 的中断向量表。 3. dtk_boot.gel: 系统的初始化文件。
4. dec5416.cmd: 声明了系统的存贮器配置与程序各段的链接关系。
1. timer.c:
2.程序流程图
52
主程序流程图
CSL 初始化 系统时钟设置 关中断 定时器中断初始化 定时器各寄存器配置 开中断 启动定时器 for(;;)循环等待进入 中断程序 中断程序流程图
i++; 开总中断 返回 3.实验准备
首先将光盘下 03. Examples of Program \\ 04. SEED-DTK5416 例程\\3.2.4 Time 文件夹 拷贝到 D:盘根目录下。
1. 将 DSP 仿真器与计算机连接好;
2. 将 DSP 仿真器的 JTAG 插头与 SEED-DEC5416 单元的 J1 相连接;
3. 打开 SEED-DTK5416 的电源。观察 SEED-DTK_MBoard 单元的+5V,+3.3V,
+15V,-15V 的电源指示灯是否均亮;若有不亮的,请断开电源,检查电源。
4.实验步骤
1. 打开 CCS,进入 CCS 的操作环境。
2. 装入 timer.pjt 工程文件,添加 dtk-boot.gel 文件。 3. 装载程序 timer.out,进行调试。
4. 在程序的第 85 行“i++;”处设置断点。
5. 运行程序,程序会停在断点处,表明已进入定时器中断。
6. 继续运行程序,程序每次都会停在断点处。实验者可根据自己的需要改变周期寄存
器的值,从而控制每次进中断的时间。
因篇幅问题不能全部显示,请点此查看更多更全内容