《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 设计应用 > 基于FPGA的高清AVS熵编码硬件设计
基于FPGA的高清AVS熵编码硬件设计
来源:电子技术应用2014年第2期
张贞雷,王祖强,蒋 霞,李文军
(山东大学 信息科学与工程学院,山东 济南250100)
摘要: 为实现高清AVS熵编码硬件设计,通过对算法模块进行分析,将码表切换、码字计算和指数哥伦布编码设计成流水线并行处理单元。利用并行zig-zag扫描,加快了处理速度。同时采用组合逻辑实现码表查找,设计码长确定器,节省了硬件资源。
中图分类号: TN919.8
文献标识码: A
文章编号: 0258-7998(2014)02-0042-04
FPGA-based hardware design of HD entropy coding in AVS
Zhang Zhenlei,Wang Zuqiang,Jiang Xia,Li Wenjun
School of Information Science and Engineering, Shandong University, Ji′nan 250100,China
Abstract: To implement hardware design of HD AVS entropy coding, through analysis of the algorithm module, code table switching, computing of codeword and exponential-Golomb encoding are designed to pipeline processing unit. Parallel zig-zag scan is taken to accelerate the speed of processing. At the same time, combinational logic which implements code table switching and code length determiner is taken to save the hareware resources.
Key words : AVS;entropy encoding;HD;pipeline;code length determiner

    音视频编码标准AVS(Audio Video coding Standard)是我国具备自主知产权的第二代信源编码标准[1]。AVS标准在获得高编码效率的同时降低了实现的复杂度[2]。AVS预测残差系数首先经过整数DCT变换和量化,量化器输出是一个包含少数非零系数和大量零系数的矩阵,在熵编码之前必须进行重排序,并对零系数进行有效的表示[3],因此要进行zig-zag扫描和游程编码。之后的输出是一个数组,用(run,level)表示,其中run表示非零系数之前的零的个数,level 表示非零系数的值。run、level之间存在很强的相关性,因此run、level共用一个可变长码字进行编码,这种编码方式叫做二维可变长编码[4]。
    由于AVS熵编码运算复杂,费时较长,本文采取流水线设计方式,利用并行zig-zag扫描加快了编码速度,并设计了码长确定器,节省了硬件资源,完成高清AVS熵编码硬件设计。
1 熵编码硬件设计
    AVS熵编码硬件设计包括量化数据输入、zig-zag扫描、游程编码、码表切换、组合逻辑查找、指数哥伦布编码和码流输出7个模块,电路框图如图1所示。

1.1 并行zig-zag扫描
    首先将量化系数输入到Ram0中,一个时钟输入8个,因此对于一个8×8的矩阵,只需要8个时钟就可以完成输入。然后按图2所示存入相应的Ram0地址,图中的数字代表AVS标准中规定的zig-zag扫描的顺序。
    与传统的MPEG/H.26L的VLC不同,在AVS中,采用zig-zag扫描的系数处理顺序,这种扫描顺序更易遵循level信息的变化[5]。本文采用并行zig-zag扫描,如图3所示。一个时钟周期内读出4个量化系数Out0、Out1、Out2、Out3,并且Ram0中的数据按图3括号里的数字所代表的方向顺序移动一次。例如表中的4(0)、5(1)分别表示在时钟沿到来时4号地址的数据移动到0号地址,5号地址的数据移动到1号地址。对于8×8块,最多需要16个时钟就可以完成扫描。与以往文献[6]相比,本设计将扫描时间减少了一半,加快了处理速度。
1.2 游程编码
    本设计中的并行zig-zag扫描有可能在一个时钟内读出4组(run,level),因此在存储游程编码输出时利用了4个深度为16的Ram,结构框图如图4所示。

    图4中的“扫描结果判断逻辑”的实现方法:对扫描结果Out0~Out3进行非零判断。为方便描述,规定若扫描结果不为0,则用1表示,否则用0表示,因此Out0~Out3的结果可以描述为0000~1111。定义变量num,用来表示两个level之间的0的个数,初始化为0。扫描结果的存储顺序是先存Ram1~Ram4的0号地址,再存Ram1~Ram4的1号地址,依次存储。例如,若扫描结果为0100,则令run0=num+1,level0=Out1,存储(run0,level0),并令num=2。若扫描结果为1011,令run0=num, level0=Out0;run1=1,level1=Out2;run2=0,level2=Out3,依次存储(run0,level0)、(run1,level1)、(run2,level2),并令num=0。
