DSP硬件指导书.docx

上传人:b****3 文档编号:4643587 上传时间:2022-12-07 格式:DOCX 页数:69 大小:1.20MB
下载 相关 举报
DSP硬件指导书.docx_第1页
第1页 / 共69页
DSP硬件指导书.docx_第2页
第2页 / 共69页
DSP硬件指导书.docx_第3页
第3页 / 共69页
DSP硬件指导书.docx_第4页
第4页 / 共69页
DSP硬件指导书.docx_第5页
第5页 / 共69页
点击查看更多>>
下载资源
资源描述

DSP硬件指导书.docx

《DSP硬件指导书.docx》由会员分享,可在线阅读,更多相关《DSP硬件指导书.docx(69页珍藏版)》请在冰豆网上搜索。

DSP硬件指导书.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1