文獻標(biāo)識碼: A
文章編號: 0258-7998(2011)07-144-04
隨著我國物聯(lián)網(wǎng)籌備和建設(shè)的推進,,高速圖像處理技術(shù)的應(yīng)用領(lǐng)域不斷擴大,對圖像處理的要求也越來越高,。由于未經(jīng)壓縮圖像的數(shù)據(jù)量非常龐大,,對存儲空間和通信帶寬的需求是無限的,這就要求對圖像進行壓縮處理,。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語言進行設(shè)計[2],,編譯后,,利用Modelsim軟件對其進行功能仿真和時序仿真,最終完成各個單元的設(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)識符后,,模塊進入ReadSegment狀態(tài)。在這個狀態(tài)下,,模塊對每個標(biāo)志段內(nèi)的信息進行解析,,并對其中的重要信息如當(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ù)流進行Huffman解碼,,解碼成功后得到一個變長的碼字,,根據(jù)解析的Huffman解碼表尋址得到該碼字對應(yīng)的解碼信息。該解碼信息為8 bit,,高4 bit代表在該頻域系數(shù)之前0的個數(shù),,而低4 bit表示該頻域系數(shù)的二進制bit長度,。最后,根據(jù)系數(shù)所占用的二進制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擴充到16 bit,,得到f(N),。對輸入的16 bit JPEG碼流code與f(N)和f(N+1)進行比較,如果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ù)解碼出來的Run/size進行幅值的確定和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ù)的二進制bit數(shù)(DhtWidth),、頻域系數(shù)的幅值(OutCode),。該模塊在Modelsim仿真軟件下的仿真如圖5所示。由仿真圖可知,,該單元可以每1個時鐘解碼出一個哈夫曼碼字,每5個時鐘完成一個頻域數(shù)據(jù)的熵解碼,。
1.3 反量化與反Z變換單元
量化是圖像壓縮中最重要的部分。DCT變換并沒有壓縮圖像數(shù)據(jù),,而是將能量聚集在低頻系數(shù)部分,。DCT 的低頻系數(shù)包含了圖像的主要信息, 而其高頻系數(shù)是反映圖像較次要的信息,。因此,結(jié)合人類視覺系統(tǒng)的特點,,采用特定的量化表,,忽略部分高頻分量,從而達到壓縮的目的,,故量化也就是進行除法操作,。相應(yīng)地,反量化過程就是將Huffman解碼后的64個頻域數(shù)據(jù)分別與對應(yīng)的量化表中量化系數(shù)相乘,。而對0系數(shù)進行相乘沒有任何意義,,因此,在該單元的設(shè)計中,,僅對非0頻域系數(shù)進行相乘,。在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變換單元
對量化過的像素進行反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圖像進行編碼時,為了便于壓縮,,需要將圖像數(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總線與外界進行數(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時,,表示開始正式圖像解碼,接下來進行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下進行綜合和仿真,,采用CycloneII EP2C8Q208C8硬件芯片驗證了IP的正確性,極大地提高了圖片解碼的速度。同時,利用IP核的可重用性,,可以將其用于其他需要實時圖像解碼的系統(tǒng)中,,可降低系統(tǒng)設(shè)計的復(fù)雜度。
參考文獻
[1] 何東健.數(shù)字圖像處理(第1版)[M].西安:西安電子科技大學(xué)出版社,,2003.
[2] 夏宇聞.Veriong數(shù)字系統(tǒng)設(shè)計教程(第2版)[M].北京:北京航空航天大學(xué)出版社,,2008.
[3] 邵天增,尚冬娟.哈夫曼編碼應(yīng)用的一種改進[J]. 科技創(chuàng)新導(dǎo)報,,2008,21:29,,31.
[4] 鐘文榮,陳建發(fā).二維DCT算法的高速芯片設(shè)計[J].廈門大學(xué)學(xué)報自然科學(xué)版,2005,43(3):198-201.