dsp实验1-基本算数运算
DSP实验手册实验一CCS使用及DSP的运算(精)
实验一 CCS使用及DSP 基本数学运算一、实验目的:1、熟悉CCS 集成开发环境,掌握工程的生成方法;2、熟悉SEED-DTK5416实验环境;3、掌握CCS 集成开发环境的调试方法;4、了解数在计算过程中的定标,掌握数的定点、浮点表示方法,定点、浮点基本运算以及定点、浮点间的相互转换。
二、实验内容:1、 DSP源文件的建立;2、 DSP程序工程文件的建立;3、编译与链接的设置,生成可执行的DSP 文件;4、进行DSP 程序的调试与改错;5、学习使用CCS 集成开发工具的调试工具;6、观察实验结果;三、实验知识背景:在DSP 编程过程中,数以二进制、十进制、与十六制表示均可。
在定点DSP 的运算过程中,数一般采用二进制与二进制补码的形式进行运算的。
其中二进制数只能代表正数不能代表负的数,而二进制补码记数系统弥补了这一缺点。
它的构成如下;在二进制的基础上,加一符号位。
符号位位于二进制数的最高位当为正数时,符号位为0,为负数时,符号位为1当采用二进制补码进行数的运算时,具有如下的两个优点:可以将加法与减法统一成加法运算符号位可以进行扩展,而其数值不变,这可以使一个比较小的数存放到比较大的寄存器当中例:1×2 + 0×1 = -2 (11110)2 = 1×(-16)+ 1×8 + …… +当将其符号位扩展三位,放入一8位的寄存器中1×2 + 0×1 = -2 (11111110)2 = 1×(-128)+ 1×64 + …… +这将为运算提供极大的方便,因而在定点的DSP 中,大多数情况采用二进制补码形式。
C5000系列的DSP 硬件只支持定点运算,浮点运算要通过软件来实现。
其运算字长为16位,也就是说,DSP 所能表示的整数的范围也就决定了,其范围为-32768到32767。
而在很多情况下,数学运算过程中不一定是整数,而且动态范围也不是固定不变的。
DSP实验手册实验一CCS使用及DSP的运算(精)
实验一 CCS使用及DSP 基本数学运算一、实验目的:1、熟悉CCS 集成开发环境,掌握工程的生成方法;2、熟悉SEED-DTK5416实验环境;3、掌握CCS 集成开发环境的调试方法;4、了解数在计算过程中的定标,掌握数的定点、浮点表示方法,定点、浮点基本运算以及定点、浮点间的相互转换。
二、实验内容:1、 DSP源文件的建立;2、 DSP程序工程文件的建立;3、编译与链接的设置,生成可执行的DSP 文件;4、进行DSP 程序的调试与改错;5、学习使用CCS 集成开发工具的调试工具;6、观察实验结果;三、实验知识背景:在DSP 编程过程中,数以二进制、十进制、与十六制表示均可。
在定点DSP 的运算过程中,数一般采用二进制与二进制补码的形式进行运算的。
其中二进制数只能代表正数不能代表负的数,而二进制补码记数系统弥补了这一缺点。
它的构成如下;在二进制的基础上,加一符号位。
符号位位于二进制数的最高位当为正数时,符号位为0,为负数时,符号位为1当采用二进制补码进行数的运算时,具有如下的两个优点:可以将加法与减法统一成加法运算符号位可以进行扩展,而其数值不变,这可以使一个比较小的数存放到比较大的寄存器当中例:1×2 + 0×1 = -2 (11110)2 = 1×(-16)+ 1×8 + …… +当将其符号位扩展三位,放入一8位的寄存器中1×2 + 0×1 = -2 (11111110)2 = 1×(-128)+ 1×64 + …… +这将为运算提供极大的方便,因而在定点的DSP 中,大多数情况采用二进制补码形式。
C5000系列的DSP 硬件只支持定点运算,浮点运算要通过软件来实现。
其运算字长为16位,也就是说,DSP 所能表示的整数的范围也就决定了,其范围为-32768到32767。
而在很多情况下,数学运算过程中不一定是整数,而且动态范围也不是固定不变的。
实验一 CCS使用及DSP基本数学运算
四、实验程序结构说明 1.math.c这个文件中包含了实验关于DSP运算的主演函数。 主要有: fixed_add(int x,int y):定点加法运算; fixed_sub(int x,int y):定点减法运算; fixed_mul(int x,int y):定点乘法运算; fixed_div(int x,int y):定点除法运算; float_add(double x,double y):浮点加法运算; float_sub(double x,double y):浮点减法运算; float_mul(double x,double y):浮点乘法运算; float_div(double x,double y):浮点除法运算; float_fixed(double x):浮点转定点运算; fixed_float(int x):定点转浮点运算;
结果不超过16位表示范围 • 设x的Q值为Qx,y的Q值为Qy,且Qx>Qy,加法/ 减法结果z的定标值为Qz,则: • z=x+y
zq 2
Qz
xq 2
Qx
yq 2 ] 2
Qx
Qy
xq 2
Qx
yq 2
( Qx Qy )
2Qx
( Qz Qx )
⑶加载源文件到工程
点击Project,选择Add Files to Project,添加 math.c、math.cmd、rts.lib文件到工程中。
①添加源文件到工程 在下拉菜单中选择.c点击打开,即可添加 源程序到工程中
②同样的方法可以添加文件math.cmd、rts.lib到工 程文件中 在下面窗口中可以看到math.c、rts.lib文件已经加 到工程文件中。
实验一 DSP指令实验
实验一DSP指令实验实验目的:了解DSP的结构及管脚功能(请参阅TMS320C5000系列原理说明书)掌握DSP的基本指令实验要求:让学生了解怎样连接对DSP进行简单的编程操作,运算控制等基本汇编语言及算术语言实验测试及除错验证。
实验说明:DSP指令实验,主要是对54系列DSP一个基本的了解实验,主要是熟悉54系列的语句、了解54系列DSP的基本框架、了解DSP的特征。
该实验所需硬件主要是TMS320C5402DSP芯片,以及发光二极管等有可观性电路。
实验过程是:让学生了解怎样连接对DSP进行简单的编程操作,运算控制等基本汇编语言及算术语言实验测试及除错验证。
实验步骤:安装CCS的Simulator方式:双击桌面上的Setup CCS C5000 图标,关闭Import Configuration 窗口,在System Configuration中的My System的下面可看到一个类似板卡的图标,如果该图标的名称是“tisim54x”的话,就可直接关闭该窗口,不存盘退出。
如果该图标的名称不是“tisim54x”的话,在该图标上点击右键,选择remove删除该结构,然后在Available Board Types中双击“tisim54x”的图标(如果有的话),弹出Board Properties的对话框点击“next”、“finish”然后关闭Code Composer Setup窗口,存盘退出即可。
如果在Available Board Types中没有“tisim54x”的图标,则在右边框内单击“Install a Device Driver”,在路径“c:\ti\driver\”中打开tisim54x.dvr 文件,在Available Board Types中可看到“tisim54x”的图标,然后按上述操作。
即生成CCS 的Simulator方式。
1、以Simulator方式启动CCS,在[Project]-[Open]菜单中打开ex1.mak;2、在左边树状列表框内双击[Project]展开目录树,双击[ex1.asm]打开源程序文件(或者打开自己编写的程序),参考程序中的注释仔细阅读源程序;3、在[Project]-[Build]菜单中编译项目文件,编译成功后在下端的状态窗口中显示Build Complete,0 Errors,0 Warnings;4、在[File]-[Load Programm]中加载输出执行代码文件ex1.out,此时,反汇编窗口将显示在前端,当前PC指针为0000:0080(黄色高亮显示),指令代码将以汇编语言方式显示,可以在反汇编窗口中点击鼠标右键,在弹出菜单中选择[Properties]-[Dis-Assembly Options]打开反汇编选项对话框,在[Dis-Assembly Style]选项中选择[Algebraic],以算术语言方式显示指令代码(注意:此时可能标号显示异常,按PageUP再按PageDown即可刷新显示);5、选择[View]-[CPU Registers]-[CPU Register](或点击左边工具栏的快捷按钮)打开处理器映射寄存器窗口;6、选择[View]-[Memory](或点击左边工具栏的快捷按钮),在弹出的[Windows Memory Options]对话框的Address文本框中输入0x0200,Page下拉框中选中Data,确定后将打开数据存储器查询窗口,此时数据存储器地址0x0200~0x0203将对应ex1.asm中声明的标号DAT0~DAT3;7、调整[Dis-Assembly][memory][CPU Registers]三个窗口的大小,以便于观察;8、依次把光标移动到反汇编窗口中标号为bk?(?表示从0开始的整数)的标号行下的指令处,选择菜单[Debug]-[Breakpoint](或者点击快捷按钮)设置断点,断点设置后,都将以紫色高亮显示;9、选择[Debug]-[Run](也可以按快捷键F5或点击快捷按钮)执行程序;10、程序将在第一个断点bk0处停止,bk0标号下的指令将以半黄半紫高亮显示,在处理器映射寄存器窗口和数据存储器查询窗口中双击相应操作数的内容,即可进行修改(注意:如步骤6所述,DAT0~DAT3对应地址为0X0200~0X0203),试修改下一条指令操作数的内容,然后按F5执行程序,再在处理器映射寄存器窗口中或数据存储器查询窗口中观察指令执行结果;11、重复执行9、10步骤,依次观察加法指令、减法指令、乘法指令、除法指令、平方指令以及3数累加宏指令的执行结果;12、上指令执行完毕后,程序转到bk0处,可再次进行熟悉运算控制的实验。
DSP实验基本汇编程序设计
实验二基本算术运算实验一、实验目的:1:通过本实验,熟悉指令系统,初步掌握汇编语言程序设计的基本方法;2.熟悉CCS5000开发环境;3了解DSP54XX的数据格式,4:了解DSP的汇编语言实现算术乘除运算5掌握TMS320C54xxDSP程序空间及数据空间的分配;6.掌握COFF格式文件及配置文件。
二、实验原理DSP 中数据的格式有多种,包括16 位有符号数、16 位无符号数、32 位无符号数、32 位有符号数、32 位浮点数、32 位IEEE 浮点数等各种形式。
由于数据所设置的小数点位置的不同,即使同一类型的数据也会出现不同的数值。
这一点是程序设计中尤其需要注意的地方。
如果采用C 语言编写程序,CCS 会自动去管理各种数据;但如果采用汇编语言编写程序,对于各种数据的管理将显得尤其麻烦,然而在许多DSP 的应用场合,采用纯汇编编写程序是必须的,所以对于DSP 中数据各种格式的情况最好还是需要了解。
DSP中定点数据表示方法:DSP 表示整数时,有两种格式,有符号数和无符号数,如果作为有符号数表示时,其最高位表示符号,最高位为0 表示其为正数,为1 表示其为负数,最低位表示1,次低位表示2 的1 次方,次高位表示2 的14 次方。
无符号数表示时,最高位仍然作为数值位计算。
例如,有符号数所能够表示的最大的正数为07FFFH,等于32767(10 进制),而0FFFFH表示最大的负数-1;无符号数不能表示负数,其所能够表示的最大的数为0FFFFH,等于十进制数的65535。
DSP表示小数时,其符号和上面整数的表示一样,但是必须注意如何安排小数点的位置,原则上小数点的位置根据程序员的爱好可以安排在任何位置,为了便于数据处理一般安排在最高位后(以下我们仅以小数点在最高位的形式进行讨论),则最高位表示符号位,这样次高位表示0.5,然后是0.25,依次减少一半。
例如:4000H表示小数0.5,1000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)0.000030517578125。
dsp技术实验讲义(精)
DSP原理及应用实验讲义穆美好宝鸡文理学院物理系2006-10-18************************************************************************ *******目录:课程说明考核方法课程简介DSP原理及应用实验课实验项目一览表实验一 DES综合外设试验实验二 C54x的基本算数运算实验三 C54x浮点数的算术运算实验四用定时器实现数字振荡器实验三 fir数字滤波器实验三快速傅立叶变换(fft)的实现实验须知1 进入实验室做实验之前,应先预习实验内容,熟悉实验的原理、实验方案及所用仪器设备,做好实验所用的各种表格,的准备的进入实验室。
2 实验过程中要注意用电安全3 实验态度严肃认真,实验操作科学严谨。
4 仔细检查实验装置正确无误后方可通电。
5 严格按照实验教师的要求认真完成各项实验内容。
6 认真做好各项实验记录。
7 实验完毕,实验数据应由实验教师签字认可;整理好实验器材,经实验教师同意方可离开实验室。
课程说明课程名称:DSP原理及应用课程编号:91025104课程性质:非独立设课面向专业:电子信息科学与技术使用教材:实验指导书课程学分:考核方法:实验课总成绩由平时成绩(20%) .实验理论考试成绩(40%) .实验操作考试成绩(40%)三部分组成,满分为100分。
实验理论考试内容包含实验原理 .实验操作方法 .实验现象解析 .实验结果评价 .实验方案设计等。
考试题型以填空 .判断 .选择 .问答为主,同时可结合课程特点设计其他题型。
实验操作考试根据课程特点设计若干个考试内容,由学生抽签定题。
平时成绩考核满分为20分,平时成绩 = 平时各次实验得分总和÷实验次数(≤20分)。
每次实验得分计算办法为:实验报告满分10分(其中未交实验报告或不合格者0分,合格6分,良好8分,优秀10分);实验操作满分10分(其中旷课或不合格者0分,合格6分,良好8分,优秀10分)。
实验一 DSP的常用指令实验
实验一 DSP 的常用指令实验西华大学实验报告(理工类)电气信息学院 专业实验中心 实验室:6A-222 实验时间 : 2014年6月10日实验一 DSP的常用指令实验Options]对话框的Address文本框中输入0x0260,Page下拉框中选中Data,确定后将打开数据存储器查询窗口,此时数据存储器地址0x0260~0x0263将对应ex1、asm中声明的标号DAT0~DAT3;7、调整[Disassembly][memory][CPU Registers]三个窗口的大小,以便于观察;8、依次把光标移动到反汇编(Disassembly)窗口中标号为bk?(?表示从0开始的整数)的标号行下的指令处,点击鼠标右键,在弹出菜单选择 [Toggle breakpoint](或者点击快捷按钮)设置断点,断点设置后,该行前显示红色圆点;9、选择[Debug]-[Run](也可以按快捷键F5或点击快捷按钮)执行程序;10、程序将在第一个断点bk0处停止,在处理器映射寄存器窗口与数据存储器查询窗口中双击相应操作数的内容,即可进行修改(注意:如步骤6所述,DAT0~DAT3对应地址为0X0260~0X0263),试修改下一条指令操作数的内容,然后按F10单步执行程序,再在处理器映射寄存器窗口中或数据存储器查询窗口中观察指令执行结果;11、重复执行9步骤,依次观察并记录加法指令(结果: A)、减法指令(结果: A)、乘法指令(结果:A)、除法指令(结果: DAT2:商; DAT3:余数)、平方指令(结果:A)以及3数累加宏指令(结果: DAT3)的执行结果;12、以上指令执行完毕后,程序转到bk0处,可再次进行熟悉运算控制的实验。
13、修改[ex1、asm],使DAT0=组号(ST #组号,DAT0),重复上述操作,记录加法指令、减法指令、乘法指令、除法指令、平方指令以及3数累加宏指令的执行结果。
DSP技术及其应用实验报告 CCS软件基本运算
DSP技术及其应用实验实验题目:CCS软件基本运算实验人:学号:班级:实验地点:一. 实验目的1.学习DSP算术指令的使用;2.学习并掌握DSP的基本寻址方式。
二. 实验器材1.CVT-DSP实验箱、DSP仿真器。
三. 实验内容1.编写程序,实现数据的算术运算;四. 基础知识1.DSP寻址方式简介在上一个实验中我们仅仅使用了一些寄存器,或者说是使用了寄存器寻址,DSP的寻址方式很多,可以分为以下几类:立即数寻址、绝对寻址、累加器寻址、直接寻址、间接寻址、存储器映射寄存器寻址、堆栈寻址,以及一些特殊的寻址比如:位倒序寻址、循环寻址。
下面简单的说明一下立即数寻址和直接寻址。
1)立即数寻址这种寻址方式最简单,指令里包括了立即操作数。
在一条指令中可对两种立即数编码。
一种是短立即数(3、5、8或9bits),另一种是16bits的长立即数。
立即数可包含在单字或双字指令中。
3-,5-,8-或9-bit值在单字指令中,16-bit值在双字指令中。
比如LD 指令允许使用3、5、8、9、16比特的立即数,FRAME指令只允许使用8比特的立即数,RPT允许使用8、16比特的立即数,而象ADD、ADDM、OR、ORM等只能使用16比特的立即数。
以下是一些立即数寻址的指令例子:2)直接寻址在直接寻址中,指令代码包含了数据存储器地址的低七位。
这7-bit作为偏移地址与数据页指针(DP)或堆栈指针(SP)相结合共同形成16-bit的数据存储器实际地址。
如下图所示。
其中CPL=0时:与9-bit的DP相结合形成数据存储器地址。
而9-bit的DP指向的是数据存储空间的512个数据页中的一页。
比如下面的程序:当CPL=1:加上SP基地址形成数据存储器地址。
示例略。
注:处理器复位后CPL默认值为0。
提示:实验算术指令由于不需要外部资源,可以不需要仿真器和实验箱。
我们可以平时自己用软件仿真,多多实验。
但是复杂的算法最好还是在线仿真,因为程序是流水线执行,软件仿真有时与实际硬件执行结果有所不同。
实验一CCS的使用及DSP基本数学运算解读
实验一 CCS 的使用及DSP 基本数学运算一、实验目的1、熟悉CCS 集成开发环境,掌握工程的生成方法;2、熟悉SEED-DEC2407 实验环境;3、掌握CCS 集成开发环境的调试方法;4、了解数在DSP 中的基本计算过程。
二、实验原理TI 公司为TMS320系统的集成与调试所提供的工具包括:标准评估模块Evaluation Module (EVM )、扩展开发系统eXtenfed Development System (即硬仿真器,如XDS510)、集成开发环境Code Composer Stdio(CCS )。
标准评估模块(EVM )是TI 或TI 的第三方为TMS320 DSP 的使用者设计生产的一种评价DSP 的硬件平台,其外观和布局结构如图1.1。
扩展开发系统(XDS )是功能强大的全速仿真器,用以系统级的集成与调试。
PC 机与XDS 及EVM 板的连接方式如图1.2。
图1.1 标准评估模块(EVM )外观及布局图1.2 DSP 开发调试环境硬件连接示意图发布的Code Composer Studio开放型集成DSP 开发环境(IDE )功能强大、直观、易用。
具有编程、编译、链接、在线调试等功能。
CCS2.0开发调试软件的主界面如图1.3。
图1.3 CCS2.0开发调试软件的主界面DSP 的中央处理单元CPU 是内部总线上的核心模块,负责完成数据处理的任务。
即取数,逻辑运算,送回数据。
由三部分组成:输入比例部分(定标器)、中央算术逻辑部分(CALU )、乘法器。
TMS320LF240x 系列CPU 模块的内部功能结构如图1.4。
图1.4 CPU 模块的内部功能结构TMS320LF240x 系列DSP 有2个16位的状态寄存器ST0和ST1,含有状态位和控制位。
ST0和ST1可以被保存到数据存储器(SST )或从数据存储器中加载(LST ),从而可以保存和恢复子程序的机器状态(现场保护)。
DSP基础实验
DSP基础实验1 / 6DSP 实验实验⼀ XF 控制实验⼀.实验步骤程序所在⽬录EX01_XF 。
在CCS 环境中操作如下:实验⽬的:熟练运⽤CCS,测试LED 灯以及板卡的正常 **** 实验说明:TMS320VC5509引脚XF 接⼀个LED 测试⼩灯,作为测试电路板 ** ** 正常⼯作,通过延时来改变LED ⼩灯的亮和灭。
** **********************************************************************/ void Delay(unsigned int nDelay); // 延时⼦程序 void CLK_init(); main() { CLK_init(); // 初始化DSP 运⾏时钟 while(1) { asm(" SSBX XF"); // Delay(256); // 延时 asm(" RSBX XF"); // Delay(256); // 延时 } } void Delay(unsigned int nDelay){int ii,jj,kk=0; for ( ii=0;ii**********************************************************************/则可看到板上发光LED L12 开始闪烁,⽤户可根据⾃⼰想要的结果,来改变代码得到⾃⼰想要的闪烁时间。
⼆.实验要求1.完成实验,观察结果2.调试程序,修改参数,改变LED 灯的闪烁间隔3.学习程序中CMD ⽂件的写法,并通过此程序学习DSP 时钟的设定⽅法。
3.完成思考题三.思考题1.程序中LED 灯的闪烁时间时如何确定的?2.程序中时钟发⽣器的设置改变对实验结果有何影响?实验⼆.定时器实验⼀.实验步骤程序所在⽬录EX02_TIME 。
在CCS 中的操作如下:实验⽬的:学习DSP 内部定时器0的使⽤ **** 实验说明:本实验是通过使⽤DSP 内部的定时器0来实现对LED 灯的控制 ** ** 实验结果:可看到板上L12⼩灯在交替闪烁 ** **********************************************************************/ #include #include #include #include #include /* This is a simple timer example to set the timer with */ /* an interrupt period of 0x400 cycles. */ /* The example uses predefined CSL macros and symbolic */ /* constants to create the correct register settings */ /* needed to configure the timer. */ /* Reference start of interrupt vector table */ /* This symbol is defined in file, vectors.s55 */ extern void VECSTART(void); #define TIMER_CTRL TIMER_TCR_RMK(\ TIMER_TCR_IDLEEN_DEFAULT, /* IDLEEN == 0 */ \ TIMER_TCR_FUNC_OF(0), /* FUNC == 0 */ \ TIMER_TCR_TLB_RESET, /* TLB == 1 */ \ TIMER_TCR_SOFT_BRKPTNOW, /* SOFT == 0 */ \TIMER_TCR_FREE_WITHSOFT, /* FREE == 0 */ \ TIMER_TCR_PWID_OF(0), /* PWID == 0 */ \TIMER_TCR_ARB_RESET, /* ARB == 1 */ \ TIMER_TCR_TSS_START, /* TSS == 0 */ \ TIMER_TCR_CP_PULSE, /* CP == 0 */ \ TIMER_TCR_POLAR_LOW, /* POLAR == 0 */ \TIMER_TCR_DATOUT_0 /* DATOUT == 0 */ \)/* Create a TIMER configuration structure that can be passed *//* to TIMER_config CSL function for initialization of Timer *//* control registers. */TIMER_Config timCfg0 = {TIMER_CTRL, /* TCR0 */0x3400u, /* PRD0 */0x0000 /* PRSC */};Uint16 eventId0;/* Create a TIMER_Handle object for use with TIMER_open */TIMER_Handle mhTimer0;volatile Uint16 timer0_cnt = 0;/* Function/ISR prototypes */interrupt void timer0Isr(void);void taskFxn(void);int old_intm;Uint16 tim_val;Uint16 xfchange = 0;Uint16 ms,f;void main(void){/* Initialize CSL library - This is REQUIRED *//*CLS库的初始化,这是必需的*/CSL_init();/* Set IVPH/IVPD to start of interrupt vector table */ /*修改寄存器IVPH,IVPD,重新定义中断向量表*/IRQ_setVecs((Uint32)(&VECSTART));/* Temporarily disable all maskable interrupts *//*禁⽌所有可屏蔽的中断源*/old_intm = IRQ_globalDisable();/* Open Timer 0, set registers to power on defaults */ /*打开定时器0,设置其为上电的的默认值,并返回其句柄*/ mhTimer0 = TIMER_open(TIMER_DEV0, TIMER_OPEN_RESET);/* Get Event Id associated with Timer 0, for use with *//*CSLinterrupt enable functions. *//*获取定时器0的中断ID号*/eventId0 = TIMER_getEventId(mhTimer0);/* Clear any pending Timer interrupts *//*清除定时器0的中断状态位*/IRQ_clear(eventId0);/* Place interrupt service routine address at *//* associated vector location *//*为定时器0设置中断服务程序*/IRQ_plug(eventId0,&timer0Isr);/* Write configuration structure values to Timer control regs */ /*设置定时器0的控制与周期寄存器*/TIMER_config(mhTimer0, &timCfg0);/* Enable Timer interrupt *//*使能定时器的中断*/IRQ_enable(eventId0);/* Enable all maskable interrupts *//*设置寄存器ST1的INTM位,使能所有的中断*/IRQ_globalEnable();/* Start Timer *//*启动定时器0*/TIMER_start(mhTimer0);//以下是原来的TIMER⼦段f=330;ms=0;for(;;){// Wait for at least 10 timer periods//等待10个定时周期if(xfchange == 0){//点亮XF的LEDCHIP_FSET(ST1_55,XF,1);}else{//关掉XF的LEDCHIP_FSET(ST1_55,XF,0);}}/* f=500;ms=0;while(1){while(ms!=f);ms=0;CHIP_FSET(ST1_55,XF,1);while(ms!=f);ms=0;CHIP_FSET(ST1_55,XF,0);// f=f-1;// if(1==f)// f=500;}/* Restore old value of INTM *//*恢复INTM旧的值*/IRQ_globalRestore(old_intm);/* We are through with timer, so close it *//*关掉定时器0*/TIMER_close(mhTimer0);}/*定时器0的中断程序*//*interrupt void timer0Isr(void){ms++;++timer0_cnt;if(timer0_cnt == 500)2 / 63 / 6{xfchange = 1;}if(timer0_cnt == 1000) { timer0_cnt = 0; xfchange = 0; } } */ interrupt void timer0Isr(void) { ms++; ++timer0_cnt; if(timer0_cnt == f){ xfchange = 1; f=f-3; if(f==0)f=330; } if(timer0_cnt == 2*f) { timer0_cnt = 0; xfchange = 0; f=f-3; if(f==0) f=330; } } 可看到板上发光LED L12 开始闪烁。
DSP实验报告 基本指令操作
实验二基本指令操作周二第三大节一实验目的(1)了解DSP数据表示格式(2)了解DSP汇编语言的编写格式(3)了解DSP配置文件的编写(4)了解DSP汇编与C混合编写的方法二实验内容1、css下的汇编语言实现2、css下的C语言与汇编语言混合编程三、实验过程例1 用汇编语言实现乘积累加的运算,y=∑(Ai*Xi)把data段的40个数据移动到bss段的a和x中,每个分别存放20个数据,然后分别取出a和x中位置相对应的一些数据,用块循环的方法完成数据的乘积和累加的运算。
最后结果保存在y中。
.title "asm.asm".mmregs.bss a,20.bss x,20.bss y,2STACK .usect "STACK",30.datatable: .word 1,2,3,4,5,6,7,8,9,10,11,12.word 13,14,15,16,17,18,19,20.word 1,2,3,4,5,26,27,28,29,30.word 1,2,3,4,5,6,7,8,9,10.def start.textstart: STM #a,AR1RPT #39MVPD table,*AR1+LD #0,BSTM #a,AR2STM #x,AR3STM #y,ar5STM #4,BRCRPTB done-1LD *AR2+,TMPY *AR3+,AADD A,Bdone: STH B,*ar5+STL B,*ar5end: b end.end相应的配置文件为:-e startMEMORY{PAGE 0:EPROM: org=0100H,len=1000H PAGE 1:SRAM org=02000H,len=1000H }SECTIONS{.text :> EPROM PAGE 0.data :> EPROM PAGE 0.bss :> SRAM PAGE 1.STACK :> SRAM PAGE 1}运行后,Memory下的结果例2 汇编程序和C程序混合编程的方法在一个工程中分别包含汇编源程序和C源程序,实现相互之间函数和变量的调用。
DSP实验报告一
DSP实验报告一引言本实验旨在通过实际操作,探索数字信号处理(DSP)的基本概念和技术。
DSP是一种通过数字计算来处理连续时间信号的技术,被广泛应用于音频处理、图像处理、通信系统等领域。
本实验将重点介绍数字信号的采样、量化和离散化过程,并通过实际编程实现。
实验过程1. 信号的采样1.1 信号的定义在DSP领域,信号是指随着时间变化的某种物理量,可以是声音、图像等。
我们首先需要定义一个连续的信号,用于采样和处理。
在本次实验中,我们选择了一个简单的正弦信号作为示例:x(t) = A \\sin(2\\pi f t)其中,A表示幅值,f表示频率,t表示时间。
1.2 采样过程为了将连续信号转换为离散信号,我们需要对信号进行采样。
采样是指在一定时间间隔内对连续信号进行测量。
我们可以通过模拟采样器来模拟采样过程。
在本实验中,我们选择了采样频率为100Hz,即每秒采样100次。
使用Python编程实现采样过程:import numpy as np# 信号参数设置A =1f =10# 采样频率设置fs =100# 采样点数设置N =100# 生成时间序列t = np.arange(N) / fs# 生成采样信号x = A * np.sin(2* np.pi * f * t)上述代码中,我们通过调整A和f的值来模拟不同的信号。
生成的信号将存储在x变量中,可以用于后续处理。
2. 信号的量化2.1 量化过程量化是指将连续信号的幅值转换为离散的数值。
在实际应用中,我们通常使用有限位数来表示信号的幅值。
常用的量化方式有线性量化和非线性量化。
在本实验中,我们选择了线性量化方式。
具体的量化过程可以通过下列Python代码实现:import math# 量化位数设置bits =8# 量化步长计算step_size =2* A / (2** bits -1)# 信号的量化x_quantized = np.round(x / step_size) * step_size上述代码中,我们通过调整bits的值来控制量化位数。
dsp实验报告
dsp实验报告C54x的浮点数的算术运算(实验⼀)实验⽬的:1)了解TMS320C54x汇编语⾔程序的基本格式,以及汇编、链接的基本过程。
2)初步熟悉软件仿真器Simulator的⽤法。
实验内容:A.基础实验将两个⼩数相乘,分离尾数与指数,进⾏算术运算,最后归⼀化。
乘法运算时遵循指数相加尾数相乘的规则。
1)编写浮点乘法程序ex1.asm,完成X1*X2=0.3×(—0.8)运算。
2) 编写链接命令⽂件ex1.cmd。
B.提⾼实验:⽤汇编语⾔实现:y1=x1*a1-x2*a2y2=12/3+1y3=0.3*(-0.5)+1实验程序框图及清单:此次试验中,在⼀个程序⾥完成基础和提⾼部分,四个计算分别作为四个⼦程序。
具体程序及相关注释如下:.title "lab1.asm".mmregsSTACK .usect "STACK", 10H.bss x1,1 ;定点数操作数1.bss x2,1 ;定点数操作数2.bss e1,1 ;指数1.bss m1,1 ;尾数1.bss e2,1 ;指数2.bss m2,1 ;尾数2.bss ep,1 ;乘积的指数.bss mp,1 ;乘积的尾数.bss product,1 ;定点乘积.bss temp,1 ;暂存单元.bss a1,1.bss a2,1.bss b1,1.bss b2,1 ;提⾼实验y1=a1*b1-a2*b2.bss y1,1.bss c1,1 ;提⾼实验y2=12/3+1.bss c2,1.bss c3,1.bss y2,1.bss d1,1 ;提⾼实验y3=0.3*(-0.5)+1.bss d2,1.bss d3,1.bss y3,1.def start.datatable: .word 3*32768/10.word -8*32768/10.word 4*32768/10 ;.word 2*32768/10 ;提⾼实验y1=a1*b1-a2*b2数据.word 12,3,1 ;提⾼实验y2=12/3+1数据.word 3*32768/10.word -5*32768/10 ;提⾼实验y3=0.3*(-0.5)+1数据.word 1 .textstart: STM #0,SWWSRSTM #STACK+10H,SPMVPD table,@x1MVPD table+1,@x2LD @x1,16,A ;EXP AST T,@e1NORM ASTH A,@m1 ;将操作数x1转换成浮点数存⾄e1和m1中LD @x2,16,A ;EXP AST T,@e2NORM ASTH A,@m2 ;将操作数x2转换成浮点数存⾄e2和m2中CALL MULT ;调⽤浮点乘法⼦程序CALL LAB11 ;y1=x1*a1-x2*a2⼦程序CALL LAB12 ;y2=12/3+1⼦程序CALL LAB13 ;y3=0.3*(-0.5)+1⼦程序done: B doneMULT: SSBX FRCT ;设置⼩数相乘浮点乘法⼦程序SSBX SXM ;设置符号扩展LD @e1,A ;ADD @e2,A ;指数相加STL A,@ep ;LD @m1,T ;MPY @m2,A ;尾数相乘EXP A ;ST T,@temp ;NORM A ;将乘积浮点化STH A,@mp ;浮点乘积尾数存mp单元LD @temp,AADD @ep,ASTL A,@ep ;浮点乘积指数存ep单元NEG ASTL A,@tempLD @temp,TLD @mp,16,ANORM ASTH A,@productRETLAB11: STM #a1,AR1 y1=x1*a1-x2*a2⼦程序RPT #3MVPD table,*AR1+SSBX FRCTSSBX SXMLD @a1,TMPY @b1,ALD @a2,TMAS @b2,ASTH A,@y1RETLAB12: STM #c1,AR1 y2=12/3+1⼦程序RPT #2MVPD table+4,*AR1+RSBX FRCTRSBX SXMLD @c1,BRPT #15SUBC @c2,BADD @c3,BSTL B,@y2RETLAB13: STM #d1,AR1 y3=0.3*(-0.5)+1⼦程序RPT #2MVPD table+7,*AR1+SSBX FRCTSSBX SXMLD @d1,TMPY @d2,ALD A,-1,A ;q.15格式转换成q1.14格式ADD @d3,14,A ;与转换成q.14的1相加STH A,@y3 ;q1.14的结果存⼊y3RET.end实验中遇到的问题及解决⽅法主要是Dos命令的熟悉和语法错误的纠正运⾏结果:A.0x0148是基础部分的计算结果(q.15格式)换算回来是B.0x23d6是y1=x1*a1-x2*a2(0.3*0.4-(-0.8)*0.2)的结果0.28045654296875误差为0.28045654296875-0.28=0.00045654296875C.0x0005是y2=12/3+1的结果D.0x666是y3=0.3*(-0.5)+1的结果-0.150146484375误差为-0.150146484375-(-0.15)=-0.00014648375⼩结通过本次试验熟悉并掌握了部分dos命令以及dsp的⼤部分汇编指令,并能在dos调试环境下调程序,检查变量以验证结果正确与否。
dsp实验1-基本算数运算
dsp实验1-基本算数运算电子科技大学通信与信息工程学院标准实验报告实验)课程名称DSP 设计与实现电子科技大学教务处制表电子科技大学实验报告一、实验室名称:DSP 实验室二、实验项目名称:基本算术运算三、实验学时:4四、实验原理:(1)定点DSP 中数据表示方法C54X 是16 位的定点DSP。
一个16 位的二进制数既可以表示一个整数,也可以表示一个小数。
当它表示一个整数时,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。
如果表示一个有符号数时,最高位(D15)为符号位,0 表示正数,1 表示负数。
例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2 的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号位。
这样次高位(D14)表示2 1,然后是2 2,最低位(D0)表示2 15。
所以04000H 表示小数0.5 ,01000H表示小数2 3 0.125 ,而0001H表示16 位定点DSP能表示的最小的小数(有符号)2 15=0.000030517578125 。
在后面的实验中,除非有特别说明,我们指的都是有符号数。
在C54X中,将一个小数用16 位定点格式来表示的方法是用215乘以该小数,然后取整。
从上面的分析可以看出,在DSP中一个16 进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。
2)实现16 定点加法C54X 中提供了多条用于加法的指令,如ADD ,ADDC ,ADDM 和ADDS 。
其中ADDS用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32位扩展精度加法),而ADDM 专用于立即数的加法。
ADD 指令的寻址方式很多,其详细使用说明请参考《TMS320C54X 实用教程》。
成都理工大学DSP(2)实验报告
本科生实验报告实验课程DSP技术及应用学院名称信息科学与技术学院专业名称通信工程学生姓名杜立华学生学号201313070112指导教师陈金鹰实验地点6B604实验成绩二〇一五年十一月二〇一五年十一月实验一:基本算数运算1 、实验目的和要求加、减、乘、除是数字信号处理中最基本的算术运算。
本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法和编程技巧。
本实验的演示文件为exer1.out。
2 、实验原理1) 定点DSP 中的数据表示方法2) 实现16 位定点加法3) 实现16 位定点减法4) 实现16 位定点整数乘法5) 实现16 位定点小数乘法6) 实现16 位定点整数除法7) 实现16 位定点小数除法3、实验内容使用C54X 汇编语言实现加、减、乘、除的基本运算,并通过DES 的存贮器显示窗口观察结果。
实验分两步完成:1) 编写实验程序代码2) 用ccs simulator 调试运行并观察结果4、实验总结:1)在减法操作中使用了辅助寄存器 ar2,ar3,请说明在执行完减法计算后辅助寄存器ar2 和ar3 的值为多少?ar2的值为0084,ar3的值为00842) 在小数乘法中使用了置 FRCT 标志为1 的指令。
如果将该语句取消,那么B 寄存器的结果是多少?想想什么时候应该设置FRCT 标志?B 寄存器的结果是FFDAA40000.3) 如何实现无符号数的乘法?利用带符号的乘法可以实现无符号数的乘法4) 请利用本实验程序计算以下算式的结果0.25*0.58374 0.25/0.5 4653/345 0.789687/0.876实验三:FIR数字滤波器1.实验目的:1)了解FIR滤波器的DSP实现方法;2)了解用FIR滤波器实现模拟信号滤波的全过程;3)掌握FIR滤波器直接型结构的实现方法。
2.实验原理:1)硬件仿真2)软件仿真3.实验内容:1)硬件配置:使用C54X 汇编语言实现SDConfig配置2)软件仿真:加载firsoft.asm、firsoft.cmd、firsoft_in.dat、firsoft_out.dat,创建新项目,修改参数,设置探针,加载文件使硬件软件相连接,设置图形参数,使生成软仿真输入时域波形*4。
DSP数据运算基础
DSP数据运算基础在应⽤DSP时,其实硬件⼀般都问题不⼤,主要的是软件,是算法!下⾯的关于DSP运算的精华但愿有些价值!⼀ DSP定点算数运算1 数的定标在定点DSP芯⽚中,采⽤定点数进⾏数值运算,其操作数⼀般采⽤整型数来表⽰。
⼀个整型数的最⼤表⽰范围取决于DSP芯⽚所给定的字长,⼀般为16位或24位。
显然,字长越长,所能表⽰的数的范围越⼤,精度也越⾼。
如⽆特别说明,本书均以16位字长为例。
DSP芯⽚的数以2的补码形式表⽰。
每个16位数⽤⼀个符号位来表⽰数的正负,0表⽰数值为正,l则表⽰数值为负。
其余15位表⽰数值的⼤⼩。
因此,⼆进制数0010000000000011b=8195⼆进制数1111111111111100b= -4对DSP芯⽚⽽⾔,参与数值运算的数就是16位的整型数。
但在许多情况下,数**算过程中的数不⼀定都是整数。
那么,DSP芯⽚是如何处理⼩数的呢?应该说,DSP芯⽚本⾝⽆能为⼒。
那么是不是说DSP芯⽚就不能处理各种⼩数呢?当然不是。
这其中的关键就是由程序员来确定⼀个数的⼩数点处于16位中的哪⼀位。
这就是数的定标。
通过设定⼩数点在16位数中的不同位置,就可以表⽰不同⼤⼩和不同精度的⼩数了。
数的定标有Q表⽰法和S表⽰法两种。
表1.1列出了⼀个16位数的16种Q表⽰、S表⽰及它们所能表⽰的⼗进制数值范围。
从表1.1可以看出,同样⼀个16位数,若⼩数点设定的位置不同,它所表⽰的数也就不同。
例如,16进制数2000H=8192,⽤Q0表⽰16进制数2000H=0.25,⽤Q15表⽰但对于DSP芯⽚来说,处理⽅法是完全相同的。
从表1.1还可以看出,不同的Q所表⽰的数不仅范围不同,⽽且精度也不相同。
Q越⼤,数值范围越⼩,但精度越⾼;相反,Q越⼩,数值范围越⼤,但精度就越低。
例如,Q0 的数值范围是⼀32768到+32767,其精度为1,⽽Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。
dsp基本算术运算
第一章、基本算术运算1.1、实验目的和要求加、减、乘、除是数字信号处理中最基本的算术运算。
DSP 中提供了大量的指令来 实现这些功能。
本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法 和编程技巧。
1.2、实验原理(1)、定点 DSP 中的数据表示方法54X 是16 位的定点DSP 。
一个16 位的二进制数既可以表示一个整数,也可以表示一个小数。
当它表示一个整数时,其最低位(D0)表示02,D1 位表示12,次高位(D14) 表示142。
如果表示一个有符号数时,最高位(D15)为符号位,0 表示正数,1 表示负 数。
例如,07FFFH 表示最大的正数32767(十进制),而0FFFFH 表示最大的负数-1(负数用 2 的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高位后,而最高位D15)表示符号位。
这样次高位(D14)表示12- ,然后是22-,最低位(D0)表示152-。
所以 04000H 表示小数 0.5,01000H 表示小数32- = 0.125 ,而0001H 表示16 位定点(DSP 能表示的最小的小数(有符号)152- =0.000030517578125。
在后面的实验中,除非有特别说明,我们指的都是有符号数。
在C54X 中,将一个小数用16 位定点格式来表示的方法是用152乘以该小数,然后取整。
从上面的分析可以看出,在DSP 中一个16 进制的数可以表示不同的十进制数,或 者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘 除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。
(2)实现 16 位定点加法C54X 中提供了多条用于加法的指令,如ADD ,ADDC ,ADDM 和ADDS 。
其中 ADDS 用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32 位扩展精度加 法),而ADDM 专用于立即数的加法。
DSP实验(精)
实验二:算术运算指令的认识实验目的:认识各种算术运算指令掌握宏指令的使用方法实验原理:写出各种算术运算指令写出宏指令的使用方法实验步骤:写出程序代码实验结果:写出几条算术运算指令的执行结果问题讨论:写出几条指令错误的原因.asm文件.title "ex3".mmregs.def _c_int00DA T0 .set 60HDA T1 .set 61HDA T2 .set 62HDA T3 .set 63HDA T4 .set 64H.textADD3 .MACRO P1,P2,P3,ADDRPstm #P1, tnopnopmpyP2,ALD P3,BADD A,BSTL B,ADDRP.ENDM.sect "vectors"_c_int00: b start.textstart: LD #004h,DPSTM #1000h,SPSSBX INTMbk0: ST #0012h,DA T0LD #0023h,AADD DA T0,ANOPbk1: ST #0054h,DAT0LD #0002h,ASUB DAT0,ANOPbk2: ST #0345h,DAT0STM #0002h,TMPY DAT0,Abk3: ST #1000h,DAT0ST #0041h,DA T1RSBX SXMLD DA T0,ARPT #15SUBC DA T1,ASTL A,DAT2STH A,DAT3STM #4,BKSTM #1,AR0LD #0H,ASTM #1000H,AR3STM #1001H,AR2ST #100H,*AR3ST #200H,*AR2MAC *AR3+,*AR2+,ANOPbk4: ST #0333h,DAT0SQUR DAT0,ANOPLD #0,ALD #0,BSTM #0,Trsbx frctbk5: ST #0001,DA T1ST #0001,DAT2ST #0002,DAT3ADD3 DA T1,DA T2,DA T3,DA T4NOPbk6: B bk0.endCMD文件:MEMORY{PAGE 0: VECS: origin=0xff80, length=0x80PROG: origin=0x1000, length=0x1000DATA: origin=0x1500, length=0x1000}SECTIONS{.vectors: {} > VECS PAGE 0.text: {} > PROG PAGE 0.data: {} > DA TA PAGE 0}实验三:正弦值的计算实验目的:掌握小数的表示方法掌握并行指令的执行方法实验原理:写出正弦值计算的方法(泰勒级数展开式)实验步骤:写出程序代码实验结果:写出正弦值计算的算术运算指令的执行结果问题讨论:写出计算过程中产生的误差的原因.asm文件.title "sinx.asm".mmregs.def _c_int00STACK .usect "stack",10y .usect "sin_vars",1d_x .usect "sin_vars",1d_temp .usect "sin_vars",1d_sinx .usect "sin_vars",1s .usect "sin_vars",1d_coeff .usect "coeff",4.datatable: .word 0249H,0444H,0aabH,4000H.sect ".vectors"_c_int00: B start.textstart: STM #STACK+10,SPLD #d_sinx,DPssbx frctstm #d_coeff,ar5rpt #3mvpd #table,*ar5+stm #d_coeff,ar3stm #y,ar2st #6487H,*ar2stm #s,ar4st #7fffh,*ar4squr *ar2+,ast a,*ar2||ld *ar4,bmasr *ar2+,*ar3,b,ampya asth a,*ar2masr *ar2-,*ar3+,b,ampya *ar2+st b,*ar2||ld *ar4,bmasr *ar2-,*ar3+,b,ampya *ar2+st b,*ar2||ld *ar4,bmasr *ar2-,*ar3+,b,ampya *ar2+st b,*ar2||ld *ar4,bmasr *ar2,*ar3,b,asth a,d_sinxends b ends.end.cmd文件自己编写CMD文件实验四:正弦波的生成实验目的:掌握正弦波的生成方法掌握利用DSP实现算法的方法实验原理:写出正弦波生成的方法实验步骤:写出程序代码实验结果:写出查看正弦波的方法问题讨论:写出计算过程中产生的误差的原因。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学通信与信息工程学院标准实验报告(实验)课程名称DSP设计与实现电子科技大学教务处制表电 子 科 技 大 学实 验 报 告一、实验室名称:DSP 实验室二、实验项目名称:基本算术运算三、实验学时:4四、实验原理:(1) 定点DSP 中数据表示方法C54X 是16位的定点DSP 。
一个16位的二进制数既可以表示一个整数,也可以表示一个小数。
当它表示一个整数时,其最低位(D0)表示02,D1位表示12,次高位(D14)表示142。
如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。
例如,07FFFH 表示最大的正数32767(十进制),而0FFFFH 表示最大的负数-1(负数用2的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号位。
这样次高位(D14)表示12-,然后是22-,最低位(D0)表示152-。
所以04000H 表示小数0.5,01000H 表示小数125.023=-,而0001H 表示16位定点DSP 能表示的最小的小数(有符号)152-=0.8125。
在后面的实验中,除非有特别说明,我们指的都是有符号数。
在C54X 中,将一个小数用16位定点格式来表示的方法是用152乘以该小数,然后取整。
从上面的分析可以看出,在DSP 中一个16进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。
(2) 实现16定点加法C54X 中提供了多条用于加法的指令,如ADD ,ADDC ,ADDM 和ADDS 。
其中ADDS 用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。
ADD指令的寻址方式很多,其详细使用说明请参考《TMS320C54X 实用教程》。
在本实验中,我们使用下列代码来说明加法运算:ld temp1,a ;将变量temp1装入寄存器Aadd temp2,a ;将变量temp2与寄存器A相加,结果放入A中stl a,add_result ;将结果(低16位)存入变量add_result中。
注意,这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。
(3)实现16位定点减法C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。
其中SUBS 用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。
SUB指令与ADD指令一样,有许多的寻址方式,其详细使用说明请参考《TMS320C54X实用教程》。
在本实验中,我们使用下列代码来说明减法运算:stm #temp1,ar3 ;将变量temp1的地址装入ar3寄存器stm #temp3,ar2 ;将变量temp3的地址装入ar3寄存器sub *ar2+, *ar3,b ;将变量temp3左移16位同时变量temp1也左移16位,然后;相减,结果放入寄存器B(高16位)中,同时ar2加1。
sth b,sub_result ;将相减的结果(高16位)存入变量sub_result。
(4)实现16定点整数乘法在C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。
乘数在C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。
有关乘法指令的详细使用说明请参考《TMS320C54X实用教程》。
在C54X 中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。
这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
在本实验中,我们使用下列代码来说明整数乘法运算:rsbx FRCT ;清FRCT标志,准备整数乘ld temp1,T ;将变量temp1装入T寄存器mpy temp2,a ;完成temp2*temp1,结果放入A寄存器(32位)例如,当temp1=1234H(十进制的4660),temp2=9876H(十进制的-26506),乘法的结果在A寄存器中为0F8A343F8H(十进制的-123517960)。
这是一个32位的结果,需要两个存单元来存放结果:sth a,mpy_I_h ;将结果(高16位)存入变量mpy_I_hstl a,mpy_I_l ;将结果(低16位)存入变量mpy_I_l当temp1=10H(十进制的16),temp2=05H(十进制的5),乘法结果在A寄存器中为00000050H(十进制的80)。
对于这种情况,仅仅需要保存低16位即可:stl a,mpy_I_l ;将结果(低16位)存入变量mpy_I_l(5)实现16定点小数乘法在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。
C54X 中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。
但注意整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT清除。
两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到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例如,temp1=temp2=4000H(十进制的0.5),两数相乘后结果为20000000(十进制的22 =0.25)。
再如,temp1=0ccdH(十进制的0.1),temp2=0599aH(十进制的0.7),两数相乘后B寄存器的容为08f5f0a4H(十进制的0.857)。
如果仅保存结果的高16位08f5H(十进制的0.063)。
有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。
(6)实现16定点整数除法在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。
一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。
这种方法对于除以常数特别适用。
另一种方法是使用SUBC指令,重复16次减法完成除法运算。
下面我们以temp1/temp2为例,说明如何使用SUBC指令实现整数除法。
其中变量temp1为被除数,temp2为除数,结果即商存放在变量temp3中。
在完成整数除法时,先判断结果的符号。
方法是将两数相乘,保存A或B的高16位以便判断结果的符号。
然后只做两个正数的除法,最后修正结果的符号。
为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指令,用除数重复减16次后,除法运算的商在累加器的低16位,余数在高16位。
详细代码如下:ld temp1,T ;将被除数装入T寄存器mpy temp2,A ;除数与被除数相乘,结果放入A寄存器ld temp2,B ;将除数temp2装入B寄存器的低16位abs B ;求绝对值stl B,temp2 ;将B寄存器的低16位存回temp2ld 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_isth B,remain_i ;将余数(B寄存器的高16位)存入变量remain_ixor B ;若两数相乘的结果为负,则商也应为负。
先将B寄存器清0 sub quot_i,B ;将商反号stl B,quot_i ;存回变量quot_i中div_end:上面给出的是整数除法的通用程序,在实际应用中可以根据具体情况做简化。
如正数除法可以直接将被除数temp1装入B寄存器的低16位,然后用SUBC指令循环减除数temp2,减完后B寄存器中低16位为商,高16位为余数,不用判断符号,从而节省时间。
例如temp1=10H (十进制的16),temp2=5,两数相除后商为3(在B寄存器的低16位),余数为1(在B 寄存器的高16位)。
(7)实现16定点小数除法在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC 指令来完成。
但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。
这与整数除好相反。
所以在执行SUBC指令前,应将被除数装入A或B 寄存器的高16位,而不是低16位。
其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位为商。
第二,与小数乘法一样,应考虑符号位对结果小数点的影响。
所以应对商右移一位,得到正确的有符号数。
其详细代码如下:ld temp1,T ;将被除数装入T寄存器mpy temp2,A ;除数与被除数相乘,结果放入A寄存器ld temp2,B ;将除数temp2装入B寄存器的低16位abs B ;求绝对值stl B,temp2 ;将B寄存器的低16位存回temp2ld 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 ,右移是为了修正符号位 xorB ;若两数相乘的结果为负,则商也应为负。
先将B 寄存器清0 subquot_f,B ;将商反号 stlB,quot_f ;存回变量quot_f 中div_end:注意,上面的C54X 的16位定点有符号小数除法通用程序没有保留余数,商保存在变量temp3中。
举一个例子,当temp1=2cccH (十进制的0.35),temp2=55c2H (十进制的0.67),两数相除的结果为temp3=42dcH (十进制的0x42dc =÷1520.52233)。