H.264 baseline解码器中运动补偿模块的硬件设计
2008-04-17
作者:俞 尧,杨华中
摘 要: 完成了H.264 baseline解码器中运动补偿模块" title="运动补偿模块">运动补偿模块的Verilog建模,通过了功能验证和综合。该运动补偿模块可用于H.264 baseline解码器的FPGA实现和ASIC实现。
关键词: H.264 运动补偿模块 硬件设计
H.264是ITU-T(VCEG)和ISO/IEC(JVT)联合提出的新一代的视频编码标准,该标准于2003年公布。H.264标准承诺将在编码压缩性能上超过以往所有的视频编码标准(MPEG2,MPEG4,H.263等)。H.264包含7个不同的档次,其中baseline档次适合于手持设备、个人终端等应用。
在H.264 baseline解码器的FPGA或ASIC实现中,运动补偿模块占据十分重要的地位。一般来讲,在整个解码器中,运动补偿模块往往是占用硬件复杂度最高、功耗最大的模块。因此在解码器的设计过程中,有必要对运动补偿模块进行精心设计。
1 Baseline级别中运动补偿的特点
在一般情况下,H.264 baseline解码器中的运动补偿器具有以下特点:
(1)支持4×4到16×16的可变块大小的运动补偿。
(2)支持运动向量的预测和恢复。
(3)在像素插值" title="插值">插值中,亮度像素的插值精度为1/4像素,色度像素的精度为1/8像素。
(4)运动补偿器涉及的图像类型只有I帧和P帧。除此之外,没有其他类型的图像。
2 运动补偿模块的硬件设计
运动补偿的大致流程为:根据H.264标准所规定的算法,利用解码得到的运动向量残差和解码端计算出运动向量估计值,恢复出当前块的运动向量。并利用已经掌握的运动向量、参考帧号和当前解码块的位置等信息,从外存(本设计支持SDRAM或DDR SDRAM)中读入所需的参考帧数据。然后,利用读入的参考帧数据,结合已经计算出的运动向量,完成亚像素" title="亚像素">亚像素插值。插值之后的数据即是像素的预测值,该预测值可以输出到图像重建" title="图像重建">图像重建模块中与反量化反变换模块得到的像素残差值相加,并回写入外存中。
由于H.264使用帧内预测和帧间预测,图像重建模块需要处理来自帧内补偿和运动补偿两个模块的数据,所以解码器中,图像重建模块并未被划分到运动补偿模块中,而是独立成为一个模块。该模块的硬件设计也已完成。本运动补偿模块的顶层结构及周边模块的结构如图1所示。其中虚线框所示为运动补偿模块的顶层结构。
2.1 运动向量恢复模块
在H.264 baseline解码器中,当前块的运动向量需要通过本地计算恢复得到。计算方法是:将本地恢复的运动向量估计值和编码端传输过来的运动向量残差值相加,得到的和即是当前块的运动向量。其中运动向量估计值的计算完全遵照H.264标准。由于计算当前块数据时需要用到相邻块的数据,所以需要一个本地存储单元将其暂时存储。这里所谓的相邻块的定义如标准所述。
运动向量恢复模块的结构如图2所示。在该模块中,控制模块生成控制信号,调度各个子模块的工作。当前块的信息首先被输入到相邻块信息生成模块。该子模块利用这些信息计算出相邻块的位置信息。这些位置信息被提交给本地数据管理模块,从中调用相邻块的运动向量相关信息,并输出给运动向量估计模块。运动向量估计模块利用这些数据,估计出当前块的运动向量估计值,并将估计值反馈给本地数据管理模块。在本地数据管理模块内,运动向量的估计值和残差值相加得到当前模块的运动向量。一方面,这个运动向量被作为运动向量恢复模块的输出;另一方面,运动向量同时被存储进本地存储器,当需要时可被当作今后块的相邻块信息调用。
2.2 参考帧数据读取模块
由于参考帧数据被按照一定的格式存储在外存中(本设计支持SDRAM或DDR SDRAM),为实现运动补偿,需要将所需的参考帧数据从外存中读入;另一方面,插值模块需要使用到这些读入的数据。因此,参考帧读取模块的主要功能是将参考帧数据读入,并按照一定的格式输送给亚像素插值" title="像素插值">像素插值模块。
H.264标准规定,亮度像素通过6抽头的滤波器实现半像素插值,色度像素通过2抽头的滤波器实现半像素插值。因此,对于一个4×4的亮度块,需要一次读入一个9×9像素的块;对于2×2的色度块,需要一次读入3×3像素的块。由于亚像素插值是逐行进行的,亮度像素每次输出同一列的6个点给亚像素插值模块;而色度像素则输出同一列的3个点给亚像素插值模块。
总体来讲,参考帧数据读取模块通过一个多层嵌套的状态机实现。其中顶层的状态跳转状况如图3所示。
首先,本子模块根据当前块的位置和当前块的运动向量,计算出参考数据块在参考帧中的位置。这个位置信息和参考帧编号被一起提交给外部的地址转换模块,从而申请从外存读入数据。本子模块内部包含了一个9×9字节的本地寄存器堆,从外存中读入的数据被暂时存储在寄存器堆内,以便这些数据被并发访问。一旦进入到数据输出状态,就按节拍选择必要的数据输出给亚像素插值模块。
2.3 亚像素插值模块
为尽可能减少片内存储器的数量并兼顾速度,亚像素模块对亮度采用4×4块串行处理的工作方式。即在一段时间内集中处理一个4×4亮度块的数据。如果当前单元大于4×4,则必定将其划分为多个4×4块,并且这些4×4块之间享有相同的运动向量。类似的,对于色度数据则采用2×2块串行处理的工作方式,即在一段时间内集中处理一个2×2亮度块的数据。在同一个4×4或2×2块内,则采用逐行计算的顺序。
对于亮度部分,需采用6抽头的滤波器来实现整像素到半像素的插值。考虑到6个抽头的加权系数为[1,-5,20,20,-5,1],如果直接采用乘法器实现乘系数的运算,则必然导致较高的硬件开销。因此采用两种基于加法器的设计来分别实现横向和纵向的半像素插值。这两种滤波器的结构分别如图4(a)和图4(b)所示。
在图4所示滤波器中,Sx表示将输入数据向左移x位,而L表示将输入数据延迟一个时钟。在图4(a)中,N×5用N+(N>>2)实现,N×20用(N>>4)+(N>>2)实现。图4(b)采用类似的方法。经过合理的设计,仅采用一个加法器就实现了对6个抽头的乘系数操作。
同理,对色度像素也作了基于加法器的设计,整个操作全部采用加法器和移位器实现,大大节省了硬件开销。
2.4 周边模块简介
图像重建模块负责将像素残差和像素的估计值求和,并将结果回写入外存。H.264解码器包含运动补偿模块和帧内补偿模块,像素的估计值可能来自两者,不同来源地的数据都在该模块内处理。因此图像重建模块被独立为一个模块,而不从属于运动补偿模块。
另一方面,参考帧数据在外存中按照某种结构存储,对外存的读写需要提交存储器对应地址,而解码过程中产生的像素位置值是其在图像中的坐标。地址转换模块的作用是完成两者的转化,并将转换结果输送给DRAM接口。
上述周边模块的设计也已完成。
3 功能验证与综合
本运动补偿模块已通过利用Modelsim XE 5.7c进行的功能仿真。在功能验证时,采用与H.264标准配套的jm86生成测试向量。将Verilog模型计算结果与jm86本身运算结果比对,两者完全一致。
本模块利用synplify pro 8.1针对XILINX sparten3 的FPGA开发板进行综合,结果显示共使用了6157个LUT。利用Synopsys的design vision针对smic18工艺进行综合,通过了本运动补偿模块的可综合性验证。
参考文献
[1] Draft ITU-T Recommendation and pre-publish draft international standard of jointVid sopecification(ITU-T Rec.H.264ISO/IEC 14496-10:2005(E)) Joint Video Team(JVT), Mar.2005.
[2] Iain G.Richardson.International electrotechnical commission video coding for next-generation multimedia,0-470-84837-5,2003.
[3] HE Wei feng,MAO Zhi gaig,WANG Jin riang,et al.Design and implementation of motion compensation for MPEG-4 AS profile streaming video decoding,0-7803-7889-x/03,IEEE,2003.
[4] CHIEN Chih Da,CHEN Ho Chun,HUANG Lin-Chieh,et al.A low-power motion compensation IP core design for MPEG-1/2/4 video decoding,0-7803-8834-8/05,IEEE, 2005.