首页电子与通信技术信息处理技术数字信号处理器DSP原理与应用 03 第三章 寻址方式和指令系统.pptx

03 第三章 寻址方式和指令系统.pptx

页数:220页文件大小:1.31 MB来源: 数字信号处理器DSP原理与应用ppt课件

本课件讲解LF240x的立即寻址、直接寻址与间接寻址方式,给出常用指令的功能说明与使用例程,介绍控制程序开发语言的选择、C语言编程方法与C语言和汇编语言的混合编程,并说明定点运算与浮点运算在TMS320上的实现方法。

第3章寻址与指令封面,标示本章主题与主要内容框架
第3章寻址与指令目录,寻址方式2.指令说明3.控制程序开发语言的选择4.C语言编程方法5.C语言与汇编语言混合编程6.运行支持函数(rts)7.闪存编程8.程序设计举例9.定点运算及定点DSP10.浮点运算及浮点DSP芯片
据存储器,3.1寻址方式、3.1.1立即寻址直接提供常数作为指令的操作数
寄存器用途调用时保护AR0帧指针(FP)YesAR1堆栈指针(SP)YesAR2局部变量指针(LVP)NoAR3-AR5表达式运算NoAR6-AR7寄存器变量YesAccumulator表达式运算/返回值No

第116页:状态寄存器

(ST0、ST1)单元假定值名称单元1辅助寄存器指针ARP-进位标志C-数据页DP-溢出标值OV0溢出模式OVM0乘法移位模式PM-符号扩展模式SXM-测试模式TC对于有假定值(为0或为1)的状态寄存器单元,在进行函数调用和函数返回时必须保证其值为假定值

第117页:个寄存器——堆栈指针

3个寄存器——堆栈指针(SP)、帧指针(FP)和局部变量指针(LVP)管理堆栈和局部帧。AR6和AR7作为寄存器变量的寄存器。AR6被分配给第一个变量,AR7分配给第二个变量。

编译器使用不用于寄存器变量的寄存器来计算表达式的值并保存临时结果。当函数的返回值是一个标量类型(整型、指针或浮点型)时,该值在函数返回时被放入累加器中。16位的数据类型(字符型、短整型、整型或指针型)连同正确的符号扩展被装载到累加器中

第118页:3. 函数结构和调用规则C编译器对函数

1183.函数结构和调用规则C编译器对函数的调用有一系列严格的规定。除了特殊的运行支持函数外,任何调用者函数和被调用函数都要遵守这些规则,否则可能会破坏C环境并导致程序失败。

1函数如何产生调用一个函数(调用者函数)在调用其他函数(子函数)时执行以下任务。注意,ARP必须设置为1。a.调用者函数将参数以颠倒的顺序压入堆栈(最右边声明的参数第一个压入堆栈,最左边的参数最后一个压入堆栈)。

即函数调用时,最左边的参数放在栈顶单元。b.调用者函数调用子函数。c.调用者函数假定当子函数执行完成返回时,ARP将被置为1。d.完成调用后,调用者函数将参数弹出堆栈

第119页:(2)被调用函数如何响应a.将返回地址

从硬件堆栈中弹出,压入软件堆栈。b.将FP压入软件堆栈。c.分配局部帧。d.如果函数修改了AR6和AR7,则将它们压入堆栈,其他的任何寄存器可以不用保存,任意修改。

e.实现函数功能。f.如果函数返回标量数据,将它放入累加器。g.将ARP设定为AR1。h.如果保护了AR6、AR7,恢复这两个寄存器。i.删除局部帧。j.恢复FP。

k.从软件堆栈中弹出返回地址并压入硬件堆栈。l.返回

第120页:(3)被调用函数的特殊情况被调用的函数

有三种特殊情况
a.返回的是一个结构体:当函数的返回值为一个结构时,调用者函数负责分配存储空间,并将存储空间地址作为最后一个输入参数传递给被调用函数。被调用函数将要返回的结构拷贝到这个参数所指向的内存空间。b.不将返回地址移到软件堆栈中:当被调用函数不再调用其它函数,或者确定调用深度不会超过8级,可以不用将返回地址移动到软件堆栈。c.不分配局部帧:如果函数没有输入参数,不使用局部变量,就不需要修改AR0(FP),因此也不需要对其进行保护

第121页:调用者局部帧FPSP调用前

调用者局部帧FPSP调用前FPSP调用者局部帧参数n...参数1返回地址压入参数调用函数原FP分配局部帧调用者局部帧参数n..参数1返回地址原FP暂存单元局部帧FPSP

第122页:3.5.2 C语言调用汇编函数a.

