H.264/AVC中CAVLC编码器的硬件设计实现
来源:电子工程世界 作者:—— 时间:2010-09-19 13:49
H.264/AVC是ITU-T和ISO联合发布的国际视频压缩标准[1],比特压缩率分别是MPEG-4、H.263及MPEG-2的39%、49%及64%[2],是一种高压缩比的新标准。基于内容的自适应可变长编码(CAVLC)是H.264中关键技术之一,应用于H.264的基本档次和扩展档次对亮度和色度残差数据块进行编解码,编码效率高,抗误码和纠错能力强[3],但计算复杂度大,用软件编码难以满足高清视频实时性要求。H.264编码过程不涉及任何浮点数运算,特别适合硬件电路实现。文献[4]提出的CAVLC编码可分成扫描和编码2部分,扫描部分对残差数据zig-zag逆序扫描后,提取出run-level标志以及相关信息提供给编码部分进行编码。文献[5]对扫描模块进行了优化。编码模块中非零系数级(level)编码计算量最大,复杂度最高。本文充分利用FPGA高速实时特点,采用并行处理及流水线设计,通过优化CAVLC编码结构和level编码子模块,提高CAVLC编码器的性能。
1 CAVLC原理
CAVLC是一种依据4×4块变换系数的zig-zag扫描顺序进行的编码算法。块系数的非零系数幅值较小,主要集中在低频段,经过zig-zag扫描后,连续零的个数较多,采用run-level游程编码,通过编码5个语义元素能够实现高效无损压缩,编码流程如图1所示。zig-zag扫描后,顺序编码系数标记(coeff_token)。尾1的符号(trailing_ones_sign_flag)、除尾1外非零系数的级(level),最后一个非零系数前零的个数(total_zeros)和零的游程(run_before)。其中TC、T1、T0分别表示非零系数个数、尾1个数以及最后一个非零系数前零的个数。由于CAVLC编码流程是串行的,软件容易实现,但执行速度慢且效率低。
2 CAVLC编码器硬件结构设计
2.1 并行化编码结构
为了提高运算速度和效率,将图1的CAVLC编码流程并行化处理,适合FPGA实现。根据文献[4]提出的思路,将CAVLC编码分成扫描和编码2部分,见图2。由zig-zag逆序扫描、统计、编码、码流整合4个模块组成。zig-zag模块和统计模块构成扫描部分,编码模块和码流整合模块构成编码部分,系统采用状态机控制。由于trailing_ones_sign_flag、level和run_before都是从zig-zag扫描后序列的尾部开始编码,所以本设计中zig-zag采用逆序扫描。统计模块用计数器统计zig-zag逆序扫描输出序列的TC、T1和T0,将尾1符号(T1_sign)、除尾1外的非零系数(coeffs)和零的游程(runbefore)存入缓存器并输出。编码模块分成6个子模块:NC生成模块、coeff_token模块、trailing_ones_sign_flag模块、level模块、total_zeros模块以及run_before模块。统计模块给各编码子模块提供输入数据,保证各编码子模块并行工作,减少了CAVLC编码的时钟周期,提高了编码器执行效率。由于CAVLC编码是变长的,使得每个编码子模块的输出码流长度不确定,各编码子模块的码字寄存器宽度不同。为了保证各编码子模块生成的码字能够紧凑无缝链接和有效存储,在各编码子模块的码字输出中嵌入输出标志信号和码长信息,当输出标志信号为高电平时码字与码长有效,低电平时则无效,经码流整合模块整合后输出。
上一篇:有源滤波电路设计总结