DSP硬件指导书.docx
- 文档编号:4643587
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:69
- 大小:1.20MB
DSP硬件指导书.docx
《DSP硬件指导书.docx》由会员分享,可在线阅读,更多相关《DSP硬件指导书.docx(69页珍藏版)》请在冰豆网上搜索。
DSP硬件指导书
DSP硬件技术实验指导书
(第一版)
编写
目录
基础性实验
实验一数据存储实验3
实验二定点数算术运算实验8
提高性实验
实验三定时中断实验16
实验四BSP串口实验24
实验五IIR数字滤波器45
设计性实验
实验六基于DSP的频率可调正弦信号发生器的设计51
实验七基于DSP的调幅信号解调过程的实现52
附录:
53
实验一数据存储实验
实验性质:
基础性实验
实验验目的:
(1)熟悉DSP系统的组成结构。
(2)熟悉CCS环境下DSP程序的开发流程,练习常用的调试和观察方法。
(2)熟悉常用的数据存储和重复指令。
(3)熟悉汇编程序段结构,掌握段定义及初始化常数伪指令。
(4)掌握链接文件的编写及构成。
实验要求:
(一)基本任务
1.编写汇编程序实现数组a[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19},x[20]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}的初始化,并将数据存储器中的数组x[20]复制到数组y[20],将数据存储器中的a[20]写入到程序存储器PROM(2000h~2013h),再将程序存储器PROM的20个数据存入数据存储器DATA(0200h~0213h).
2.在CCS环境下调试、观察该程序,观察内容如下:
(1)观察数据段已初始化数据
(2)观察数组a、x、y
(3)观察程序存储器PROM
(4)观察数据存储器DATA
3.修改程序将PROM地址范围改为2010H起始
4.修改程序将DATA地址范围改为0210H起始
(二)设计提高
1.解释该程序中LOOPP循环体的功能,修改程序将LOOPP循环体的功能用块传送方式实现。
(三)思考总结
1.总结数据传送指令MVPD、MVDD、WRITA、READA各自的功能,并思考在本
程序中是否可以互换。
2.总结该程序的存储空间配置和使用情况。
实验设备:
计算机,CCS2.0版软件,DSP仿真器,实验箱。
实验内容:
1.连接DSP开发系统,启动CCS软件
(1)系统连接
进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如图1-1所示:
图1-1DSP系统连接图
(2)在硬件安装完成后,确认安装正确、各实验部件及电源连接正常后,接通电源,
启动CCS,若系统连接正常,则出现画面如图1-2
图1-2CCS正常启动界面
若出现画面如图1-3
图1-2CCS非正常启动界面
表示系统连接不正常。
仿真器的连接、JTAG接口或CCS相关设置存在问题,需要掉电检查仿真器的连接、JTAG接口连接,或检查CCS相关设置是否正确。
2.创建一个新工程
在CCS环境中点击Project-New,弹出工程创建窗口,如图1-4所示
图1-4建立工程界面
在Project一栏中键入工程名mymove,在location一栏选择工程所在位置D:
\programFiles\myprojects\myove,然后单击“完成”按钮,CCS将在指定目录下创建一个名为mymove.pjt的工程。
3.建立汇编程序
在CCS环境中点击File-New-Sourcefile菜单命令,打开一个空白文档,将汇编程序录入,单击File-Save菜单命令,出现如图1-5所示保存窗口
图1-5新建汇编程序界面
选择D:
\programFiles\myprojects\myove子目录,在文件名一栏输入mymove,并选择保存类型为AssemblySourceFiles(*.asm),单击“保存”按钮,汇编程序存盘。
参考汇编程序
.mmregs
.def_c_int00
.data
TBL:
.word0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
.word1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PROM.usect"PROM",20
.bssa,20
.bssx,20
.bssy,20
DATA.usect"DATA",20
.text
_c_int00
bstart
nop
nop
start:
STM#a,AR1;a[20]={0,1,2,3,4,5,6,7,8,9,10,;11,12,13,14,15,16,17,18,19}
RPT#39;x[20]={1,1,1,1,1,1,1,1,1,1;1,1,1,1,1,1,1,1,1,1}
MVPDTBL,*AR1+
STM#x,AR2;将数据存储器中的数组x[20]复制到数组y[20]STM#y,AR3
STM#y,AR3
RPT#19
MVDD*AR2+,*AR3+
STM#a,AR1;将数据存储器中的a[20]写入到程序存储器PROM
LD#PROM,A
STM#19,AR3
LOOPP:
WRITA*AR1+
ADD#1,A,A
BANZLOOPP,*AR3-
LD#PROM-1,A;读程序存储器PROM中20个数据存入数据存储器DATA
STM#DATA,AR1
ST#19,BRC
RPTBLOOP2
ADD#1,A,A
LOOP2:
READA*AR1+
WAIT:
NOP
BWAIT
4.建立链接文件
在CCS环境中点击File-New-Sourcefile菜单命令,打开一个空白文档,将汇编程序录入,单击File-Save菜单命令,出现如图1-5所示保存窗口,选择D:
\programFiles\myprojects\myove子目录,在文件名一栏输入mymove,并选择保存类型为TIcommandLanguageFiles(*.cmd),单击“保存”按钮,链接程序存盘。
参考链接文件:
MEMORY
{PAGE0:
RAM:
origin=1000h,length=800h
RAM1:
origin=2000h,length=300h
PAGE1:
DARAM1:
origin=0100h,length=100h
DARAM2:
origin=0200h,length=100h
}
SECTIONS
{
.data:
>RAMPAGE0
.text:
>RAMPAGE0
PROM:
>RAM1PAGE0
.bss:
>DARAM1PAGE1
DATA:
>DARAM2PAGE1
5.将有关文件添加到工程中
点击Project-AddFilestoProject菜单命令,选择文件mymove.asm,双击打开,将mymove.asm添加到工程。
同理,将mymove.cmd添加到工程中。
6.汇编、编译和链接产生.out文件
选择Project/RebuildAll.或工具条中的相应按钮,注意在监视窗口显示的汇编、编译和链接相关信息。
如果没有错误,将产生mymove.out文件,如果有错,在监视窗口中以红色字体显示出相关信息,用鼠标双击该行,光标调至该行,修改程序后,重新汇编、链接。
7.加载并运行.out文件
选择File--LoadProgram,选择mymove.out,将运行文件加载到DSP中,点击Debug-Run命令运行程序,若需单步执行程序则点击Debug-setpinto,若需设置断点进行调试,则将光标移至准备设置断点的一行,按下图标,再点击Debug-Run命令。
8观察运行结果
由.asm和.cmd文件可以确定数组a、x、y、DATA、PROM放置的位置,例如数组a放置在数据空间0100h开始的单元中,点击View-Momory菜单命令,出现如图1-6所示选项窗口
图1-6察看内存界面
按照要求修改其中的address和Page值即可观察到相应结果。
9.修改cmd文件,PROM地址范围改为2010H起始,DATA地址范围改为0210H起始,重新汇编、编译和链接、下载、运行,观察相应结果。
10.阅读理解参考程序,并自行设计块传送程序实现LOOPP循环体功能。
11.思考总结本程序中所用数据传送指令的功能以及存储器的配置情况。
实验报告
1.简述实验目的和要求
2.实验结果及分析
●实验源程序清单:
要求可读性好,必要时须加注释(如变量注释等)。
●实验结果:
给出CCS中的调试结果,并总结实验过程中出现问题和解决过程。
●简要总结思考题
实验二定点数算术运算实验
实验性质:
基础性实验
实验验目的:
(1)熟悉CCS环境下DSP程序的开发流程,练习常用的调试和观察方法。
(2)熟悉定点DSP数的表示方法及算数运算规则。
(3)掌握定点DSP算术运算指令和编程技巧。
实验原理:
1.数据的定标
定点DSP芯片的数值表示是基于2的补码表示形式,C54x是16位定点DSP,DSP
中的加法器、乘法器都是按无符号整数来运算的,如何处理小数呢?
实际上,小数点的位置是一种“假想”,是由程序员来确定的,通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数,这就是数的定标,数的定标有S表示法和Q表示法。
Q表示法中用一个符号位、Q个小数位和15-Q个整数位来表示一个数。
例如00000011.10100000表示的数值为3.625,这是Q8格式(用8表示小数位数),它表示数的范围为:
-128~+127.996,Q8定点数的小数精度为1/256=0.004。
同样,一个16位数,采用的Q值不同(即小数点位置不同),表示的数就不同,Q值越大,数值范围越小,精度越高,反之,Q越小,数值范围越大,精度越低。
定点数和浮点数的转换关系如下:
浮点数(x)转换为定点数(xq):
xq=(int)(x*2q)
定点数(xq)转换为浮点数(x):
x=(float)(x*2-q)
除特殊情况下(如动态范围和精度要求)需要混合表示法外,通常用Q15格式表示小数,以Q0格式表示整数。
(1)Q0格式
当一个16位数表示整数时,最低位(D0)表示20,D1位表示21,次高位(D14)
表示214,最高位(D15)为符号位,0表示正数,1表示负数。
Q0表示的数值范围为-32768~32767,精度为1。
(2)Q15格式
当需要表示定点小数时,若小数的位置始终在最高位后,而最高位(D15)表示符号位为Q15格式。
当一个16位数表示纯小数时,次高位(D14)表示2-1,然后是2-2,最低位(D0)表示2-15。
Q15表示的数值范围为-1~0.9999695,精度为2-15。
将一个小数用Q15格式表示的方法是用215,再将其十进制整数部分转换成十六进制数,就得该小数的补码表示了,如图2-1所示。
图2-1DSP定点运算中小数的表示
在汇编语言中不能直接写入十进制小数,如果要定义一个系数0.707,可以写成:
.word32768*707/1000
2.16位定点加法和减法
C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。
其中,ADDS用于无符号数的加法,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。
ADD用于有符号数加法,寻址方式很多。
C54X中提供了多条用于减法法的指令,如SUB、SUBB、SUBC和SUBS。
其中,SUBS用于无符号数的减法运算,SUBB用于带进位的减法(如32位扩展精度减法)。
而SUBC为条件减法指令,SUB与ADD一样,有多种寻址方式。
本实验中采用ADD和SUB指令来完成加减运算的。
指令的详细使用说明请参考《TMS320C54xDSPReferenceSet,》。
注意,在加法和减法运算中,必须保证两个操作数定标相同,整数加减运算和相同定标的小数加减运算是一样的。
3.16位定点整数乘法
在C54X中提供了大量的乘法运算指令,其结果都是32位,放在累加器A或B中。
乘数在C54X的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和累加器A或B的高16位。
MPY是有符号乘法指令,MPYU是无符号乘法指令,C54X中一般对数据的处理都是有符号的,本实验中,我们使用下列代码来说明整数乘法运算:
RSBXFRCT;清FRCT标志,准备整数乘
LDtemp1,T;将变量temp1装入T寄存器
MPYtemp2,A;完成temp1*temp2,结果放入T寄存器(32位)
例如,当temp1=1234H(十进制的4660),temp2=9876H(十进制的-26506),乘法的结果在累加器A中为0F8A343F8H(十进制的-123517960)。
这是一个32位的结果,需要两个内存单元存放结果:
STHA,mpy_I_H;将结果高16位存入变量mpy_I_H中
STLA,mpy_I_L;将结果低16位存入变量mpy_I_L中
当temp1=10H(十进制的16),temp2=05H(十进制的5),乘法结果在累加器A中为50H(十进制80),对于这种情况,仅需要保存低16位即可;
STLA,mpy_I_L
4.16位定点小数乘法
在C54X中,小数的乘法与整数的乘法基本一样,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高位的后面,所以必须左移一位,才能得到正确的结果。
C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移一位。
对于整数乘法不需要左移,因此,乘法前要将FRCT清零。
两个16位小数相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位结果。
本实验中,我们用下列代码实现小数乘法:
SSBXFRCT;FRCT=1,准备小数乘法
LDtemp1,16,A;将变量temp1装入累加器A的高16位
MPYAtemp2;完成temp2乘累加器A的高16位,结果在B中,同时将temp2
装入T寄存器
STHB,mpy_f;将乘积结果的高16位存入变量mpy_f
有时为了提高精度,可以使用RND或MPYR指令对低16位做四舍五入的处理。
5.16位定点除法
在C54C中没有专门提供除法指令,一般有两种方法来完成除法。
一种是乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。
这种方法对于除以常数特别适用,另一种方法是使用SUBC指令,加上重复指令RPT#15,通过16次条件减法完成无符号除法运算,再通过修正符号位实现有符号除法,详细代码如下:
LDtemp1,T;将被除数装入T寄存器
MPYtemp2,A;除数与被除数相乘,结果放入累加器A
LDtemp2,B;将除数temp2装入累加器B的低16位
ABSB;求绝对值
STLB,temp2;将累加器B的低16位存回temp2
LDtemp1,B;将被除数temp1装入累加器B的低16位
ABSB;求绝对值
RPT#15;重复SUBC指令16次
SUBCtemp2,B;使用SUBC指令完成除法运算
BCDdiv_end,agt;判断除数与被除数是否同号
STLB,quot_i;将商存入变量quot_i
STHB,remain_i;将余数存入变量remain_i
XORB;商为负,将B清零
SUBquot_i,B;将商反号
STLB,quot_i;存回变量
div_end:
6.16位定点小数除法
在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。
但有两点需要注意:
第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。
这与整数除法正好相反。
所以在执行SUBC指令前,应将被除数装入累加器A或B的高16位而不是低16位,其结果的格式与整数除法一样累加器A或B的高16位为余数,低16位为商。
第二,与小数乘法一样,应考虑符号位对结果小数的影响,所以应对商右移一位,得到正确的有符号数。
实验要求
(一)基本任务
1.阅读、理解、运行参考程序,观察结果,说明程序功能
参考汇编程序:
.mmregs
.global_c_int00
VAL1.set012h;18
VAL2.set034h;52
VAL3.set04000h;0.5
VAL4.set02000h;0.25(fraction)&8192(integer)
VAL5.set04ab8h;0.58374
VAL6.set0ffeeh;-18
VAL7.set0b548h;-0.58374
.bsstemp,1;addressof0x080
.bsstemp1,1;addressof0x081
.bsstemp2,1;addressof0x082
.bsstemp3,1;addressof0x083
.bsstemp4,1;addressof0x084
;resultregister
.bssadd_result,1;addressof0x085
.bsssub_result,1;addressof0x086
.bssmpy_i_h,1;addressof0x087
.bssmpy_i_l,1;addressof0x088
.bssmpy_f,1;addressof0x089
.bssquot_i,1;addressof0x08a
.bssremain_i,1;addressof0x08b
.bssquot_f,1;addressof0x08c
.text
_c_int00:
ld#temp,DP;loadDPoftemp1
st#VAL1,temp1
st#VAL2,temp2;inittemp1&temp2,18+52=70(0x46)
;--------testADD---------------------------
ldtemp1,a;loadtemp1->a
addtemp2,a;a+temp2->a
stla,add_result;savea(low16bits)->add_result
nop;setbreakpoint
st#VAL6,temp3
st#VAL1,temp4;inittemp3&temp4,(-18)-18=-36(0x0ffdc)
;--------testSUB---------------------------
stm#temp3,ar2;addressoftemp3->ar2
stm#temp4,ar3;addressoftemp4->ar3
sub*ar2+,*ar3,b;(temp3<<16)-(temp4<<16)->b,ar2++
sthb,sub_result;resultinsub_result
nop;setbreakpoint
st#VAL1,temp1
st#VAL2,temp2;inittemp1&temp2,18*52=936(0x3a8)
;--------testMPY(integer)-----------------
rsbxFRCT;prepareforintegermpy
ldtemp1,T;temp1->T
mpytemp2,a;temp1*temp2->A(resultis32bit)
stha,mpy_i_h;thehigh16bitinmpy_i_h
stla,mpy_i_l;thelow16bitinmpy_i_l
nop;setbreakpoint
st#VAL3,temp3
st#VAL7,temp4;inittemp3&temp4,0.5*(-0.58374)=-0.29187(0x0daa4)
;--------testMPY(fraction)----------------
ssbxFRCT;prepareforfractionmpy
ldtemp3,16,a;loadtemp3intoA(high16bits)
mpyatemp4;temp3*temp4->B,andtemp4->T
sthb,mpy_f;resultinmpy_f
nop;setbreakpoint
st#VAL2,temp1
st#VAL6,temp2;inittemp1&temp2,52/-18=-2(0xfffe)mod16(0x10)
;--------testDIV(integer)-----------------
ldtemp1,T;loadtemp1->T
mpytemp2,A;temp1*temp2->A
ldtemp2,B;loadtemp2->B(low16bits)
absB;|B|->B
stlB,temp2;saveBlow16bits->temp2
ldtemp1,B;loadtemp1->B(low16bits)
absB;|B|->B
rpt#15;repeatSUBC16times
subctemp2,b;useSUBCdonediv
bcdidiv_end,agt;delayjump,runthefollowingtwoinstruction,then
;ifA>0,thenjumptolabelidiv_end,enddiv
stlB,quot_i;savelow16bitsofB->quot_i--->quotient
sthB,remain_i;savehigh16bitsofB->remain_i--->remainder
xorB;ifresultifnegative,then0->B
subquot_i,B;putminustoquotient
stlB,quot_i;savelow16bitsofB->quot_i--->quotient
idiv_end:
nop;setbreakpoint
st#VAL3,temp1
st#VAL5,temp2;inittemp1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 硬件 指导书