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