所有的函数,无论是C函数还是汇编语言函数,都必须遵循寄存器规则。b.必须保存被函数修改的任何专用寄存器,包括:AR0(FP)、AR1(SP)、AR6、AR7。如果正常使用堆栈,则不必明确保存SP。

也就是说,用户可以自由地使用堆栈,弹出被压入的所有内容。用户可以自由使用所有其他的寄存器,而不必保留它们的内容。c.如果改变了任何一个寄存器位域状态的假定值,则必须确保恢复其假定值。

尤其注意ARP应该被指定为AR1。d.中断子程序必须保存所有使用的寄存器。e.在从汇编语言中调用C函数时,将参数以倒序压入堆栈,函数调用后弹出堆栈

第123页:f.调用C函数时

f.调用C函数时,只有专用的寄存器内容被保留,C函数可以改变其他任何寄存器的内容。g.函数必须返回累加器中的值。h.汇编模块使用.cinit段只能用于全局变量的初始化。

boot.c中的启动子程序假定.cinit段完全是由初始化表组成。在.cinit段中放入其他的信息会破坏初始化表而导致无法预知的后果。i.编译器将在所有的C语言对象标识符的开头添加下划线“_”。

在C语言中和汇编语言都要访问的对象必须在汇编语言中以下划线“_”作为前缀。例如,C语言中名为x的对象在汇编语言中为_x。仅在汇编语言模块中使用的对象可以使用不加下划线的标识符,不会和C语言中的标识符发生冲突。

j.在C中被访问的任何汇编语言对象或在C中被调用的任何汇编语言函数必须在汇编代码中使用.global伪指令声明。这将声明该符号是外部的,允许链接器解决对它的引用

第124页:3.5.3 内嵌汇编语中,可

以使用asm语句在编译器产生的汇编语言文件中嵌入单行的汇编语句。一系列的asm语句可以将顺序的汇编语句插入到编译器的输出代码中。使用中的几点注意事项:a.asm语句使用户可以访问某些用C语句无法访问的硬件特性。

b.在使用asm语句的时候,要防止破坏C环境。编译器不会对嵌入代码进行检查和分析。c.在asm语句中使用跳转语句或标记符(LABEL)可能会产生无法预知的结果。

d.不要改变C变量的值,但可以安全地读取任何变量的当前值。e.不要使用asm语句嵌入汇编伪指令,这会破坏汇编语言环境。f.在编译器的输出代码中嵌入注释时,asm语句是很有用的。

可以用星号(*)作为汇编代码的开头,如:asm(“******thisisanassemblylanguagecomment.”)

第125页:f.调用C函数时

f.调用C函数时,只有专用的寄存器内容被保留,C函数可以改变其他任何寄存器的内容。g.函数必须返回累加器中的值。h.汇编模块使用.cinit段只能用于全局变量的初始化。

boot.c中的启动子程序假定.cinit段完全是由初始化表组成。在.cinit段中放入其他的信息会破坏初始化表而导致无法预知的后果。i.编译器将在所有的C语言对象标识符的开头添加下划线“_”。

在C语言中和汇编语言都要访问的对象必须在汇编语言中以下划线“_”作为前缀。例如,C语言中名为x的对象在汇编语言中为_x。仅在汇编语言模块中使用的对象可以使用不加下划线的标识符,不会和C语言中的标识符发生冲突。

j.在C中被访问的任何汇编语言对象或在C中被调用的任何汇编语言函数必须在汇编代码中使用.global伪指令声明。这将声明该符号是外部的,允许链接器解决对它的引用

第126页:3.5.4 C程序访问汇编程序变量有时候

  • 需要在C程序中访问汇编语言变量,这通常有两种方式:O访问.bss块中的变量:
  • 将要访问的变量定义在.bss块中。
  • 用.golbal修饰要访问的变量。
  • 在汇编语言中以下横线“_”为前缀声明要访问的变量。
  • 在C语言中将变量声明为外部变量(extern),就可以进行正常访问

第127页:O访问非.bss块中的变量

  • O访问非.bss块中的变量:要访问非.bss块中的变量,通常的办法是在汇编语言中定义一个查找表,然后在C语言中通过指针来访问。
  • 首先定义变量,而且最好放在独立的初始化块中。
  • 定义一个全局的标识指向对象的起始点,这样对象可以分配在存储器空间的任何位置。
  • 在C程序中将这个对象定义为外部对象(extern),并且对象名称不带下横线“_”前缀,就可以对其进行正常访问

第128页:3.5.5 修改C编译器的输出用户可

以编译源程序,然后在汇编前对编译输出的汇编语言代码进行手动检查和修改。这种情况下,在C代码中利用asm语句插入适当的注释对理解C编译器输出的汇编语言代码是非常有帮助的

