基于FPGA的JPEG解码器设计与实现
2.3 Decode_MCU模块设计
Decode_MCU是jpeg解码器设计中一个非常重要的单元,也是正式解码的开始。本设计中此模块的设计见图6虚线框中设计,主要由四个子模块组成:Fill_buffer、Decode_blockIZZ、Process_restart和Controller。
(1)Fill_buffer:当32BITS_REG中的比特数不够时控制器将启动此模块读取Src_ram中的数据并且加载到32bits_reg中,并且去掉码流中的填充数据。
(2)Decode_blockIZZ:huffman解码,并且将解码数据逆zig_zag顺序输出。
(3)Process_restart:当JPEG图像中有restart interval(Get_dri)标志,在解码完由Get_dri规定的n个MCU后,控制器首先调用此模块来进行同步(在网络传输中非常重要)。
(4)Controller:控制协调各模块的执行。
核心模块Decode_block硬件实现如图6,虚线右边是EXTEND[1]部分,采用查找表实现。Get_buffer即图6中的32BITS_REG, Bits_left记录32BITS_REG中剩余的比特数。Huff_D模块每启动一次解码一个熵编码数据。由于DC编码采用DPCM编码,解码直流(DC)时需要增加一个时钟周期来加上上一个DC的值,从而得出如图6所示的output,解码交流系数(AC)时则在EXTEND后直接输出。Sel_s_input为”00”时,选通huffman解码数据;为”01”时,选通EXTEND后的数据;为”10”时,选通加上了last_dc_val的数据。
2.4 IDCT模块设计
IDCT(Inverse Discrete Consine Transform)是JPEG解码器中最耗资源和计算量最大的单元。本设计为减少内存读取,提高解码速度,将反量化也放在IDCT模块中实现。
离散余弦变换的公式和离散余弦逆变换的公式如下:
经分析公式(1)可以做如下等效变换:
即通过两次一维的IDCT变换即可实现二维的IDCT。考虑到数据的读取,本设计IDCT模块的设计如图7虚线框中所示。
实现过程:首先读取Block ram的一列,相应的反量化数据从Dqt ram中读取,经过IQ(反量化单元,即乘法器)后的8个数据存储在regs中,之后控制器启动一维IDCT变换,并将反变换后的数据存储在REG FILES的一列中。当一个Block ram中的8列数据全部反量化和IDCT变换后,控制器将切换成对REG FILES中一行的数据进行一维IDCT变换,变换后的数据存储在REG FILES中的一行中,之后再进行下一行变换,直到8行数据全部IDCT 变换完。基于参考文献[2]的一维IDCT实现具有资源比较小和实现简单的特点,通过对IDCT反变换矩阵系数分析,一维IDCT奇偶数据变换具有不同的结构化特点,在此可以进行单独的设计,最后将两部分的结果数据进行碟形加减操作,得到一维IDCT的运算结果(见图7)。这样变换完的数据即可进行输出,送到显示单元进行色彩变换和其它后续处理后显示。
2.5 测试与结果
本设计采用的硬件开发平台为ALTERA DE2,FPGA为EP2C35F672C6,在quartusii 5.0中进行综合,所耗资源和最大时钟频率见表1。2005年ACTEL[3]公司推出的JPEG-D IP的速度针对不同的平台其速度变化从31M~69M,同年4I2I[4]公司推出的JPEG-D的最大速率为40M,从速度可以看出本设计达到了实时解码的要求。
将VHDL与C语言实现的JPEG解码器对图像解码产生的结果进行对比,从而可以判断解码正确与错误。通过结果对比,本设计结果完全正确。
本设计严格按照VLSI自顶向下设计的一般流程,首先进行C语言级建模[5],从而得到测试矢量和JPEG硬件解码器的总体架构;之后完成了各个顶层模块和子模块的接口定义;最后进行各个模块的VHDL实现。从结果可知达到了实时解码要求,并且节约了资源。
- JPEG2000核心算法的研究及DSP实现(05-23)
- 基于DSP的JPEG图像压缩的设计与实现(08-02)
- JPEG2000中53离散小波多层变换FPGA实现研究 (10-15)
- DSP在JPEG视频压缩系统的应用(01-04)
- 基于Android的3G手机网络摄像机客户端软件设计(02-29)
- 基于Blackfin561的JPEG2000压缩算法实现(03-23)