利用可配置处理器来创建多标准多分辨率视频引擎

发布时间:2010-12-18 15:53    发布者:conniede
关键词: RTL , SIMD , 处理器 , 视频
随着消费类电子产品,尤其是手机、PDA和便携式媒体播放器(PMP)的急剧发展,其对于终端硅供应商的要求也大大提高。对这些供应商来说,设计仅仅能够适用于一到两个多媒体编解码器或无线标准的IC已经远远不够了。消费者希望他们的设备能够播放各种采用不同的编码标准和无线下载标准的媒体。因此,必须采取一个新的更具灵活性的途径来更好地适配新的媒体标准。在本文中,我们主要谈一谈视频解码器和编码器引擎所面对的挑战和机遇。

1 基于RTL的传统视频引擎设计方法

上一代视频ASIC设计的目的是为了解码和编码MPEG-2,因为这是DVD所使用的标准。其中也有些支持MPEG-1,可以播放VCD。大多数情况下,这种单个应用的逻辑实现策略就是:利用RTL(寄存器转换层,寄存器转换逻辑)来设计定制化MPEG-2解码器和编码器。下图1是一个典型的MPEG-2视频ASIC结构,展示了由视频子系统、主控制器和片上存储器组成的RTL功能块。



  图1:典型的MPEG-2视频ASIC结构

随着市场形势的改变,现在的视频ASIC必须能够支持多种视频标准,并具有多个分辨率。由于下列原因,传统的RTL方法已经不再有效:

·随着标准数量的增加,RTL功能块的数量和复杂性也增加;

·无论是执行一个新的视频标准,还是升级现有的已执行的标准,或者修改bug,都需要进行硅芯片重制;

·在第一代硅执行之后的这4-5年内,视频编解码器,尤其是编码器在性能上(比特率、性能)有很大的改进。要执行这些改进的成果,也必须在所有的RTL方法中进行硅芯片重制。

2 在视频引擎中使用处理器,而不是固定的RTL

那么,有没有其它办法呢?使用一个可编程处理器是最佳方案,因为它可以解决上面提到的所有问题:

(1)处理器和编解码器之间很容易建立连接端口;(不论是采用新的视频标准,还是升级现有的编解码器或者修改bug,都可以很容易地在软件中进行);

(2)通过软件升级,可以很容易地应用视频编解码器执行中的改进。

但是,由于其性能瓶颈,传统的处理器只能用于一般的编码,而不能用于视频引擎。嵌入式DSP也不是专为视频而设计的,但拥有通用DSP应用所需的硬件功能单元、指令和接口。因此,要在传统的RISC和DSP处理器上执行视频编解码,就意味着这些处理器必须以非常高的速度运行(MHz),而且还需要大量内存并消耗大量功率,但是在便携式设备中,这显然是行不通的。

只要我们对某个视频内核中所需的计算次数作一个简单分析,就很容易得出这一点。绝对误差和是大多数视频解码运算的动作估计中所进行的一个重要计算步骤。SAD运算的目的在于发现两个连续视频帧之间的宏模块的运动。它是通过计算这两个宏模块中每套相应的象素值之间的绝对误差之和来实现这一目的的。



下面的C代码展示了SAD运算的一次简单执行:



图2展示了SAD运算中的基本计算步骤。如图所示,其中主要进行的计算有减、算绝对值和结果累计。



          图2:绝对误差和(SAD)内核中进行的主要计算

计算一个RISC上的两个16x16宏模块的SAD需要进行256次减法、256次求绝对值和256次相加――总共进行了768次计算,还不包括传输数据所需的负载与内存。由于每一帧当中所有的宏模块都必须进行这一运算,很显然这在计算上成本是很昂贵的,而且会随着视频帧分辨率的增加而越来越难。

实际上,在一个带有一些如相乘和乘法累加等指令的中等范围通用型RISC处理器上,如果要以CIF的分辨率进行H。26?Baseline解码,需要250MHz的速率,而如果进行H。26?Baseline编码,所需速率更是超过1GHz。这意味着光是处理器内核就要消耗将近500mW的功率,更不用提内存和视频片上系统中其它部分消耗的功率了。很显然这种处理器不能作为嵌入式多媒体处理器用于便携式设备中。


3 可配置处理器解决了问题

如何在处理器中进行SAD运算呢?有一个方法是编写一个能够同时进行“减-求绝对值-加”计算的指令。这可以将16x16宏模块所需的计算次数从768减少到256。另外,由于一个执行这种综合化简单运算的功能单元一般都能够优化成一个周期,意味着计算周期也被减少到了256。

