DSP的特点
DSP的分类
分 类 标 准 | 类 型 | 特性 |
---|---|---|
基础特性 | 静态DSP | 在一定始终频率范围内的任何频率上都能正常工作,除计算速度外,没有性能下降 |
基础特性 | 一致性DSP | 对于两种或两种以上的DSO芯片,其指令集和相应机器代码及引脚结构相互兼容 |
用途 | 通用型DSP | 可用指令编程的DSP芯片,通过编程可实现复杂的数字信号处理算法,具有较强的处理能力 |
用途 | 专用型DSP | 为特定DSP运算而设计,针对某一算法,由内部硬件电路实现,适用于数字滤波、FFT和卷积等特色运算;主要用于对信号处理速度要求较高的特殊场合 |
数据格式 | 定点DSP | 以定点数据格式工作,大多数定点DSP芯片采用16位定点运算 |
数据格式 | 浮点DSP | 以浮点数据格式工作,浮点格式包括自定义浮点格式和IEEE标准浮点格式 |
DSP芯片的选择
- 运算速度
- 运算精度
- 功耗
- 价格
- 硬件资源
- 开发工具
DSP系统的构成
DSP系统的特点
- 接口方便,易于模块化设计和集成
- 可编程,易于重复使用
- 快速稳定,精度高
DSP系统的设计过程
- 根据需求确定DSP系统的性能指标
- 算法研究及模拟实现和功能验证
- 选择适合的DSP芯片和外围组件
- 软件设计及调试
- 硬件设计及调试
- 系统集成及测试
TMS320C6x_58">TMS320C6x简介
TMS320C6x_DSP8000MIPSTMS320C6x__DSP_59">TMS320C62x/C64x处理器为定点DSP,TMS320C67x处理器为浮点DSP。TMS320C62x、TMS320C64x及TMS320C67x间代码兼容.TMS320C6x DSP最高可达到8000MIPS(百万条指令每秒)的运算速度,TMS320C6x DSP包含程序存储器和多种大小不同的数据存储器,其中程序存储器被用作程序缓存
TMS320C64x结构 DSP结构框图
TMS320C64x+DSP结构框图
TMS320DM6437的基本结构
TMS320DM6437采用TMS320C64x+ DSP内核,32位定点处理器,工作频率可达700MHz,处理速度最高可达5600MIPS。
TMS320DM6437具有64个32位通用寄存器和8个独立计算功能单元,这些功能单元包括2个用于存储32位结果的乘法器和6个算术逻辑单元(ALU)。
TMS320DM6437的内核采用TI开发的第三代高性能支持超长指令字(VLIW)的VelociTI.2结构
TMS320DM6437集成了丰富的片内外设,包括以下4部分
- 系统外设
- 多种串口
- 连接器
- 外部存储器接口
CPU的组成
包括8个独立的计算功能单元、2个寄存器组和2条数据通路
软件开发环境及程序优化
CCS集成开发环境
TMS320 CCS由以下四部分组件构成:
① TMS320代码生成工具,如汇编器、链接器、C/C++编译器和建库工具等。
② CCS集成开发环境(Integrated Developing Environment,IDE),包括编辑器、工程管理工具和调试工具等。
③ DSP/BIOS(Basic Input and Output System)插件及应用程序接口API(Application Program Interface)。
④ RTDX(Real Time Data Exchange)实时数据交换插件、主机(Host)接口及相应的API。
面向DSP的C/C++语言程序设计流程
1)C语言代码编写测试
在实际的DSP应用中,直接用汇编代码编写,虽然优化效率很高,可是实现的难度却很大,所以一般先用C语言来实现,然后编译运行,利用C64x开发环境的profile、clock工具测试程序运行时间,若不能满足要求,则进行第二步。
2)C语言级的优化
选择C64x开发环境提供的优化方式,以及充分运用其他技巧优化C代码,若还不能满足效率要求,则进行第三步。
3) 汇编级的优化
将上一阶段C程序中优化效率较低的部分提出来,用线性汇编语言编写,利用汇编优化器进行优化。
C语言源代码的优化
1)选用C编译器提供的优化选项
-o:使能软件流水和其他优化方法。
-pm:使能程序级优化。
-mt:使能编译器假设程序中没有数据存储混淆,可进一步优化代码。
-mg:使能分析(profile)优化代码。
-ms:确保不产生冗余循环,从而减小代码尺寸。
-mh:允许投机执行。
-mx:使能软件流水循环重试,基于循环次数对循环试用多个方案,以便选择最佳方案。
2)数据类型
C64xDSP内部数据总线和寄存器宽度是32位的。一般遵守的规则如下:
(1)在使用过程中,注意int和long两种类型的宽度不一致,long型数据为40位,会产生额外的指令和占用更多的功能单元。
(2)在使用loop counts时应尽量使其为int型或unsigned int型数据,以避免不必要的符号位扩展。
(3)尽量使用short类型进行乘法运算,因为这种数据类型适应C6000中的16位乘法器。如进行一次short* short运算只需1个时钟周期, 而进行一次int* int运算则需5个时钟周期。
(4)循环计数器应使用int或无符号int类型,不用short。
(5)short型数据的int处理,C64xDSP具有双16bit扩充功能,芯片能在一个周期内完成双16bit的乘法、加减法、比较和移位等操作。在设计时,当对连续的short型数据流操作时,应该转化成对int型数据流的操作,这样一次可以把两个16位的数据读入一个32位的寄存器,然后用内部函数来对它们处理(如_sub2等)。充分运用双16bit扩充功能,一次可以进行两个16bit数据的运算,速度将提升一倍。
3)减小存储器相关性
设计中常采用关键字const来指定目标,const表示一个变量或一个变量的存储单元保持不变。因此,在代码中加入关键字const,可以去除指令间的相关性。
4)使用内联函数(Intrinsics)
内联函数是C64x编译器提供的专门函数,它们与嵌入式的汇编指令一一对应,C编译器以内联函数的形式支持所有C语言代码不易表达的指令,其目的是快速优化C源程序。在C源程序中调用内联函数,与调用一般的函数相同,只不过内联函数名称前有下划线作特殊标识。当汇编指令功能不易采用C语言表达时,可采用内联函数表示。
5)尽量少进行函数调用
函数调用时,要将PC和一些寄存器压栈保存,函数返回时,则将这些寄存器出栈返回,增加了一些不必要的操作。所以一些小的函数,最好是用适当的内联函数代替直接写入主函数里,一些调用不多的函数,也可以直接写入主函数内,这样可减少不必要的操作,提高速度。但是这样往往会增加程序的长度,因此是一种利用空间换取时间的办法。
6)使用逻辑运算代替乘除运算
在DSP里,乘除运算指令的执行时间要远远超过逻辑移位指令,尤其是除法指令,在设计的时候,可以根据实际情况,进行一些调整,尽量用逻辑移位运算来代替乘除运算,以加快指令的运行时间。
7)软件流水线技术的使用
在编译代码时,可以选择编译器的-o2或-o3选项,编译器将根据程序尽可能地安排软件流水线。使用软件流水线还有下面几点限制:
- 循环结构不能包含代码调用,但可以包含内联函数;
- 循环计数器应该是递减的;
- 循环结构不能包含break,if语句不能嵌套,条件代码应当尽量简单;
- 循环结构中不能包含改变循环计数器的代码;
- 循环体代码不能过长,因为寄存器(32个)的数量有限,应该分解为多个循环;
- 在软件流水线的运用上,尽量使复杂的循环分解成简单的小循环,以避免寄存器的数量不够;对于过于简单的循环,应该适当展开,以增加代码数量,增加流水线中的迭代指令。