1.3 流水线设计
    流水线技术的本质是把一个很大的总运算单元划分成多个独立的子运算单元,某一个时间段内各个子单元可以并行工作,从而提高数据处理速度。
    本设计中将码表切换、组合逻辑查找和指数哥伦布编码设计成流水线结构,同时这种硬件结构也节省了大量存储中间结果所需要的空间。流水线结构如图5所示,图中的1~5表示第1~5组(run,level)。
1.4 码表切换模块设计
    本模块的功能是得到当前(run,level)组对应的码表号。实现过程为:若前一组level的绝对值大于跳转门限,则根据AVS标准中的码表跳转规则进行码表切换,得到当前(run,level)组的码表号tablenum,并更新跳转门限;否则,码表号tablenum不变,即当前组的码表号是由上一组level的绝对值决定的。该硬件结构如图6所示。1.5 组合逻辑查找

    编码时从最后一组(run,level)开始,为节约存储器资源,本文采取组合逻辑映射查表的方法,避免了访问存储器带来的延迟[7]。该方法由run、level和码表号tablenum组成查表索引,输入到组合逻辑中,得到对应的码字codenum。由于AVS熵编码正常编码部分对应的码字是0~59(共60个),很多查表索引对应相同的码字codenum,因此把相同的索引路径合并,从而有效减少映射路径,提高索引效率。例如由于表VLC0_Intra中(run,level)为(3,1)时所对应的码字和表VLC1_Intra中(run,level)为(2,1)时所对应的码字都是6,因此可将这两条索引路径合并,由同一条索引路径映射出码字。
1.6 指数哥伦布编码
    在AVS标准中宏块层以上的语法元素采用定长码或0阶指数哥伦布码编码[8]。残差系数采用基于上下文的二维变长编码,即对通过组合逻辑查找得到的码字codenum进行0、1、2或3阶指数哥伦布编码,逃逸编码则采用0或1阶指数哥伦布编码,在AVS标准中已经规定了每张码表对应的指数哥伦布编码的阶数。图7为产生阶数K的硬件电路,其中flag为标志位,若该码字为正常编码,则flag为0;若为逃逸编码,则flag为1。

1.7 码长确定器和码字输出
    由于指数哥伦布编码属于变长编码,因此在编码时指数哥伦布码长度的确定是影响整个编码器效率的关键问题[9]。若要准确地输出,就必须确定出码字的具体位数,以往文献[10]中是另外开辟存储空间来存储每一个码字的位数。本设计使用了码长确定器结构,直接从读出的码字进行位数的判断,从而节省了存储空间。
    由于码字的后缀部分不超过16 bit,因此该结构将高16位输入分为两组进行检测。“或门”将高8位输入进行“或”运算,用来检测码字高8位中是否含有1。在MUX中,如果“或门”的输出为1,则选择Code[15:8]作为输入;否则,选取Code[7:0]。编码器从输入的最高位开始逐位检查是否为1,若为1则输出编码值。如果最高位为1,则输出111;如果次高位为1,则输出110,依次类推,R[2:0]依次减1输出。如果“或门”的输出为1,则选择器对R[2:0]进行加8操作,否则R[2:0]的值不变。选择器的输出M就是首1的具体位置。根据式(3)就可以得到码字的长度Length。码长确定器的硬件结构如图8所示。
    在码字输出时,熵编码将各种信息以二进制的形式逐个比特写入码流,最终以字节为单位进行封装,这样会增加运算时间,使得编码效率极低[10]。本设计中采用双字节为单位写入码流,极大地加快了熵编码速度。实现方法:将完成编码的码字Code存储到宽度为16的Ram中,设置一个32 bit的码流缓冲器,变量pos表示码流缓冲器中有效码字的位置,初始值为31,在有效码字数大于或者等于16(即pos<16)时,码流缓冲器左移输出16 bit数据Codestream,然后pos加16。变量Length表示输入到缓冲器中码字的位数。输出模块的硬件结构如图9所示。

 

 

