页数:220页文件大小:1.31 MB来源: 数字信号处理器DSP原理与应用ppt课件
本课件讲解LF240x的立即寻址、直接寻址与间接寻址方式,给出常用指令的功能说明与使用例程,介绍控制程序开发语言的选择、C语言编程方法与C语言和汇编语言的混合编程,并说明定点运算与浮点运算在TMS320上的实现方法。
(ST0、ST1)单元假定值名称单元1辅助寄存器指针ARP-进位标志C-数据页DP-溢出标值OV0溢出模式OVM0乘法移位模式PM-符号扩展模式SXM-测试模式TC对于有假定值(为0或为1)的状态寄存器单元,在进行函数调用和函数返回时必须保证其值为假定值
3个寄存器——堆栈指针(SP)、帧指针(FP)和局部变量指针(LVP)管理堆栈和局部帧。AR6和AR7作为寄存器变量的寄存器。AR6被分配给第一个变量,AR7分配给第二个变量。
编译器使用不用于寄存器变量的寄存器来计算表达式的值并保存临时结果。当函数的返回值是一个标量类型(整型、指针或浮点型)时,该值在函数返回时被放入累加器中。16位的数据类型(字符型、短整型、整型或指针型)连同正确的符号扩展被装载到累加器中
1183.函数结构和调用规则C编译器对函数的调用有一系列严格的规定。除了特殊的运行支持函数外,任何调用者函数和被调用函数都要遵守这些规则,否则可能会破坏C环境并导致程序失败。
1函数如何产生调用一个函数(调用者函数)在调用其他函数(子函数)时执行以下任务。注意,ARP必须设置为1。a.调用者函数将参数以颠倒的顺序压入堆栈(最右边声明的参数第一个压入堆栈,最左边的参数最后一个压入堆栈)。
即函数调用时,最左边的参数放在栈顶单元。b.调用者函数调用子函数。c.调用者函数假定当子函数执行完成返回时,ARP将被置为1。d.完成调用后,调用者函数将参数弹出堆栈
从硬件堆栈中弹出,压入软件堆栈。b.将FP压入软件堆栈。c.分配局部帧。d.如果函数修改了AR6和AR7,则将它们压入堆栈,其他的任何寄存器可以不用保存,任意修改。
e.实现函数功能。f.如果函数返回标量数据,将它放入累加器。g.将ARP设定为AR1。h.如果保护了AR6、AR7,恢复这两个寄存器。i.删除局部帧。j.恢复FP。
k.从软件堆栈中弹出返回地址并压入硬件堆栈。l.返回
调用者局部帧FPSP调用前FPSP调用者局部帧参数n...参数1返回地址压入参数调用函数原FP分配局部帧调用者局部帧参数n..参数1返回地址原FP暂存单元局部帧FPSP
所有的函数,无论是C函数还是汇编语言函数,都必须遵循寄存器规则。b.必须保存被函数修改的任何专用寄存器,包括:AR0(FP)、AR1(SP)、AR6、AR7。如果正常使用堆栈,则不必明确保存SP。
也就是说,用户可以自由地使用堆栈,弹出被压入的所有内容。用户可以自由使用所有其他的寄存器,而不必保留它们的内容。c.如果改变了任何一个寄存器位域状态的假定值,则必须确保恢复其假定值。
尤其注意ARP应该被指定为AR1。d.中断子程序必须保存所有使用的寄存器。e.在从汇编语言中调用C函数时,将参数以倒序压入堆栈,函数调用后弹出堆栈
f.调用C函数时,只有专用的寄存器内容被保留,C函数可以改变其他任何寄存器的内容。g.函数必须返回累加器中的值。h.汇编模块使用.cinit段只能用于全局变量的初始化。
boot.c中的启动子程序假定.cinit段完全是由初始化表组成。在.cinit段中放入其他的信息会破坏初始化表而导致无法预知的后果。i.编译器将在所有的C语言对象标识符的开头添加下划线“_”。
在C语言中和汇编语言都要访问的对象必须在汇编语言中以下划线“_”作为前缀。例如,C语言中名为x的对象在汇编语言中为_x。仅在汇编语言模块中使用的对象可以使用不加下划线的标识符,不会和C语言中的标识符发生冲突。
j.在C中被访问的任何汇编语言对象或在C中被调用的任何汇编语言函数必须在汇编代码中使用.global伪指令声明。这将声明该符号是外部的,允许链接器解决对它的引用
以使用asm语句在编译器产生的汇编语言文件中嵌入单行的汇编语句。一系列的asm语句可以将顺序的汇编语句插入到编译器的输出代码中。使用中的几点注意事项:a.asm语句使用户可以访问某些用C语句无法访问的硬件特性。
b.在使用asm语句的时候,要防止破坏C环境。编译器不会对嵌入代码进行检查和分析。c.在asm语句中使用跳转语句或标记符(LABEL)可能会产生无法预知的结果。
d.不要改变C变量的值,但可以安全地读取任何变量的当前值。e.不要使用asm语句嵌入汇编伪指令,这会破坏汇编语言环境。f.在编译器的输出代码中嵌入注释时,asm语句是很有用的。
可以用星号(*)作为汇编代码的开头,如:asm(“******thisisanassemblylanguagecomment.”)
f.调用C函数时,只有专用的寄存器内容被保留,C函数可以改变其他任何寄存器的内容。g.函数必须返回累加器中的值。h.汇编模块使用.cinit段只能用于全局变量的初始化。
boot.c中的启动子程序假定.cinit段完全是由初始化表组成。在.cinit段中放入其他的信息会破坏初始化表而导致无法预知的后果。i.编译器将在所有的C语言对象标识符的开头添加下划线“_”。
在C语言中和汇编语言都要访问的对象必须在汇编语言中以下划线“_”作为前缀。例如,C语言中名为x的对象在汇编语言中为_x。仅在汇编语言模块中使用的对象可以使用不加下划线的标识符,不会和C语言中的标识符发生冲突。
j.在C中被访问的任何汇编语言对象或在C中被调用的任何汇编语言函数必须在汇编代码中使用.global伪指令声明。这将声明该符号是外部的,允许链接器解决对它的引用
以编译源程序,然后在汇编前对编译输出的汇编语言代码进行手动检查和修改。这种情况下,在C代码中利用asm语句插入适当的注释对理解C编译器输出的汇编语言代码是非常有帮助的
1293.6运行支持函数(rts)一个C程序所执行的一些任务(如输入/输出、动态存储器配置、字符串操作以及三角函数等器可以提供除了用于处理意外情况和地域相关问题(如基于当地的语言、民族或文化的程序)的工具之外的全部ANSI的标准库的内容。
使用ANSI的标准库可以确保有一套统一的函数。a.rts2xx.lib:运行期支持目标库,包含:·ANSIC标准库·系统启动程序_c_int0·允许C访问特殊指令的函数和宏b.rts.src:运行期支持资源库。
包含运行期支持目标库的C语言和汇编语言程序源代码
闪存编程在DSP控制程序编写、调试完成后,需要将程序编译、链接所得到的可执行文件(.out)编程到DSP的程序存储器中,使DSP可以摆脱开发系统运行,所开发的系统成为一套独立的系统。,应该将软件开发得到的可执行文件编程到内部闪存(Flash)中,即进行Flash编程
DSP烧写步骤:
到DSP中独立运行的结果往往与仿真的状态有差异,甚至可能系统完全不能正常运行,这是由于仿真过程中的程序运行情况和DSP独立运行时的程序运行情况不同所引起的。在将程序编程到DSP内部之前,需要对以下几个问题深入考虑,以保证编程后系统的正常运行:(1)电路元件初始化同步问题:由于外部元件初始化可能较慢,DSP初始化完成后要延时一段时间再访问外部慢速器件,通常要在控制程序的主函数中添加一段循环延时程序
2用仿真器调试时程序执行速度比较慢,循环时间比较长,而烧写到DSP中可能时间比较短,要对决定循环时间的循环次数重新考虑。3用仿真器调试的时候,DSP运行的一些资源(如堆栈等)用的是仿真器中的资源,烧写到DSP中执行必须利用DSP本身的资源,烧写前必须对链接命令文件(.cmd文件)中定义的各种资源进行详细考虑
时钟由硬件仿真器提供,而闪存编程后DSP运行时钟由电路板时钟电路提供,如果电路板时钟电路有问题,编程后的DSP将无法正常工作。闪存编程之后DSP独立运行的时候出现的很多问题都是由于时序配合引起的,这就需要调整程序中的各种延时,甚至可能要经过反复调整来寻求最佳的延时设置,以保证系统功能的正常实现
1.功能要求按照一定的频率控制四个发光二极管的点亮状态,要求如下:1四个发光二极管依次循环显示0000b~1111b;2发光二极管显示刷新频率10Hz;3发光二极管的控制映射在I/O空间0xC的低四位,写1点亮;
1374显示刷新频率的控制利用定时器实现
工程组成分析功能要求,对发光二极管的控制可以通过对I/O空间的端口读写来实现,而显示频率的控制要利用定时器来实现。由于程序功能要求简单,流程控制容易实现,对定时器中断的处理可以采用回调方式来处理。
由此,此控制程序的工程中应该包含如下文件:1链接命令文件.cmd,配置资源映射;2头文件.h,内外设控制寄存器;3汇编代码文件.asm,定义中断向量表;4C代码文件.c,程序文件
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}
1403.8.4头文件头文件2407c.h主要内外设控制寄存器。此文件在的各种开发中可以通用。3.8.5汇编文件示例程序中没有利用汇编语言编写控制程序,但由于对定时器中断的处理采用回调方式,需要编写汇编文件定义中断向量表。
.ref_gptime1,_c_inct Reset Vector;_c_int0BRSVECTvel;PHANTOMBINT1vel;_gptime1BINT2vel;GISR3BINT3……
1413.8.gp_init……break;}}}
1423.8.7实例总结实例功能要求虽然简单,却包含了DSP控制程序设计中的许多问题,包括:1各种文件的编写:头文件(.h)、链接命令文件(.cmd)、汇编代码文件(.asm)、C源文件(.c);
2数据空间的读写,对各种片内外设控制寄存器的设置都是通过数据空间的写操作实现的;3I/O空间的读写,四个发光二极管的显示控制就是通过对I/O空间的写操作实现的
1434中断服务函数的编写,程序中的gptime1函数是一个中断服务函数,从函数定义到两级中断服务函数的结构都是DSPC语言编程中常用的中断处理方法;5中断向量表的定义,虽然实例程序中只有一个自定义中断服务函数,但中断向量表的定义方法在各种DSP应用中是类似的。
实例程序已经覆盖到了DSP控制程序设计中大多数常见的问题,而在实际应用中可能存在的各种复杂问题的解决方法则需要在应用中深入研究
定点运算及定点DSP
数据格式在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示DSP芯片的数以2的补码形式表示数的定标:Q表示法和S表示法对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价
为0.25小数点的位置Q表示法16进制数2000HQ0表示为810小数点的位置符号位
浮点数x=0.5,定标Q=15,则定点数=0.5*32768=16384qxintx2Q定点数转换为浮点数xfloatxq2数与定点数的转换关系
| 十进制数表示范围 | S表示 | Q表示 |
|---|---|---|
| -1≤X≤0.9999695 | S0.15 | Q15 |
| -2≤X≤1.9999390 | S1.14 | Q14 |
| -16384≤X≤16383.5 | S14.1 | Q1 |
| -32768≤X≤32767 | S15.0 | Q0 |
说明:源表格中S2.13至S13.2各行以省略号形式给出,未列出具体数值。
floatx,y,z;z=x+y;
结果超过16位表示范围
intx,y,z;longtemp;temp=(long)x;z=(temp×y)>>(Qx+Qy-Qz);z=xyzq2Qz=(QQ)xqyq2xyzqQ(QQ)=(xqyq)2zxy
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
intx,y,z;longtemp;temp=(long)x;z=(temp<<(Qz-Qx+Qy))/y;z=x/yzqQz2=yqQy2Qxq2xq157qqyx2(QzQxQy)运算的C语言定点模拟floatx,y,z;z=x/y
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
上就是确定变量的动态范围。设变量的绝对值的最大值为|max|,取整数n,使其满足确定变量的绝对值的最大值理论分析法(三角函数、汉明窗、FIR卷积、自相关线性预测编码等)统计分析法(依据足够多的采样值)2n1max2n如果某变量的值在-1至+1之间,即<1,因此n=0,Q=15-n=15
通常的是全部以Q15格式表示的小数或以Q0格式表示的整数来工作
0.5=0.2515;Q1500.25;Q30161LTOP1;OP1=4000H(0.5/Q15)MPYOP2;OP2=4000H(0.5/Q15)PACSACHANS,1;(ANS)=2000H(0.统定点乘法
=-001=11=01011=-85
1.5×0.75=1.1250.5×00.75;Q14;Q140001..125;Q28
但是,若事先了解数的动态范围,就可以增加数的精度。例如,程序员了解到上述乘积不会大于1.8,就可以用Q14数表示乘积,而不是理论上的最佳情况Q13。164程序如下:LTOP1MPYOP2PACSACH;OP1=6000H(1.5/Q14);OP2=3000H(0.75/Q14)ANS,1;ANS=2400H(1.125/Q13)
上述方法为了保证精度均对乘的结果舍位,结果所产生的误差相当于减去1个LSB(最低位)。采用下面简单的舍入方法,可使误差减少二分之一。1,14(上舍入)SACHANS,1
调整小数点保留16位结果加法运算必须用相同的Q点表示通过移位操作解决溢出问题溢出检测溢出保护完全避免
加法无溢出有溢出被加数加数被加数加数
1可能溢出可能溢出被加数加数被加数加法
保留32位结果1;(Q15);(Q15)ANSHI;(高16位结果)SACLANSLO;(低16位结果)2.调整小数点保留16位结果LACOP1,15ADDOP2,15;(Q14数用ACCH表示);(Q14数用ACCH表示)SACHANS;(Q14)
被除数左移一次00010100-000110001111110017200010100+1110100011111100得数为负,舍去第二次除法
被除数左移一次得数为正,左移加一0010100000101000+11101000-00011000000100000001000000100001第三次除法
定点除法00100001-0001100000001001余数商00100001+111010000000100100010011得数为正左移加一第四次运算
定点除法00001010-000110001111001000010100-000110001111110000101000-000110000001000000100001-00011000舍去舍去左移加一左移加一0000100100010011余数商
TMS320没有专门的除法指令,但使用条件减指令SUBC可以完成有效灵活的除法功能。使用这一指令的唯一限制是两个操作数必须为正。程序员必须事先了解其可能的运算数的特性,如其商是否可以用小数表示及商的精度是否可被计算出来。
这里每一种考虑可影响如何使用SUBC指令的问题。下面给出两种不同情况下的除法程序
DIV_A:177NUMERALTDENOMMPYPAC;取商的符号TEMSGNSACHDENOMLACABS;使分母为正DENOMSACL;使分子为正NUMERAZALHABS14RPTK;除循环15次DENOMSUBCQUOTSACLTEMSGNLAC;若符号为正,则完成A1BGEZZACQUOTSUB;若为负,则商为负QUOTSACLA1:RET
DIV_B:;取商的符号;使分母为正;计算循环计数器;使分子为正;除循环16+FRAC次;若符号为正,则完成;若为负,则商为负LTNUMERAMPYDENOMPACSACHTEMSGNLACDENOMABSSACLDENOMLACK15ADDFRACSACLFRACLACNUMERAABSRPTFRACSUBCDENOMSACLQUOTLACTEMSGNBGEZB1ZACSUBQUOTSACLQUOTB1:RET
调用DSP编译系统的库函数
丰富的运行支持库函数。在这些库函数中,包含了诸如对数、开方、三角函数、指数等常用的非线性函数。在C程序中(也可在汇编程序中)只要采用与库函数相同的变量定义,就可以直接调用。
例如,在库函数中,定义了以10为底的常用对数log10():#include<math.h>doublelog10(doublex)
查表法在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。查表法是快速实现非线性运算最常用的方法。采用这种方法必须根据自变量的范围和精度要求制作一张表格。
显然输入的范围越大,精度要求越高,则所需的表格就越大,即存储量也越大。查表法求值所需的计算就是根据输入值确定表的地址,根据地址就可得到相应的值,因而运算量较小。
查表法比较适合于非线性函数是周期函数或已知非线性函数输入值范围这两种情况,下面两个例子分别说明这两种情况
cos(x),制作一个512点表格,并说明查表方法。由于正弦函数是周期函数,函数值在-1至+1之间,用查表法比较合适。由于Q15的表示范围为-1至32767/32768之间,原则上讲-1至+1的范围必须用Q14表示。
但一般从方便和总体精度考虑,类似情况仍用Q15表示,此时+1用32767来表示
:#defineN512#definepi3.14159intsin_tab[512];voidmain(){inti;for(i=0;i<N;i++)sin_tab[i]=(int)(32767*sin(2*pi*i/N));}
(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
例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),依次类推
| 地址 | 输入值区间 | 对数值(Q15) |
|---|---|---|
| 0 | 0.50~0.55 | -32768 |
| 1 | 0.55~0.60 | -28262 |
| 2 | 0.60~0.65 | -24149 |
| 3 | 0.65~0.70 | -20365 |
| 4 | 0.70~0.75 | -16862 |
| 5 | 0.75~0.80 | -13600 |
| 6 | 0.80~0.85 | -10549 |
| 7 | 0.85~0.90 | -7683 |
| 8 | 0.90~0.95 | -4981 |
| 9 | 0.95~1.00 | -2425 |
提高查表法的精度
程序执行后,AR1=#0eH,ACCH=2000(10进制)。对一个16位整数x进行上述程序处理实际上就是做这样一个等效变换:x=其中,寄存器AR1包含的值为15-Q,累加器ACC高16位包含的值为,其数值在16384~32768之间
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)
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);}
TMS320C54x–为实现低功耗、高性能而专门设计的定点DSP芯片–为无线通讯用的高性能价格比的芯片。–运算速度快,指令周期为10ns–优化的CPU结构。17×17乘法器和40位的桶型移位器,有4条内部总线和2个地址产生器–低功耗,可在3.3V或2.7V电压下工作,三个低功耗方式–智能外设,除标准的串行口和时分复用串行口外,还含有自动缓存串行口(2kbuffer)和外部处理器并行口HPI
TMS320C62x–TI公司1997年开发的新型定点DSP芯片,用于无线基站,无线PDA,Modem,GPS等。–速度快,指令周期为3.3ns,运算能力为2400MIPS–内部结构不同,同时集成有,一个周期内可执行8条32bit指令–使用超长指令集,在一个周期内可并行执行几个指令–大容量片内存储器(片内有96K程序和512K数据存储器)和52MB寻址空间–多种外设,4个DMA,3个多通道缓存串口,2个计时器
DSP实现时的算法性能,在编写DSP汇编程序之前一般需将高级语言浮点算法改写为高级语言定点算法取整操作:i=int(f1);i=int(f1+0.5);先放后缩:f1=(y1+y2)*x;f1=f1/x;1语言:从浮点到定点
浮点运算及浮点DSP芯片
IEEE单精度浮点数格式3130-2322-0符号位阶码数据格式
1990e255,e0,f0,e0,f0,e255,f0,e255,f=0,x1s2e1271.fx1s21260.fxEE单精度浮点数格式
01.f2es1x10.f2ee为绝对值最大的负数,且sf0,x0fse尾数或:s200mss.fm{2.f}阶码符号位x{2s.f}2e
正数=12127最小负数=12-322127最大负数=22127212fse扩展精度格式:8位指数,1位符号,31位分数(40位)393231300零的特殊表示:e128sf0
IEEE浮点格式与TMS320浮点格式的转换–硬件方法:专用芯片–软件方法
非线性浮点运算的实现
TMS320C4x–并行浮点处理器。–275MOPS,320Mbyte/s数据吞吐量–6个高速通讯接口,每个口的最大数据吞吐量可达20Mbyte/s的异步传输速率–6个DMA通道实现了I/O操作与CPU操作的并行化–分开的数据和地址总线,16G连续的程序和数据存储空间–片内分析模块支持高效的并行处理调试–片内程序高速缓冲存储器
TMS320C67X–可同时执行8条指令,其运算能力可达1GFLOPS–运行速度快。指令周期为6ns,峰值运算能力为1336MIPS,对于单精度运算可达1GFLOPS,对于双精度运算可达250MFLOPS–集成了32×32bit的乘法器,其结果可为32或64bit
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}