基本算数运算(DSP实验报告)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基本算数运算

一、实验目的和要求

加、减、乘、除是数字信号处理中最基本的算术运算。DSP 中提供了大量的指令来实现这些功能。本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法和编程技巧。本实验的演示文件为exer1.out。

二、实验原理

1) 定点DSP 中的数据表示方法

2) 实现16 位定点加法

ld temp1,a ;将变量temp1 装入寄存器A

add temp2,a ;将变量temp2 与寄存器A相加,结果放入A中stl a,add_result ;将结果(低16 位)存入变量add_result 中3)实现16 位定点减法

stm #temp1,ar3 ;将变量temp1 的地址装入ar3 寄存器

stm #temp3,ar2 ;将变量temp3 的地址装入ar2 寄存器

sub *ar2+, *ar3,b ;将变量temp3 左移16 位同时变量temp1 也左移16 位,然后相减,结果放入寄存器B(高16位)中,同时ar2 加1。

sth b,sub_result ;将相减的结果(高16位)存入变量sub_result 4)实现16 位定点整数乘法

rsbx FRCT ;清FRCT标志,准备整数乘

ld temp1,T ;将变量temp1 装入T 寄存器

mpy temp2,a ;完成temp2*temp1,结果放入A寄存器(32 位)5)实现16 位定点小数乘法

我们使用下列

ssbx FRCT ;FRCT=1,准备小数乘法

ld temp1,16,a ;将变量temp1 装入寄存器A的高16位

mpya temp2 ;完成temp2 乘寄存器A的高16 位,结果在B中,同时将temp2 装入T 寄存器

sth b,mpy_f ;将乘积结果的高16 位存入变量mpy_f

6)实现16 位定点整数除法

代码如下:

ld temp1,T ;将被除数装入T 寄存器

mpy temp2,A ;除数与被除数相乘,结果放入A寄存器

ld temp2,B ;将除数temp2 装入B 寄存器的低16位

abs B ;求绝对值

stl B,temp2 ;将B 寄存器的低16 位存回temp2

ld temp1,B ;将被除数temp1 装入B寄存器的低16 位

abs B ;求绝对值

rpt #15 ;重复SUBC 指令16 次

subc temp2,b ;使用SUBC 指令完成除法运算

bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A>0,则跳转到标号div_end,结束除法运算

stl B,quot_i ;将商(B寄存器的低16 位)存入变量quot_i sth B,remain_i ;将余数(B 寄存器的高16 位)存入变量remain_i

xor B ;若两数相乘的结果为负,则商也应为负。先将B 寄存器清0

sub quot_i,B ;将商反号

stl B,quot_i ;存回变量quot_i 中

div_end:

7)实现16 位定点小数除法

代码如下:

ld temp1,T ;将被除数装入T 寄存器

mpy temp2,A ;除数与被除数相乘,结果放入A寄存器

ld temp2,B ;将除数temp2 装入B 寄存器的低16位

abs B ;求绝对值

stl B,temp2 ;将B 寄存器的低16 位存回temp2

ld temp1,16,B ;将被除数temp1 装入B寄存器的高16 位abs B ;求绝对值

rpt #15 ;重复SUBC 指令16 次

subc temp2,b ;使用SUBC 指令完成除法运算

and #0ffffh,B ;将B 寄存器的高16 位清为0。这时余数被丢弃,仅保留商

bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,

若A>0,则,跳转到标号div_end,结束除法运算

stl B,-1,quot_f ;将商右移一位后存入变量quot_f,右移是为了修正符号位

xor B ;若两数相乘的结果为负,则商也应为负。先将B 寄存器清0

sub quot_f,B ;将商反号

stl B,quot_f ;存回变量quot_f中

div_end:

三、实验内容

1) 编写实验程序代码

本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句:nop,当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见附录。

2)用ccs simulator 调试运行并观察结果

在完成实验程序代码的输入,并使用ccs 进行编译并连接,得到out 文件后,就可以在simulator上调试运行。步骤如下:

a.启动ccs simulator。

b.点击file ->load program,找到exer1.out 并装入。这时可在反汇编窗口看到程序代码。

c.打开“Memory”窗口,并在其中选择要查看的存贮器地址段:0x080

-0x08e。

d.在反汇编窗口中在每个“nop”指令处都设一个断点,方法有两种:1.用鼠标双击该指令将其点亮即可。2.在菜单栏中选择debugÆbreakpoint,然后在弹出的对话框中键入欲加断点的地址即可(注意地址的格式)。

e.单击Run 快捷键(或者F5 按钮),启动执行基本算术运算程序,程序在执行完加法运算后自动暂停。通过register window 窗口可以看到寄存器A的内容为0x46,这正是加法运算的结果。同样,在Memory 窗口中,可以看到0x81,0x82,0x88 的内容为分别为0012,0034,0x46。执行加法运算后,将0x81 和0x82 的内容相加,结果放在0x88 单元。

f.在Memory 窗口中用鼠标左键双击0x81 单元,这时可以修改该内存单元的内容。输入新的数据0x0ffee(十进制的-18),编辑内容时请直接输入FFEE(十六进制),然后回车确认,便完成对0x81 单元的修改。

g.在register window窗口中修改PC 值,方法也是鼠标左键双击PC 寄存器的内容,输入新的PC 值0x1085(编辑内容时直接输入1805),并用回车键确认。

h.单击Run 快捷键(或者F5 按钮),程序从当前PC 继续运行,重新计算0x81和0x82的和,结果在0x88 中。当程序再次暂停时,可以看到A寄存器和0x88 的内容为0x22(十进制的34),这正是我们希望的结果:-18+52=34。

相关文档
最新文档