文献标识码:A
DOI:10.16157/j.issn.0258-7998.2017.05.008
中文引用格式:黄友文,董洋. 一种HEVC标准中IDCT变换的FPGA实现[J].电子技术应用,2017,43(5):38-40.
英文引用格式:Huang Youwen,Dong Yang. An IDCT transform implementation on FPGA in HEVC[J].Application of Electronic Technique,2017,43(5):38-40.
0 引言
为解决当前主流视频编码标准H.264/AVC无法满足高分辨率视频和图像的问题,视频编码联合开发组(Joint Collaborative Team on Video Coding)于2013年1月正式发布了新一代高效视频编码标准HEVC(High Efficiency Video Coding),HEVC的目标是在H.264/AVC的基础上,在相同码率条件下,提高50%的压缩率[1]。HEVC标准中采用的是整数逆离散余弦变换(Inverse Discrete Cosine Transform),这样就防止了采用浮点数在有限数据精度下编码器与解码器之间的误差。
HEVC支持的IDCT包括4、8、16、32点4种不同尺寸[1],因此,硬件结构的灵活性显得格外重要。目前已有的设计对全部尺寸的IDCT变换支持不够全面[2-3],文献[4]可以实现全部尺寸的IDCT变换,但是由于采用单一IDCT计算单元,不能很好地对视频信号进行实时处理。
本文在研究HEVC标准中的IDCT算法之后[9],设计了一种可以统一处理各种尺寸的电路结构。通过对IDCT变换矩阵系数的分解[6],复用小尺寸的变换单元来构建更大的变换单元,采用传统的移位加进行常系数的乘法,同时优化了移位加中的操作冗余。利用FPGA内部的双口RAM进行矩阵转置,减少硬件消耗[5]。为了使设计达到预期的工作频率,采用流水线技术对其关键路径进行优化,同时设计并行数据调度机制,减少硬件等待时间,提高硬件使用率,使其满足了实时处理30帧/秒、采样率为4:2:0的视频信号的要求。
1 设计总体架构
整体设计结构如图1所示,完整的二维IDCT由两个IDCT运算单元和一个转置单元组成,为了使系统可以拥有更高的数据吞吐量,采用了经典的全并行结构。考虑到在HEVC解码器中IDCT模块需要配合其他相应的模块进行工作,采用并行的方式输入,图1箭头方向表示数据及控制信号的流动,为了简明起见,结构图中省略了时钟与复位信号。IDCT_1D模块对数据进行一维IDCT运算,IDCT_2D模块对数据进行二维IDCT运算,Transpose模块对内部的数据进行转置操作,采用这种单向数据流的硬件电路,减少了控制逻辑的复杂度,数据处理过程如下:首先把使能sel信号拉高,模块开始工作,然后输入指示数据块TU的尺寸大小信号blk与数据in0~in31,先按列输入到一维变换单元IDCT_1D,计算得到的中间结果,经过转置单元Transpose转置之后,再在二维变换单元IDCT_2D中进行运算,输出最终结果,rdy信号表示得到有效计算数据。
2 IDCT模块
相比H.264/AVC,HEVC支持的整数IDCT尺寸为4×4,8×8,16×16,32×32四种块尺寸变换[1],图1中的IDCT_1D模块与IDCT_2D模块实现结构类似,不同之处在于两个模块输入的数据位宽,参考HM16.0[7],IDCT_1D输入位宽为8 bit,即预测图像与原始图像的残差值数据位宽为8 bit,经过Transpose模块的输出数据位宽为16 bit,即IDCT_2D输入数据位宽为16 bit,为了节约硬件资源并保证数据的准确性,在经过IDCT_1D运算之后,参考标准HM模型,数据需要进行截位操作,使其位宽保持在16 bit,这样就统一了硬件结构与转置操作过程中所需要的存储器消耗[6]。
图2显示了IDCT运算单元的内部细节,该设计复用了硬件结构,使得在进行较大尺寸的IDCT运算时可以使用较小的IDCT模块,IDCT32为最终的运算单元,可以进行尺寸为32×32的IDCT运算,其内部的IDCT4、IDCT8、IDCT16,分别完成4×4、8×8、16×16三种运算。
当sel信号高电平有效的时候,表示模块开始工作,blk配合输入数据送入到IDCT模块,其取值为00、01、10、11,分别表示了当前变换块为4×4、8×8、16×16、32×32的情况。ps_i模块的作用在于调整输入数据的顺序,如在计算IDCT4的时候,送入IDCT模块的数据为x0、x1、x2、x3,但是由于复用了硬件模块,需要经过ps_i模块调序后变为x0、x8、x16、x24送入内部的IDCT4单元进行计算,在计算IDCT8的时候,在图2中可以看到,IDCT8模块复用了IDCT4作为计算单元的一部分,输入数据为x0、x8、x16、x24,输出结果作为偶部分,MCM4为4位常系数乘法部分,输入数据为x4、x12、x20、x28,输出结果作为奇部分,奇偶部分结果进行简单的加减操作即可得到最终的结果,IDCT16和IDCT32运算过程与之类似。每次计算开始的时候启动IDCT32模块,输出的结果为32个数据,因此需要ps_o模块选择有效数据输出。
3 Transpose模块
进行二维IDCT变换的时候需要在两个IDCT变换单元之间使用转置单元对中间结果进行行列转置操作,本文的转置操作过程如图3所示,变换数据块最大为32×32,所以使用32个16 bit的双口RAM作为必要的数据存储单元,为了减少对RAM频繁操作,采用统一的地址写入,列变换得到的数据依次写入不同RAM单元的相同地址,在地址达到指示变换块上限时,经过一个时钟周期的延时后,利用模块内部的有限状态机FSM(Finite State Machine)按RAM0、RAM1、…、RAM31的顺序读取数据,由于采用了双口RAM,定义的输出端口位宽为512 bit,每个周期最多可以读取32个数据,根据不同的变换块指示标志,可以实现不同数据块的转置操作。
3.1 RAM读取顺序
宏观上的转置单元Transpose包含32个RAM,如何合理地读取RAM是本设计要解决的一个问题,为了实现对不同变换数据块的灵活操作,在写入数据的时候,写入地址单元采用统一地址写入,即同时写入多个RAM的相同地址,地址的写满通过数据块尺寸指示标志blk判断,这样就简化了多个地址的写入控制逻辑。在读取RAM的时候,使用FSM顺序访问RAM0~RAM31,blk指示当前需要读取到的RAM编号,根据参考模型HM16.0[9],定义每个数据位16 bit,每块RAM有512 bit,输出端口也定义为512 bit,每读取16 bit即表示一个有效数据,这样就保证了单周期读取数据块的所有行数据。
3.2 并行处理的数据调度
在全并行的结构中,转置模块在处理不同尺寸的数据块时很容易发生数据覆盖现象,即下一个数据块到来的时候,当前数据块较大时未能全部读取出来,造成原来数据被下一个到来的数据覆盖掉的现象。为解决这一问题,本文借鉴计算机指令中的流水线处理方式,数据调度如图4所示,图中方块代表若干时钟周期,Transpose处理周期中W表示写入数据,R表示读取数据,F表示数据转置完毕,当前数据块在转置完成之后,Transpose模块发出完成信号使能IDCT_2D模块,即图4中的F处,同时该信号使能外部的数据输入单元发送下一数据块,当前数据进行IDCT_2D运算的时候,下一数据块进行IDCT_1D运算,这样两个IDCT模块就不存在数据处理的空闲期,硬件利用率大大提高。
4 电路仿真与实验结果分析
电路结构采用Verilog HDL设计,在Altera Arria II GX EP2AGX190FF35C4芯片上综合通过,使用Modelsim进行仿真,并与HM标准模型中的结果进行比较,结果一致,证明本文设计的正确性。
在结构上,DCT与IDCT并无本质的区别,因此本文也选取了DCT的相关文献作为参考,本文的资源占用率如表1所示。
由表1可以发现,本文设计的结构可以处理HEVC中多种变换块尺寸,并且拥有较高的吞吐率。文献[2]拥有较大的数据吞吐量,但是不能很好地处理HEVC中所有的变换块,文献[4]、文献[7]采用面积优先的方式,单周期处理量较小,文献[8]能够实现对不同变换块的一维DCT运算,且效率较高,但是并未对二维DCT变换进行很好地优化。本文在面积与速度之间做了平衡,在满足实时处理的基础上,尽可能地减少资源的消耗。设计结果表明,最大延时为41个时钟周期,模块固定的流水线延时为9个时钟周期。为了可以对采样率为4:2:0、分辨率为3 840×2 160、帧率为30帧/秒的视频实时处理,满足设计要求的电路工作时钟最小为104 MHz(3 840×2 160×30×1.5/3.6)。设计结果完全满足4k视频处理的要求。
5 结论
本文提出了一种整数IDCT变换的FPGA设计,针对IDCT变换矩阵的特点,采用复用模块的方法减少了硬件消耗。利用FPGA内嵌的RAM资源进行转置,节约了其内部的寄存器资源,在满足处理要求的基础上尽量减少硬件消耗,充分利用结构特点,设计并行数据调度,提高了硬件的使用率,对工程应用具有一定的指导意义。
参考文献
[1] SULLIVAN G J,OHM J R,HAN W J,et al.Overview of the high efficiency video coding(HEVC) standard [J].IEEE Transactions on Circuits and Systems for Video Technology,2012,22(12):1649-1668.
[2] PARK J S,NAM W J,HAN S M,et al.2-D large inverse transform (16×16,32×32) for HEVC(high efficiency video coding)[J].Journal of Semiconductor Technology and Science(JSTS),2012,12(2):203-211.
[3] CONCEICAO R,SOUZA J C,JESKE R,et al.Hardware design for the 32×32 IDCT of the HEVC video coding standard[M].Symposium on Integrated Circuits and Systems Design. Curitiba;IEEE Press.2013:1-6.
[4] SHEN S,SHEN W W,SHEN Y,et al.A unified 4/8/16/32-point integer IDCT architecture for multiple video coding standards[M].IEEE International Conference on Multimedia and Expo.2012:788-793.
[5] 许亚军,韩雪松,韩应征.AVS二维DCT变换的FPGA实现[J].电视技术,2013,37(11):18-21.
[6] SZE V,BUDAGAVI M,J S G.High efficiency video coding(HEVC)-algorithms and architectures[M].Springer:2014.
[7] TIKEKAR M,HUANG C T,SZE V,et al.Energy and area-efficient harware implementation of HEVC inverse transform and dequantization[M].International Conference on Image Processing(ICIP).IEEE Press.2014:2100-2104.
[8] 杨启洲,刘一清.基于HEVC的多长度DCT变换的VLSI设计[J].微电子学,2015,45(1):100-103.
[9] Joint collaborative team on video coding(JCT-VC).HEVC Test Model HM-16.0[EB/OL].https://hevc.hhi.fraunhofer.de/trac/hevc/browser/tags/HM-16.0.
作者信息:
黄友文,董 洋
(江西理工大学 信息工程学院,江西 赣州341000)