内容发布更新时间 : 2024/12/23 19:55:00星期一 下面是文章的全部内容请认真阅读。
一、 TI公司DSP分类及代表产品简介
TI的DSP经过完善的测试出厂时,都是以 TMS320为前缀。在众多款型DSP中,TI把市场销量好和前景看好的DSP归为三大系列而大力推广,TI也称之为三个平台。
TMS320C6000平台,包含定点C62x和C64x以及浮点C67x。其追求的是至高性能,最近新推出的芯片速度高达1GHZ,适合宽带网络、图像、影像、雷达等处理应用。
TMS320C5000 平台,包含代码兼容的定点C54x和C55x。其提供性能、外围设备、小型封装和电源效率的优化组合,适合便携式上网、语音处理及对功耗有严格要求的地方。 DSP的传统设计往往是采取主从式结构:在一块电路板上,DSP做从机,负责数字信号处理运算;外加一块嵌入式微处理器做主机,来完成输入、控制、显示等其他功能。为此,TI专门推出了一款双核处理器OMAP,包含有一个ARM和一个C5000系列DSP,OMAP处理器把主从式设计在芯片级上合二为一,一个典型的应用实例为诺基亚手机。 TMS320C2000 平台,包含16位C24xx和32位C28xx的定点DSP。C24xx系列市场销量很好,而对C28xx系列, TI认为很有市场潜力而大力推广。C2000针对控制领域做了优化配置,集成了了众多的外设,适合逆变器、马达、机器人、数控机床、电力等应用领域。
另外,OMAP 系列:OMAP 处理器集成ARM 的命令及控制功能,另外还提供DSP 的低功耗,实时信号处理能力,最适合移动上网设备和多媒体家电。
其他系列的DSP 曾经有过风光,但现在都非TI 主推产品了,除了C3X 系列外,其他基本处于淘汰阶段,如:C3X 的浮点系列:C30,C31,C32 C2X 和C5X 系列:C20,C25,C50, 每个系列的DSP 都有其主要应用领域。
二、 简述实时信号处理的含义。
要求在限定的时间内将采集的数据在现场处理完成并得到一定的结果,即信号处理的时间要小于或者等于下一批数据输入时间,有时甚至要求在特定的时间、地点来完成信号处理。
三、 数字信号处理中最典型的运算有哪些?
离散傅里叶变换(DFT)和卷积是信号处理中两个最基本也是最常用的运算。
核心算法是构成多数数字信号处理系统的基本模块, 包括:FFT,向量加,向量点积,滤波器,控制(转移、压栈、出栈、位操作)
四、 C6000系列DSP为什么适合与数字信号处理的需要?从DSP的cpu结构、总线结构、存储器结构、专用功能单元、指令系统等方面阐述。
TMS320C6000产品是美国TI公司于1997年推出的dsp芯片,该DSP芯片定点、浮点兼容,其中,定点系列是TMS320C62xx系列,浮点系列是TMS320C67xx系列。
CPU结构:1.定点/浮点系列兼容DSP 2.具有VelociTITM先进VLIW结构内核 3.具有类似RISC的指令集 4.片内集成大容量SRAM,最大可达8bit 6.内置高效率协处理器7.片内提供多重集成外设(不同芯片的资源不同)等多种功能结构,满足数字信号处理的精度及效率需要,另外其CPU用了哈佛结构,程序总线和数据总线分开,取指令与执行指令可并行,时效性提高。
总线:cpu内部程序总线和数据总线分开,取指令与执行指令可并行。但偏外的存储器和总线都不分开。C6000系列DSP才用了新的VILW结构,片内提供8个独立的运算单元,256位的程序总线,2套32位的数据总线和1套32位的DMA专用总线。灵活的总线结构大大缓解了数据瓶颈对系统性能的限制。
存储区:C6000系统dsp内部集成有1-8bit的程序RAM和数据RAM,对于有些片种,这些存储器还可以配置为程序Cache或者数据Cache来使用。
专用功能单元:C6000片内有8个并行的处理单元,分为相同的两组,包括2个乘法器和6个ALU。这8个功能单元最多可以在1个周期内同时执行8条32位指令,芯片最高时钟频率为300MHz(67xx系列),且内部8个处理单元并行运行时,其最大处理能力可达到1600MIPS。郭功能单元的并且操作使得DSO在相同时间内能够完成更多的操作,提高了程序的执行速度。
指令系统:DSP的体系结构采用超长指令字(vliw)结构,单指令字长为32位,指令包里有8条指令,总字长达到256位。执行指令的功能单元已经在编译时分配好,程序运行时通过专门的指令分配模块,可以将每个256为的指令包同时分配到8个处理单元,并有8个单元同时运行。 综上看出,C6000 DSP适合数字信号处理的需要。
五、 简述C6000系列定点DSP的指令流水线结构。 指令流水线的工作方式,即一条指令的执行分为若干个阶段完成,就像经过工厂里的生产流水线上的一道道工序一样,而同时,在流水线的其它阶段又分别有其它的指令在顺序地执行着。C6000中指令均按照取指(Fetch)译码(Decode)和执行(Execute)3个流水线运行,每一级又包含几个节拍,如下图所示C6000系列定点DSP指令流水线结构:
六、 简述C6000系列DSP CPU 有那几个功能单元,每个功能单元的作用是什么? 4个主要单元,指令缓冲单元I,程序流程单元P,地址流程单元A,数据计算单元D,
指令缓冲单元I由指令队列和指令译码器构成,接受程序指令代码,放到IBQ中,指令译码器从指令缓冲队列中取指令进行译码,译码后数据分别送到其他三个单元中处理。P单元由程序地址产生逻辑电路和一组寄存器组构成,主要功能产生所有I单元读取指令所需的程序地址、控制指令读取顺序。A单元:功能产生读写数据空间的地址;D单元:包括了CPU的主要计算部件,完成高效的计算功能。
CPU结构分三个机构:程序读入及指令分配、译码机构;程序执行机构:两个数据通路,8个功能单元等,其中.L1、.L2、.S1、.S2是主要的算术逻辑单元,.M1.M2是乘法器,主要完成乘法运算,.D1.D2是数据寻址单元,唯一能产生地址的功能单元。指令测试、仿真端口及控制逻辑。
七、 何谓线性汇编?并行汇编?
线性汇编语言主要用途是编写需要优化的算法,其代码不需要给出汇编代码必须指出的所有信息,可对信息选择,也可由汇编优化器确定。其文件使用“.sa”,扩展名仅对指定的代码段进行优化,指定代码段外的代码被拷贝为输出“.asm”文件,线性汇编过程可以:传递参数,返回结果,使用符号变量,不考虑流水线问题。
并行汇编 :它是直接采用DSP中各个功能单元作为操作对象,根据TI规定的汇编语言书写规范要求来完成程序的编写,在程序编写时要充分考虑寄存器的使用、各个指令的时延以及指令间的并行关系。根据尽量使软件流水满负荷执
行的规则,合理的书写并行汇编指令,能够极大的提高程序执行的速度,充分发挥出DSP的优势。
八、 何谓超标量处理器?何谓超流水处理器?何谓超标量超流水处理器?(理解) 超标量是通过内置多条流水线来同时执行多个处理器,其实质是以空间换取时间。
超流水是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间。 超标量超流水处理器则是指在超标量和超流水两种技术间,找到一个最佳结合点,这样既能解决操作的时间问题,又能满足处理器对空间的要求。
九、 何谓软件流水优化?软件流水优化有什么专用?
DSP适合对大量数据做相同的运算,相同的工作放在一起完成,形成循环,便于软件流水。
软件流水:是一种重要的指令调度技术,它通过编排循环指令,重叠地执行不同的循环体来提高ILP。
而软件流水优化正是利用DSP处理机指令级的并行性,满足各种资源限制,实现资源合理分配、充分使用算法到DSP结构的映射,使单周期内尽可能多的功能单元在执行指令。
专用:产生高性能循环代码,执行并行指令,填充延迟间隙,功能单元使用最大化,由开发工具产生,由编译器选项-o2或o3引入,汇编优化器/C优化器产生,循环中工作太多,导致资源不够(如:寄存器不够分配),则可以拆分循环或展开循环。消除冗余循环。充分利用指令局部性和数据局部性的特点,推测执行。
十、数字信号处理程序优化分为哪几个层次?优化的步骤是什么?每个步骤有哪些优化措施?(注:不知道题目问的步骤是指优化的总步骤,还是指每个层次优化的步骤,故答案不全面) 三个层次:1.C语言级的优化 2. 线性汇编优化3. 手工汇编优化
(优化步骤:1、用C语言实现算法并验证写2、C6x线性汇编代码3、画相关图4、分配功能单元和寄存器5、建编排表6、将编排表转换为C6x汇编代码)
1.C语言级的优化 :使用编译选项、软件流水、内联函数和循环展开等方法来对代码进行优化,以提高代码执行速度,并减小代码尺寸。 2. 线性汇编优化:写线性汇编程序,然后用汇编优化器进行优化,生成高性能的代码。使用C6000的剖析工具(Profiling Tools)可以找到代码中最耗费时间的部分,就是这部分需要用线性汇编重写。需要知道:汇编优化器伪指令、影响汇编优化器行为的选项、TMS320C6000指令、线性汇编源语句语法、指定寄存器或寄存器组、指定功能单元、源代码注释等。
3. 手工汇编优化:编写C程序并不经过任何优化,使用-On优化选项,需要优化的代码转换为线性汇编,手工汇编并优化。优化措施:并行指令,填充延迟间隙,展开循环,存取带宽优化(使用LDW/LDDW),软件流水等。
十、CMD文件的作用是什么?
CMD是连接命令文件,包含了DSP和目标板的存储器空间的定义以及代码段、数据段是如何分配到这些存储器空间的。是32位的dos命令提示符,有中文提示;而command是16位的dos命令提示符,全是英文.区别就是:一个是中文帮助,一个是英文帮助,功能没有多大区别.
十一、以实验一为例简述上机实验步骤。
实验步骤
1、开机:进入Win XP系统,双击桌面上CCS3.3图标,选择open——DM6437 Little Endian Simulator ,进入DSP软件集成开发环境,或者选择open——c6437 510 plus进入DSP硬件集成开发环境(使用实验箱做实验,先连接好实验箱及仿真器等方可开机)。
2、编辑文件:选择File-New—Source File菜单,编辑好C程序文件(*.c)、汇编程序文件(*.asm)、头文件(*.asm)及链接命令文件(*.cmd),并保存在D盘DSPLAB\\LAB1文件夹中。
3、创建工程项目:选择Project-New,出现—对话框,在project栏(第一行)填写项目名称,并选定项目的位置(D:\\DSPLAB\\LAB1),然后单击“完成”按钮,这样就新建了一个工程项目,该项目用来管理各种文件,便于编译、调试。
注意:路径、文件夹、文件名中不能含有汉字,且第一个字母不能是数字。
4、添加文件:将编辑好的三个文件添加到刚建好的工程项目中,选择Project-Add Files to Project,出现一个对话框,选择文件夹(D:\\DSPLAB\\LAB1)并选中C文件、汇编程序文件、头文件、cmd文件,单击“打开”按钮就将这四个文件添加到该工程中了。
5、编译汇编程序:选择Project—Compile File,分别编译主程序及头文件,修改程序中的错误,再编译,直到无错误出现。编译后的文件为OBJ文件。
6、链接:选择Project—Build或Rebuild All,链接各OBJ文件,若有错误出现应修改错误(错误应在cmd文件中),再链接,直到无错误出现。链接生成可执行的out文件。
7、下载out文件:选择File—Load Program,在debuge文件夹中选中out文件(文件名与工程项目同名),单击“打开”按钮,这样out文件就下载到DSP中了。
调试:选择debuge—Step Into 单步执行代码或者选择debuge—Run连续运行代码(debuge—Halt停止运行)。单步运行或运行结束后选择View-Memory和View-Registers-CPU Registers/Peripheral Regs查看存储器和寄存器中的数据。如果最后的结果有错误,则应查找原因修改程序并重复步骤5 ~ 步骤8,直到结果正确为止。
十二、编写矢量点积的C程序、线性汇编程序(画出相关图)、并行汇编程序、软件流水程序。 1、C语言代码
int DSP_dotprodc( const short *m, const short *n, int count) { int i;
int prod, sum = 0; #ifndef NOASSUME
_nassert((int)m % 8 == 0); /* Double-word aligned */ _nassert((int)n % 8 == 0); /* Double-word aligned */ _nassert((int)m % 16 != (int)n % 16); /* In different banks */ #pragma MUST_ITERATE(4,,4); /* count >= 4, mult of 4 */ #endif
for (i = 0; i < count; i++) {
prod = m[i] * n[i]; sum += prod; }
return sum; }
2线性汇编代码
.text
.global _DSP_dotprodsa
_DSP_dotprodsa: .cproc A_m, B_n, A_count .no_mdep
.reg A_reg1:A_reg0, B_reg1:B_reg0 .reg A_prod, B_prod, A_sum, B_sum, A_i ZERO A_sum ZERO B_sum
SHRU A_count, 2, A_i SUB A_i, 2, A_i .mptr A_m, x + 0, 8 .mptr B_n, x + 8, 8 loop: .trip 8
LDDW .1 *A_m++, A_reg1:A_reg0 LDDW .2 *B_n++, B_reg1:B_reg0 DOTP2 A_reg1, B_reg1, A_prod DOTP2 B_reg0, A_reg0, B_prod ADD A_sum, A_prod, A_sum ADD B_sum, B_prod, B_sum BDEC loop, A_i
ADD A_sum, B_sum, A_sum .return A_sum .endproc .end
3、并行汇编代码
.sect \.global _DSP_dotprod64 _DSP_dotprod64:
*=====================SYMBOLIC REGISTER ASSIGNMENTS ===================== * .asg A4, A_m ; pointer to vector m .asg B4, B_n ; pointer to vector n
.asg A6, A_count ; number of elements in each vector .asg A0, A_i ; loop count .asg A16, A_sum ; partial sum a
.asg A17, A_prod ; sum of products a[i]*b[i]+a[i+1]*b[i+1] .asg B16, B_sum ; partial sum b
.asg B17, B_prod ; product sum a[i+2]*b[i+2]+a[i+3]*b[i+3] .asg A9, A_reg1 ; elements a[i+3] a[i+2] .asg A8, A_reg0 ; elements a[i+1] a[i] .asg B7, B_reg1 ; elements b[i+3] b[i+2] .asg B6, B_reg0 ; elements b[i+1] b[i]
.asg A4, A_sumt ; total sum a + b returned to caller
* ========================== PIPE LOOP PROLOG ============================= * B .S2 loop ; prime loop || LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] || LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i]
B .S2 loop ; prime loop || LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] || LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || SHRU .S1 A_count, 2, A_i ; calc loop count || ZERO .L1 A_prod:A_sum || ZERO .L2 B_prod:B_sum
B .S1 loop ; prime loop ||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || ZERO .L1 A_prod:A_sum ; added for branch- || ZERO .L2 B_prod:B_sum ; target-not-span
[A_i] BDEC .S1 loop, A_i ; prime loop ||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || ZERO .L1 A_prod:A_sum ; added for branch- || ZERO .L2 B_prod:B_sum ; target-not-span
[A_i] BDEC .S1 loop, A_i ; prime loop ||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || ZERO .L1 A_prod:A_sum ; added for branch- || ZERO .L2 B_prod:B_sum ; target-not-span