1、在本实验中,我们使用下列代码说明减法运算: STM #TEMP1,AR3 ;将变量TEMP1的地址装入AR3寄存器 STM #TEMP3,AR2 ;将变量TEMP3的地址装入AR2寄存器 SUB *AR2+,AR3,B STH B,SUBRESULT(4)实现16定点整数乘法在C54中提供大量的乘法运算指令,其结果都是的32位,放在A或B寄存器中。乘法指令输入变量非常灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。有关乘法指令的详细使用说明请参考TMS320C54X实用教程。在C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符
2、号数乘法运算的指令,而其它指令都是有符号数的乘法。在本实验中,我们使用下列代码来说明整数乘法运算;RSBX FRCT ;请FRCT标志,准备整数乘LD TEMP1,T ;将变量TEMP1装入T寄存器MPY TEMP2,A ;完成TEMP2*TENPL,结果放入A寄存器(32)位例如,当TEMP1=1234H(十进制的4660),TEMP2=9876H(十进制的-26506),乘法的结果在A寄存器中为0F8A343F8H(十进制的-123517960)。这是一个32位的结果,需要两个内存单元来存放结果;STH A,MPY_1_H ;将结果(高16位)存入变量MPY_1_HSTL A,MPY_1_
3、H ;将结果(低16位)存入变量MPY_1_L当TEMP1=10H(十进制的16),TEMP2=05H(十进制的5),乘法结果在A寄存器中为00000050H(十进制的80)。对于这种情况,仅仅需要保存低16位即可;STL A,MPY_1_L ;将结果(低16位)存放变量MPY-1-L(5)实现16定点小数乘法在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。但注意整数乘法时不能这样处理,所以上面的实验中一开始便将FRC
4、T清除。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存放高16位,将低16位丢弃,这样仍可得到16位的结果。在本实验中,我们使用下列代码来说明小数乘法运算:SSBX FRCT ;FRCT=1 ,准备小数乘法LD TEMP1,16,A ;将变量TEMPL装入寄存器A的高的16位MPYA TEMP2 ;完成TEMP2乘寄存器A的高的16位,结果在B;中,同时将TEMP2装入T寄存器STH B,MPY-F ;将乘积结果的高16位存入变量MPY-F例如,TEMP1=TEMP2=4000H(十进制的0.5),两数相乘后结果为20000000(十进制的2-2=0.25)。再如,TEMP1
5、=0CCDH(十进制的0.1),TEMP2=0599AH(十进制的0.7),两数相乘后B 寄存器的内容为08F5F0A4H(十进制的0.07000549323857)。如果仅保存结果的高16位08F5H(十进制的0.06997680664063)。有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。(6)实现16定点整数除法在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。下面我们以TEMP1/
6、TEMP2为例,说明如何使用SUBC指令实现整数除法,其中变量TMP1为被除数,TMP2为除数,结果即商存放在变量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
7、 B ;求绝对值STL B,TEMP2 ;将B寄存器的低16位存回TEMP2LD TEMP1,B ;将被除数TEMP1装入B寄存器的低16位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 ;若两数相乘的结果为负,则商也应为负。先将B寄存器清0SUB
8、QUOT-I,B ;将商反号存回变量QUOT-I中DIV-END:(7)实现16定点小数除法下面给出的是小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于一),所以被除数一定小于除数。这与整数除法正好相反。所以在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位商。第二,与小数乘法一样,应考虑符号对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。其详细代码如下:AND #0FFFFH,B ;将B寄存器的高16位 清为0。这时
9、余数被丢弃,仅保留商断A,若A大于0,则跳转到标号DIV-END,结束除法运算STL B-1,QUOT-F ;将商右移STL B-1,REMAIN-I ;将余数(B寄存器的高16位)存入变量REMAIN-I注意:上面的C54X的16位定点有符号小数除法通用程序没有保留余数,商保存在变量TEMP3中。举一个例子,当TEMP1=2CCCH(十进制0.35),TEMP2=55C2H(十进制的0.67),两数相除的结果为TEMP3=42DCH(十进制的0X42DC除以215=0.52233)。(四) 实验步骤1新建一个工程1) 如果你的CCS安装在C:ti目录下,请在d:下新建一个目录,名为sf2)
10、将C:DSP实验C5402例程a1suanfa下的.asm文件拷贝到新目录中3) 运行CCS程序4) 选择Project New菜单5) 在窗口中,选择你新建的目录,键入sf作为工程文件名,然后单击完成。CCS会给你新建一个叫sf.pjt的工程文件,他将保存你的工程文件设置,和工程引用相关文件。2往工程中加入文件1) 选择projectAdd Files to Project,选择sf.asm,加入工程中。5浏览代码和Windows的资源管理器相似,只要打开+号展现下面的文件,然后双击文件的图标,在主窗口就会显示相应文件的原始代码。6 编译/执行程序1) 选择ProjectRebuild Al
11、l或工具栏中的相应按钮。2) 编译成功后,选择FileLoad Program。选择你刚编译的可执行程序exp1.out。3) 选择DebugRun,或工具栏中的相应图标。5. 程序调试的环境应用(1) 跟踪/调试程序1) 选择DebutRestart,重新执行程序。2) 不全速运行,而是选择DebugStep Into或按F8,单步执行程序.3) 观察主要寄存器的变化ViewCPU RegistersCPU Registe。注:对不熟悉的指令,可查找相应说明。(2)断点的设置与取消。(3)观察CPU寄存器、存储器及变量。6.源程序如下实验一:CCS基本操作* FileName: sf.asm
12、 * Description: DSP指令实验 * Copyright(C) SanZhi Electronic * .title ex1 .mmregs .def _c_int00DAT0 .SET 60HDAT1 .SET 61HDAT2 .SET 62HDAT3 .SET 63H .textADD3 .MACRO P1,P2,P3,ADDRP ;三数相加宏定义: ADDRP = P1 + P2 + P3 LD P1,A ADD P2,A ADD P3,A STL A,ADDRP .ENDM _c_int00: B start start: LD #00h,DP ;置数据页指针 STM #
13、1000h,SP ;置堆栈指针 SSBX INTM ;禁止中断bk0: ST #0012h,DAT0 LD #0023h,A ADD DAT0,A ;加法操作: A = A + DAT0 NOPbk1: ST #0054h,DAT0 LD #0002h,A SUB DAT0,A ;减法操作: A = A - DAT0bk2: ST #0345h,DAT0 STM #0002h,T MPY DAT0,A ;乘法操作: A = DAT0 * Tbk3: ST #1000h,DAT0 ST #0041h,DAT1 RSBX SXM ;无符号除法操作: DAT0 DAT1 ; 结果: DAT2:商;
14、DAT3:余数 LD DAT0,A RPT #15 SUBC DAT1,A STL A,DAT2 STH A,DAT3bk4: ST #0333h,DAT0 SQUR DAT0,A ;平方操作: A = DAT0 * DAT0bk5: ST #0034h,DAT0 ST #0243h,DAT1 ST #1230h,DAT2 ADD3 DAT0,DAT1,DAT2,DAT3 ;三数相加操作: DAT3 = DAT0 + DAT1 + DAT2bk6: B bk0 ;循环执行 .end实验二 定时器实验熟悉DSP的定时器了解定时器中断的编程方法学会使用定时器中断方式控制程序流程计算机;DSP硬件仿
15、真器;DSP实验开发平台(三) 实验原理及说明VC5402上有2个CPU定时器,本程序主要对CPU定时器0进行操作,1ms产生一次中断,让DSP5402开发板上的D9发光二极管每500ms闪烁一次。1 新建一个工程2 新建源文件3 将源文件添加到工程4 编译、执行程序5 观察实验结果实验三 同步串口 了解DSP同步串口工作原理及程序的编写了解AD50工作原理DSP实验开发平台;耳机、麦克风(三)实验硬件设置在做实验之前,需要接通该实验所需的硬件电路,本实验为:先将实验箱右侧的船型开关往“I”方向打开电源,然后将系统主板的开关S33(主板左上角)往下拨接通+/-5V电源;将麦克风(红色端)插入语
16、音输入插座(M1),将耳机(黑色端)插入语音输出插座(M3),然后开始做实验,注意在做DSP实验时开始按了RST硬件复位后,实验中不要再按RST键,以免实验由于DSP复位而失败。如果实验中硬件工作不正常,可按RST键对整个系统硬件进行复位。(四)实验原理本实验是实现通过DSP的同步串口能向AD50发送控制字和数据或接收AD50发送的数据。硬件原理图请参考语音处理模块,同步串口实验,主要是通过5402的同步串口0访问A/D芯片,使学生了解同步串口工作原理。该实验所需的硬件主要是DSP、TMS320AD50、TLC2272,在实验过程中如果TLC320AD50C工作不正常,请按复位键(RST键)对
17、实验仪硬件复位。编写DSP同步串口程序访问AD50,语音信号从麦克风(红色)输入后经过TLC2272(双路低噪声)滤波,通过AD50的A/D将模拟信号转换为数字信号,通再数字信号发送到AD50的DAC通道中,最后信号由耳机(黑色)输出。要在耳机里听到麦克风所输入的声音。TLC320AD50和TMS320C54x的接口图(五)实验程序框图 实验四 FIR滤波器实验熟悉数字滤波的基本原理和实现方法;熟悉线性相位FIR数字滤波器特性;通过观察对实际信号的滤波作用,获得对数字滤波的感性认识。DSP实验开发平台。然后开始做实验, 注意在做DSP实验时开始按了RST硬件复位后,实验中不要再按RST键,以免
18、实验由于DSP复位而失败。FIR 滤波器算法的函数表达式: short oflag = fir (DATA *x, DATA *h, DATA *r, DATA *dbuffer,ushort nh, ushort nx) (定义于 fir.asm)参数xnx指向输入向量,长度为 nx hnh指向系数向量,长度为 nx例如:若 nh=3:则:H = b0, b1, b2。 内存对齐:这是一个环行缓冲区,必须起始于k位边界上(就是说起始地址的k个LSB位必须为0)。其中k为大于log2(nh)的整数,具体解释见TMS320C54X DSP Reference Set 第5-15页5.5.3.4小
19、节。rnx指向输出向量,长度为 nxDbuffernh延迟缓冲区 在多重缓冲区方法中,该向量在进行第一次块操作时应该初始化为0;在后面的块操作中,延迟缓冲区保存着计算r所必须的输入值。与h向量一致。Nx输入向量的长度Nh系数向量的长度Oflag溢出标志 若 oflag = 1, 则运算中产生32位溢出 若 oflag = 0, 运算中未产生32位溢出说明使用系数向量h,计算实数的FIR滤波。输入数据存于向量x中。该例程使用一个缓冲内存d,来保存前一次的输入值。可以进行块滤波操作,或者单个数据滤波(nx=1)。算法rj = 0 =j =nx(五)实验步骤(1) 用MATLAB设计软件设计出FIR
20、数据文件,可采用随机光盘里WAVE文件夹中的数据文件。(2)启动CCS,编写实验程序代码(可参考随机光盘中的例程),进行编译并加载到DSP中。 (3)采用单步运行或执行到光标处,或全速运行,并打开波形观察窗口,跟踪观察其执行过程和滤波效果。此处举例介绍随机光盘里的例程低通滤波器的程序运行,以及如何观察滤波效果:先打开项目,然后编译、加载实验程序,然后点击菜单debugGo main就进入实验程序test.c(如图一)。 图 一 程序然后我们打开波形观察窗口,路径是ViewGraphTime/Frequence,将出现如下图二所示的图形属性框,因为本程序编写的是输入向量放在x中,而滤波后的输出向
21、量放在r中,因此图形属性框应选择:在Display Type一栏中选择 Dual Time 项;Interleaved Data Sources一栏中选择No项; Start Address-upper display一栏中输入x,Start Address-upper display 一栏中输入r; Acquistition Buffer Size 一栏中输入256;Display Data Size 一栏中输入256;DSP Data Type一栏中选择16-bit signed integer项;其他为默认值,然后点击“OK”就可打开图形观察窗口如图三。 图二 图形属性窗口 图三 输入数据波形 输入数据文件,路径是FileDataLoad,将WAVE文件夹的“fwave1k+500.dat数据文件载入,如图四所示设置。然后就会出现如图三所示的输入波形窗口。图四 加载数据设置运行程序,就可观察到输入数据经过FIR滤波后的效果,如图五所示。至此就可观察信号经过FIR滤波后的信号的改变。图五 FIR 滤波后的输出数据具体实验程序请参考:随机光盘里的lpassfir文件夹。(六) 实验思考 根据上述低通FIR滤波器的设计方法设计出高通FIR滤波附录:参考程序清单 ex1.asm * ST #03
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2