dsp芯片编译器
① DSP有哪些特点适于进行数字信号处理
DSP的特点
对于没有使用过DSP的初学者来说,第一个困惑就是DSP其他的嵌入式处理器究竟有什么不同,它和单片机,ARM有什么区别。事实上,DSP也是一种嵌入式处理器,它完全可以完成单片机的功能。
唯一的重要的区别在于DSP支持单时钟周期的"乘-加"运算。这几乎是所有厂家的DSP芯片的一个共有特征。几乎所有的DSP处理器的指令集中都会有一条MAC指令,这条指令可以把两个操作数从RAM中取出相乘,然后加到一个累加器中,所有这些操作都在一个时钟周期内完成。拥有这样一条指令的处理器就具备了DSP功能。
具有这条指令就称之为数字信号处理器的原因在于,所有的数字信号处理算法中最为常见的算术操作就是"乘-加"。这是因为数字信号处理中大量使用了内积,或称"点积"的运算。无论是FIR滤波,FFT,信号相关,数字混频,下变频。所有这些数字信号处理的运算经常是将输入信号与一个系数表或者与一个本地参考信号相乘然后积分(累加),这就表现为将两个向量(或称序列)进行点积,在编程上就变成将输入的采样放在一个循环buffer里,本地的系数表或参考信号也放在一个buffer里,然后使用两个指针指向这两个buffer。这样就可以在一个loop里面使用一个MAC指令将二者进行点积运算。这样的点积运算对与处理器来说是最快的,因为仅需一个始终周期就可以完成一次乘加。
了解DSP的这一特点后,当我们设计一个嵌入式系统时,首先要考虑处理器所实现的算法中是否有点积运算,即是否要经常进行两个数组的乘加,(记住数字滤波,相关等都表现为两个数组的点积)如果有的话,每秒要做多少次,这样就能够决定是否采用DSP,采用多高性能的DSP了。
浮点与定点
浮点与定点也是经常是初学者困惑的问题,在选择DSP器件的时候,是采用浮点还是采用定点,如果用定点是16位还是32位?其实这个问题和你的算法所要求的信号的动态范围有关。
定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压。在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算。
而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例,
单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数
这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)*2^127.动态范围为20*log(最大的数/最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度。原因在于定点处理处理的信号的动态范围有限,比如16位定点DSP,可以表示整数范围为1-65536,其动态范围为20*log(65536/1)=96dB.对于32定点DSP,动态范围为20*log(2^32/1)=192dB,远小于32位ieee浮点数的1667.6dB,但是,实际上192dB对绝大多数应用所处理的信号已经足够了。
由于AD转换器的位数限制,一般输入信号的动态范围都比较小,但在DSP的信号处理中,由于点积运算会使中间节点信号的动态范围增加,所以主要考虑信号处理流程中中间结果的动态范围,以及算法对中间结果的精度要求,来选择相应的DSP。另外就是浮点的DSP更易于编程,定点DSP编程中程序员要不断调整中间结果的P,Q值,实际就是不断对中间结果进行移位调整和舍入。
DSP与RTOS
TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基于各自DSP的嵌入式多任务内核。DSP编程可以用单用C,也可以用汇编,或者二者结合,一般软件编译工具都提供了很好的支持。我不想在这里多说BIOS,VDK怎么用这在相应的文档里说的很详细。我想给初学者说说DSP的RTOS原理。用短短几段话说这个复杂的东西也是挑战!
其实DSP的RTOS和基于其他处理器的通用RTOS没什么大的区别,现在几乎人人皆知的uCOSii也很容易移植到DSP上来,只要把寄存器保存与恢复部分和堆栈部分改改就可以。一般在用BIOS和VDK之前,先看看操作系统原理的书比较好。uCOS那本书也不错。
BIOS和VDK其实是一个RTOS内核函数集,DSP的应用程序会和这些函数连接成一个可执行文件。其实实现一个简单的多任务内核并不复杂,首先定义好内核的各种数据结构,然后写一个scheler函数,功能是从所有就绪任务中(通过查找就绪任务队列或就绪任务表)找出优先级最高的任务,并恢复其执行。然后在此基础上写几个用于任务间通信的函数就可以了,比如event,message box,等等。
RTOS一般采用抢先式的任务调度方式,举例说当任务A等待的资源available的时候,DSP会执行一个任务调度函数scheler,这个函数会检查当前任务是否比任务A优先级低,如果是的话,就会把它当前挂起,然后把任务A保存在堆栈里寄存器值全部pop到DSP处理器中(这就是所谓的任务现场恢复)。接着scheler还会把从堆栈中取出任务A挂起时的程序执行的地址,pop到PC,使任务A继续执行。这样当前任务就被任务A抢先了。
使用RTOS之后,每个任务都会有一个主函数,这个函数的起始地址就是该任务的入口。一般每个任务的主函数里有一个死循环,这个循环使该任务周期地执行,完成一部分算法模块的功能,其实这个函数跟普通函数没任何区别,类似于C语言中的main函数。一个任务创建的时候,RTOS会把这个函数入口地址压入任务的堆栈中,好象这个函数(任务)刚发生过一次中断一样。一旦这个新创建任务的优先级在就绪队列中是最高的,RTOS就会从其堆栈中弹出其入口地址开始执行。
有一个疑问是,不使用RTOS,而是简单使用一个主循环在程序中调用各个函数模块,一样可以实现软件的调度执行。那么,这种常用的方法与使用RTOS相比有什么区别呢?其实,使用主循环的方法不过是一种没有优先级的顺序执行的调度策略而已。这种方法的缺点在于,主循环中调用的各个函数是顺序执行的,那么,即使是一个无关紧要的函数(比如闪烁一个LED),只要他不主动返回,也会一直执行直到结束,这时,如果发生一个重要的事件(比如DMA buffer full 中断),就会得不到及时的响应和处理,只能等到那个闪烁LED的函数执行完毕。这样就使整个DSP处理的优先次序十分不合理。而在使用了RTOS之后,当一个重要的事件发生时,中断处理会进入RTOS,并调用scheler,这时scheler 会让处理这一事件的任务抢占DSP处理器(因为它的优先级高)。而哪个闪烁LED任务即使晚执行几毫秒都没任何影响。这样整个DSP的调度策略就十分合理。
RTOS要说的内容太多,我只能讲一下自己的一点体会吧
DSP与正(余)弦波
在DSP的应用中,我们经常要用到三角函数,或者合成一个正(余)弦波。这是因为我们喜欢把信号通过傅立叶变换映射到三角函数空间来理解信号的频率特性。信号处理的一些计算技巧都需要在DSP软件中进行三角函数计算。然而三角函数计算是非线性的计算,DSP并没有专门的指令来求一个数的正弦或余弦。于是我们需要用线性方法来近似求解。
一个直接的想法是用多项式拟合,这也正是大多数DSP C编译器提供正余弦库函数所采用的方法。其原理是把三角函数向函数空间{1,x,x^2,x^3....}上投影,从而获得一系列的系数,用这些系数就可以拟合出三角函数。比如,我们在[0,pi/2]区间上拟合sin,只需在matlab中输入以下命令:
x=0:0.05:pi/2;
p=polyfit(x,sin(x),5)
就得到5阶的多项式系数:
p =
0.00581052047605 0.00580963216172 -0.17193865685360
0.00209002716293 0.99969270087312 0.00000809543448
于是在[0,pi/2]区间上:
sin(x)= 0.00000809543448+0.99969270087312*x+ 0.00209002716293*x^2-0.17193865685360*x^3+
0.00580963216172*x^4+0.00581052047605*x^5
于是在DSP程序中,我们可以通过用乘加(MAC)指令计算这个多项式来近似求得sin(x)
当然如果用定点DSP还要把P这个多项式系数表用一定的Q值来改写成定点数。
这样的三角函数计算一般都需要几十个cycle 的开销。这对于某些场合是不能容忍的。
另一种更快的方法是借助于查表,比如,我们将[0,pi/2]分成32个区间,每个区间长度就为pi/64,在每个区间上我们使用直线段拟合sin曲线,每个区间线段起点的正弦值和线段斜率事先算好,存在RAM里,这样就需要在在RAM里存储64个
常数:
32个起点的精确的正弦值(事先算好): s[32]={0,sin(pi/64),sin(pi/32),sin(pi/16)....}
32个线段的斜率: f[32]={0.049,.....}
对于输入的每一个x,先根据其大小找到所在区间i,通常x用定点表示,一般取其高几位就是系数i了,然 后通过下式即可求出sin(x):
sin(x)= s[i]*f[i]
这样一般只需几个CYCLE就可以算出正弦值,如果需要更高的精度,可以将区间分得更细,当然,也就需 要更多的RAM去存储常数表。
事实上,不仅三角函数,其他的各种非线性函数都是这样近似计算的。
② DSP编译器的处理器选项中大内存模型的特点
摘要 禁止编译器优化:按(单线程)程序的顺序依次访问内存。
③ DSP处理器和鼠标内部的芯片是否有区别
HDNS2000光学感测芯片在运动检测中的应 用2009年02月17日 星期二 下午 10:40
摘 要:安捷伦(Agilent)公司的hdns2000芯片是一种高性能的运动检测器件,在目前的光学鼠标中应用广泛,其易用性和廉价性使其非常适合应用于中低精度的运动和位置检测中。本文介绍hdns2000的功能、特点,从硬件与软件两个方面讨论hdns2000与AVR单片机的接口设计。
关键词:hdns2000 运动检测 AVR
在机电产品设计中,有时需要检测物体间的相对运动,包括运动方向和运动距离。若采用机械式的结构,比如机械鼠标中的滚轮和轨迹球,则会由于频繁的机械运动而发生故障,导致精度下降甚至失效,维修起来也不方便。另外它需要两个物体表面相接触,靠相互间的摩擦进行工作,这在某些场合是不能允许的。解决方案之一就是采用光电器件,运用光学原理来测定运动。安捷伦公司的hdns2000就是为此而设计的,虽然它的市场是针对光学鼠标,但也可以作为一种高性能而又廉价的器件运用于工业控制领域中。
1 hdns2000芯片介绍
1.1 主要功能与特性
hdns2000是安捷伦推出的高性能的光学感测芯片,它的内部包含三个基本模块:图像拾取系统、DSP处理器、PS/2或四状态输出转换器,如图1所示。在hdns2000芯片的底部有一个感光眼,如同一个小型的摄像头,不断地对物体表面进行拍照,接着将前后两次的图像送入DSP中进行处理,以判断物体移动的方向和大小,最后将数据转化为PS/2格式或者以两通道四状态格式输出。图2中的(a)与(b)分别为芯片前后两次拾取的图像。比较图2中的(a)和(b)可以看出,物体向左下方移动了一点。
hdns2000的图像拾取系统每秒钟可以拾取1500张图像,可以精确地测量最高30.48 cm/s(12 英寸/s)的运动,分辨率为400点每英寸。
1.2 引脚介绍
hdns2000的主要引脚框图如图3所示。
PS2_C:PS/2接口的时钟端。
MODE/XA:复用引脚,接高电平时表示选择PS/2模式;否则,为XA输出。
RB/XB:复用引脚,PS/2模式时为鼠标右键输入;否则,为XA输出。
MB/YB:复用引脚,PS/2模式时为鼠标中键输入;否则,为YB输出。
LB/YA:复用引脚,PS/2模式为鼠标左键输入;否则,为YA输出。
XY_LED:激光LED控制输出,在物体长时间不移动时,hdns2000可以控制LED关闭,以节约能量。
VDD3:3.3 V直流电源输入。
REFB:内部参考引脚,通过电容与VDD3相连。
PS2_D :PS/2接口的数据端。
NRESET:低电平复位引脚。
VDD5:5 V直流电源输入。
GND:电源地。
OSC2:晶振输出。
OSC1:晶振输入,外接18.432 MHz晶振。
2 hdns2000与AVR单片机接口设计
2.1 hdns2000与AT90S8015接口
hdns2000直接提供有PS/2接口,方便了PS/2鼠标的设计;但在机电控制中,为了提高效率,宜直接采用hdns2000的另一种输出模式,即X向与Y向两通道四状态输出模式。此时XA、XB指示X向移动状态,而YA、YB指示Y向移动状态。图 4为hdns2000与AVR单片机AT90S8515的接口原理图。接口主要占用了4个引脚,其它两个是可选的,所以,即使是AVR中最低档的ATtiny系列也可以方便地与hdns2000连接。
另外在对节能要求不高的场合,可以将激光LED的一端直接与地相连接,而通过控制开关三极管2N3906来主动控制hdns2000的工作状态。本文作者在设计时正是采用的这种方式。在进行系统设计时,最好采用安捷伦公司提供的套件,其中包括hdns2000芯片、HDNS2100透镜、HDNS2200 激光LED卡件及HLMP-ED80激光LED,激光波长为639 nm。
2.2 四位状态机的工作过程
在hdns2000内部有两个状态机分别指示X、Y两个方向,每个状态机又有四个稳定的状态。图5是状态机的示意图。由图5可见,一开始系统处于状态0,每当检测到物体向正向或反向移动1个单位时就转移到下一个状态,所以只要连续监测状态机状态的变化就可以判断物体移动的方向和距离。图6(a)和(b)分别为负向移动和正向移动时状态机输出的波形。值得注意的是,每个状态的最少停留时间为133μs。
2.3 接口软件设计
由状态机输出波形图可以看出,有一种很简单自然的接口设计方法,就是将状态输出引脚接到单片机的外部中断引脚上,使其在每个波形的上下边沿都产生中断,再在中断处理程序中,检测另一对应波形的电平高低,就可以判断移动方向。比如在XA的上升沿时,若XB是低电平就是左移,若XB是高电平就是右移。这种方法需要单片机提供足够多的外部中断。若同时检测X向与Y向运动,且单片机1个引脚不能同时提供上升沿和下降沿中断的情况下,就需要占用8个中断、8条引脚;而目前许多单片机仅提供2个外部中断引脚,这种要求显然较为苛刻。
另一种方式就是降低精度要求,仅在XA与YA的上升沿进行检测,此时仅需要2个外部中断引脚。但这种方式在一种极端条件下会出错,读者可以自行分析。若只检测X一个方向,则可以同时检测上下沿中断,这样不会出错。这种方式牺牲了一点对运动换向和震颤的敏感度;但编程简单,不失为一种好方法。
本文采用的是查询方式,这种方式不占用任何中断,且能够不损精度地同时检测X向与Y向运动。前面已经提过,每个状态的最小保持时间为133 μs,所以,只要将查询的周期控制在60μs之下就可以抓住每个状态的变化。对于AT90S8515,若按晶振为8 MHz计算,则只需将查询周期汇编指令数控制在450条以下就可以了。实际上,以下给出的C语言程序经过编译后只有不大于60条汇编指令,完全能够满足系统要求。
该方法的基本思想是将状态机的前一状态与现在的状态组合在同一字节内,如表1所列,寻找其中的规律,简化程序设计。表1中以PRE开头的表示前一状态的对应值。
以X向移动为例(仅看前半字节),正向移动时对应的值为0b1000、0b1110、0b0111、0b0001,负向移动时对应的值为0b0010、0b1011、0b1101、0b0100。假设状态不变的情况已经排除,且查询周期足够短,不会出现相对周期的组合值。所以只要能将以上两组值区分开来就可以了,这也正是程序中两条条件判断语句的目的。读者可以对照程序自行验证。接口程序如下:
while(1){
state=PINA&0xcc;
state_change=state^pre_state;
combo_state=sate | (pre_state>>2);
if(state_change & 0x0c)
{
if((combo_state & 0x06) == 0x06)
{asm("INC R20");goto next;}
if((combo_state | 0x09) == 0x09)
{asm("INC R20");goto next;}
asm("DEC R20");
}
next:
if(state_change & 0xc0)
{
if((temp & 0x60) == 0x60)
{asm("INC R21");goto end;}
if((temp | 0x90) == 0x90)
{asm("INC R21");goto end;}
asm("DEC R21");
}
end:pre_state=state;}
程序已经事先定义了寄存器R20与R21分别为X、Y向的计数器,用来表示X、Y向移动的距离。以上程序段利用内嵌汇编语句优化了程序结构。实际上,还可以对编译器生成的汇编代码进行优化,这里就不再详述了。
结 语
以上软硬件接口设计虽然是以功能强大的AVR单片机作为例子,但通过仔细分析不难发现,在简单的应用场合,用普通的51单片机,甚至如AT89C2051在12 MHz晶振频率下也可以实现其功能。所以整个系统会是相当廉价的。
④ 能否将Windows操作系统中的.exe文件下载到DSP芯片中执行如果可行,基本思路是什么
把windows的EXE文件放在DSP中运行?这根本不可能啊!除非是你有这EXE文件的源程序,用DSP编译器编译之后才能下载到DSP中运行。
另外,现在windows的程序都是C++写的吧?DSP的编译器好像还没有C++的呢!
⑤ 想问一下,dsp编程一般用的什么编译器
DSP产家提供的编译器,部分DSP支持GCC
⑥ 设计数字信号处理应用系统选择dsp时,应考虑哪些因素
德州仪器公司众所周知,美国德州仪器(Texas Instruments,TI)是世界上最知名的DSP芯片生产厂商,其产品应用也最广泛,TI公司生产的丁MS320系列 DSP芯片广泛应用于各个领域。TI公司在1982年成功推出了其第一代DSP芯片TMS32010,这是DSP应用历史上的一个里程碑,从此,DSP芯片开始得到真正的广泛应用。由于TMS320系列DSP芯片具有价格低廉、简单易用功能强大等特点,所以逐渐成为目前最有影响、最为成功的DSP系列处理器。目前,TI公司在市场上主要有三大系列产品:(1)面向数字控制、运动控制的TMS320C2000系列,主要包括 TMS320C24x/F24x、TMS320LC240x/LF240x、TMS320C24xA/LF240xA、TMS320C28xx等。(2)面向低功耗、手持设备、无线终端应用的TMS320C5000系列,主要包括TMS320C54x, TMS320C54xx,TMS320C55x等。(3)面向高性能、多功能、复杂应用领域的TMS320C6000系列,主要包括TMS320C62xx、TMS320C64xx、TMS320C67xx等。 美国模拟器件公司ADI公司在DSP芯片市场上也占有一定的份额,相继推出了一系列具有自己特点的DSP芯片,其定点DSP芯片有ADSP2101/2103/2105、ADSP2111/2115、ADSP2126/2162/2164、ADSP2127/2181、ADSP-BF532以及Blackfin系列,浮点DSP芯片有ADSP21000/21020、ADSP21060/21062,以及虎鲨TS101、TS201S。 Motorola公司Motorola公司推出的DSP芯片比较晚。1986年该公司推出了定点DSP处理器MC56001;1990年,又推出了与IEEE浮点格式兼容的的浮点DSP芯片MC96002。还有DSP53611、16位DSP56800、24位的DSP563XX和MSC8101等产品。 杰尔公司杰尔公司的SC-1000和SC2000两大系列的嵌入式DSP内核,主要面向电信基础设施、移动通信、多媒体服务器及其它新兴应用。DSP芯片的选型参数根据应用场合和设计目标的不同,选择DSP芯片的侧重点也各不相同,其主要参数包括以下几个方面: (1)运算速度:首先我们要确定数字信号处理的算法,算法确定以后其运算量和完成时间也就大体确定了,根据运算量.及其时间要求就可以估算DSP芯片运算速度的下限。在选择DSP芯片时,各个芯片运算速度的衡量标准主要有:•MIPS (Millions of InstructionsPer Second),百万条指令/秒,一般DSP为20-100M IPS,使用超长指令字的TMS320B2XX为2400M IPS 。必须指出的是这是定点DSP芯片运算速度的衡量指标,应注意的是,厂家提供的该指标一般是指峰值指标,因此,系统设计时应留有一定的裕量。•MOPS(Millions of OperationsPer Second),每秒执行百万操作。这个指标的问题是什么是一次操作,通常操作包括CPU操作外,还包括地址计算、DMA访问数据传输、I/0操作等。一般说MOPS越高意味着乘积一累加和运算速度越快。MOPS可以对DSP芯片的性能进行综合描述。•MFLOPS(Million Floating PointOperations Per Second),百万次浮点操作/秒,这是衡量浮点DSP芯片的重.要指标。例如TMS320C31在主频为40MHz时,处理能力为40MFLOPS,TMS320C6701在指令周期为6ns时,单精度运算可达1GFLOPS .浮点操作包括浮点乘法、加法、减法、存储等操作。应注意的是,厂家提供的该指标一般是指峰值指标,因此,系统设计时应注意留有一定的裕量。•MBPS(Million Bit Per Second),它是对总线和I/0口数据吞吐率的度量,也就是某个总线或I/0的带宽。例如对TMS320C6XXX, 200MHz时钟、32bit总线时,总线数据吞吐率则为800Mbyte/s或6400MBPS。•ACS(Multiply-AccumulatesPer Second),例如TMS320C6XXX乘加速度达300MMACS-600MMACS。•指令周期,即执行一条指令所需的时间,通常以ns(纳秒)为单位,如TMS320LC549-80在主频为80MHz是的指令周期为12.5ns.•MAC时间,执行一次乘法和加法运算所花费的时间:大多数DSP芯片可以在一个指令周期内完成一次MAC运算。•FFT/FIR执行时间,运行一个N点FFT或N 点FIR程序的运算时间。由于FFT运算/FIR运算是数字信号处理的一个典型算法,因此,该指标可以作为衡量芯片性能的综合指标。表1是基于上述某些参数对一些DSP芯片所作的比较。(2)运算精度:一般情况下,浮点DSP芯片的运算精度要高于定点DSP芯片的运算精度,但是功耗和价格也随之上升。一般定点DSP芯片的字长为16位、24位或者32位,浮点芯片的字长为32位。累加器一般都为32位或40位。定点DSP的特点是主频高、速度快、成本低、功耗小,主要用于计算复杂度不高的控制、通信、语音/图像、消费电子产品等领域。通常可以用定点器件解决的问题,尽量用定点器件,因为它经济、速度快、成本低,功耗小。但是在编程时要关注信号的动态范围,在代码中增加限制信号动态范围的定标运算,虽然我们可以通过改进算法来提高运算精度,但是这样做会相应增加程序的复杂度和运算量。浮点DSP的速度一般比定点DSP处理速度低,其成本和功耗都比定点DSP高,但是由于其采用了浮点数据格式,因而处理精度,动态范围都远高于定点DSP,适合于运算复杂度高,精度要求高的应用场合;即使是一般的应用,在对浮点DSP进行编程时,不必考虑数据溢出和精度不够的问题,因而编程要比定点DSP方便、容易。因此说,运算精度要求是一个折衷的问题,需要根据经验等来确定一个最佳的结合点。(3)字长的选择:一般浮点DSP芯片都用32位的数据字,大多数定点DSP芯片是16位数据字。而Motorola公司定点芯片用24位数据字,以便在定点和浮点精度之间取得折衷。字长大小是影响成本的重要因素,它影响芯片的大小、引脚数以及存储器的大小,设计时在满足性能指标的条件下,尽可能选用最小的数据字。(4)存储器等片内硬件资源安排:包括存储器的大小,片内存储器的数量,总线寻址空间等。片内存储器的大小决定了芯片运行速度和成本,例如TI公司同一系列的DSP芯片,不同种类芯片存储器的配置等硬件资源各不相同。通过对算法程序和应用目标的仔细分析可以大体判定对DSP芯片片内资源的要求。几个重要的考虑因素是片内RAM和ROM的数量、可否外扩存储器、总线接口/中断/串行口等是否够用、是否具有A/D转换等。(5)开发调试工具:完善、方便的的开发工具和相关支持软件是开发大型、复杂DSP系统的必备条件,对缩短产品的开发周期有很重要的作用。开发工具包括软件和硬件两部分。软件开发工具主要包括:C编译器、汇编器、链接器、程序库、软件仿真器等,在确定DSP算法后,编写的程序代码通过软件仿真器进行仿真运行,来确定必要的性能指标。硬件开发工具包括在线硬件仿真器和系统开发板。在线硬件仿真器通常是JTAG周边扫描接口板,可以对设计的硬件进行在线调试;在硬件系统完成之前,不同功能的开发板上实时运行设计的DSP软件,可以提高开发效率。甚至在有的数量小的产品中,直接将开发板当作最终产品。(6)功耗与电源管理:一般来说个人数字产品、便携设备和户外设备等对功耗有特殊要求,因此这也是一个该考虑的问题。它通常包括供电电压的选择和电源的管理功能。供电电压一般取得比较低,实施芯片的低电压供电,通常有3.3V,25V,I8V, 0.9V等,在同样的时钟频率下,它们的功耗将远远低于5V供电电压的芯片。加强了对电源的管理后,通常用休眠、等待模式等方式节省功率消耗。例如TI公司提供了详细的、功能随指令类型和处理器配置而改变的应用说明。(7)价格及厂家的售后服务因素:价格包括DSP芯片的价格和开发.工具的价格。如果采用昂贵的DSP芯片,即使性能再高,其应用范围也肯定受到一定的限制。但低价位的芯片必然是功能较少、片内存储器少、性能上差一些的,这就带给编程一定的困难。因此,要根据实际系统的应用情况,确定一个价格适中的DSP芯片。还要充分考虑厂家提供的的售后服务等因素,良好的售后技术支持也是开发过程中重要资源(8)其他因素:包括DSP芯片的封装形式、环境要求、供货周期、生命周期等。DSP应用选型型举例面向数字控制、运动控制的DSP系统开发的DSP芯片选型面向数字控制、运动控制主.要有磁盘驱动控制、引擎控制、激光打印机控制、喷绘机控制、马达控制、电力系统控制、机器人控制、高精度伺服系统控制、数控机床等。当然这些主要是针对数字运动控制系统设计的应用,在这些系统的控制中,不仅要求有专门用于数字控制系统的外设电路,而且要求芯片具有数字信号处理器的一般特征。例如在控制直流无刷电动机的DSP控制系统中,直流无刷电机运行过程要进行两种控制,一种是转速控制,也即控制提供给定子线圈的电流;另一种是换相控制,在转子到达指定位置改变定子导通相,实现定子磁场改变,这种控制实际上实现了物理电刷的机制。因此这种电机需要有位置反馈机制,比如霍尔元件、光电码盘,或者利用梯形反电动势特点进行反电动势过零检测等。电机速度控制也是根据位置反馈信号,计算出转子速度,再利用PI或PID等控制方法,实时调整PWM占空比等来实现定子电流调节。因此,控制芯片要进行较多的计算过程。当然也有专门的直流无刷电机控制芯片;但一般来说,在大多数应用中,除了电机控制,总还需要做一些其他的控制和通信等事情,所以,选用带尸WIVI ,同时又有较强数学运算功能的芯片也是一种很好的选择。Motorola的数字信号处理器DSP568xx系列整合了通用数字信号处理器快速运算功能和单片机外围丰富的特点,使得该系列特别适合于那些要求有较强的数据处理能力,同时又要有较多控制功能的应用中,对直流无刷电机的控制就是这一系列DSP的典型应用之一。除此之外,数字运动控领域还有TI公司的丁M S320C24x系列,TMS320Lx240xx系列,特别是TMS320LF2407A在控制方面得到了非常广泛的应用,TMS320LF2407A作为一款专门面向数字控制系统进行优化的通用可编程微处理器,不仅具有低功耗和代码保密的特点,而且它集成了极强的数字信号处理能力,又集成了数字控制系统所必需的输入、输出、A/D转换、事件捕捉等外设,其时钟频率为40MHz,指令周期小于50ns,采用改进的哈佛结构和流水线技术,在一个指令周期内可以执行几条指令。从运行速度,精度角度来讲上述两款芯片相差无几,但是TMS320LF2407A的调试开发环境CCCS)更加成熟,可参考的资料也更丰富,这样无疑会减少开发周期。面向低功耗、手持设备、无线终 端应用的DSP芯片选型C54X, C54XX, C55X相比其它一系列的主要特点是低功耗,所以最适合个人与便携式上网以及无线通信应用,如手机、PDA、GPS等应用。处理速度在80---400M IPS之间。C54XX和C55XX一般只具有McBSP同步串口、HPI并行接口、定时器、DMA等外设。值得注意的是C55XX提供了EMIF外部存储器扩展接口,可以直接使用SDRAM,而C54XX则不能直接使用。
⑦ 什么是dsp技术
20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛的应用。数字信号处理是利用计算机或专用处理设备,以数字形式对信号进行采集、变换、滤波、估值、增强、压缩、识别等处理,以得到符合人们需要的信号形式。数字信号处理是围绕着数字信号处理的理论、实现和应用等几个方面发展起来的。数字信号处理在理论上的发展推动了数字信号处理应用的发展。反过来,数字信号处理的应用又促进了数字信号处理理论的提高。而数字信号处理的实现则是理论和应用之间的桥梁。数字信号处理是以众多学科为理论基础的,它所涉及的范围极其广泛。例如,在数学领域,微积分、概率统计、随机过程、数值分析等都是数字信号处理的基本工具,与网络理论、信号与系统、控制论、通信理论、故障诊断等也密切相关。近来新兴的一些学科,如人工智能、模式识别、神经网络等,都与数字信号处理密不可分。可以说,数字信号处理是把许多经典的理论体系作为自己的理论基础,同时又使自己成为一系列新兴学科的理论基础。世界上第一个单片DSP芯片应当是1978年AMI公司发布的S2811,1979年美国Intel公司发布的商用可编程器件2920是DSP芯片的一个主要里程碑。这两种芯片内部都没有现代DSP芯片所必须有的单周期乘法器。1980年,日本NEC公司推出的μPD7720是第一个具有乘法器的商用DSP芯片。在这之后,最成功的DSP芯片当数美国德州仪器公司(TexasInstruments,简称TI)的一系列产品。TI公司在1982年成功推出其第一代DSP芯片TMS32010及其系列产品TMS32011、TMS320C10/C14/C15/C16/C17等,之后相继推出了第二代DSP芯片TMS32020、TMS320C25/C26/C28,第三代DSP芯片TMS320C30/C31/C32,第四代DSP芯片TMS320C40/C44,第五代DSP芯片TMS320C5X/C54X,第二代DSP芯片的改进型TMS320C2XX,集多片DSP芯片于一体的高性能DSP芯片TMS320C8X以及目前速度最快的第六代DSP芯片TMS320C62X/C67X等。TI将常用的DSP芯片归纳为三大系列,即:TMS320C2000系列(包括TMS320C2X/C2XX)、TMS320C5000系列(包括TMS320C5X/C54X/C55X)、TMS320C6000系列(TMS320C62X/C67X)。如今,TI公司的一系列DSP产品已经成为当今世界上最有影响的DSP芯片。TI公司也成为世界上最大的DSP芯片供应商,其DSP市场份额占全世界份额近50%。DSP处理器与通用处理器的比较考虑一个数字信号处理的实例,比如有限冲击响应滤波器(FIR)。用数学语言来说,FIR滤波器是做一系列的点积。取一个输入量和一个序数向量,在系数和输入样本的滑动窗口间作乘法,然后将所有的乘积加起来,形成一个输出样本。 类似的运算在数字信号处理过程中大量地重复发生,使得为此设计的器件必须提供专门的支持,促成了了DSP器件与通用处理器(GPP)的分流:1、对密集的乘法运算的支持GPP不是设计来做密集乘法任务的,即使是一些现代的GPP,也要求多个指令周期来做一次乘法。而DSP处理器使用专门的硬件来实现单周期乘法。DSP处理器还增加了累加器寄存器来处理多个乘积的和。累加器寄存器通常比其他寄存器宽,增加称为结果bits的额外bits来避免溢出。同时,为了充分体现专门的乘法-累加硬件的好处,几乎所有的DSP的指令集都包含有显式的MAC指令。2、存储器结构传统上,GPP使用冯.诺依曼存储器结构。这种结构中,只有一个存储器空间通过一组总线(一个地址总线和一个数据总线)连接到处理器核。通常,做一次乘法会发生4次存储器访问,用掉至少四个指令周期。大多数DSP采用了哈佛结构,将存储器空间划分成两个,分别存储程序和数据。它们有两组总线连接到处理器核,允许同时对它们进行访问。这种安排将处理器存贮器的带宽加倍,更重要的是同时为处理器核提供数据与指令。在这种布局下,DSP得以实现单周期的MAC指令。还有一个问题,即现在典型的高性能GPP实际上已包含两个片内高速缓存,一个是数据,一个是指令,它们直接连接到处理器核,以加快运行时的访问速度。从物理上说,这种片内的双存储器和总线的结构几乎与哈佛结构的一样了。然而从逻辑上说,两者还是有重要的区别。GPP使用控制逻辑来决定哪些数据和指令字存储在片内的高速缓存里,其程序员并不加以指定(也可能根本不知道)。与此相反,DSP使用多个片内存储器和多组总线来保证每个指令周期内存储器的多次访问。在使用DSP时,程序员要明确地控制哪些数据和指令要存储在片内存储器中。程序员在写程序时,必须保证处理器能够有效地使用其双总线。此外,DSP处理器几乎都不具备数据高速缓存。这是因为DSP的典型数据是数据流。也就是说,DSP处理器对每个数据样本做计算后,就丢弃了,几乎不再重复使用。3、零开销循环如果了解到DSP算法的一个共同的特点,即大多数的处理时间是花在执行较小的循环上,也就容易理解,为什么大多数的DSP都有专门的硬件,用于零开销循环。所谓零开销循环是指处理器在执行循环时,不用花时间去检查循环计数器的值、条件转移到循环的顶部、将循环计数器减1。与此相反,GPP的循环使用软件来实现。某些高性能的GPP使用转移预报硬件,几乎达到与硬件支持的零开销循环同样的效果。4、定点计算大多数DSP使用定点计算,而不是使用浮点。虽然DSP的应用必须十分注意数字的精确,用浮点来做应该容易的多,但是对DSP来说,廉价也是非常重要的。定点机器比起相应的浮点机器来要便宜(而且更快)。为了不使用浮点机器而又保证数字的准确,DSP处理器在指令集和硬件方面都支持饱和计算、舍入和移位。5、专门的寻址方式DSP处理器往往都支持专门的寻址模式,它们对通常的信号处理操作和算法是很有用的。例如,模块(循环)寻址(对实现数字滤波器延时线很有用)、位倒序寻址(对FFT很有用)。这些非常专门的寻址模式在GPP中是不常使用的,只有用软件来实现。 6、执行时间的预测大多数的DSP应用(如蜂窝电话和调制解调器)都是严格的实时应用,所有的处理必须在指定的时间内完成。这就要求程序员准确地确定每个样本需要多少处理时间,或者,至少要知道,在最坏的情况下,需要多少时间。如果打算用低成本的GPP去完成实时信号处理的任务,执行时间的预测大概不会成为什么问题,应为低成本GPP具有相对直接的结构,比较容易预测执行时间。然而,大多数实时DSP应用所要求的处理能力是低成本GPP所不能提供的。这时候,DSP对高性能GPP的优势在于,即便是使用了高速缓存的DSP,哪些指令会放进去也是由程序员(而不是处理器)来决定的,因此很容易判断指令是从高速缓存还是从存储器中读取。DSP一般不使用动态特性,如转移预测和推理执行等。因此,由一段给定的代码来预测所要求的执行时间是完全直截了当的。从而使程序员得以确定芯片的性能限制。7、定点DSP指令集定点DSP指令集是按两个目标来设计的:·使处理器能够在每个指令周期内完成多个操作,从而提高每个指令周期的计算效率。·将存贮DSP程序的存储器空间减到最小(由于存储器对整个系统的成本影响甚大,该问题在对成本敏感的DSP应用中尤为重要)。为了实现这些目标,DSP处理器的指令集通常都允许程序员在一个指令内说明若干个并行的操作。例如,在一条指令包含了MAC操作,即同时的一个或两个数据移动。在典型的例子里,一条指令就包含了计算FIR滤波器的一节所需要的所有操作。这种高效率付出的代价是,其指令集既不直观,也不容易使用(与GPP的指令集相比)。GPP的程序通常并不在意处理器的指令集是否容易使用,因为他们一般使用象C或C++等高级语言。而对于DSP的程序员来说,不幸的是主要的DSP应用程序都是用汇编语言写的(至少部分是汇编语言优化的)。这里有两个理由:首先,大多数广泛使用的高级语言,例如C,并不适合于描述典型的DSP算法。其次,DSP结构的复杂性,如多存储器空间、多总线、不规则的指令集、高度专门化的硬件等,使得难于为其编写高效率的编译器。即便用编译器将C源代码编译成为DSP的汇编代码,优化的任务仍然很重。典型的DSP应用都具有大量计算的要求,并有严格的开销限制,使得程序的优化必不可少(至少是对程序的最关键部分)。因此,考虑选用DSP的一个关键因素是,是否存在足够的能够较好地适应DSP处理器指令集的程序员。8、开发工具的要求因为DSP应用要求高度优化的代码,大多数DSP厂商都提供一些开发工具,以帮助程序员完成其优化工作。例如,大多数厂商都提供处理器的仿真工具,以准确地仿真每个指令周期内处理器的活动。无论对于确保实时操作还是代码的优化,这些都是很有用的工具。GPP厂商通常并不提供这样的工具,主要是因为GPP程序员通常并不需要详细到这一层的信息。
⑧ 同一C语言程序写进不同型号的DSP芯片,他们结果相同吗
看看你所用到的功能在这两个不同型号的芯片说明书里软件操作上,功能上是否有差别。如果没有差别,编译正常 且外围电路都一样能正常工作的话,结果电路所完成的功能一般都会相同。只是不同芯片,性能不一样,执行速度等都有所差别