文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2011)07-144-04
隨著我國(guó)物聯(lián)網(wǎng)籌備和建設(shè)的推進(jìn),高速圖像處理技術(shù)的應(yīng)用領(lǐng)域不斷擴(kuò)大,對(duì)圖像處理的要求也越來(lái)越高。由于未經(jīng)壓縮圖像的數(shù)據(jù)量非常龐大,對(duì)存儲(chǔ)空間和通信帶寬的需求是無(wú)限的,這就要求對(duì)圖像進(jìn)行壓縮處理。JPEG圖像壓縮標(biāo)準(zhǔn)憑著其高壓縮率和靈活的應(yīng)用形式得到了廣泛的應(yīng)用。
Avalon總線是Altera公司開(kāi)發(fā)的用于Nios嵌入式處理器的參數(shù)化接口總線,由一組預(yù)定義的信號(hào)組成,是一種相對(duì)簡(jiǎn)單的總線結(jié)構(gòu),主要用于連接片內(nèi)存儲(chǔ)器和外設(shè),以構(gòu)成SOPC系統(tǒng)。本文在研究JPEG算法的基礎(chǔ)上,設(shè)計(jì)了一種基于Avalon總線的圖像解壓縮IP核,以提高圖像解碼的速度,滿足實(shí)時(shí)性要求。
1 JPEG解壓縮原理
JPEG(Joint Photographic Expert Group)是第一個(gè)適用于連續(xù)色調(diào)、多灰度、彩色或黑白靜止圖像的國(guó)際標(biāo)準(zhǔn)[1]。JPEG解碼的目的是將編碼后的壓縮數(shù)據(jù)轉(zhuǎn)換成適合于顯示器顯示的RGB信號(hào)。其解碼流程如圖1所示。
解碼流程的主要功能模塊包括:(1)頭文件解析;(2)熵解碼,包括直流系數(shù)解碼、交流系數(shù)解碼和差分解碼; (3)反量化與反Z變換(掃描);(4)IDCT變換;(5)顏色空間轉(zhuǎn)換。將每個(gè)模塊用Verilog HDL語(yǔ)言進(jìn)行設(shè)計(jì)[2],編譯后,利用Modelsim軟件對(duì)其進(jìn)行功能仿真和時(shí)序仿真,最終完成各個(gè)單元的設(shè)計(jì)和IP核的實(shí)現(xiàn)。
1.1 頭文件解析單元
在JPEG解碼模塊啟動(dòng)后,頭碼流解析單元首先讀入JPEG文件的包頭,根據(jù)JPEG文件數(shù)據(jù)的存儲(chǔ)方式依次檢測(cè)數(shù)據(jù)流中包含的各種段的標(biāo)識(shí)符,把要解碼的文件信息從數(shù)據(jù)流中解析出來(lái)并存儲(chǔ)到相應(yīng)的存儲(chǔ)單元,為后面壓縮數(shù)據(jù)的解碼做準(zhǔn)備。
頭碼流解析單元由頭碼流解析狀態(tài)機(jī)和一系列存儲(chǔ)單元組成。狀態(tài)機(jī)主要有Idle空閑狀態(tài)、ReadMarker讀取標(biāo)志位狀態(tài)和ReadSegment讀取段內(nèi)信息三個(gè)狀態(tài)。該單元模塊初始狀態(tài)為Idle狀態(tài),當(dāng)外部發(fā)出解碼開(kāi)始信號(hào)時(shí),模塊跳轉(zhuǎn)到ReadMarker狀態(tài),讀完標(biāo)識(shí)符后,模塊進(jìn)入ReadSegment狀態(tài)。在這個(gè)狀態(tài)下,模塊對(duì)每個(gè)標(biāo)志段內(nèi)的信息進(jìn)行解析,并對(duì)其中的重要信息如當(dāng)前圖像的寬度、高度以及解碼需要的量化表和解碼表存儲(chǔ)到相應(yīng)的存儲(chǔ)單元。當(dāng)所有的標(biāo)記段解碼完成后,模塊又跳轉(zhuǎn)到Idle(空閑)狀態(tài)。其狀態(tài)轉(zhuǎn)移圖如圖2所示。
頭文件解析單元模塊的輸入輸出信號(hào)分別為:復(fù)位信號(hào)(rst)、系統(tǒng)時(shí)鐘(clk)、輸入數(shù)據(jù)有效(DataInEnabe),輸入數(shù)據(jù)(DataIn)、狀態(tài)機(jī)狀態(tài)(state),讀取段內(nèi)信息時(shí)的狀態(tài)(process)。該模塊在Modelsim仿真軟件下的頂層仿真如圖3所示。由仿真圖可知,該單元可以每2個(gè)時(shí)鐘處理1 B的數(shù)據(jù)。
1.2 熵解碼單元
JPEG圖像熵解碼由Huffman編碼、行程編碼和變長(zhǎng)編碼三部分組成。其解碼過(guò)程為:對(duì)輸入的數(shù)據(jù)流進(jìn)行Huffman解碼,解碼成功后得到一個(gè)變長(zhǎng)的碼字,根據(jù)解析的Huffman解碼表尋址得到該碼字對(duì)應(yīng)的解碼信息。該解碼信息為8 bit,高4 bit代表在該頻域系數(shù)之前0的個(gè)數(shù),而低4 bit表示該頻域系數(shù)的二進(jìn)制bit長(zhǎng)度。最后,根據(jù)系數(shù)所占用的二進(jìn)制bit長(zhǎng)度,確定該頻域系數(shù)的值。
從解碼過(guò)程可知,Huffman解碼步驟比較耗時(shí),這是因?yàn)镠uffman算法為變長(zhǎng)編碼,壓縮后產(chǎn)生的碼字長(zhǎng)度不固定,需要逐個(gè)bit地讀入數(shù)據(jù)。根據(jù)范式哈夫曼編碼的一個(gè)很重要特性:長(zhǎng)度為i的碼字的前j位的數(shù)值大于長(zhǎng)度為j的碼字的數(shù)值,即i>j[3]。因此可以構(gòu)造出一種并行結(jié)構(gòu)的huffman快速解碼算法。將N(N=1,2,3…15)bit長(zhǎng)度的最小碼字低位補(bǔ)0擴(kuò)充到16 bit,得到f(N)。對(duì)輸入的16 bit JPEG碼流code與f(N)和f(N+1)進(jìn)行比較,如果f(N)<code<f(N+1),則可以確定待解碼碼字長(zhǎng)度為N。在確定碼字長(zhǎng)度后,定義offset=code-f(N)。若f(N)對(duì)應(yīng)的解碼信息的存儲(chǔ)地址為addr(N),則code的解碼信息的地址為offset+addr(N)。以該地址作為Huffman解碼表的讀地址,就可以得到對(duì)應(yīng)的Run/szie解碼信息。快速Huffman解碼算法結(jié)構(gòu)如圖4所示。
熵解碼單元包括Huffman解碼及變長(zhǎng)解碼和行程解碼。Huffman解碼完成后,再進(jìn)行變長(zhǎng)解碼和行程解碼。在該部分中,主要根據(jù)解碼出來(lái)的Run/size進(jìn)行幅值的確定和0行程的解碼,同時(shí)設(shè)置了計(jì)數(shù)器counter用來(lái)記錄當(dāng)前解碼符號(hào)在8×8數(shù)據(jù)塊中的位置。如果Run/size為00,則表示該圖像塊已解碼完成;如果Run/size為F0,則將counter加上16。否則,將counter加上Run,從碼流中讀取size位,判斷最高位,如果為0,則表示當(dāng)前系數(shù)為負(fù)數(shù),將該bit以及后面讀入的bit全部取反;為1表示當(dāng)前系數(shù)為正數(shù),將當(dāng)前系數(shù)的剩余bit讀出,輸出到外部模塊。
熵解碼單元模塊的輸入輸出信號(hào)有:復(fù)位信號(hào)(rst)、系統(tǒng)時(shí)鐘(clk)、輸入數(shù)據(jù)有效(DataInEnabe)、輸入數(shù)據(jù)(DataIn)、解碼出來(lái)的哈夫曼碼字(TableCode)、Huffman解碼表的尋址地址(DhtNumber)、行程0的個(gè)數(shù)(DhtZero),該頻域系數(shù)的二進(jìn)制bit數(shù)(DhtWidth)、頻域系數(shù)的幅值(OutCode)。該模塊在Modelsim仿真軟件下的仿真如圖5所示。由仿真圖可知,該單元可以每1個(gè)時(shí)鐘解碼出一個(gè)哈夫曼碼字,每5個(gè)時(shí)鐘完成一個(gè)頻域數(shù)據(jù)的熵解碼。
1.3 反量化與反Z變換單元
量化是圖像壓縮中最重要的部分。DCT變換并沒(méi)有壓縮圖像數(shù)據(jù),而是將能量聚集在低頻系數(shù)部分。DCT 的低頻系數(shù)包含了圖像的主要信息, 而其高頻系數(shù)是反映圖像較次要的信息。因此,結(jié)合人類視覺(jué)系統(tǒng)的特點(diǎn),采用特定的量化表,忽略部分高頻分量,從而達(dá)到壓縮的目的,故量化也就是進(jìn)行除法操作。相應(yīng)地,反量化過(guò)程就是將Huffman解碼后的64個(gè)頻域數(shù)據(jù)分別與對(duì)應(yīng)的量化表中量化系數(shù)相乘。而對(duì)0系數(shù)進(jìn)行相乘沒(méi)有任何意義,因此,在該單元的設(shè)計(jì)中,僅對(duì)非0頻域系數(shù)進(jìn)行相乘。在Huffman解碼模塊中,counter用于記錄已經(jīng)解碼的頻域數(shù)據(jù)的個(gè)數(shù),Run記錄0行程的個(gè)數(shù),將兩個(gè)數(shù)值相加作為量化表存儲(chǔ)單元的尋址地址,查到當(dāng)前非0頻域系數(shù)對(duì)應(yīng)的量化系數(shù)。反Z變換則按照對(duì)應(yīng)關(guān)系輸出反量化后的數(shù)據(jù),處理起來(lái)比較簡(jiǎn)單,本文不作討論。
反量化與反Z變換單元模塊的輸入輸出信號(hào)有:復(fù)位信號(hào)(rst)、系統(tǒng)時(shí)鐘(clk)、輸入數(shù)據(jù)有效(DataInEnabe)、解碼出來(lái)的哈夫曼碼字(NumberCode)、解碼出來(lái)的非0頻域系數(shù)(OutCode)、量化表尋址地址(DqtNumber)、量化系數(shù)(DqtData)、輸出使能(DecodeEnable)、反量化后的數(shù)據(jù)(DecodeCode)。該模塊在Modelsim仿真軟件下的仿真如圖6所示。由仿真圖可知,通過(guò)對(duì)量化單元尋址,每個(gè)時(shí)鐘就可以完成一個(gè)數(shù)據(jù)的反量化過(guò)程。
1.4 IDCT變換單元
對(duì)量化過(guò)的像素進(jìn)行反Z變換,得到8×8的數(shù)據(jù)塊。圖像數(shù)據(jù)是編碼時(shí)通過(guò)正向離散余弦變換得到的結(jié)果,解碼時(shí)必須將其反向余弦變換,將數(shù)值c向時(shí)域轉(zhuǎn)換。目前,用硬件實(shí)現(xiàn)的快速算法的普遍思想[4]是把2D-IDCT分解成兩個(gè)1D-IDCT,再在1D-DCT做快速算法,但是這種方法會(huì)占用過(guò)多的芯片資源。本文采用分時(shí)復(fù)用的方法,用一個(gè)1D-IDCT模塊實(shí)現(xiàn)二維余弦變換,其總體結(jié)構(gòu)如圖7所示。
對(duì)于1D-IDCT,本文采用經(jīng)典的陳氏算法。由于其算法具有清楚的分級(jí)結(jié)構(gòu),可以采用流水線結(jié)構(gòu)的設(shè)計(jì)方法來(lái)提高解碼速度。對(duì)于陳氏算法,采用4級(jí)流水線可以實(shí)現(xiàn)1D-IDCT算法。每級(jí)都有兩組寄存器,一組用于存放中間結(jié)果,另一組用于寄存運(yùn)算結(jié)果,同時(shí)也作為下一級(jí)的輸入。該設(shè)計(jì)利用狀態(tài)機(jī)產(chǎn)生變換矩陣,通過(guò)共用乘法器來(lái)減少乘法器的使用,由原來(lái)的22個(gè)減少到6個(gè),大大節(jié)約了邏輯資源。
IDCT模塊的輸入輸出信號(hào)有:復(fù)位信號(hào)(rst)、系統(tǒng)時(shí)鐘(clk)、輸入數(shù)據(jù)有效(DataInEnabe)、反量化后的頻域系數(shù)(Data00In)、輸出使能(DataOutEnable)、IDCT變換行數(shù)(DataOutPage)、IDCT變換流水線級(jí)數(shù)(DataOutCount)、IDCT變換完成后的時(shí)域系數(shù)(Data0Out, Data10Out)。該模塊在Modelsim仿真軟件下的仿真如圖8所示。
1.5 顏色空間轉(zhuǎn)換單元
在JPEG圖像進(jìn)行編碼時(shí),為了便于壓縮,需要將圖像數(shù)據(jù)由RGB色彩空間轉(zhuǎn)換到Y(jié)CbCr色彩空間。而在解碼時(shí),為了便于終端顯示,則需要將圖像數(shù)據(jù)由YCbCr色彩空間轉(zhuǎn)換到RGB色彩空間。其變換關(guān)系如下:
顏色空間轉(zhuǎn)換單元的輸入輸出信號(hào)有:復(fù)位信號(hào)(rst)、系統(tǒng)時(shí)鐘(clk)、輸入數(shù)據(jù)有效(DataInEnabe)、色彩空間信號(hào)(DataY、DataCb、DataCr)、變換后的RGB信號(hào)(OutR、OutG、OutB)。該模塊在Modelsim仿真軟件下的仿真如圖9所示,由仿真圖可知,在輸入一組信號(hào)后,3個(gè)時(shí)鐘周期可以得到對(duì)應(yīng)的一組RGB信號(hào),直至完成色彩空間轉(zhuǎn)換算法。
2 基于Avalon總線的JPEG IP核設(shè)計(jì)
Avalon總線是一種協(xié)議較為簡(jiǎn)單的片內(nèi)總線,Nios通過(guò)Avalon總線與外界進(jìn)行數(shù)據(jù)交換。Avalon總線的特點(diǎn)有:(1)所有外設(shè)的接口與Avalon總線時(shí)鐘同步,不需要復(fù)雜的握手/應(yīng)答機(jī)制。(2)所有的信號(hào)都是高電平或低電平有效,便于信號(hào)在總線中高速傳輸。(3)為了方便外設(shè)的設(shè)計(jì),地址、數(shù)據(jù)和控制信號(hào)使用分離的、專用的端口。
JPEG解碼時(shí),前一個(gè)模塊的輸出是下一個(gè)模塊的輸入。根據(jù)Avalon總線協(xié)議,該解碼模型需要設(shè)置一組Avalon接口,控制部分由Nios完成。Avalon接口設(shè)置如下:clk為全局同步時(shí)鐘,DataInRead是握手信號(hào),當(dāng)為高時(shí),向外設(shè)發(fā)送數(shù)據(jù)請(qǐng)求;DataInEnable為輸入數(shù)據(jù)有效信號(hào),有效時(shí),表示當(dāng)前傳送的是有效的數(shù)據(jù),IP核開(kāi)始接收?qǐng)D像碼流DataIn;為了提高圖像的解碼速度,數(shù)據(jù)寬度設(shè)計(jì)為32 bit;當(dāng)頭文件分析完成后,IP發(fā)送ImageEnable信號(hào),為1時(shí),表示開(kāi)始正式圖像解碼,接下來(lái)進(jìn)行Huffman解碼、IQ和IDCT變換,最終輸出3個(gè)8 bit的RGB數(shù)據(jù)。輸出數(shù)據(jù)只有在OutEnable為高時(shí)有效,當(dāng)最后一個(gè)碼流結(jié)束后,輸出JPEGIDLE信號(hào)。JPEG解碼IP核的輸入輸出時(shí)序仿真圖分別如圖10、圖11所示。
完成設(shè)計(jì)和驗(yàn)證后,該IP核可以通過(guò)SOPC Builder工具加入到系統(tǒng)中。基于SOPC的JPEG解碼系統(tǒng)如圖12所示。圖中,SDRAM控制器實(shí)現(xiàn)處理器、VGA控制器和SDRAM之間的圖像數(shù)據(jù)存取。由于VGA直接從SDRAM中讀取數(shù)據(jù),所以將VGA的avalon_master接口連接到SDRAM上, 當(dāng)VGA控制器發(fā)出讀有效信號(hào)到SDRAM時(shí),SDRAM直接將圖像數(shù)據(jù)傳送給VGA控制器,VGA控制器同時(shí)產(chǎn)生行場(chǎng)同步信號(hào),與RGB數(shù)據(jù)一起傳送到顯示器。SDRAM采用ICSI公司的數(shù)據(jù)寬度為16 bit、存儲(chǔ)容量為64 MB的IS42S8800來(lái)存儲(chǔ)解碼后的圖像數(shù)據(jù)。
針對(duì)軟件解碼圖片速度慢的問(wèn)題,本文設(shè)計(jì)了一種基于Avalon總線的JPEG解碼IP核。系統(tǒng)時(shí)鐘設(shè)置為50 MHz,在Quartus下進(jìn)行綜合和仿真,采用CycloneII EP2C8Q208C8硬件芯片驗(yàn)證了IP的正確性,極大地提高了圖片解碼的速度。同時(shí),利用IP核的可重用性,可以將其用于其他需要實(shí)時(shí)圖像解碼的系統(tǒng)中,可降低系統(tǒng)設(shè)計(jì)的復(fù)雜度。
參考文獻(xiàn)
[1] 何東健.數(shù)字圖像處理(第1版)[M].西安:西安電子科技大學(xué)出版社,2003.
[2] 夏宇聞.Veriong數(shù)字系統(tǒng)設(shè)計(jì)教程(第2版)[M].北京:北京航空航天大學(xué)出版社,2008.
[3] 邵天增,尚冬娟.哈夫曼編碼應(yīng)用的一種改進(jìn)[J]. 科技創(chuàng)新導(dǎo)報(bào),2008,21:29,31.
[4] 鐘文榮,陳建發(fā).二維DCT算法的高速芯片設(shè)計(jì)[J].廈門大學(xué)學(xué)報(bào)自然科學(xué)版,2005,43(3):198-201.