摘 要:阐述了TMS320C62x的系统结构和软件设计方法,介绍了在title="TMS320C6201">TMS320C6201EVM板上实现宽带毫米波雷达目标时延神经网络识别算法。通过程序验证,取得了比较好的处理效果。
关键词:TMS320C6201DSP软件设计 实时处理 目标识别
数字信号处理(DSP)技术近年来取得了高速发展,目前DSP芯片已经广泛地应用于通信、图像处理、语音处理、雷达等领域。TI公司是当今世界DSP芯片的主要供应商之一,其TMS320C6000是TMS320系列产品中的新一代高性能DSP芯片,其中定点系列为TMS320C62x,浮点系列为TMS320C67x。TMS320C6201芯片是定点系列的代表产品,其处理能力高达1600MIP。本文着重介绍TMS320C62x的软件设计方法,并对TMS320C62x的系统结构以及基于TMS320C62x的软件设计方法,在TMS320C6201上实现宽带毫米波雷达目标时延神经网络识别算法进行阐述。
1 TMS320C62x的系统结构
TMS320C62x的系统结构如图1所示,TMS320C62x处理器由三个主要部分组成:CPU内核、外设和存储器。CPU内核中的8个功能单元可以完全并行运行,功能单元执行逻辑、位移、乘法、加法和数据寻址等操作。TMS320C6000系列芯片的体系结构采用甚长指令字(VLIW)方式,单指令字长为32位,每条32位指令占用一个功能单元。取指令、指令分配和指令译码单元每周期可以从程序存储器到功能单元传递8条指令,这8条指令组成一个指令包,总字长为8×32=256位。芯片内部设置了专门的指令分配模块,可以将每个256位的指令包分配到8个功能单元中,并由8个功能单元并行运行。TMS320C62x芯片的最高时钟频率可以达到200MHz,8个功能单元同时运行时,该芯片的处理能力高达1600MIP。
TMS320C62x芯片的片内存储器总容量为1M位,其中2K×256位用于程序内存和程序cache,宽度为256位;64K字节用于数据内存和数据cache,用户可以访问8位、16位和32位的数据。TMS320C62x芯片的外设模块包括多通道缓冲串口、时钟、外部存储器接口EMIF、DMA控制器、主机口和Power-down逻辑等,DMA控制器可以在存储器空间的不同区域间控制转移数据;外部存储器接口EMIF可以访问的片外存储器最大容量为64MB,数据总线宽度为32位,同时也提供对8位和16位存储器的读写支持;16位宽的主机口HPI可以访问TMS320C62x的所有存储空间和设备;多种外设模块使得TMS320C62x芯片的功能十分强大。
2 TMS320C62x的软件设计方法
用户在开发应用软件时,首先应当明确应用软件的功能和性能要求,然后按照代码开发流程的三个阶段进行软件设计:第一阶段是开发C代码;第二阶段是优化C代码;第三阶段是编写线性汇编代码。以上的三个阶段不是必须经过的,如果在某一阶段已经实现了应用软件的功能和性能要求,那么就不必进入下一个阶段。代码开发流程图如图2所示。
2.1 开发C代码
开发C语言代码需要考虑的要点包括:①数据结构;②分析C代码性能;③使用查找表;④用整形数(int)表示浮点数。
2.1.1 数据结构
TMS320C62x编译器对每种数据结构定义一个尺寸,字符型(char)为8位,短整型(short)为16位,整型(int)为32位,长整型(long)为40位,浮点型(float)为32位,双精度浮点型(double)为64位。在编写C代码时应当遵循的规则是:避免在代码中将int型和long型作为同样尺寸处理,因为编译器对long型数据使用40位操作;对于定点乘法,应当尽可能使用short型数据,这种数据类型可以更有效地使用TMS320C62x的乘法器;对循环计数器应当使用int或者无符号int类型,而不使用short或者无符号short类型,以避免不必要的符号扩展。
2.1.2 分析C代码性能
应用调试器的Profile工具可以得到一个关于C代码中各特定代码段执行情况的统计表,也可以得到特定代码段执行所用的CPU时钟周期数,因此可以找出影响软件程序总体性能的C语言代码段来加以改进(通常是循环代码段影响软件程序总体性能)。
2.1.3 使用查找表
在C语言代码中通过直接计算得到结果的语句或函数可以用查找表或常数数值代替,所以可以提高指令执行速度。
2.1.4 用整型数(int)表示浮点数
由于TMS320C62x是定点芯片,不支持浮点操作。对于浮点加、减、乘和除运算,应通过TMS320C62x的编译器,把浮点运算转化为一系列的定点运算,并由TMS320C62x芯片的功能单元处理这一系列的定点运算。浮点运算是比较费时的,在程序的编写过程中,应当尽量采用定点的数据结构。对于C语言,应当尽量采用整型(int)的数据结构。在基于TMS320C62x的C语言中,整型数据占用4个字节,其所能表示的最大数据范围是:-2147483648~+2147483647。因为实际处理的数据通常都是浮点的,所以需要把浮点数据通过定标转化为整型数据进行处理,以提高应用程序的处理速度。小数位数的选取十分关键,既要使转化后的数据处理精度满足要求,又要防止在数据处理的过程中出现数据溢出。
2.2 优化C代码
优化C代码包括使用编译器选项、使用内联函数、使用字访问短整型数据和使用软件流水等。编译器选项控制着编译器的操作,其中有些选项可使C代码优化。
2.2.1 向编译器指明不相关的指令
为使指令并行操作,编译器必须确定指令间的关系或者相关性,即一条指令必须发生在另一条指令之后,只有不相关的指令才可以并行执行。如果编译器不能确定两条指令是不相关的,则编译器认为它们是相关的,将安排它们串行执行。用户可以通过如下方法指明相关的指令:
·关键字const可以指定一个目标,const表示一个变量或者一个变量的存储单元保持不变,使用const可以提高代码的性能和适应性。
·一起使用-pm选项和-03选项可以确定程序优先级。在程序优先级中,所有源文件都被编译成一个模块,该模块通过编译器进行优化和产生代码,从而使编译器更有效地消除相关性。
·使用-mt选项向编译器说明在代码中不存在存储器相关性,即允许编译器在无存储器相关性的假设下进行优化。
2.2.2 使用内联函数(intrinsics)
TMS320C62x编译器提供的内联函数是直接映射为内联的C6000指令的特殊函数,用户可以用内联函数来快速优化C代码。
2.2.3 使用字访问短整型数据
内联函数中有些指令是对存储在32位寄存器的高16位和低16位字段进行操作。当有大量短整型数据进行操作时,可以使用字(整型数)一次访问两个短整型数据,然后使用内联函数对这些数据进行操作,从而减少对内存的访问。
2.2.4 使用软件流水
软件流水是采用安排循环指令的方法使循环多次迭代并行执行的一种技术。在编译时,使用-o2选项和-o3选项,编译器可对循环代码实现软件流水。为填满软件流水线,软件流水结构需要执行的最小循环迭代次数称为最小循环次数。当编译器不能确定循环总数与最小循环次数的大小时,就产生了两种形式的循环:循环总数小于最小循环次数时,执行不流水形式循环;循环总数大于最小循环次数时,执行软件流水形式循环。可以使用-ms选项使编译器根据循环次数仅产生一种循环形式。用户可以通过系列方法向编译器传递循环次数信息:使用-o3和-pm选项,使优化器访问整个程序,了解循环次数信息;使用_nassert内联函数,访止冗余循环产生。用户可以使用投机执行(_mh选项)消除软件流水循环的排空,从而减少代码尺寸。
由于在嵌套循环中编译器仅对最里面的循环执行软件流水,因此对于执行周期很少的内循环进行循环展开,对外循环进行软件流水,这样可以改进C代码的性能。
使用软件流水应当注意的问题有:尽管软件流水循环可以包含内联函数,但是不能包含函数调用;在循环中不可以有条件终止指令;在循环体中不可以修改循环控制变量;如果循环体内复杂的条件代码需要超过5个条件寄存器或者代码尺寸需要32个寄存器以上,则这个循环不可以进行软件流水。
2.3 编写线性汇编代码
编写线性汇编代码是代码开发流程的第三个阶段。为了提高代码性能,对影响应用程序速度的关键C代码可以用线性汇编重新编写,线性汇编文件是汇编优化器的输入文件。线性汇编代码类似于通常的C6000汇编代码,不同的是编写线性汇编代码不需要指明使用的寄存器、指令的并行与否、指令的延迟周期和指令使用的功能单元,汇编优化器会根据情况确定这些信息。线性汇编文件使用一些汇编优化器伪指令来区分线性汇编和通常的汇编代码,.cproc命令和.endpro命令限定了汇编优化器优化的代码段,.cproc命令放在代码段的开始,.endproc命令放在代码段的结尾;.reg命令使汇编优化器为数值,选择一个寄存器,这个寄存器与对该值进行操作的指令所选择的功能单元一致;.trip命令指出循环的迭代次数。优化线性汇编代码的方法包括:为线性汇编指令指定功能单元,使得最后的汇编指令并行执行;使用字访问短整型数据;使用软件流水对循环进行优化。
编写线性汇编代码的工作量非常大,需要很长的开发周期。而且开发后的汇编代码不能象C代码那样移植在其它的DSP平台上,因此建议尽量采用第一阶段来进行软件设计。如果仍然不能满足性能要求,那么再对关键的C代码段编写线性汇编代码。
3 在TMS320C6201上实现宽带毫米波雷达目标时延神经网络识别算法
宽带毫米波雷达目标识别算法对于实时处理的需求是比较苛刻的,例如某种宽带雷达导引头目标识别处理时间要求小于1.5ms,即要求目标识别算法在1.5ms内对一组数据完成处理,正确地把目标识别出来。人工神经网络(ANN)具有并行处理运算能力和网络信息存储能力,能满足宽带毫米波雷达目标识别系统并行计算和需较小数据存储空间的要求。ANN技术应用于雷达目标识别极具潜力。在多层前馈感知器神经网络模型中引入时延单元可以使神经网络增加记忆功能,由此导出的神经网络模型适合应用于处理序列数据。宽带毫米波雷达目标时延神经网络识别算法的基本原理为:对一维距离像进行非相干平均和自适应门限、等距离间隔峰值下采样预处理,获得较稳定的低维样本后,作为特征矢量提供给时延神经网络分类器进行自动分类识别。时延神经网络为三层网络,网络输入层节点数为17,网络隐层节点数为10,网络输出层节点数为3。采用大量的训练样本集对时延神经网络进行训练,得到时延神经网络的权值,然后应用TMS320C62x的软件设计方法,在TMS320C6201 EVM板上实现宽带毫米波雷达目标时延神经网络识别算法。
在程序实现过程中,对于经常用到的两个函数值1.0/(1.0+exp(-x))和tanh(x)采用查找表的方法来提高程序执行速度。根据对程序的测试,使用整型数(int)表示浮点数,选取整型数的低13位来表示小数。支持TMS320C6201 EVM 板的开发软件Code Composer Studio(CCS)是一个集编译、连接、实时调试、跟踪和分析应用程序于一体的开发软件包。CCS能够加快用户的开发进度,增强用户的应用程序性能,使用户可以实时地创建和调试数字信号处理应用程序。在开发软件CCS的集成开发环境中,综合应用TMS320C62x的软件设计方法可以编写和优化时延神经网络识别算法的C代码。
经过实际测试,在TMS320C6201上实现宽带毫米波雷达目标时延神经网络识别算法的程序执行时间为0.850ms,满足了目标识别算法的实时性需求,取得了比较好的处理效果。
参考文献
1 肖怀铁.宽带极化毫米波雷达目标特征信号测量与识别算法研究:[博士论文].国防科技大学,2000
2 TMS320C6x用户手册.TI公司
3 任丽香,马淑芬,李方慧.TMS320C6000系列DSPs的原理与应用.北京:电子工业出版社