但是如何执行这个“减-求绝对值-加”指令呢?

在这个时候,就需要可配置处理器了。可配置处理器是嵌入式的,设计者可以配置选项菜单中进行选择,并通过添加特殊应用指令、寄存器文件和接口来扩展处理器功能。

下面是目前的可配置处理器具备的一些可配置和可扩展性功能,传统的固定式处理器是没有这些功能的:

可配置性,有下面的一系列选项可供选择:

·设计者想要或者不想要的指令,包括:16x16相乘或乘法累加、漏斗转换、浮点指令等;

·零耗循环、5或7个步进管线、本地数据加载/存储单元的数量等各种功能;

·是否需要内存保护、内存转换或者一个全内存管理单元(MMU);

·是否需要一个系统总线接口;

·系统总线和本地内存接口的宽度;

·本地内存的数量和大小;

·中断的次数、种类和等级

可扩展性,可自由添加下列由设计者自定义的组件:

·寄存器和寄存器文件;

·多周期、任意复杂功能单元;

·SIMD功能单元;

·将基本型处理器转换成多发射处理器;

·定制能够直接从数据路径读取和写入的接口,例如在处理器内核上的类似于GPIO(通用IO)的端口或管脚,以及可以用来和其它逻辑或者处理器内核进行连接的外置FIFO。

可配置性的优点在于使你可以通过选择你的应用所需的功能选项来构建一个规模适中的处理器,而可扩展性的优点则是让设计者可以通过创造能加快应用速度的指令、寄存器文件、功能单元和接口来定制处理器,使之完全与其视频应用相匹配。但必须注意的是,只有当今先进的可配置处理器才具能提供设计者自定义可扩展性。

4 利用可配置处理器来构建视频引擎

4.1 创建能进行多次运算的功能单元

这一步即是SAD运算和加速SAD运算的内容。对于可配置处理器来说,要添加这一综合运算功能简直是小菜一碟。它可以添加名为"sub。abs。acc(减-求绝对值-加)"的新指令来进行“相减、求绝对值和相加”运算。如图3所示。



                图3:进行“相减、求绝对值和相加”运算的新指令

现代的可配置处理器(例如Tensilica的Xtensa处理器)所配的软件工具会自动修改编辑器工具,包括C/C++编辑器、汇编程序、调试器、模仿器和ISS(指令集仿真器)。此时,C编辑器会识别新的C内部指令"sub。abs。acc"并安排相应的指令,调试器则显示sub。abs。acc功能模块中使用的内部信号,同时,汇编程序会将之作为一个新的指令进行处理,而ISS则对之进行周期精确级仿真。

图4是嵌入这种新的视频特殊功能单元之后数据路径的简化图。必须注意的是,硬件生成工具不仅能够自动生成功能单元逻辑,还可自动嵌入正向路径、控制逻辑和旁路逻辑来将这一新的功能单元和数据路径的其它部分相连。



图4:嵌入sub。abs。acc视频特殊功能单元之后数据路径的简化图



现在,运用了C内部指令来进行SAD运算的C代码就变为:



正如前文所说,这将16x16宏模块(例如:numrows=numcols=16)的计算次数减少至256次。

4.2 创建SIMD功能单元

除了上面的成果,我们还可以实现进一步改进。在这个内核中,内循环穿越整个宏模块,并进行同样的计算。此时恰恰可以创建一个SIMD(单指令多数据)功能单元和相应的指令sub。abs。acc16,来在16象素上同时进行“相减、求绝对值和相加”运算,如图5所示。



图5:SIMD在16象素上同时进行的“相减、求绝对值和相加”运算



相应的C内部指令是sub。abs。acc16,用来在SAD运算中重写C代码:



此时,SAD运算的次数从768次减少至仅16次。

但是,上面的C代码是不精确的。我们掩盖了一个细节,那就是sub。abs。acc16指令要求来自两个宏模块的128-b的输入。这要求支持两个功能-一个128b的寄存器文件和一个宽加载/存储接口-这些会在接下来的部分进行讨论。

4.3 创建自定义寄存器文件

在可配置处理器中创建一个任意大小的自定义寄存器文件是很简单的。例如,一个名为"myRegFile128"并带有4个寄存器的128b寄存器文件,就可以创建一个相应的新的C数据类型,用于C/C++编码中来显示变量。另外,软件工具还可以进行“移动”操作,能将各种C数据类型转换成这种新的自定义数据类型。