2 验证、实现结果及仿真分析
2.1 验证

    验证思路是将AVS参考软件产生的测试向量作为激励,输入到熵编码模块,然后将其结果与软件编码的结果进行比对,从而验证熵编码模块设计的正确性。本设计中参考软件产生的测试向量为2,0,2, 0,1,0,11,5,2,
7,0,1,0,0,2,8,4,0,2,0,0,1,1,0,1,0&hellip;&hellip;0共64个数据。熵编码模块的仿真输出结果如图10所示。

    通过观察熵编码的仿真输出结果与AVS参考软件的输出结果是一致的,从而验证了本设计的功能。
2.2 硬件实现结果
    硬件模块采用Verilog HDL硬件描述语言,实现了AVS熵编码模块的硬件设计,使用Quartus II 8.0进行综合与仿真,目标器件是Cyclone II系列的EP2C35F672C8。结果表明约消耗38K逻辑门,工作频率约为120 MHz。在所有量化系数有50%不为零的情况下(实际中不为零的量化系数所占比例远低于50%),完成一个8&times;8块的数据编码所需的时钟周期为48,即所需时间为4&times;10-7 s。对于高清编码(1 080p,30 f/s,视频格式4:2:2),要求完成一个8&times;8块所需时间为5&times;10-7 s,因此完全满足高清编码的要求。
2.3 仿真分析
    本设计的整体仿真结果如图11所示。

    从图11中可以看出,本设计一个时钟内读出4个量化数据Out0~Out3,并且根据Out0~Out3中非零个数完成游程编码,完成了本文中的并行zig-zag扫描的设计目标;码表切换、组合逻辑查找和指数哥伦布编码按照本文设计的流水线结构进行。此外,码长确定器的输出Length正确,完成了本文中码长确定器的设计目标,可直接从读出的码字进行位数的判断。
    本文采用组合逻辑进行码表查找,设计了码长确定器,节省了硬件资源;采用流水线设计和并行zig-zag扫描,加快了熵编码的处理速度,编码性能达到了高清视频编码的要求,对AVS高清视频编码芯片设计具有一定的参考意义。
参考文献
[1] AVS工作组.信息技术先进音视频编码:视频[M].北京:中国标准出版社,2006.
[2] 李文军,王祖强,徐辉.基于FPGA的AVS帧内预测电路设计[J].电子技术应用,2013,39(8):50-53.
[3] 刘宁.基于DSP的DCT变换和量化技术研究[D].浙江:浙江大学,2007.
[4] Wang Qiang,Zhao Debin,Gao Wen.Context-based 2D-VLC entropy coder in AVS video coding standard[J].Journal of Computer Science and Technology,2006,21(3):315-322.
[5] Xu Long,Deng Lei,Ji Xingyang,et al.Hardware architecture for AVS entropy encoder[C].Consumer Electronics (ICCE),2008.
[6] 刘锦阳.基于FPGA的AVS实时高清视频编码器的研究与实现[D].上海:上海大学,2009.
[7] 黄玄,陈杰,李霞,等.AVS高清视频变长解码器算法与电路实现[J].微电子学与计算机,2009,26(1):76-80.
[8] 周小龙,王祖强,魏先政.AVS及H.264双模可变长解码器设计[J].计算机工程,2012,38(12):222-224.
[9] 王小东.AVS视频编码器的熵编码与插值部分的FPGA设计与实现[D].济南:山东大学,2011.
[10] 白玉婷,张刚.AVS熵编码的FPGA实现[J].软件,2012,33(2):102-104.

此内容为AET网站原创,未经授权禁止转载。