JPEG解码器IP核的设计与实现
扫描二维码
随时随地手机看文章
摘要:介绍了基于静止图像压缩标准JPEG解码器IP核的设计与实现。设计采用适于硬件实现的IDCT算法结构,通过增加运算并行度和流水线技术相结合的方法以提高处理速度。根据Huffman码流特点,采用新的Huffman并行解码硬件实现结构,用简单的算术运算代替复杂的配对模式,解码速度快,硬件成本低。该IP核可方便地集成到诸如数码相机、手机以及扫描仪等各种应用中。
关键词:JPEG;IP核;Huffman;流水线设计
基于IP(Intellectual Property)核的设计和可复用已成为SoC(System on a Chip)设计方法的主流设计方法。本设计实现了基于静止图像压缩标准JPEG基本模式的解码器软IP核。JPEG(Joint Photograph ExpelsGroup)是1992年CCITT和ISO正式通过的连续色调静止图像压缩标准。图像的高数据量和广泛应用对图像的存储和传输提出了要求,有限的存储容量和传输带宽不能直接对图像进行存储与传输,因此需要先对图像进行压缩处理。JPEG压缩算法因其优异的压缩性能成为目前最流行的图像压缩工具。
1 JPEG解码IP核设计和实现
在JPEG解码器中,因为Huffman解码是变长的,本次解码结束后才能重新定位码流,难以实现流水线设计,所以本设计中主要通过提高功能部件并行度和在功能模块内部实现流水线来提高解码速度。因为解码速度不定,所以各功能模块间的握手信号很关键。每个模块的数据输出时也要考虑到后级模块的数据输入要求,这样才能达到整个解码过程的有序、高效进行。JPEG解码IP核总体架构,如图1所示。
1.1 JPEG解码IP核控制器设计
JPEG解码器控制器的作用是在不同解码环节为各个单元模块分配任务,以控制中间运算过程及最后输出结果。采用了有限状态机的设计方法,这是一种结构清晰、设计灵活的方法,它易于建立、理解和维护,特别是应用于大量状态转移和复杂时序控制系统中更显优势。控制器主要由一个Mealy型有限状态机实现,状态转移如图2所示。
初始化状态(IDLE):复位或者一幅图像解码完成时进入的状态,重新定位码流,在解码开始标志有效时跳转到标志符解码状态(DeMar-ker)。
标志符解码状态(DeMarker):按JPEG码流语法和JFIF文件格式解析标记符,根据解析出的标志符跳转到相应的标志段解码状态,如果解析到SOI标志符或者是0xFFFF状态不改变。
解码出错状态(False):若是在标志段解码出错跳转到False状态,通过输出端口将出错信号输出,在得到外部反馈后跳转到初始化状态IDLE。
应用扩展标志段APPn、帧开始标志段SOFO、量化表定义DQT标志段、Huffman码表定义DHT标志段和扫描行开始SOS标志段的解码过程是相似的,在相应标志符后是标志段的长度,可以根据这个长度值,结合JPEG码流语法,进行码流解析,将所需的图像信息如图像尺寸、图像格式、量化表、Huffman码表等写入相应寄存器或者存储器中,以便于后续压缩数据的解码。
Huffman码流解码状态(DeHuffman):在解析完扫描开始标志段SOS后跳转到Huffman码流解码状态,解码图像压缩数据,主要包括Huffman解码、反量化、反Z字形重排、IDCT和输出缓存等。
控制器还负责外部输入的调配工作,每个时钟周期,都将本次解码长度送至码流缓存模块,从而重新定位解码码流位置。因为有多种图像格式,所以控制器还要负责各个模块的亮度色度选择信号的输入。
1.2 码流缓存模块设计
JPEG码流是变长码,数据量大,如果采用传统的解码方法对码字的每个比特进行处理,其输出速率势必不能满足应用要求。JPEG标准中数据编码的最大码长为26,而在标志段解码时要求码长为8的整数倍,所以设计中采用两个32位寄存器、一个32位桶形移位器、一个加法器和一个减法器的组合来实现该功能。其中,寄存器Rn负责从外部模块读取数据,并和寄存器R1一起作为桶形移位器的输入缓存。每个解码周期,桶形移位器移出已解码流的同时装载新的待解码流。减法器用于计算已处理码长,传送桶形移位器移位长度,判断并控制R0的读取和R1的更新。加法器用于码流输入时更新寄存器码长和桶形移位器移位长度。这样就为后续处理单元提供了连续不间断的码流,满足了并行解码处理的需求。
桶形移位器的输出是32位,因此每个时钟周期R0、R1必须为其提供32位的有效码流。图3所示给出了桶形移位器输入缓存的更新示例。
1.3 Huffman解码模块设计
Huffman码是变长编码,若采用传统的解码方法逐位读人码流,先判断码字长度,再进行解码,效率较低,其解码速率难以满足应用要求。本设计中提出了一种新的Huffman并行解码硬件结构,Huffman符号表可配置,通用性强。用简单的算术运算代替复杂的配对模式,解码速度快、硬件成本低。
1.3.1 Huffman解码算法分析
对于一组概率确定的符号,其最佳Huffman编码有多种码字分配方式。其中一种特殊的分配方式称为单调编码,这种编码中长度相等的码字在数值上是单调变化的,JPEG中Huffman编码采用这种方式。单调编码的单调性是指出现概率较大的符号其对应的码字的值一定小于概率小的符号对应的码字值。具体说来有两个特性:
(1)在某一特定长度对应的码字集当中,码字大小是连续变化的。
(2)长度短的码字Ck的值一定小于长度比它长的码字Cm,且Ck一定小于Cm的前k位前缀。
根据单调编码的特性,可以证明:对于一个长为X的码字,其长为K(1≤K<X)位前缀码的值总是大于长度为K的最大码字,同时其码字总是小于长度为Y(Y>X)的最小码字的K位前缀。这一结论表明当把一串足够长的码流并行输入码长检测器时,只可能得到惟一的有效码长。
1.3.2 Huffman解码模块的硬件实现
对于一个给定长度L的码字,可以用码长为L的最小码字和该码字相对于最小码字的偏差offset来表示。如果解码器将相同码长的解码符号顺序存储在RAM或者寄存器阵列中,则可以由最小码字的地址和偏差offset得到解码符号。解码符号的地址可由式(1)得到
在Huffman码表定义DHT标志段解码时,可以得到各长度对应的最小码字Min Code、各最小码字的地址Base Address和解码符号Symbol,为了后续解码需要,要将这些数据存入存储器中。因为解码包括了亮度DC系数、亮度AC系数、色度DC系数和色度AC系数4种情况,所以相应地需要多个存储器。
表1所示给出了本算法和其他算法的实现比较。可见,本算法的实现在速度和硬件成本综合权衡之下比较有优势。
因为Huffman编码是无损压缩,不存在误差,所以Huffman解码出来的数据也是没有误差的。本设计采用一个简洁的Mealy型状态机实现,状态转移如图4所示。图5所示是相应的Huffman解码硬件结构图。
接下来结合图4和图5介绍Huffman并行解码流程。
(1)初始化状态(IDLE):复位或图像压缩数据解码完成时进入的状态,初始化相关寄存器。
(2)解码状态1(S1):首先寄存从码流缓冲模块输入26位图像码流,将高16位输入码长检测单元,与Min Code Memory中存储的各长度最小码字并行比较,码长检测单元由选择器、比较器和一个16选4的选择器组成,得到码字的长度L。接着由码长为L的Huffman码与相应长度的最小码字Min(L)计算出偏移量offset,从Base Address Memory中取出最小码字Min(L)的地址Base Address,将两者输入8位加法器中,由式(1)可计算出该码字对应的解码符号地址。然后根据这个地址从Symbol Memory中取出解码符号,对DC来说是SSSS,对AC来说是RRRRSSSS。同时将移位寄存器中的码字左移L位,将高11位编码输入到幅值寄存器中。
(3)解码状态2(S2):将解析出的字长SSSS和码长L输入到5位加法器中,得出本次解码总位长,输出到码流缓冲模块,用于重新定位码流,更新输入数据。将幅值寄存器的高SSSS位选择输入一个12位中间寄存器的低位,该中间寄存器的高(12-SSSS)位移入幅值寄存器的最高位的相反值,若得到的中间寄存器的最高位为“1”,按.JPEG标准,要再加1。这样解析出来的就是频率系数,即DCT系数,对于DC来说就是差值DIFF。解析完幅值后,进行DC/AC系数解码。
DC/AC系数解码:计数器用于计算解析系数在块数据中的位置。若计数器值为零,表示解析出来的是DC系数的差值DIFF,要根据亮度色度选择信号选择相应DCk-1,根据DCk=DIFF+DCk-1计算出DC值,并且更新DCk-1。若计数器值不为零,表示解析出来的是AC值,接下来对应的有4个分支:1)若(RRRR,SSSS)=(0,0),表示此图像块解码结束,输出块解码结束标志DecOneBlock,并清零计数器;2)若(RRRR,SSSS)=(15,0),表示连续16个零系数,计数器加16,不输出;3)若SSSS不为零,且计数器值+RRRR=62,表示解析出来的是图像块的最后一个系数,计数器清零,并输出块解码结束标志DecOneBlock和DCT系数值;4)普通AC系数,计数器加1,输出计数器的值和DCT系数值。
1.4 反量化模块设计
本设计在Huffman解码后没有采用JPEG标准的先反Z字形重排再反量化的流程,而是先进行反量化操作。如此只要Huffman解码有DCT系数输出时才需要进行反量化运算,能减少无效操作,降低功耗。
反量化运算时先将相应的量化系数保存在寄存器阵列中,在Huffman解码模块有DCT系数输入时,按其地址取出相应的量化系数,相乘后输出到后级反Z字形重排模块。
1.5 反Z字形重排模块设计
根据模块输入数据的特点,提出了一种优化的硬件实现结构。因为一个8×8图像块经DCT变换后非零系数个数一般不超过总数据量的10%,所以设计中为寄存器阵列的每个寄存器都设定一个一位的使能标志,在初始化时先将寄存器阵列中寄存器和相应标志位都赋零值,在输入值为非零值时才写入相应地址,并置位对应的使能标志,这样在写入数据时不需要进行零数据的存储,而在输出数据时只要根据使能标志就能判断是要读寄存器阵列还是直接输出零,所以可以减少对存储器的读写操作,加快数据处理速度。
反Z字形重排模块不仅要接收反量化后的系数,对其进行反Z字形重排,同时要对图像块数据进行一次行列转置,这样可以节省2个寄存器阵列,降低硬件成本。为了提高运算并行度,提高解码速率,满足后级模块数据要求,反Z字形重排模块中采用了两个64×14位双端口寄存器阵列,进行乒乓操作。
1.6 IDCT模块设计
2D-IDCT的实现选用行列分解法,所以主要功能模块包括1D-IDCT模块和行列转置模块。因为全流水线实现系统解码硬件成本很高,所以设计中主要通过提高运算并行度和在功能模块内部实现流水线运算来提高解码速度。IDCT模块设计中采用了两个1D-IDCT处理单元,并通过流水线技术实现高运算速率。
1.6.1 1D-IDCT模块设计
本设计采用了一种运算量少、数据流简单且适于流水线实现的IDCT算法。通过对1D-IDCT数据流程的合理划分,将其分4级,在每级中间插入寄存器,对每级流水线内部运算的时序进行合理安排,在每级流水线内共享算术单元,降低硬件成本。1D-IDCT快速算法的数据流程如图6所示。
通过对1D-IDCT数据流程的合理安排和资源共享,本设计共需4个加法器,4个减法器和4个乘法器,所用硬件资源比较少。而且本设计的处理速度快,每个时钟周期输入两个像素,完成1D-IDCT的延迟时间是6个时钟周期。在流水运算时计算一个8点1D-IDCT只需要4个时钟周期。
1.6.2 行列转置模块设计
行列转置矩阵的实现大部分设计采用双RAM进行乒乓操作完成,本设计采用一个8×8寄存器阵列和方向控制信号完成,可节省一半硬件资源,且控制简单。当有信号输入时,方向控制信号值初始设为0,这时寄存器阵列的输入输出方向是从左到右,64个时钟周期后方向控制信号反向变为1,这时寄存器阵列的输入输出方向是从下到上。如此循环,即可实现行列转置,如图7所示。
2 综合、仿真与性能分析
设计时先用Matlab进行算法级仿真与验证,在RLT级设计时采用Verilog语言实现,在Modelsim6.1中进行功能仿真,选择VIRTEX2系列xc2v250器件进行FPGA验证,从软硬件方面都验证了设计的正确性。
使用Synopsys公司的Design Compiler工具在0.18μm的SMIC CMOS工艺条件下,对RTL代码进行综合优化。通过设置不同的面积、时序及功耗约束条件,缩短关键路径的延时,时钟频率可达100 MHz的最优设计,综合出面积为721 695μm2,不包括存储单元需要34.6 kB标准门。本设计能每秒能够解码1 920×1 080图形25帧以上,所以也能用于一些有低成本需求的监控、录像系统。
3 结束语
介绍了基于静止图像压缩标准JPEG的解码器IP核的设计,描述了硬件设计过程,提出了一种高效、低成本的JPEG解码器架构。设计通过VIRTEX2平台进行了FPGA验证,并使用Synopsys公司的DC工具在SMIC 0.18 μmCMOS工艺条件下,对设计进行面积和时间的优化,在100 MHz时钟频率下工作时电路面积为721 695μm2,每秒能够解码1 920×1 080图形25帧以上。本设计还支持多种图像质量和图像格式,有较宽的压缩比范围,设计具有独立性和完整性,也适用于数码相机、手机和扫描仪等各种应用。