第129页:使用ANSI的标准库可以确保有一套统一

1293.6运行支持函数(rts)一个C程序所执行的一些任务(如输入/输出、动态存储器配置、字符串操作以及三角函数等器可以提供除了用于处理意外情况和地域相关问题(如基于当地的语言、民族或文化的程序)的工具之外的全部ANSI的标准库的内容。

使用ANSI的标准库可以确保有一套统一的函数。a.rts2xx.lib:运行期支持目标库,包含:·ANSIC标准库·系统启动程序_c_int0·允许C访问特殊指令的函数和宏b.rts.src:运行期支持资源库。

包含运行期支持目标库的C语言和汇编语言程序源代码

第130页:3.7 闪存编程在DSP控制程序编写

闪存编程在DSP控制程序编写、调试完成后,需要将程序编译、链接所得到的可执行文件(.out)编程到DSP的程序存储器中,使DSP可以摆脱开发系统运行,所开发的系统成为一套独立的系统。,应该将软件开发得到的可执行文件编程到内部闪存(Flash)中,即进行Flash编程

第131页:烧写DSP程序也要利用硬件仿真器来实现

  • 烧写DSP程序也要利用硬件仿真器来实现,仿真器制造商会提供相应的烧写程序。要注意不同型号的DSP往往使用不同的烧写程序,不同类型的仿真器对烧写环境也会有不同的要求,使用前要详细阅读相应说明(readme)。
  • MP/MC模式置为微计算机模式
  • 仿真RAM不被PS信号选中

第132页:DSP烧写步骤

DSP烧写步骤:

  • 清除flash内容(bc0.bat,bc1.bat)将FLASH(EEPROM)中的所有位清零(setto0)。
  • 擦除flash内容(be0.bat,be1.bat)将FLASH(EEPROM)中的所有位置位(setto1)。
  • 把目标程序写进flash中(bp16k.bat,bp32k.bat)将FLASH(EEPROM)中的所有选中的位清零(setto0)

第133页:在实际应用中,仿真调试通过的程序编程

到DSP中独立运行的结果往往与仿真的状态有差异,甚至可能系统完全不能正常运行,这是由于仿真过程中的程序运行情况和DSP独立运行时的程序运行情况不同所引起的。在将程序编程到DSP内部之前,需要对以下几个问题深入考虑,以保证编程后系统的正常运行:(1)电路元件初始化同步问题:由于外部元件初始化可能较慢,DSP初始化完成后要延时一段时间再访问外部慢速器件,通常要在控制程序的主函数中添加一段循环延时程序

第134页:用仿真器调试时程序执行速度比较慢

2用仿真器调试时程序执行速度比较慢,循环时间比较长,而烧写到DSP中可能时间比较短,要对决定循环时间的循环次数重新考虑。3用仿真器调试的时候,DSP运行的一些资源(如堆栈等)用的是仿真器中的资源,烧写到DSP中执行必须利用DSP本身的资源,烧写前必须对链接命令文件(.cmd文件)中定义的各种资源进行详细考虑

第135页:浮点数运算的问题

1354浮点数运算的问题
浮点型变量考虑使用全局变量,因为局部变量都是在堆栈里生成的,过多的浮点数变量对软件堆栈要求太多,容易造成堆栈溢出问题。5复位问题:利用仿真器进行调试的时候,DSP程序通过仿真环境启动,不需要复位信号;而闪存编程后DSP的运行中,复位要通过电路板上复位电路来实现,如果电路板上复位电路有问题,不能保证DSP的正常复位,会造成仿真通过的程序编程到DSP中后完全无法正常执行

第136页:(6)时钟问题:利用仿真器进行仿真调试时

时钟由硬件仿真器提供,而闪存编程后DSP运行时钟由电路板时钟电路提供,如果电路板时钟电路有问题,编程后的DSP将无法正常工作。闪存编程之后DSP独立运行的时候出现的很多问题都是由于时序配合引起的,这就需要调整程序中的各种延时,甚至可能要经过反复调整来寻求最佳的延时设置,以保证系统功能的正常实现

第137页:8. 程序设计举例

1.功能要求按照一定的频率控制四个发光二极管的点亮状态,要求如下:1四个发光二极管依次循环显示0000b~1111b;2发光二极管显示刷新频率10Hz;3发光二极管的控制映射在I/O空间0xC的低四位,写1点亮;

1374显示刷新频率的控制利用定时器实现

第138页:3.8.2 工程组成分析功能要求

工程组成分析功能要求,对发光二极管的控制可以通过对I/O空间的端口读写来实现,而显示频率的控制要利用定时器来实现。由于程序功能要求简单,流程控制容易实现,对定时器中断的处理可以采用回调方式来处理。

由此,此控制程序的工程中应该包含如下文件:1链接命令文件.cmd,配置资源映射;2头文件.h,内外设控制寄存器;3汇编代码文件.asm,定义中断向量表;4C代码文件.c,程序文件

第139页:第3章寻址与指令要点

1393.8.3链接命令文件-lrts2xx.lib MEMORY{PAGE0:VECS:o=0,l=40hPROG:o=9000h,l=2000hPAGE1:IDATA1:o=300h,l=100h IDATA2:o=0c00h,l=400hREG_MEM:o=7000h,l=1000h}SECTIONS{.vectors:>VECSPAGE0.text.cinit.data.stack.bss:>PROGPAGE0:>PROGPAGE0:>PROGPAGE0:>IDATA2PAGE1:>IDATA2PAGE1.reg240x:>REG_MEMPAGE1}

第140页:此文件在的各种开发中可以通

1403.8.4头文件头文件2407c.h主要内外设控制寄存器。此文件在的各种开发中可以通用。3.8.5汇编文件示例程序中没有利用汇编语言编写控制程序,但由于对定时器中断的处理采用回调方式,需要编写汇编文件定义中断向量表。

.ref_gptime1,_c_inct Reset Vector;_c_int0BRSVECTvel;PHANTOMBINT1vel;_gptime1BINT2vel;GISR3BINT3……

第141页:第3章寻址与指令要点

1413.8.gp_init……break;}}}

