本文主要是关于TMS320C6000和DSP的相关介绍,并着重对TMS320C6000和DSP芯片进行了详尽的阐述。
DSP
数字信号处理是一种将现实世界中的真实信号(专业术语称之为连续信号)转换为计算机能够处理的信息的过程。比如人们说话的声音,这就是一个连续信号,除此之外,现实生活中还有很多这样的信号,比如光、压力、温度等等。这些信号通过一个模拟向数字的转换过程(称之为AD),变成数字信号送给处理器,进行数字计算,处理结束后,再把结果通过数字向模拟的转换过程重新变成连续信号(称之为DA)。用一般的通用微处理器可以完成这些工作,但是面临的问题是满足如此高的计算速度,就很难保证耗电量很低,更难保证价格足够便宜。因此,另一种微处理器应运而生:数字信号处理器,简称DSP。
DSP是微处理器的一种,这种微处理器具有极高的处理速度。因为应用这类处理器的场合要求具有很高的实时性(Real Time)。比如通过移动电话进行通话,如果处理速度不快就只能等待对方停止说话,这一方才能通话。如果双方同时通话,因为数字信号处理速度不够,就只能关闭信号连接。在DSP出现之前数字信号处理只能依靠MPU(微处理器)来完成。但MPU较低的处理速度无法满足高速实时的要求。因此,直到70年代,有人才提出了DSP的理论和算法基础。那时的DSP仅仅停留在教科书上,即便是研制出来的DSP系统也是由分立元件组成的,其应用领域仅局限於军事、航空航天部门。
90年代DSP发展最快,相继出现了第四代和第五代DSP器件。现在的DSP属於第五代产品,它与第四代相比,系统集成度更高,将DSP芯核及外围元件综合集成在单一芯片上。这种集成度极高的DSP芯片不仅在通信、计算机领域大显身手,而且逐渐渗透到人们日常消费领域。
DSP芯片,也称数字信号处理器,是一种具有特殊结构的微处理器。DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。
根据数字信号处理的要求,DSP芯片一般具有如下的一些主要特点:
(1)在一个指令周期内可完成一次乘法和一次加法。
(2)程序和数据空间分开,可以同时访问指令和数据。
(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问。
(4)具有低开销或无开销循环及跳转的硬件支持。
(5)快速的中断处理和硬件I/O支持。
(6)具有在单周期内操作的多个硬件地址产生器。
(7)可以并行执行多个操作。
(8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。与通用微处理器相比,DSP芯片的其他通用功能相对较弱些。
TMS320C6000 DSP芯片介绍
近年来,以高速数字信号处理器(DSP)为基础的实时数字信号处理技术飞速发展,并获得了广泛的应用。TMS320C6000系列DSP是德州仪器公司(TI)推出的定点、浮点系列DSP,其中定点产品峰值处理能力达到4800MIPS,浮点产品峰值处理能力达到1350MFLOPS,是目前国际上性能最高的DSP之一,其卓越的性能使得它在传统的DSP领域、雷达、无线电基站等高端领域,以及宽带媒体、身份识别等新兴领域都有很好的应用前景。随着DSP性能和功能的不断增强,应用系统的设计越来越复杂,要将DSP的性能充分释放出来,合理的板级设计是DSP系统开发人员面临的一个关键性的问题。
TI公司的三种新型TMS320 DSP系列和OMAP系列
1.TMS320C2000——作控制用的最佳DSP,可以替代老的C1X和C2X。
TMS320C20X系列DSP芯片具有如下特点:
(1)处理能力强:指令周期最短是25nm,运算处理能力达40MIPS。
(2)片内具有较大的FLASH存储器:TMS320C20X是最早使用片内FLASH存储器的DSP芯片,FLASH存储器具有比ROM灵活、比RAM便宜的特点,TMS320F206和TMS320F207的片内具有32KB的FLASH存储器和4.5KB的RAM。
(3)芯片的功耗低:TMS320C20X系列DSP芯片在5V工作时每个MIPS消耗1.9mA电流,在3.3V工作时每个MIPS消耗1.1mA电流4)芯片的资源配置灵活。
TMS320C2000系列DSP芯片价格低,具有较高额性能和适用于控制领域的功能,因此可以广泛地应用于工业自动化、电机控制、运动控制、电力电子、家用电器等领域。现在有趋势集中在以下两个方向上:
(1)C20X16位定点DSP,速度为20MIPS,主要用途是电话、数字相机、售货机等,其中:F206带有闪速存储器。
(2)C24X16位定点DSP,速度为20MIPS,用作数字马达控制、工业自动化、电力转换系统、空调等。
2.TMS320C5000——低功耗高性能DSP,16位定点,速度40~200MIPS。
主要用途是有线和无线通信、IP、便携式信息系统、寻呼机、助听器等。TMS320C54XX系列DSP芯片具有如下特点:
(1):运算速度快:其运算速度可达500MIPS。
(2)优化的CPU结构。
(3)芯片的低功耗工作方式:TMS320C54XX的DSP核可以在3.3、2.5、1.8V甚至更低电压下工作,特别适合于无限移动设备。
(4)芯片具有智能外设:提供了多通道缓冲串行口。以及和外部处理器通信的主机HPI。
目前,C5000系列中又有三种新成员,一种是C5402,这是廉价型的DSP,速度保持100MIPS,片内存储空间稍小一些,RAM为16K、ROM为4K。主要应用对象是无线Modem、新一代PDA、网络电话和其它电话系统以及消费类电子产品。第二种是C5420,它拥有两个DSP核,速度达到200MIPS,200K片内RAM,功耗0.32mA/MIPS,200MIPS全速工作时不超过120mW,为业内功耗最低的DSP。C5420是当今集成度最高的定点DSP,适合于做多通道基站、服务器、Modem和电话系统等要求高性能、低功耗、小尺寸的场合。第三种是C5416,它是TI公司0.15μm器件中的第一款,速度为160MIPS,有三个多通道缓冲串行口(McBSPs),能够直接与T1或E1线路联接,不需要外部逻辑电路,有128K片内RAM。应用对象是VoIP、通信服务器、PBX(专用小交换机)和计算机电话系统等。
3.TMS320C6000——这是TI公司1997年2月推向市场的高性能DSP,综合了目前DSP的所有优点:
(1)具有最佳的性价比和低功耗。
(2)运行速度快:指令周期最小为3.3ns,运算能力为2400MIPS。
(3)指令集不同:一条指令中组合了几个执行单元,结合其独特的内部结构,充分发挥其内部集成的各执行单元的独立运行能力。
(4)大量的片内存储器和大范围的寻址能力:片内最多集成了512K字程序存储器和512K字数据存储器,并拥有32位的外部存储器借口。
(5)智能外设:内部集成了4-16个DMA借口,2-3个多通道缓冲串口,2个32位定时器等。由于TMS320C6000系列具有极高的性能,因此可以广泛地应用于通信领域,主要应用于:数字移动通信、个人通信系统、个人数字助理、数字无线通信、无线数据通信、便携式因特网音频处理器。
在老的TI DSP系列中,浮点C30还是TI公司主推的产品,因此它的售价不像其它老系列每年都要提升。TI公司还在对这个型号作性能改进和制造廉价型,如新近推出的C33采用0.18μm制造工艺,有1M RAM,速度为120Mflops,为老产品的两倍,而价格仅5美元。速度更高的150Mflops为8美元。C33与其它C3X器件代码兼容,所以用户可以保护其软件环境,在他们换用新器件时还可以减少开发时间。
4.OMAP(Open Multimedia Applications Platform,开放式多媒体应用平台)
这是TI公司推出的专门为支持第三代(3G)无线终端应用而设计的应用处理器体系结构。OMAP处理器平台提供了语言、数据和多媒体所需的带宽和功能,可以极低的功耗为高端3G无线设备提供极佳的性能。OMAP嵌入式处理器系列包括应用处理器及集成的基带应用处理器,目前已广泛应用于实时的多媒体数据处理、语音识别系统、互联网通信、无线通信、PDA、Web记事本、医疗器械等领域。
TMS320C6000 DSP和Bootloader、VectorTable
1. Bootloader
如上图,
(1)在Device Reset阶段:
设备初始化为默认状态,大部分三态输出都配置为高阻态。
(2)在CPU Reset阶段:
从RS上升沿处开始(这个时候,根据HD[4:3]配置启动模式,HD8配置大小端模式,CLKMODE配置输入时钟源,根据HPI_EN配置外设功能),处理器检查启动模式HD[4:3],启动bootloader程序。
EDMA自动将CE1开始位置的1KB代码拷贝到内部程序存储器的0地址。
(3)RESET信号恢复高电平,CPU从内存0地址处开始运行程序
2. Interrupt Vector Table(Interrupt Service Table, IST)
处理器在RESET为低电平时复位,在RESET的上升沿,启动配置被锁定,开始从0地址处执行程序。一旦ROM启动完成(将外部ROM的1KB程序拷贝到内存0地址完成),寄存器初始化为默认值,程序计数器PC装载复位中断向量(复位中断向量需要在0地址处),CPU开始从0地址开始执行,这个地址称为复位向量。
默认的,中断服务表(IST)也在0地址处。IST是中断向量的一个集合,当CPU中断发生时,PC自动通过中断向量跳转到对应的中断服务程序。每个中断向量都是8个字(WORD)对齐。IST可以重映射到任意的以0x400-byte对齐的位置,但需要修改中断服务表指针(ISTP),在复位时,ISTP初始化为0值,IST首地址与复位向量对齐。
(1)创建中断向量表
IST由32个服务向量组成,每个向量对应一个CPU中断,特殊的:中断号0对应复位向量,中断号1对应不可屏蔽中断(NMI)。中断4~15对应各种信号事件的中断。中断号为n的中断向量的地址为
比如,ISTP重定位到0x1000,中断号为4的中断向量地址为Addr=0x1000+0x20*4=0x1080。
每个中断向量必须在8条指令内完成,若无法在8条指令内完成,必须将一些工作放到中断服务程序(Interrupt Service Routine, ISR)中完成。
.sect vectorsRESET: MVK .S2 Start, B0 ; Load Start address MVKH .S2 Start, B0 ; Load Start address B .S2 B0 ; Branch to start NOP NOP NOP NOP NOPNMI_ISR: MVK .S2 Nmi_isr, B0 MVKH .S2 Nmi_isr, B0 B .S2 B0 NOP NOP NOP NOP NOP
上面是包含了复位和不可屏蔽中断的中断向量表的一个例子,主要是完成一个跳转到中断服务程序的功能。
(2)中断服务程序(ISR)
当使用-c或-cr链接器选项时,DSP的C编译器自动的创建了函数_c_int00,这个函数对应C程序的入口地址,复位向量必须跳转到_c_int00地址处。当C程序遇到一个CPU中断时,在中断向量表中或中断服务程序中要使用的CPU寄存器都将先被压入堆栈,一旦中断服务程序完成,堆栈中的值弹出到对应的寄存器,继续执行原C程序。
中断服务程序需要使用关键字interrupt声明,
interrupt void myISR(void){ /* Code for myISR */ …}
中断服务程序没有返回值,也没有参数,interrupt的功能就是在执行该中断服务程序前自动将寄存器压栈,执行完后自动的弹栈。
*********************************************************************************
* vecs.asm
* Copyright 2003 by SEED Electronic Technology Ltd.
* All rights reserved. Property of SEED Electronic Technology Ltd. *
* Designed by: Hongshuai.Li *
*********************************************************************************
*------------------------------------------------------------------------------
* Global symbols defined here and exported out of this file
*------------------------------------------------------------------------------
.global _vectors
.global _c_int00
.global _vector1
.global _vector2
.global _vector3
.global _vector4
.global _vector5
.global _vector6
.global _vector7
.global _c_int08 ; Hookup the c_int08 ISR in main()
.global _vector9
.global _vector10
.global _vector11
.global _vector12
.global _vector13
.global _vector14
.global _vector15
*------------------------------------------------------------------------------
* Global symbols referenced in this file but defined somewhere else.
* Remember that your interrupt service routines need to be referenced here.
*------------------------------------------------------------------------------
.ref _c_int00
*------------------------------------------------------------------------------
* This is a macro that instantiates one entry in the interrupt service table.
*------------------------------------------------------------------------------
VEC_ENTRY .macro addr
STW B0,*--B15
MVKL addr,B0
MVKH addr,B0
B B0
LDW *B15++,B0
NOP 2
NOP
NOP
.endm
*------------------------------------------------------------------------------
* This is a dummy interrupt service routine used to initialize the IST.
*------------------------------------------------------------------------------
_vec_dummy:
B B3
NOP 5
*------------------------------------------------------------------------------
* This is the actual interrupt service table (IST)。 It is properly aligned and
* is located in the subsection .text:vecs. This means if you don‘t explicitly
* specify this section in your linker command file, it will default and link
* into the .text section. Remember to set the ISTP register to point to this
* table.
*------------------------------------------------------------------------------
.sect “.text:vecs”
.align 1024
_vectors:
_vector0: VEC_ENTRY _c_int00 ;RESET
_vector1: VEC_ENTRY _vec_dummy ;NMI
_vector2: VEC_ENTRY _vec_dummy ;RSVD
_vector3: VEC_ENTRY _vec_dummy
_vector4: VEC_ENTRY _vec_dummy
_vector5: VEC_ENTRY _vec_dummy
_vector6: VEC_ENTRY _vec_dummy
_vector7: VEC_ENTRY _vec_dummy
_vector8: VEC_ENTRY _c_int08 ; Hookup the c_int08 ISR in main()
_vector9: VEC_ENTRY _vec_dummy
_vector10: VEC_ENTRY _vec_dummy
_vector11: VEC_ENTRY _vec_dummy
_vector12: VEC_ENTRY _vec_dummy
_vector13: VEC_ENTRY _vec_dummy
_vector14: VEC_ENTRY _vec_dummy
_vector15: VEC_ENTRY _vec_dummy
*------------------------------------------------------------------------------
********************************************************************************
* End of vecs.asm
********************************************************************************
上面是一个实际使用的C6713的中断向量表的汇编文件(vecs.asm),其中定义了全部15个中断向量,复位向量跳转到_c_int00地址,8号中断向量跳转到_c_int08函数地址,在C主程序中应该做如下定义,
/* * interrupt function */interrupt void c_int08(void){ }
另外,由于在C程序中的PC跳转到中断向量地址是远跳转,因此有时需要在C程序中声明中断向量地址为远地址,如下,
extern far void vectors();
其中的vectors()表示中断向量表的起始地址(汇编中使用了_vectors)。
结语
关于TMS320C6000和DSP的相关介绍就到这了,如有不足之处欢迎指正。
评论
查看更多