基于AVS的变字长解码器的设计及其FPGA验证
2009-05-06
作者:李晓燕,张卫宁,袁 鲲,赵建全
摘 要: 提出了一个完整的AVS变字长解码器的硬件架构,在设计中采用加入FIFO的方法构成流水结构,并尽量减少变字长解码器中各子模块的运行节拍,大大提高了系统的运行速度。本设计已经通了FPGA验证。该变字长解码器不仅可以成为其他AVS解码器的硬件加速器,同时由于视频编解码标准的相似性,稍加改动即可应用在其他的视频标准中。
关键词: AVS;变字长解码器;FPGA
AVS(Audio Video coding Standard)是我国具备自主知识产权的第二代信源编码标准,是《信息技术先进音视频编码》系列标准的简称。2006年2月底,AVS标准被正式批准为数字音视频国家标准,并于2006年3月1日起正式实施。它与现今国际上最先进的视频编码标准H.264相比,在实现同等压缩性能的前提下,其计算复杂度有明显降低。虽然复杂度较H.264有所降低,但用软件实现解码仍然很难达到实时解码的效果,因此需要采用硬件解码器。
根据AVS标准[1]设计的基于硬件的解码器框图如图1所示。
解码器由系统控制器和各功能模块组成,模块与模块之间加入FIFO,使得模块间可以以8×8块的大小进行流水处理。总体结构的组成模块为:系统控制模块(Sym_controller)、变字长解码模块(VLD)、反量化模块(IQ)、反变换模块(IICT)、帧内预测模块(Intra_pred)、帧间预测模块(Inter_pred)、环路滤波模块(Deblock)、存储模块(Restore)等。系统控制模块控制各个模块的工作状态和模块与模块之间的通信。为了节省片上资源,将输入码流、已解码的帧和参考帧等需要大量存储空间的部分都存放在片外存储器内。片外存储器与片内模块之间通信的数据宽度设为128 bit,以减少片内与片外数据交互所耗费的时间。
在整个解码器结构中,变字长解码器(VLD)位于此硬件解码器的第一级,因此其速度要求较高。本文针对AVS变长码字解码的特殊性设计了一种适用于AVS解码的VLD结构。
1 变字长解码器的设计
1.1 变字长解码器的功能和结构
变字长解码器的功能是将输入的码流解析成一系列语法元素,主要包括:序列头信息、帧头信息、宏块头信息及宏块亮度色度系数。解析出的宏块层以上的语法元素加以存储,宏块层以下的语法元素则直接传送入下一级模块进行处理。
变字长解码器的硬件结构主要由三部分组成:预处理模块(pre_process)、解析模块(parsing)和FIFO。在两个功能模块之间加入FIFO,目的是使预处理模块和解析模块能够实现并行操作,提高变字长解码器的运行速度。从外部存储器中以128 bit的位宽将码流输入到第一级FIFO中,经过预处理模块处理后的数据进入第二级FIFO缓存,最终经过解析模块后完成变字长解码功能。
1.2 变字长解码器的设计
变字长解码器的功能决定了其解码速度,但由于其解析的大部分语法元素的长度是不固定的,需要解完一个语法元素才可以知道它的长度,然后进行下一个语法元素的解析,所以很难采用并行操作,给设计增加了难度。本设计一方面考虑尽量减少VLD各子模块的运行节拍,另一方面从架构入手,通过适当使用FIFO构成流水结构,来达到整体运行速度的提高。
1.2.1 预处理模块的设计
预处理模块的功能是去除起始码前缀以及伪起始码的插入位。
起始码:起始码标志着一个单元的开始,同时又意味着前一个单元的结束。起始码包括起始码前缀和起始码的值两部分。起始码前缀为固定比特串0x000001,起始码的值是一个有特定意义的8 bit整数。起始码前缀在码流中起到一个标识符的作用,但在解码过程中没有实际的意义,因此需要在解码时将其去除。
伪起始码:当部分语法元素取特定值时就会在单元内部出现与起始码前缀相同的比特串,如果不做处理,就会在解码过程中出现误读起始码,从而导致解码错误。因此在编码时,对这种情况做了特殊处理,其过程为在每写入一位时,如果该位是一个字节的第二最低有效位,检查该位之前写入的22位,如果这22位均为‘0’,则在该位之前插入两位的‘10’,而该位成为下一个字节的最高有效位。因此在解码过程中,遇到伪起始码时应将其添加的‘10’去除。
预处理模块的设计结构如图2所示。
图2中reg_c为32位寄存器,用来接收来自fifo_in的32位数据,reg_c通过控制器controller输出的移位控制进行相应的移位操作,将数据移入24位寄存器reg_b中。检测器detector检测寄存器reg_b中的数据是否为起始码前缀或伪起始码,并将检测结果送入控制器,控制器根据检测结果发出相应的控制信号。经过检测处理后的数据送入40位寄存器reg_a等待输出。加法器add_a和加法器add_c的作用是对寄存器reg_a和寄存器reg_c进行计数。当加法器add_a计数达到32时,表明寄存器reg_a中已经有32 bit的数据等待输出,此时加法器add_a进位,控制器发出fifo_out的写信号,将reg_a中的32位数据送入fifo_out中;当加法器add_c计数达到32时,表明reg_c已空,此时加法器add_c进位,控制器发出fifo_in的读信号,从fifo_in中读取新的32 bit数据放入寄存器reg_c中。
1.2.2 解析模块的设计
解析模块的功能是作定长、变长码字的解码。解析帧内预测模式、运动向量、参考帧索引和残差系数。
设计中解析模块主要由以下几个部分构成:变字长解码控制器(VLD_controller),桶形移位器(B_shifter),长度检测器(length_detector),code_num计算器(code_num),查表模块(look_up_table)。其结构如图3所示。
解析模块的输入码流为经过预处理后的数据。变字长解码控制器由状态机来控制整个解析定长及变长语法元素的过程。当解析的语法元素为定长时,控制器输出此语法元素的长度len,同时接收来自桶形移位器的输出码流数据data_out,将数据data_out右移(32-len)后即可得到语法元素的值。与此同时,桶形移位器将解码过的长度为len的数据移出,并准备好下次需要解码的数据;当解析的语法元素为变长时,控制器控制桶形移位器输出数据data_out给长度检测器,经检测后得到变长码的长度vlc_len,之后将数据输入码字值计算模块,计算得到码字的code_num,若为非残差数据,则将数据返回给控制模块,若为残差数据,则将解得的code_num作为查表模块的输入,查表得到相应的(run,level)对后,经过反扫描反变换后得到残差数据,同时桶形移位器将解码过的长度为vlc_len的数据移出并准备好下次需要解码的数据。下面介绍解析模块(parsing)中各功能模块的结构。
(1)桶形移位器的设计
桶形移位器的作用是将已经解码过的数据移出,并保证每次输出的数据均为未解码的数据。它在解析模块中非常重要,桶形移位器准确快速的移位是能够正确解码的前提。本文所设计的桶形移位器状态机结构如图4所示。
wait & data_out:等待状态
当桶形移位器在此状态时表明移位器可用,并且移位器输出引脚上的数据data_out为未解码的数据。当长度使能信号len_en为低电平时,表明没有长度信号输入,保持在此状态;当长度使能信号len_en为高电平时,则表明有长度信号输入,此时进入寄存器数据移位状态。
reg_shift:寄存器数据移位状态
将接收到的长度信号(若为定长,接收到长度为len,若为变长,则需要经过长度检测(length_detect)得到变长码字长度vlc_len)作为移位的长度,将桶形移位器中数据左移。此操作将已经解码过的数据移出移位寄存器。同时,将接收到的长度送入累加器。当累加器的值没有达到32时,转到等待状态;当累加器的值达到32时,累加器发生溢出,其溢出位作为FIFO的读信号,进入FIFO读状态。
fifo_read:FIFO读状态
当累加器溢出,则进入FIFO读状态。在此状态向FIFO发出读取信号,读取FIFO中的32位数据装入桶形移位器,并回到等待状态。
length_detect:长度检测状态
当需要解码的语法元素为变长时,则需要经过长度检测状态。长度检测器在此状态检测出变长码字的长度,并将其送入移位器进行移位(由于长度检测状态取决于长度检测器,因此用虚线标出)。
由图4中的状态跳转可以看出,当桶形移位器不需要从FIFO中读取数据时,仅需要两个时钟周期即可完成数据的输出、长度接收、移位和码字值计算,而当移位器需要从FIFO中读取数据时,也仅需要三个时钟周期即可回到可用状态,这是因为在设计时,对于定长码,将其数据输出与长度接收并行执行;而对于变长码,将桶形移位器的移位操作和码字值计算器的计算操作并行执行。这种设计不仅简化了移位器的工作节拍,而且模块间并行执行的思想也使整个解析模块的解码速度得以提高。
(2)长度检测器的设计
长度检测器用来检测指数哥伦布码字的长度。本文根据基于H.264的长度检测器[2]并结合AVS指数哥伦布解码的要求设计了一个符合AVS标准的长度检测器,其结构如图5所示。
图中优先编码器电路priority_encoder用Verilog可以描述为:
reg [1:0] priority_out;
always @ (data_in)
begin
casez (data_in)
4′b1???:priority_out=0;
4′b01??:priority_out=1;
4′b001?:priority_out=2;
4′b0001:priority_out=3;
default: priority_out=0;
endcase
end
由于AVS码字长度不会超过32 bit,因此其前导零的长度最大为15 bit,所以只需检测16 bit即可得到指数哥伦布码的前导零的个数,进而得到码字的长度。检测过程为:先将16 bit数据以4 bit为单位分成四组,分别输入到4个或门中,再经过优先编码器1(priority_encoder1)就可以知道第一个“1”在哪一组中,然后通知复用器将这一组的4位数据输出,经过优先编码器2(priority_encoder2)即可检测出这一组中第一个“1”的位置,最后根据这个组在整个16 bit数据中所处的位置以及第一个“1”在此组中的位置就可以计算出其前导零的长度M,结合变字长码控制器给出指数哥伦布码的阶数K,由公式len=2M+1+K即可求出指数哥伦布码字的长度。
(3)码字值计算器的设计
对于K阶指数哥伦布,其码字值的计算公式为:
code_num=2M+K-2K+INFO
对于0阶指数哥伦布,若其语法元素的描述子为ue(v),语法元素的值等于K=0时的码字值;若其语法元素的描述子为se(v),语法元素与码字值code_num的对应关系如下:
语法元素值=(-1)code_num+1×ceil(code_num÷2);
若其语法元素的描述子为me(v),则先求出0阶指数哥伦布码字值再根据AVS标准[1]中的表15和表16求MbCBP和MbCBP422的值;若其语法元素的描述子为ce(v)时,则将计算出的码字值送入查表模块解析残差系数。
(4)查表模块的设计
经过码字值计算器计算得出的code_num作为查表模块的输入,得到(run,level)对,将level值反量化后进行游程解码再经过反变换后即可得到8×8块的残差系数矩阵。之所以将反量化过程在游程解码之前进行是因为经过变换编码的一个像素块中大部分数据均为0,如果对所有系数均进行反量化处理则会产生较大的时间冗余,因此在进行游程解码之前仅将非零系数进行反量化[3],反量化过程结束之后进行游程解码。游程解码结构如图6所示。
游程解码的过程是由图6中的寄存器堆完成的。此寄存器堆有以下四种工作模式:
reg_mode:寄存器模式
当寄存器堆处在此模式时,寄存器堆中数据保持不变。
chain_mode:链模式
当寄存器堆处在此模式时,即进行游程解码的过程。寄存器中的值按照虚线箭头所指的方向进行数据移动。具体解码过程为:当需要游程解码时,读一对(level,run)数据,先把level数据进行反量化,然后将反量化之后的level值输入标号为0的寄存器reg_0,将与level相对应的run值作为计数初值,每当主时钟上升沿到来时将计数值减1,并将原来放在reg_0中的数据根据虚线箭头所指的方向进行寄存器的赋值,而原来存放level值的寄存器清零。重复操作,直至计数值减为0,再进行下一轮(level,run)的求解。在前面求解level、run时,块的结束以向FIFO输入一个全1为标志。因此在游程解码过程中,如果遇到全1标志则表明一个块已经解码结束,此时就可以进入idct模式进行数据的idct处理。
idct_mode:idct模式
当寄存器堆处在此模式时,寄存器堆向idct模块输入相应数据,并接收idct之后的数据。
row_mode:列模式
当寄存器堆处在此模式时,寄存器中的值按照实线箭头所指方向进行数据移位,此时即将寄存器堆中数据以行为单位组合,共用8个时钟周期,将8行数据送入下一级FIFO缓存,等待下一步处理。
在解码过程中,根据需要从这四种模式中切换,最终将解码后的残差数据存入下一级FIFO中。
2 变字长解码器仿真结果
本文设计的变字长解码器结构用Verilog HDL描述,在Xilinx的ISE环境下进行了综合,并用Modelsim6.2进行了软件仿真。利用AVS标准参考软件rm5.2j产生测试码流数据,将码流数据输入到所设计的模型中,然后将输出数据与标准输出进行对比,测试功能的正确性及完整性。软件仿真正确之后则进行开发板的验证。本设计采用的是Xilinx公司的Virtex4系列XC4VSX35型FPGA开发板进行验证,用FPGA调试工具ChipScop Pro观察信号在FPGA开发板上的运行情况。经过多次数据勘测,结果表明本文设计的变字长解码器在FPGA开发板中运行结果正确。结果如图7所示。
该变字长解码器不仅可以成为其他AVS解码器的硬件加速器,同时由于视频编解码标准的相似性,稍加改动即可应用在其他的视频标准中,具有很好的应用价值。
参考文献
[1] 数字音视频编码技术标准工作组.信息技术 先进音视频编码 第2部分:视频(GB/T 200090.2-2006).中国国家标准化管理委会,2006.
[2] 颜明,陈咏恩.高效的H.264指数哥伦布解码器设计.现代电子技术,2007(3):71-73.
[3] 赵策,刘佩林.AVS游程解码、反扫描、反量化和反变换优化设计.信息技术,2007(2):54-57.
[4] 戴春泉,李锦涛,黄晁.适用于H.264视频解码器的VLD设计.计算机工程,2005(13):162-164.
[5] WU Di,GAO Wen,Hu Ming Zeng,et al.An Exp-Golomb encoder and decoder architecture for JVT/AVS.
[6] SHENG Bin,GAO Wen,XIE Don,et al.An efficient VLSI architecture of VLD for AVS HDTV decoder.IEEE,Transactions on Consumer Electronics,52,2,2006:696-701.