第142页:数据空间的读写,对各种片内外设控制寄存器

1423.8.7实例总结实例功能要求虽然简单,却包含了DSP控制程序设计中的许多问题,包括:1各种文件的编写:头文件(.h)、链接命令文件(.cmd)、汇编代码文件(.asm)、C源文件(.c);

2数据空间的读写,对各种片内外设控制寄存器的设置都是通过数据空间的写操作实现的;3I/O空间的读写,四个发光二极管的显示控制就是通过对I/O空间的写操作实现的

第143页:中断服务函数的编写

1434中断服务函数的编写,程序中的gptime1函数是一个中断服务函数,从函数定义到两级中断服务函数的结构都是DSPC语言编程中常用的中断处理方法;5中断向量表的定义,虽然实例程序中只有一个自定义中断服务函数,但中断向量表的定义方法在各种DSP应用中是类似的。

实例程序已经覆盖到了DSP控制程序设计中大多数常见的问题,而在实际应用中可能存在的各种复杂问题的解决方法则需要在应用中深入研究

第144页:3.9 定点运算及定点DSP

定点运算及定点DSP

第145页:1. 数据格式在定点DSP芯片

数据格式在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示DSP芯片的数以2的补码形式表示数的定标:Q表示法和S表示法对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价

第146页:0Q15表示

为0.25小数点的位置Q表示法16进制数2000HQ0表示为810小数点的位置符号位

第147页:浮点数转换为定点数、浮点数x=0.5等要

浮点数x=0.5,定标Q=15,则定点数=0.5*32768=16384qxintx2Q定点数转换为浮点数xfloatxq2数与定点数的转换关系

第148页:定点数表示范围与Q/S表示对照表

16位定点数十进制数表示范围与S、Q表示对照表
十进制数表示范围S表示Q表示
-1≤X≤0.9999695S0.15Q15
-2≤X≤1.9999390S1.14Q14
-16384≤X≤16383.5S14.1Q1
-32768≤X≤32767S15.0Q0

说明:源表格中S2.13至S13.2各行以省略号形式给出,未列出具体数值。

第149页:加法/减法运算的C语言定点模拟

