11bin/周期CABAC硬件编码器架构
基于上下文的自适应二进制算数编码器CABAC将算数编码区间定义为[L,L+R],其中L定义为区间下界,R定义为区间长度。如图1(a)所示,CABAC算法由3个功能模块串行完成编码,其中二值化模块BN将各类编码SE转换为3类bin串,bin类型包括常规编码bin(RB)、旁路编码bin(BB),以及终止bin(TB);上下文模型化模块CM为每一个RB选择上下文模型(RB的统计概率模型),并负责上下文模型状态的更新;二进制算数编码模块BAC负责根据bin值更新编码区间,通过重整化保持区间计算精度,并输出L的高位确认比特,实现压缩码流输出。对于RB编码,BAC需根据CM选取的上下文模型判断RB是MPS(mostprobablesymbol)还是LPS(leastprobablesymbol),对应计算子区间长度RMPS或RLPS,再完成区间重整化;而对于BB编码,BAC根据BB为0或1的概率相等原则将R更新为R/2,在重整化后区间长度恢复到R。1bin/周期CABAC全硬件编码器参考文献[5]的功能模块划分如图1(b)所示。设计通过合理划分功能与调整编码步骤次序,将CABAC3个功能模块转换为7个并行处理的硬件功能单元。BN模块由BN单元和BS单元实现,其中BN单元将编码SE值采用对应的编码方式生成二值化的bin串,BS单元将bin串按每周期1bin的速度串行输出到后续编码单元。CM模块的上下文模型选择通过CS1和CS2两单元实现,其中CS1单元完成需要参考相邻宏块(MB)已编码SE的上下文模型选择。CS1需要访问上下文模型参考SE存储RAM,因此在编码流程中提前计算,以避免访问延迟,而CS2单元中上下文模型的选择计算不需要参考相邻MB已编码SE,因此在编码器中配置CS2与BS单元设置为相同周期并行计算。CM模块的上下文模型访问由CA单元实现。CS1和CS2选择的上下文模型存放在RAM,因此CA采用多级流水线结构以避免RAM访问延迟对bin编码吞吐率的影响,并通过本地缓存机制减小RAM的访问频率。CA读取的上下文模型以及bin值输送到AR单元,由AR完成编码区间更新,即R和L值的更新。RB、BB和TB的更新计算在AR中分开完成,以降低电路延迟。L更新计算重整化操作输出的高位比特在BP单元中打包输出。由于BP单周期计算延迟较长,BP功能采用两级流水线结构完成。图1(b)中BS&CS2、CA、AR、BP构成了CABAC编码器编码流水线的4级并行处理单元。该流水线设计能保证编码器稳定的1bin/周期吞吐率。编码器前级的BN、CS1单元与编码流水线之间设置FIFO缓存,以保证前后两级功能单元能完全并行编码。
2CABAC硬件编码器吞吐率的改进设计
2.1CABAC硬件编码器改进策略改进设计没有采用RB编码加速优化方案,如单周期2个或多个RB编码的硬件结构等,笔者改进设计把提升旁路编码bin(BB)处理速度,即降低BB的平均编码周期数作为设计重点,在维持较高时钟频率的前提下提高编码器的绝对吞吐率。笔者通过两种方式电路改进实现BB编码吞吐率提升:①单周期N-BB编码电路实现对指数哥伦布码bin串以及紧邻的符号位BB(MVD符号或Coeff符号)的加速编码;②对于紧邻RB的符号位BB,调整RB的算数编码电路,实现单周期1RB+1BB编码。方式②实现对数值较小的MVD或者块系数Coeff的符号位BB编码加速。改进算法及电路实现为保证编码器原有时钟频率,需要考量单周期所支持的最大BB编码个数Nmax对电路延迟的影响,并在二进制算数编码BAC的流水线各级均衡分配区间更新、输出比特打包等操作计算量,以便有效控制流水线各级的关键路径长度。图2给出了基于以上改进思路的AR单元两级流水线设计框图。2.2单周期N-BB算数编码2.2.1算法描述CABAC编码器的二进制算数编码模块BAC的编码区间由[L,L+R]界定,其中L[9:0]共10比特,且在每个bin编码前L值小于0×200,R[8:0]共9比特,bin编码前R范围在[0×100,0×200)内,区间上限值L+R小于0×400。如果直接采用串行编码方式顺序完成多个BB的L、R更新计算以及比特输出判断,BB编码的电路关键路径长度将随单周期BB编码个数成倍增长,因而无法提升编码器处理速度。笔者采用单周期多BB编码算法。用BBN[N-1:0]表示单周期完成编码处理的BB位串,N值范围为1~Nmax。由于在BAC连续编码BB过程中,R的更新值维持不变,算法核心工作是实现L快速更新。定义LBBN为L计算的10+N比特中间结果为:LBBN[N+9∶0]=L×2N+BBN×R=(LN)+BBN×R(1)完成LBBN计算后,L值即可按如下方式重整化,并完成更新:如果LBBN[N+9:10]的N比特全为1,则L=LBBN[9:0],且输出N比特1;否则,L=LBBN[8:0],且需要解析LBBN的计算结果解析高N+1位,即LBBN[N+9:9],以确定输出N比特值。L更新计算在图1中由AR单元完成,而LBBN[N+9:9]的解析输出在BP单元实现。若LBBN[N+9:10]的N比特非全为1,则BP单元对LBBN[N+9:9]比特串的解析输出的基本步骤如下:(1)检测LBBN[N+9:9]中最低零比特(leastsignificantzero,LSZ)位置IdxLSZ。(2)如果LSZ为LBBN[N+9:9]最高位比特,即IdxLSZ=N+9,则输出N比特为待定比特。(3)如果LSZ为LBBN[N+9:9]最低位比特,即IdxLSZ=9,则输出确定的N比特LBBN[N+9:10]。(4)如果步骤(2)和步骤(3)皆不成立,则输出比特包含确定比特LBBN[N+9:IdxLSZ+1]以及待定比特数IdxLSZ-9。表1说明该算法在N值为2、3、5条件下L更新计算结果及输出比特。表1中的数值均采用二进制表示。表1中3组输出结果说明LBBN[N+9:9]中LSZ位置确定输出比特中待定比特数。2.2.2电路设计在参考文献[5]中,包括BB在内的各类bin编码在流水线AR级单周期实现编码区间的L和R值更新计算。由于N-BB编码中LBBN计算的乘法器计算时延较长,该设计将编码器流水线的AR单元拆分为ARR和ARL前后两级,如图2所示。其中ARR主要完成编码区间长度R更新计算,ARL完成编码区间下限L的更新。ARL单元实现各类bin编码的L更新计算,支持单周期N-BB、1RB、1TB(terminalbin)编码以及1RB+1BB组合编码等模式。ARL单元的L更新后,比特打包输出由BAC流水线下级BP完成。按照上述流水线功能划分,ARL单元须在单周期完成BBN×R乘法,其中R为9位无符号整数。考虑到该设计上下文模型初始化流水线设计已采用8位乘6位乘法器,将N-BB编码算法设定N值上限Nmax为5,以确保ARL单元的电路关键路径长度不会超出原设计范围。该N值可保证大部分情况下MVD和Coeff二值化产生的指数哥伦布码BB位串及相邻符号位BB在两个周期内完成编码。ARR计算得到N-BB编码的BBN×R乘积定义为ProductBB[N+8:0],而在流水线下一级ARL单元中LBBN计算可拆分为式(2)中高位、低位两部分。该方式可减少加法器长度及计算延时:LBBN[N+9∶N]=L+ProductBB[N+8∶N]LBBN[N-1∶0]=ProductBB[N-1∶0](2)ARL单元中对N-BB编码最后完成LBBN高N比特,即LBBN[N+9:10]的全1判断,并输出LBBN[N+9:9]到BP单元。输出比特全1判断通过位与运算(&LBBN[N+9:10])完成。通过上述ARR、ARL两级流水线设计,BAC模块实现了最高5BB/周期的编码能力。2.3单周期1RB+1BB算数编码2.3.1算法描述单周期完成1RB和1BB计算的优势是加快了MVD符号和块系数Coeff符号位BB编码。这两种符号位BB在BB编码中的统计比例远高于MVD和Coeff的指数哥伦布码BB,原因在于较小MVD和较小Coeff出现概率较高。该算法基于参考文献[5]AR单元,实现单周期1RB编码和单周期1RB+1BB编码两种模式。与单周期N-BB编码相似之处是1RB+1BB编码的L更新计算量高于R更新计算,且L更新计算依赖于R计算的部分结果。因此1RB+1BB编码也在ARR、ARL两级流水线分别实现R、L更新。ARR单元根据RB值选择子区间长度,并重整化,以保持R值比特精度。在ARR单元计算RB编码同一周期内,与R值相关且将用于L更新计算的变量需要与R更新同周期完成,以便减小ARL单元用于1RB+1BB编码的电路延时。ARL单元基于ARR提供的中间数据、bin编码模式、bin值,以及前一周期L更新值完成当前周期L更新,并向流水线下一级BP提供输出解析比特串。2.3.2电路设计如图2所示,单周期1RB+1BB算数编码的电路设计在ARR单元和ARL单元完成。下列计算公式中采用赋值符号“=”和“<=”分别表示组合逻辑电路赋值和寄存器赋值。如式(3)所示,ARR单元在1RB+1BB编码周期,除R寄存器外,另需计算寄存器RS、RM、ShiftN、ShiftN+1,以便流水线下一周期在ARL中L更新计算时直接使用这些中间结果。RS计算式中{R1}表示R值的2倍。由于NLZD不超过6,ShiftN和ShiftN+1均设为3比特寄存器。ARR单元根据R值选取RLPS并计算RMPS,根据RB值和上下文模型选择子区间长度RSel,再通过LZD(leadingzerodetection)电路检测RSel的高位连零个数NLZD,对RSel左移NLZD实现R值重整化。在ARL单元根据RB值为LPS或MPS分别计算L更新值,其中LRB、LRB+BB1、LRB+BB0分别对应单个RB编码、1RB和1个值为1的BB编码、1RB和1个值为0的BB编码。ARL单元采用MUX31选取当前周期对应的L计算结果LSel,并采取类似N-BB编码算法的高位全1检测,以确定L重整化的更新值最高位L[9]是否需要置0。LSel的高位比特串OutputParse输出到流水线下级BP用于比特打包输出。对于单RB编码,BP输出比特总数为ShiftN(包括待定比特),而在1RB+1BB编码时,输出比特总数为ShiftN+1。与参考文献[5]的AR单元比较,支持1RB+1BB编码的ARR单元关键路径得到简化,原因在于L更新计算移到流水线下级;而ARL单元关键路径计算延迟相对于原AR单元也更短,原因在于L更新所依赖的RMPS及其他相关中间结果已在前一周期ARR中提前完成计算。上述单周期1RB+1BB编码设计使CABAC的MVD符号位和Coeff符号位编码时间完全省去。2.4CABAC编码器其他电路调整如图2所示,为支持单周期N-BB编码和1RB+1BB编码,ARR和ARL单元将分别完成TB(终止bin)的R更新和L更新。TB编码未与上述两种编码电路合并设计,原因在于其编码输出方式相对固定,且出现概率较低。单独设计有利于减小各种模式的编码延时。除上述3类bin编码外,ARR和ARL单元也支持RDO编码模式下编码区间(R,L值)的备份与恢复操作。相对于参考文献[5],改进编码器的二值化操作相关单元包括BN和BS功能需要少量调整,以支持BB编码加速。BN单元中根据MVD和Coeff二值化情况决定MVD和Coeff的符号位,BB将采取1RB+1BB编码方式还是与指数哥伦布码BB位串组合采用N-BB编码。BS单元根据BN的判定信息向CA单元输出RB、1RB+1BB、N-BB、TB等各类bin组合,并提供RB编码所需的上下文模型索引CtxIdx。
3高吞吐率CABAC编码器硬件电路性能
上述改进CABAC编码器采用Verilog硬件描述语言完成RTL级设计,采用TSMC0.13μm工艺综合生成编码器门级网表,并通过门级仿真验证电路功能正确。由于合理分配了ARR和ARL两级的功能,门级电路保持与参考文献[5]相同的时钟频率578MHz(测试条件为25℃、1.2V)。相对于参考文献[5],电路面积增大1.8k门,总面积为46.4k门,电路增加面积仅为参考文献[5]总面积的4%。该编码器全硬件实现CABAC功能,完全支持H.264/AVC编码器在RDO模式下CABAC码率计算输出,并集成系统总线接口。为验证编码器流水线吞吐率性能的提升,笔者采用3种分辨率视频编码测试序列,即CIF序列(News)、576p序列(720×576分辨率,Basket-ball)、720p序列1(Night)及序列2(City)。采用H.264/AVC标准编码器JM12.4[11],按照IPPPP格式编码序列,生成CABAC编码器输入编码向量,对比参考文献[5]与改进设计的实际编码周期数,并统计BB单独编码周期数。由于BB编码加速在高码率段更有效,笔者分别测试了量化系数QP为12、16、20、24这4种条件下的编码器性能。该QP段对应的重建视频PSNR值范围为38~50,属于高清高码率段。表2给出了改进编码器相对于参考文献[5]对BB编码减少周期数百分比。BB周期减小比例分别为CIF97.1%、576p97.3%、720p98.8%,平均减少周期比例达到98.0%,且在高分辨率序列的性能略优。改进设计的BB编码周期数仅为参考文献[5]的2%,充分说明改进设计对BB编码加速的有效性。图3显示了改进CABAC编码器在QP为12~24范围的4组测试序列编码流水线平均吞吐率曲线。4组序列曲线的相同趋势是编码器流水线吞吐率随码率升高(QP值减小)而提升。编码器在CIF、576p、720p序列编码的吞吐率分别为1.18bin/周期、1.19bin/周期、1.18bin/周期,4组序列平均吞吐率为1.18bin/周期,相对于原编码器1bin/周期吞吐率,改进设计吞吐率提高了18%。该吞吐率在578MHz时钟频率条件下对应的编码器绝对吞吐率为682Mbin/s。在ARR单元和ARL单元实现的单周期N-BB编码和1RB+1BB编码两项加速技术分别贡献了1%和17%的吞吐率提升值。1RB+1BB编码技术对吞吐率提升的作用更显著,原因主要是在高码率段符号位BB编码概率远大于MVD和块Coeff的指数哥伦布码BB位串编码概率,即较大值的MVD和Coeff编码概率仍较低。
4结论
在分析1bin/周期吞吐率硬件CABAC编码器结构以及对不同编码bin处理方式的基础上,讨论了进一步提升CABAC编码器性能的可能性。通过对比不同的二进制算数编码加速方案,采取加速旁路编码bin(BB)编码的方式,并通过对编码区间更新计算合理的功能划分,采用ARR、ARL两级流水线结构实现了单周期N-BB编码和单周期1RB+1BB编码两种BB编码加速策略。由于流水线的ARR、ARL单元电路关键路径长度得到有效控制,该设计在原CABAC编码器相同时钟频率下实现了BB编码加速,BB编码周期数仅为其的2%,且使CABAC编码器的流水线吞吐率提升18%,达到1.18bin/周期和682Mbin/s,而电路面积开销相对于原编码器设计仅增加4%。相对于单周期多RB串行编码的吞吐率提升方式,笔者采用的BB编码加速方案以较小电路面积开销实现了明显的CABAC硬件编码性能提升。
作者:田晓华 单位:深圳电器公司 技术中心