因此,使用了sub。abs。acc16内部指令和新的寄存器文件的SAD运算的正确的C编码是:



接着,C/C++编辑器将生成移动指令来将数据从普通的C数据类型转化成自定义C数据类型"myRegFile128",并为新的寄存器文件进行寄存器分配。

4.4 创建新的加载/存储接口

要在如此之大的寄存器文件(和相应的SIMD功能单元)中读出和写入数据,要求可以进行大规模的加载和存储。还是在可配置处理器中,设计者可以自定义加载和存储指令来直接在自定义寄存器文件中加载和存储数据。接着,编辑器会自动生成对应于这个加载/存储接口的加载/存储指令,从而将数据从内存中加载到寄存器文件中。

图6是处理器数据路径的更新图。如图中所示,硬件生成工具自动生成大的自定义寄存器文件和加载/存储接口以及所有相关的正向控制和旁路逻辑。特别需要注意的是这些工具还会生成硬件逻辑来将数据从基本寄存器文件转移到用户自定义的寄存器文件中。



图6

4.5  加载或存储时更新地址

创建指令来进行自定义加载或存储时,最好能在加载或存储的同时更新地址。这种新的加载/存储指令可以同时进行:

加载A1←存储器(地址1);地址1=地址1+索引更形

这种能够同时进行数据加载/存储和地址更新的指令使得处理器可以进行背靠背加载/存储,而不需要一个中介指令来进行地址更新。

4.6 创建FIFO接口和通用IO端口

可配置处理器中另一个重要特征是可以定义FIFO接口和通用IO(GPIO)端口来直接从数据路径中读取和写入数据。这些FIFO接口和GPIO端口的宽度可以是任意的(在这个例子中是1024b),在数字上没有任何限制(例如,FIFO和GPIO端口的宽度都可以是1024)。这些宽的数据路径直接接口可以提供多媒体和网络应用所需的高数据吞吐量,来通过处理器内核读取、处理和写入数据。

图7显示的是带有这样的FIFO接口和GPIO端口的数据路径。(有了这种方法)我们可以创建一个指令来发射两个FIFO(只要确保这两个不是空的),进行一次复杂的计算(例如循环乘加),并将结果传到另一个输出FIFO上(只要这个FIFO还没有满)。接着,再次由硬件生成工具生成适当的接口信号、控制逻辑和旁路逻辑,并生成已配置处理器所需的完整RTL,同时,软件生成工具则自动生成一套完整的编辑器工具和模仿新指令的周期精确级ISS。



                 图7:通过FIFO接口和GPIO端口进行的高速通信

4.7 加速复杂控制代码

多媒体应用中控制代码的数量和复杂性已经增加到这样的一个程度:它所消耗的计算时间和工作几乎和代码的数据密集型部分一样多。H。26?Mainprofile解码器中的一个关键部分-CABAC算法(内容自适应二进制算术编码)就是这样的一个例子:这种算法几乎就是一棵控制流程判定树,有各种各样复杂的数据计算和比较。

由于CABAC计算过于复杂,很多传统的处理器方案不得不放弃CABAC而选择一个专用的RTL加速器。但是,CABAC可以在可配置处理器上作为一套指令扩展而产生作用,不仅在性能足以媲美RTL方案的性能,同时比起RTL加速器还有另外一个优势,那就是它的数据不需要进出处理器。这样一来就显示出处理器指令扩展的另外一个优势—由于特殊应用硬件位于处理器内部,你可以更好地分割硬件和软件。

5 总结

现代的可配置及可扩展处理器是创建视频和音频引擎的完美选择,迄今为止已经为众多的半导体ASIC供应商所广泛采用。另外也有一些作为嵌入式SoC模块的视频和音频IP产品。例如,Tensilica公司及其合作伙伴就能供应一套完整的视频和音频IP产品,其中包括XtensaHiFi2音频引擎和一系列多标准多分辨率视频方案,以及H。26?(基本类、主流类和高级类)、MPEG-4(SPandASP)、MPEG-2、VC-1/WM9及各种标准的编码器和解码器软件(编解码器)。这些视频方案覆盖了QCIF、CIF和SD,都以实现HD分辨率为目标,并以低功耗和小封装为设计起点。

由于消费者的需求扩展了消费类设备中ASIC的技术规格要求,越来越多的应用将通过使用可配置处理器来执行。借助于可配置处理器所带来的自动设计流程,新的功能支持将会像软件升级一样简单,而设计和验证时间也将大大降低。
本文地址:https://www.eechina.com/thread-47041-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表