关键词: dsp , MPEG , 视频 , 无线
MPEG-4是一种新兴的视频标准,其弹性纠错能力和可支持小屏幕的特性使之在移动通信市场上受到广泛关注,几乎所有移动电话生产商和PDA开发商都对其表示出极大的兴趣。然而这种视频标准对处理器的要求却非常高。在整个移动通信结构中,仅MPEG-4处理器这一部分就会毫不客气地吞掉大量的资源。因而要想真正实现无线视频应用这一梦想,首先就必须解决MPEG-4信号处理问题。
工程师们已经尝试过采用固定编码逻辑和通用型DSP来完成这一庞然大物般的MPEG-4处理,但结果均不理想。固定编码逻辑虽然能够提供较高的性能,但设计和实现所需的时间太长,而且得到的设计结果不够灵活,无法满足将来修改的需要。而通用可编程数字信号处理器(DSP)尽管很适合有限冲击响应(FIR)滤波和其他一些MAC密集的应用,但对于可变长度解码和离散余弦变换等视频编解码中固有的算法却又无法有效实现。
那么怎样才能设计出满足要求的处理器呢?本文给出了一种方案:采用定制DSP。工程师们可以利用数字DSP IP核并结合一些新的设计方法,设计一种用户化的引擎来完成所需的MPEG-4功能,从而将无线视频应用变为现实。
本方案的第一步,要开发一种应用软件来执行MPEG-4视频标准,然后对该软件进行优化和校验,以保证其满足MPEG-4视频标准的要求。第二步,在这个应用软件得到优化之后,将其编译至一个通用型DSP引擎,仔细分析它在应用中可能出现的性能瓶颈。通过分析,构造一组由设计者定义的计算单元(DDCU),有针对性地解决应用中的计算瓶颈问题。这组DDCU构成一个库,利用这个库,设计者可以为不同的产品和产品域创建不同的用户应用DSP引擎。例如,在一个支持QCIF(四分之一普通接口格式)和CIF帧格式的PDA中,可以通过简单等级(SP)和高级简单等级(ASP)创建一个简单的定制 DSP来实现低速编解码。
此外,通过恰当的设计规划,设计者还可以使引擎的性能刚好满足目标产品的要求——例如针对CIF格式设计出帧处理速度为每秒15帧的 DSP引擎——这样就能降低对时钟速率、指令长度和存储映像的要求,从而实现低功率和低成本。但是若想支持更大尺寸的帧并支持高级分析,就需要创建一种性能更高的DSP引擎。这种DSP引擎内部并行度更高,可用资源量更大,因而运行速度也更快。
最后一步,将定制DSP融入多处理器内核,通过两者的共同作用来达到进一步规划高端应用性能的目的。在当今的通信行业中,产品推向市场的速度越来越快,以上谈到的方法和工具恰好为快速分析和创建定制DSP从而加快产品设计提供了一种较好的方案。
下面让我们看看定制DSP是如何创建的。
可定制的VLIW(超长指令字)引擎
引擎指一组资源的集合,通过对这种资源编程,可以使之以某种给定的顺序实现一系列操作。通常,设计中最主要的处理工作是由数据通道资源-即我们所说的计算单元-来完成的。
计算单元可以对其输入进行一系列操作,并输出一个或多个计算结果。RISC(精简指令集计算机)和DSP是两种由计算单元组成的处理器。其中,RISC处理器每次(每时钟周期)只能执行一个操作,而典型的多媒体和DSP应用却可以在每个时钟周期内执行多项操作。这是因为大部分这种高级DSP 的结构都具有某种形式的指令级并行处理能力。
本文给出的方案中,针对MPEG-4应用而设计的DSP引擎能够达到固定编码逻辑和通用型DSP都无法达到的性能。该引擎之所以如此成功,主要原因之一就是采用了VLIW结构。VLIW是一种非常适合多媒体应用的结构。它支持指令级并行性,这就使得采用它的DSP引擎可以在单时钟周期内执行多项操作。不但如此,它还支持应用程序编译过程中的并行性,这又避免了为庞大的视频处理耗费过长的运行时间或增加过大的芯片体积。与VLIW类似的超标量体系结构也具备这一特性。
用户应用引擎的一种专用解决方案
下面来讨论一个现实生活中的解决方案,该方案采用了三级不同的可定制性来构造专门的用户应用引擎。
第一级可定制性在处理器的标准资源处提供,这些标准资源包括算术逻辑单元(ALU)以及乘法器和累加器(MAC)等。对某些应用而言MAC 用得较多,如基于快速傅立叶变换(FFT)的算法;还有一些则倾向于更多地采用ALU。这就提出了一个要求,对于不同的应用,处理器应有不同的资源组合,而不是将所有的应用都分配到同样的一组固定的资源中去。
例如,可以将一个MAC密集的算法分配到一个包含4 MAC、2 ALU、1 SHIFT的处理器中去,而将一个ALU密集的应用分配给一个包含3 ALU、1 MAC、1 SHIFT的引擎。这种处理器资源分配的可定制性对许多普通应用而言已经绰绰有余,但对大多数与视频相关的应用来说还远远不够,它们的要求更高,并且需要更多的运算单元来加快运行速度。
第二级可定制性允许向处理器添加DDCU协处理器。设计者先要对所需完成的应用有一个大致的认识,接着对该应用进行分析,将其中的一些专用函数分离出来,然后在硬件上专门针对这些函数进行加速处理,即添加DDCU。此外,设计者还可以分析一下,采用工具组添加DDCU来加快运行速度会对处理器的性能造成怎样的潜在影响,以及在诸如此类的一些其他假设下会出现什么情况。
DDCU是一种适用于专用算法的计算单元。一旦设计者确认了哪个算法需要用DDCU进行硬件加速之后,就可以写出实现该DDCU的RTL 代码,并将其加入用户应用引擎。例如,在通用DSP中加入滤波DDCU,那么若用该DSP实现一个需要滤波的应用,其表现出来的性能就会有所增强。
除此以外,设计者还要在增加并行性所带来的性能优化和该并行性对指令的影响之间寻找最佳平衡。为解决这一问题,可以在VLIW指令中定义分段的数目(从而定义最大并行度),并为每一段分别分配CU和DDCU(见图1)。
最后一级可定制性表现在处理器资源的选择上。设计者可以自己决定需要多大的数据存储器,以及需要多少个数据寄存器和地址寄存器。而且,根据具体应用所提出的数据要求,设计者还可以增加存储器接口,以便提供并行数据访问。这些共享的存储器接口又可以用来连接多个处理器引擎,这就为处理器资源提供了一定的可伸缩性。
采用DSP引擎的一个关键的好处是可以加快产品投入市场的时间。但要达到这个目的,还要先定义一系列与DSP引擎协作的DDCU协处理器。在设计MPEG-4引擎的时候,首先要对其各个方面进行全面分析,确定需要采用哪些DDCU。然后用这些DDCU构建起一个大致MPEG-4引擎,分析其性能瓶颈,并针对性能瓶颈再定义一些DDCU加入引擎中,从而提高该引擎的性能,冲破其瓶颈。为了更方便地完成以上工作,人们开发出一个专门用于MPEG -4应用的DDCU库。以下讨论了该库中的某些专用DDCU。
1. 比特流/可变长度解码DDCU
在视频编码中常常会遇到可变长度解码。比特流/可变长度解码DDCU 可以加快从输入比特流中取出可变长度字段的速度,这是一种基本操作。如果用软件来实现这种比特流管理,会消耗大量的时钟周期来处理指针的移位、屏蔽和管理,而采用比特流/可变长度解码DDCU则可以在一个简单的硬件单元里快速完成同样的功能。
在比特流/可变长度解码DDCU中,由用户设计的指令组集中完成普通比特的提取和插入操作。这种DDCU不但能加快处理速度,提高整个视频引擎的性能,还可以解放处理器中的其他资源,使之得以用于周围的其他处理过程。因此,采用这种DDCU不但可以减小指令长度,同时还增强了系统性能。实际上,在DSP中加入这种计算单元会使可变长度解码的速度增快23.2%。
2. 量化/反量化DDCU
量化和反量化是视频编解码中的两种基本操作,其计算量占整个视频编解码计算量的10%甚至更多。量化/反量化DDCU允许在单周期内处理多像素,其内部操作可以满足多种MPEG-4等级的量化需求。在比特流/可变长度解码DDCU中,将可变长度解码模块的计算需求降低15.4%时,指令存储空间也会减小,这一特性同样适用于量化、反量化DDCU。
3. 半像素内插/运动补偿DDCU
这种运算单元用于加速半像素内插操作,该操作所需计算量相当大。在解码器中,内插/补偿操作所消耗的时钟周期约为总时钟周期的40%。该单元中所涉及的运算其实很简单,只需要面积很小的硅片就能完成,因此很容易移入DDCU中去。就算是边缘扩展这样的涉及大量计算的操作,只要不需要进行优化处理,也还是可以较好地移入硬件中。
不论采用哪种内插类型,内插/运动补偿DDCU中的指令组都允许每周期内插4个像素,这一特性也减少了需要执行的指令数。通过使用内插/运动补偿DDCU,半像素内插/运动补偿操作的速度可以增快74.6%。
4. DCT/IDCT DDCU
IDCT(反离散余弦变换)和DCT(离散余弦变换)都是视频编码中固有的运算。众所周知,这两种运算需要占用大量的时钟周期,并要求在编写其汇编代码时非常小心。本文谈到的这种专用DCT/IDCT DDCU单元(依据IEEE 1180-1990规范)可模仿DCT/IDCT中的“蝶形”运算。通过使用这种计算单元可以大大提高视频设计的性能和生产力,从而使开发人员能够集中精力开发视频应用中的其他方面,以达到使其产品区别于其他同类产品的目的。
5. 运动估计(MEMC)DDCU
MEMC单元用于帮助完成运动估计这一计算量最大的操作。无线视频应用中,在每个运动矢量的位置上都必须进行误差测量。MEMC DDCU可以完成两种最常见的误差测量计算:绝对误差和(SAD)测量和平方误差和(SSE)测量。DSP平台中若加入该运算单元,那么每周期误差测量时所比较和累加的像素位置就可以多达4个。
6. 四分之一像素运动补偿单元
基本来说,该单元所提供的功能是对半像素内插单元的一种必要的扩展。四分之一像素算法比半像素算法稍微复杂一些,因为它首先采用了一个2维FIR 滤波器来获取半像素值,然后才使用线性插值法来计算四分之一像素值。这个2维滤波器直接并入半像素内插单元,致使半像素内插单元的硅片面积稍有增大,但这种方式仍然保持了较高的像素处理速度,这一速度远远超过只采用Simple Profile 设计的DSP引擎。
7. 全局运动补偿单元
在视频应用中有一种变形函数(warping function)专门用来描述当前视频对像相对于参考视频对像的变化。全局运动补偿(GMC)单元就是为加速这种函数的运算而设计的。该单元最大可支持 3点变形(即参考VOP的仿射变换)。一旦从比特流中分析出变形点的个数后,就用这个数值来初始化GMC。GMC计算变形等式的速度远远快于纯软件实现方式的计算速度。
8. 语境自适应算法编/解码DDCU
构成语境需要进行逐位操作,而逐位操作只能在标准的32位DSP中实现。为了打破这一限制,语境自适应算法编/解码DDCU采用硬件方法形成语境值。该DDCU内部有一个查找表,用于存放所有可能的语境值,以便快速查找判断。语境自适应编解码运算单元支持以1b/周期的速度进行算法编、解码。
怎样创建一个工作平台
设计者定义了需要用到的DDCU之后,就可以用它们来创建满足其特殊要求的用户应用引擎,并由此构建起工作平台,从而设计出具有MPEG-4视频功能的产品。
为清楚起见,让我们来看一个例子,例中的引擎是专门针对可传送MPEG-4信息的3G移动电话设计的。这样的引擎要想在3G移动电话上实现预期的视频功能,就必须以低于20MHz的速度处理第1级和第2级MPEG-4简单视觉等级,这样才能为诸如音频和语音处理等其他DSP功能留有一定的可规划带宽。
在开始设计用户DSP时,分配1 ALU、1 SHIFT和1MAC单元作为起始基准平台是比较合理的。要想增加并行性,只需将这些计算单元再分配给两个单独的指令段:ALU和SHIFT分配给同一段, MAC分配给另一段。如果该视频应用采用的是帧处理速度为每秒15帧的CIF格式,那么要在这个用户平台上编译视频应用程序就需要40MHz的带宽,若采用QCIF格式则只需10MHz带宽。尽管这样的带宽已经很具竞争力了,但仍然不能满足前面提到的具有MPEG-4功能的3G移动电话的需要。
降低带宽要求的解决方案
首先,要分析在用户平台中加入不同的计算单元对其性能的影响(这些计算单元全部来自MPEG-4 DDCU库)。也就是说,我们定义了一系列的引擎,以此分析不同的计算单元混用方式所造成的性能影响。分析表明,应该保留两段型引擎定义,因为这可以限制指令宽度,使之不至于过宽。
然后再定义一些新的引擎,经过编译,分析其结果。新引擎定义分析的整个过程用了1或2个小时。由于DDCU库是提前创建好的,因此许多引擎可以在一天时间内就分析完。接着从这些引擎中选出最能满足目标产品要求的,用来构建工作平台。
这样得到的工作平台与基准平台相比,增加了一个ALU和四个MPEG-4 DDCU:比特流DDCU、量化/反量化DDCU、半像素DDCU和DCT/IDCT DDCU(见图2)。在起始平台的基础上添加这些运算单元,目的就是在不增大指令存储或数据存储的前提下,尽可能降低对时钟速率(MHz)的要求。完成这些操作之后,我们得到了这样一个用户应用引擎,该引擎可以用带宽只有18MHz的DSP完成每秒15帧的CIF格式图像的解码,同时还能满足这种3G无线视频应用的其他关键要求(低功率、小芯片尺寸以及低时钟速率)。
从图3中可以看出DDCU对加快整个应用运行速度的作用。图中第一条表示在标准CU构成的基准平台上,整个运算时间在IDCT、运动补偿(MC)以及可变长度编码和反量化(VLD/DQnt)这几种DDCU之间的分布情况。
可以看出,在这几种DDCU中,MC部分占用时钟周期最多。因此我们在工作平台上添加了一个DDCU来加速半像素内插操作,提高MC部分的速度。一旦MC部分所占用的时钟周期数大幅降低,VLD/DQnt马上就上升成为了限制整个应用性能的最主要因素。针对这一情况,再添加一个比特流 DDCU和一个量化/反量化DDCU,又进一步提高了性能。这样,最初的基准平台已经经过了两次组合。此时,再将IDCT DDCU加入其中,整个应用的性能就得到了更大的提高。图3中的最后一条给出了三次组合后整个应用需要耗费的时钟周期。
上面介绍的只是一个典型案例。一般而言,在无线视频应用的开发中,按照以上这几步进行操作,我们就可以快速地构造一个优化的引擎,为移动电话或PDA设备开发出收发MPEG-4视频信息的功能。更妙的是,在构造起这个引擎的同时还可以解放一部分处理器资源,使之有余力去支持其他的一些新兴功能,比如MP3音频、网络浏览,甚至更多。