文献标识码:A
文章编号: 0258-7998(2011)07-144-04
随着我国物联网筹备和建设的推进,高速图像处理技术的应用领域不断扩大,对图像处理的要求也越来越高。由于未经压缩图像的数据量非常庞大,对存储空间和通信带宽的需求是无限的,这就要求对图像进行压缩处理。JPEG图像压缩标准凭着其高压缩率和灵活的应用形式得到了广泛的应用。
Avalon总线是Altera公司开发的用于Nios嵌入式处理器的参数化接口总线,由一组预定义的信号组成,是一种相对简单的总线结构,主要用于连接片内存储器和外设,以构成SOPC系统。本文在研究JPEG算法的基础上,设计了一种基于Avalon总线的图像解压缩IP核,以提高图像解码的速度,满足实时性要求。
1 JPEG解压缩原理
JPEG(Joint Photographic Expert Group)是第一个适用于连续色调、多灰度、彩色或黑白静止图像的国际标准[1]。JPEG解码的目的是将编码后的压缩数据转换成适合于显示器显示的RGB信号。其解码流程如图1所示。
解码流程的主要功能模块包括:(1)头文件解析;(2)熵解码,包括直流系数解码、交流系数解码和差分解码; (3)反量化与反Z变换(扫描);(4)IDCT变换;(5)颜色空间转换。将每个模块用Verilog HDL语言进行设计[2],编译后,利用Modelsim软件对其进行功能仿真和时序仿真,最终完成各个单元的设计和IP核的实现。
1.1 头文件解析单元
在JPEG解码模块启动后,头码流解析单元首先读入JPEG文件的包头,根据JPEG文件数据的存储方式依次检测数据流中包含的各种段的标识符,把要解码的文件信息从数据流中解析出来并存储到相应的存储单元,为后面压缩数据的解码做准备。
头码流解析单元由头码流解析状态机和一系列存储单元组成。状态机主要有Idle空闲状态、ReadMarker读取标志位状态和ReadSegment读取段内信息三个状态。该单元模块初始状态为Idle状态,当外部发出解码开始信号时,模块跳转到ReadMarker状态,读完标识符后,模块进入ReadSegment状态。在这个状态下,模块对每个标志段内的信息进行解析,并对其中的重要信息如当前图像的宽度、高度以及解码需要的量化表和解码表存储到相应的存储单元。当所有的标记段解码完成后,模块又跳转到Idle(空闲)状态。其状态转移图如图2所示。
头文件解析单元模块的输入输出信号分别为:复位信号(rst)、系统时钟(clk)、输入数据有效(DataInEnabe),输入数据(DataIn)、状态机状态(state),读取段内信息时的状态(process)。该模块在Modelsim仿真软件下的顶层仿真如图3所示。由仿真图可知,该单元可以每2个时钟处理1 B的数据。
1.2 熵解码单元 熵解码单元包括Huffman解码及变长解码和行程解码。Huffman解码完成后,再进行变长解码和行程解码。在该部分中,主要根据解码出来的Run/size进行幅值的确定和0行程的解码,同时设置了计数器counter用来记录当前解码符号在8×8数据块中的位置。如果Run/size为00,则表示该图像块已解码完成;如果Run/size为F0,则将counter加上16。否则,将counter加上Run,从码流中读取size位,判断最高位,如果为0,则表示当前系数为负数,将该bit以及后面读入的bit全部取反;为1表示当前系数为正数,将当前系数的剩余bit读出,输出到外部模块。 1.3 反量化与反Z变换单元 1.4 IDCT变换单元 对于1D-IDCT,本文采用经典的陈氏算法。由于其算法具有清楚的分级结构,可以采用流水线结构的设计方法来提高解码速度。对于陈氏算法,采用4级流水线可以实现1D-IDCT算法。每级都有两组寄存器,一组用于存放中间结果,另一组用于寄存运算结果,同时也作为下一级的输入。该设计利用状态机产生变换矩阵,通过共用乘法器来减少乘法器的使用,由原来的22个减少到6个,大大节约了逻辑资源。 1.5 颜色空间转换单元 2 基于Avalon总线的JPEG IP核设计 完成设计和验证后,该IP核可以通过SOPC Builder工具加入到系统中。基于SOPC的JPEG解码系统如图12所示。图中,SDRAM控制器实现处理器、VGA控制器和SDRAM之间的图像数据存取。由于VGA直接从SDRAM中读取数据,所以将VGA的avalon_master接口连接到SDRAM上, 当VGA控制器发出读有效信号到SDRAM时,SDRAM直接将图像数据传送给VGA控制器,VGA控制器同时产生行场同步信号,与RGB数据一起传送到显示器。SDRAM采用ICSI公司的数据宽度为16 bit、存储容量为64 MB的IS42S8800来存储解码后的图像数据。 针对软件解码图片速度慢的问题,本文设计了一种基于Avalon总线的JPEG解码IP核。系统时钟设置为50 MHz,在Quartus下进行综合和仿真,采用CycloneII EP2C8Q208C8硬件芯片验证了IP的正确性,极大地提高了图片解码的速度。同时,利用IP核的可重用性,可以将其用于其他需要实时图像解码的系统中,可降低系统设计的复杂度。
JPEG图像熵解码由Huffman编码、行程编码和变长编码三部分组成。其解码过程为:对输入的数据流进行Huffman解码,解码成功后得到一个变长的码字,根据解析的Huffman解码表寻址得到该码字对应的解码信息。该解码信息为8 bit,高4 bit代表在该频域系数之前0的个数,而低4 bit表示该频域系数的二进制bit长度。最后,根据系数所占用的二进制bit长度,确定该频域系数的值。
从解码过程可知,Huffman解码步骤比较耗时,这是因为Huffman算法为变长编码,压缩后产生的码字长度不固定,需要逐个bit地读入数据。根据范式哈夫曼编码的一个很重要特性:长度为i的码字的前j位的数值大于长度为j的码字的数值,即i>j[3]。因此可以构造出一种并行结构的huffman快速解码算法。将N(N=1,2,3…15)bit长度的最小码字低位补0扩充到16 bit,得到f(N)。对输入的16 bit JPEG码流code与f(N)和f(N+1)进行比较,如果f(N)
熵解码单元模块的输入输出信号有:复位信号(rst)、系统时钟(clk)、输入数据有效(DataInEnabe)、输入数据(DataIn)、解码出来的哈夫曼码字(TableCode)、Huffman解码表的寻址地址(DhtNumber)、行程0的个数(DhtZero),该频域系数的二进制bit数(DhtWidth)、频域系数的幅值(OutCode)。该模块在Modelsim仿真软件下的仿真如图5所示。由仿真图可知,该单元可以每1个时钟解码出一个哈夫曼码字,每5个时钟完成一个频域数据的熵解码。
量化是图像压缩中最重要的部分。DCT变换并没有压缩图像数据,而是将能量聚集在低频系数部分。DCT 的低频系数包含了图像的主要信息, 而其高频系数是反映图像较次要的信息。因此,结合人类视觉系统的特点,采用特定的量化表,忽略部分高频分量,从而达到压缩的目的,故量化也就是进行除法操作。相应地,反量化过程就是将Huffman解码后的64个频域数据分别与对应的量化表中量化系数相乘。而对0系数进行相乘没有任何意义,因此,在该单元的设计中,仅对非0频域系数进行相乘。在Huffman解码模块中,counter用于记录已经解码的频域数据的个数,Run记录0行程的个数,将两个数值相加作为量化表存储单元的寻址地址,查到当前非0频域系数对应的量化系数。反Z变换则按照对应关系输出反量化后的数据,处理起来比较简单,本文不作讨论。
反量化与反Z变换单元模块的输入输出信号有:复位信号(rst)、系统时钟(clk)、输入数据有效(DataInEnabe)、解码出来的哈夫曼码字(NumberCode)、解码出来的非0频域系数(OutCode)、量化表寻址地址(DqtNumber)、量化系数(DqtData)、输出使能(DecodeEnable)、反量化后的数据(DecodeCode)。该模块在Modelsim仿真软件下的仿真如图6所示。由仿真图可知,通过对量化单元寻址,每个时钟就可以完成一个数据的反量化过程。
对量化过的像素进行反Z变换,得到8×8的数据块。图像数据是编码时通过正向离散余弦变换得到的结果,解码时必须将其反向余弦变换,将数值c向时域转换。目前,用硬件实现的快速算法的普遍思想[4]是把2D-IDCT分解成两个1D-IDCT,再在1D-DCT做快速算法,但是这种方法会占用过多的芯片资源。本文采用分时复用的方法,用一个1D-IDCT模块实现二维余弦变换,其总体结构如图7所示。
IDCT模块的输入输出信号有:复位信号(rst)、系统时钟(clk)、输入数据有效(DataInEnabe)、反量化后的频域系数(Data00In)、输出使能(DataOutEnable)、IDCT变换行数(DataOutPage)、IDCT变换流水线级数(DataOutCount)、IDCT变换完成后的时域系数(Data0Out, Data10Out)。该模块在Modelsim仿真软件下的仿真如图8所示。
在JPEG图像进行编码时,为了便于压缩,需要将图像数据由RGB色彩空间转换到YCbCr色彩空间。而在解码时,为了便于终端显示,则需要将图像数据由YCbCr色彩空间转换到RGB色彩空间。其变换关系如下:
颜色空间转换单元的输入输出信号有:复位信号(rst)、系统时钟(clk)、输入数据有效(DataInEnabe)、色彩空间信号(DataY、DataCb、DataCr)、变换后的RGB信号(OutR、OutG、OutB)。该模块在Modelsim仿真软件下的仿真如图9所示,由仿真图可知,在输入一组信号后,3个时钟周期可以得到对应的一组RGB信号,直至完成色彩空间转换算法。
Avalon总线是一种协议较为简单的片内总线,Nios通过Avalon总线与外界进行数据交换。Avalon总线的特点有:(1)所有外设的接口与Avalon总线时钟同步,不需要复杂的握手/应答机制。(2)所有的信号都是高电平或低电平有效,便于信号在总线中高速传输。(3)为了方便外设的设计,地址、数据和控制信号使用分离的、专用的端口。
JPEG解码时,前一个模块的输出是下一个模块的输入。根据Avalon总线协议,该解码模型需要设置一组Avalon接口,控制部分由Nios完成。Avalon接口设置如下:clk为全局同步时钟,DataInRead是握手信号,当为高时,向外设发送数据请求;DataInEnable为输入数据有效信号,有效时,表示当前传送的是有效的数据,IP核开始接收图像码流DataIn;为了提高图像的解码速度,数据宽度设计为32 bit;当头文件分析完成后,IP发送ImageEnable信号,为1时,表示开始正式图像解码,接下来进行Huffman解码、IQ和IDCT变换,最终输出3个8 bit的RGB数据。输出数据只有在OutEnable为高时有效,当最后一个码流结束后,输出JPEGIDLE信号。JPEG解码IP核的输入输出时序仿真图分别如图10、图11所示。
参考文献
[1] 何东健.数字图像处理(第1版)[M].西安:西安电子科技大学出版社,2003.
[2] 夏宇闻.Veriong数字系统设计教程(第2版)[M].北京:北京航空航天大学出版社,2008.
[3] 邵天增,尚冬娟.哈夫曼编码应用的一种改进[J]. 科技创新导报,2008,21:29,31.
[4] 钟文荣,陈建发.二维DCT算法的高速芯片设计[J].厦门大学学报自然科学版,2005,43(3):198-201.