floatx,y,z;z=x+y;

  • 两个操作数的定标值一样
  • 如果加法/减法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度149z=x+yqqq2(QxQy)]2(QzQx)z[xyQQQyzq2zxq2xyq2(QQ)=xq2Qxyq2xy2Qx(QQ)Q=[xqyq2xy]2x

第150页:描述

描述
intx,y,z;longtemp;temp=y<<(Qx-Qy);temp=x+temp; z=(int)(temp>>(Qx-Qz)),若Qx≥Qz z=(int)(temp<<(Qz-Qx)),若Qx≤Qz1加法

第151页:例子

例子
设x=0.5,y=3.1,则浮点运算结果为z=x+y=0.5+3.1=3.6;Qx=15,Qy=13,Qz=13,则定点加法为:x=16384;y=25395; temp=25395<<2=101580;temp=x+temp=16384+101580=117964;z=(int)(117964L>>2)=29491;验算:z=29491/8192=3.61加法

第152页:定点减法

  • 设x=3.0,y=3.1,则浮点运算结果为z=x-y=3.0-3.1=-0.1;Qx=13,Qy=13,Qz=15,则定点减法为:x=24576;y=25395;temp=25395;temp=x-temp=24576-25395=-819;
  • 因为Qx<Qz,故z=(int)(-819<<2)=-3276。验算:由于z的Q值为15,所以定点值z=-3276即为浮点值z=-3276/32768-0.1

第153页:结果超过16位表示范围、设x的Q值为Qx

结果超过16位表示范围

  • 设x的Q值为Qx,y的Q值为Qy,且Qx>Qy,加法结果z的定标值为Qz,则定点加法为:
  • intx,y;longtemp,z;temp=y<<(Qx-Qy);temp=x+temp; z=temp>>(Qx-Qz),若Qx≥Qz z=temp<<(Qz-Qx),若Qx≤Qz

第154页:结果超过16位的定点加法例子

结果超过16位的定点加法例子
设x=15000,y=20000,则浮点运算结果为z=x+y=15000+20000=35000,显然z>32767;Qx=1,Qy=0,Qz=0,则定点加法为:x=30000;y=20000; temp=20000<<1=40000; temp=temp+x=40000+30000=70000; z=70000L>>1=35000

第155页:乘法运算的C语言定点模拟

intx,y,z;longtemp;temp=(long)x;z=(temp×y)>>(Qx+Qy-Qz);z=xyzq2Qz=(QQ)xqyq2xyzqQ(QQ)=(xqyq)2zxy

第156页:定点乘法设x=

18.4,y=36.8,则浮点运算值为z=18.4×36.8=677.12;Qx=10,Qy=9,Qz=5,所以x=18841;y=18841;temp=18841L;z=(18841L*18841)>>(10+9-5)=354983281L>>14=21666;因为z的定标值为5,故定点z =21666即为浮点的z=21666/32=677.08

第157页:intx,y,z;longtemp;

intx,y,z;longtemp;temp=(long)x;z=(temp<<(Qz-Qx+Qy))/y;z=x/yzqQz2=yqQy2Qxq2xq157qqyx2(QzQxQy)运算的C语言定点模拟floatx,y,z;z=x/y

第158页:定点除法设x=

18.4,y=36.8,浮点运算值为z=x/y=18.4/36.8=0.5;Qx=10,Qy=9,Qz=15;所以有x=18841,y=18841;temp=(long)18841;z=(18841L<<(15-10+9))/18841=308690944L/18841=16384;因为商z的定标值为15,所以定点z =16384即为浮点z=16384/32768=0.5

第159页:程序变量的Q值确定确定变量的Q值实际

上就是确定变量的动态范围。设变量的绝对值的最大值为|max|,取整数n,使其满足确定变量的绝对值的最大值理论分析法(三角函数、汉明窗、FIR卷积、自相关线性预测编码等)统计分析法(依据足够多的采样值)2n1max2n如果某变量的值在-1至+1之间,即<1,因此n=0,Q=15-n=15

第160页:2. 运算方法

通常的是全部以Q15格式表示的小数或以Q0格式表示的整数来工作

  • 定点乘法
  • 定点加法
  • 定点除法

第161页:小数乘小数Q15×Q15=Q300.5*

0.5=0.2515;Q1500.25;Q30161LTOP1;OP1=4000H(0.5/Q15)MPYOP2;OP2=4000H(0.5/Q15)PACSACHANS,1;(ANS)=2000H(0.统定点乘法

第162页:整数乘整数Q0×Q0=Q017×(-5)

=-001=11=01011=-85

第163页:混合表示法

1.5×0.75=1.1250.5×00.75;Q14;Q140001..125;Q28

第164页:但是,若事先了解数的动态范围

但是,若事先了解数的动态范围,就可以增加数的精度。例如,程序员了解到上述乘积不会大于1.8,就可以用Q14数表示乘积,而不是理论上的最佳情况Q13。164程序如下:LTOP1MPYOP2PACSACH;OP1=6000H(1.5/Q14);OP2=3000H(0.75/Q14)ANS,1;ANS=2400H(1.125/Q13)

第165页:上述方法为了保证精度均对乘的结果舍位

上述方法为了保证精度均对乘的结果舍位,结果所产生的误差相当于减去1个LSB(最低位)。采用下面简单的舍入方法,可使误差减少二分之一。1,14(上舍入)SACHANS,1

第166页:定点加法

调整小数点保留16位结果加法运算必须用相同的Q点表示通过移位操作解决溢出问题溢出检测溢出保护完全避免

第167页:加法无溢出有溢出被加数加数被加数加数

加法无溢出有溢出被加数加数被加数加数

第168页:可能溢出可能溢出被加数加数被加数加法

1可能溢出可能溢出被加数加数被加数加法

第169页:1. 保留32位结果1;(Q15);

保留32位结果1;(Q15);(Q15)ANSHI;(高16位结果)SACLANSLO;(低16位结果)2.调整小数点保留16位结果LACOP1,15ADDOP2,15;(Q14数用ACCH表示);(Q14数用ACCH表示)SACHANS;(Q14)

第170页:定点除法

  • 在通用DSP芯片中,一般不提供单周期的除法指令,为此必须采用除法子程序来实现
  • 二进制除法是乘法的逆运算。乘法包括一系列的移位和加法,而除法可分解为一系列的减法和移位

第171页:例如

例如
10÷3=3余100001010000000110000101000001010+11101000-000110001111001011110010得数为负,舍去第一次除法

第172页:被除数左移一次00010100-

被除数左移一次00010100-000110001111110017200010100+1110100011111100得数为负,舍去第二次除法

第173页:被除数左移一次得数为正

被除数左移一次得数为正,左移加一0010100000101000+11101000-00011000000100000001000000100001第三次除法

第174页:定点除法00100001-

定点除法00100001-0001100000001001余数商00100001+111010000000100100010011得数为正左移加一第四次运算

第175页:定点除法00001010-

定点除法00001010-000110001111001000010100-000110001111110000101000-000110000001000000100001-00011000舍去舍去左移加一左移加一0000100100010011余数商

第176页:TMS320没有专门的除法指令

TMS320没有专门的除法指令,但使用条件减指令SUBC可以完成有效灵活的除法功能。使用这一指令的唯一限制是两个操作数必须为正。程序员必须事先了解其可能的运算数的特性,如其商是否可以用小数表示及商的精度是否可被计算出来。

这里每一种考虑可影响如何使用SUBC指令的问题。下面给出两种不同情况下的除法程序

第177页:(1)分子小于分母

DIV_A:177NUMERALTDENOMMPYPAC;取商的符号TEMSGNSACHDENOMLACABS;使分母为正DENOMSACL;使分子为正NUMERAZALHABS14RPTK;除循环15次DENOMSUBCQUOTSACLTEMSGNLAC;若符号为正,则完成A1BGEZZACQUOTSUB;若为负,则商为负QUOTSACLA1:RET

第178页:(2)规定商的精度

DIV_B:;取商的符号;使分母为正;计算循环计数器;使分子为正;除循环16+FRAC次;若符号为正,则完成;若为负,则商为负LTNUMERAMPYDENOMPACSACHTEMSGNLACDENOMABSSACLDENOMLACK15ADDFRACSACLFRACLACNUMERAABSRPTFRACSUBCDENOMSACLQUOTLACTEMSGNBGEZB1ZACSUBQUOTSACLQUOTB1:RET

第179页:非线性运算的定点快速实现

调用DSP编译系统的库函数

  • 查表法–在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。查表法是快速实现非线性运算最常用的方法。
  • 混合法–提高查表法的精度–扩大自变量范围

第180页:调用DSP编译系统的库函数TMS3比较

丰富的运行支持库函数。在这些库函数中,包含了诸如对数、开方、三角函数、指数等常用的非线性函数。在C程序中(也可在汇编程序中)只要采用与库函数相同的变量定义,就可以直接调用。

例如,在库函数中,定义了以10为底的常用对数log10():#include<math.h>doublelog10(doublex)

第181页:在C程序中按如下方式调

在C程序中按如下方式调用
floatx,y;x =10.0;y=log10(x);从上例可以看出,库函数中的常用对数log10()要求的输入值为浮点数,返回值也为浮点数,运算的精度完全可以保证。直接调用库函数非常方便,但由于运算量大,很难在实时DSP中得到应用

第182页:查表法在实时DSP应用中实现非线性运算

查表法在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。查表法是快速实现非线性运算最常用的方法。采用这种方法必须根据自变量的范围和精度要求制作一张表格。

显然输入的范围越大,精度要求越高,则所需的表格就越大,即存储量也越大。查表法求值所需的计算就是根据输入值确定表的地址,根据地址就可得到相应的值,因而运算量较小。

查表法比较适合于非线性函数是周期函数或已知非线性函数输入值范围这两种情况,下面两个例子分别说明这两种情况

第183页:例1已知正弦函数y=

cos(x),制作一个512点表格,并说明查表方法。由于正弦函数是周期函数,函数值在-1至+1之间,用查表法比较合适。由于Q15的表示范围为-1至32767/32768之间,原则上讲-1至+1的范围必须用Q14表示。

但一般从方便和总体精度考虑,类似情况仍用Q15表示,此时+1用32767来表示

第184页:(1)产生512点值的C语言程序如下所示

:#defineN512#definepi3.14159intsin_tab[512];voidmain(){inti;for(i=0;i<N;i++)sin_tab[i]=(int)(32767*sin(2*pi*i/N));}

第185页:(2)查表查表实际上就是根据输入值确定表

(2)查表查表实际上就是根据输入值确定表的地址。设输入x在0~2之间,则x对应于512点表的地址为:index=(int)(512*x/2),则y=sin(x)=sin_tab[index]。

如果x用Q12定点数表示,将512/2用Q8表示为20861,则计算正弦表的地址的公式为:index=(x*20861L)>>20

第186页:例2用查表法求以2为底的对数

例2用查表法求以2为底的对数,已知自变量取值范围为0.5~1,要求将自变量范围均匀划分为10等分。试制作这个表格并说明查表方法。(1)做表:y =log2(x),由于x在0.5到1之间,因此y在-1到0之间,x和y均可用Q15表示。

由于对x均匀划分为10段,因此,10段对应于输入x的范围如表3.2所示。若每一段的对数值都取第1点的对数值,则表中第1段的对数值为y0(Q15) =(int)(log2(0.5)×32768),第2段的对数值为y1(Q15)=(int)(log2(0.55)×32768),依次类推

第187页:10点对数表(输入0.5~1)

以2为底的对数10点查表法表(输入范围0.5~1)
地址输入值区间对数值(Q15)
00.50~0.55-32768
10.55~0.60-28262
20.60~0.65-24149
30.65~0.70-20365
40.70~0.75-16862
50.75~0.80-13600
60.80~0.85-10549
70.85~0.90-7683
80.90~0.95-4981
90.95~1.00-2425

第188页:提高查表法的精度

提高查表法的精度

第189页:扩大查表法的范围设

扩大查表法的范围设
表的范围为0.5~1,X为大于0.5的数则:Xm2e式中,0.5m1,e为整数eelog2(X)log2(m2)log2(m)log2(2)log2(m)e例如:14log2(10000)log2(0.610352)log2(0.61035)1413.2877

第190页:例如,对数值10000进行规格化

的TMS320C25程序为
LAC#10000SACLTEMPZALHTEMPLARAR1,#0FHRPT14NORM*-

第191页:15Q191232768x2Q上述

程序执行后,AR1=#0eH,ACCH=2000(10进制)。对一个16位整数x进行上述程序处理实际上就是做这样一个等效变换:x=其中,寄存器AR1包含的值为15-Q,累加器ACC高16位包含的值为,其数值在16384~32768之间

第192页:例实现以2为底的对数的C定点模拟程序

intlogtab0[10]={-32768,-28262,-24149,-20365,-16862,-13600,-10549,-7683,-4981,-2425};intlogtab1[10]={22529,20567,18920,17517,16308,15255,14330,13511,12780,12124};intlogtab2[10]={16384,18022,19660,21299,22938,24576,26214,27853,29491,31130};intlog2_fast(int Am)

第193页:{intpoint,point1;

intindex,x0,dx,dy,y;193point1=(15-point-4)*512; index=((Am-16384)*20L)>>15;dx=Am-logtab2[index]; dy=((long)dx*logtab1[index])>>13; y=(dy+logtab0[index])>>6; y=point1+y;return(y);}

第194页:3. 定点DSP芯片从TMS32010

TMS320C54x–为实现低功耗、高性能而专门设计的定点DSP芯片–为无线通讯用的高性能价格比的芯片。–运算速度快,指令周期为10ns–优化的CPU结构。17×17乘法器和40位的桶型移位器,有4条内部总线和2个地址产生器–低功耗,可在3.3V或2.7V电压下工作,三个低功耗方式–智能外设,除标准的串行口和时分复用串行口外,还含有自动缓存串行口(2kbuffer)和外部处理器并行口HPI

第195页:定点DSP芯片

TMS320C62x–TI公司1997年开发的新型定点DSP芯片,用于无线基站,无线PDA,Modem,GPS等。–速度快,指令周期为3.3ns,运算能力为2400MIPS–内部结构不同,同时集成有,一个周期内可执行8条32bit指令–使用超长指令集,在一个周期内可并行执行几个指令–大容量片内存储器(片内有96K程序和512K数据存储器)和52MB寻址空间–多种外设,4个DMA,3个多通道缓存串口,2个计时器

第196页:为了DSP程序调试的方便及模拟定点

DSP实现时的算法性能,在编写DSP汇编程序之前一般需将高级语言浮点算法改写为高级语言定点算法取整操作:i=int(f1);i=int(f1+0.5);先放后缩:f1=(y1+y2)*x;f1=f1/x;1语言:从浮点到定点

第197页:3.10 浮点运算及浮点DSP芯片

浮点运算及浮点DSP芯片

第198页:fes

IEEE单精度浮点数格式3130-2322-0符号位阶码数据格式

第199页:x无效x无穷大

1990e255,e0,f0,e0,f0,e255,f0,e255,f=0,x1s2e1271.fx1s21260.fxEE单精度浮点数格式

第200页:s0x

01.f2es1x10.f2ee为绝对值最大的负数,且sf0,x0fse尾数或:s200mss.fm{2.f}阶码符号位x{2s.f}2e

第201页:短浮点格式

短浮点格式
4位指数,1位符号,11位分数(16位)单精度浮点格式:8位指数,1位符号,23位分数(32位)扩展精度格式:8位指数,1位符号,31位分数(40位)

第202页:2-2-1127202最大正数=

fse短浮点格式
4位指数,1位符号,11位分数(16位)1512111000111011111111111

第203页:最小正数=12-7203

fse短浮点格式
4位指数,1位符号,11位分数(16位)1512111001

第204页:最小负数=-1-2-112-

7204fse短浮点格式
4位指数,1位符号,11位分数(16位)1512111001

第205页:最大负数=227205

fse短浮点格式
4位指数,1位符号,11位分数(16位)15121110001

第206页:零的特殊表示

零的特殊表示
e8,sf0206fse短浮点格式:4位指数,1位符号,11位分数(16位)1512111

第207页:最大正数=2-2-23

2127207fse单精度浮点格式
8位指数,1位符号,23位分数(32位)3124232200111111

第208页:最小正数=12-127208

fse单精度浮点格式
8位指数,1位符号,23位分数(32位)31242322010000

第209页:最小负数=-1-2-232-

127209fse单精度浮点格式
8位指数,1位符号,23位分数(32位)31242322010000

第210页:最大负数=-22127210

fse单精度浮点格式
8位指数,1位符号,23位分数(32位)312423220011111

第211页:零的特殊表示

零的特殊表示
e128,sf0211fse单精度浮点格式:8位指数,1位符号,23位分数(32位)3124232

第212页:最大正数=22-322127最小

正数=12127最小负数=12-322127最大负数=22127212fse扩展精度格式:8位指数,1位符号,31位分数(40位)393231300零的特殊表示:e128sf0

第213页:两种浮点数格式的转换

IEEE浮点格式与TMS320浮点格式的转换–硬件方法:专用芯片–软件方法

第214页:2. 运算方法浮点加减法设两个浮点数

运算方法浮点加减法设两个浮点数
x1m12e1x2m22e2如果:e1e2则需对x2进行归正:x2m22e1e22e1

第215页:浮点乘法设两个浮点数

浮点乘法设两个浮点数
x1m12e1x2m22e2尾数相乘:m1×m2指数相加:e1+e2乘积处理:2运算方法

第216页:浮点除法除法指令

浮点除法除法指令
直接应用无除法指令:若求z=x/y,先用迭代法求1/y,再乘x迭代公式可选用:e[i]=e[i-1]×(2.0-y×e[i-1])需选初始估值!2运算方法

第217页:非线性浮点运算的实现、丰富的库函数等要点

非线性浮点运算的实现

  • 丰富的库函数,C语言程序可直接调用
  • 汇编语言必须遵循调用规约
  • 快速实现的方法,查表法
  • 浮点和定点运算的比较–浮点精度较高,动态范围更大–定点运算效率高

第218页:3. 浮点DSP芯片从TMS320C30

TMS320C4x–并行浮点处理器。–275MOPS,320Mbyte/s数据吞吐量–6个高速通讯接口,每个口的最大数据吞吐量可达20Mbyte/s的异步传输速率–6个DMA通道实现了I/O操作与CPU操作的并行化–分开的数据和地址总线,16G连续的程序和数据存储空间–片内分析模块支持高效的并行处理调试–片内程序高速缓冲存储器

第219页:浮点DSP芯片

TMS320C67X–可同时执行8条指令,其运算能力可达1GFLOPS–运行速度快。指令周期为6ns,峰值运算能力为1336MIPS,对于单精度运算可达1GFLOPS,对于双精度运算可达250MFLOPS–集成了32×32bit的乘法器,其结果可为32或64bit

第220页:

《数字信号处理器DSP原理与应用》课件目录

顶部目录