JPEG解碼器IP核的設(shè)計與實現(xiàn)
摘要:介紹了基于靜止圖像壓縮標(biāo)準(zhǔn)JPEG解碼器IP核的設(shè)計與實現(xiàn)。設(shè)計采用適于硬件實現(xiàn)的IDCT算法結(jié)構(gòu),通過增加運(yùn)算并行度和流水線技術(shù)相結(jié)合的方法以提高處理速度。根據(jù)Huffman碼流特點,采用新的Huffman并行解碼硬件實現(xiàn)結(jié)構(gòu),用簡單的算術(shù)運(yùn)算代替復(fù)雜的配對模式,解碼速度快,硬件成本低。該IP核可方便地集成到諸如數(shù)碼相機(jī)、手機(jī)以及掃描儀等各種應(yīng)用中。
關(guān)鍵詞:JPEG;IP核;Huffman;流水線設(shè)計
基于IP(Intellectual Property)核的設(shè)計和可復(fù)用已成為SoC(System on a Chip)設(shè)計方法的主流設(shè)計方法。本設(shè)計實現(xiàn)了基于靜止圖像壓縮標(biāo)準(zhǔn)JPEG基本模式的解碼器軟IP核。JPEG(Joint Photograph ExpelsGroup)是1992年CCITT和ISO正式通過的連續(xù)色調(diào)靜止圖像壓縮標(biāo)準(zhǔn)。圖像的高數(shù)據(jù)量和廣泛應(yīng)用對圖像的存儲和傳輸提出了要求,有限的存儲容量和傳輸帶寬不能直接對圖像進(jìn)行存儲與傳輸,因此需要先對圖像進(jìn)行壓縮處理。JPEG壓縮算法因其優(yōu)異的壓縮性能成為目前最流行的圖像壓縮工具。
1 JPEG解碼IP核設(shè)計和實現(xiàn)
在JPEG解碼器中,因為Huffman解碼是變長的,本次解碼結(jié)束后才能重新定位碼流,難以實現(xiàn)流水線設(shè)計,所以本設(shè)計中主要通過提高功能部件并行度和在功能模塊內(nèi)部實現(xiàn)流水線來提高解碼速度。因為解碼速度不定,所以各功能模塊間的握手信號很關(guān)鍵。每個模塊的數(shù)據(jù)輸出時也要考慮到后級模塊的數(shù)據(jù)輸入要求,這樣才能達(dá)到整個解碼過程的有序、高效進(jìn)行。JPEG解碼IP核總體架構(gòu),如圖1所示。
1.1 JPEG解碼IP核控制器設(shè)計
JPEG解碼器控制器的作用是在不同解碼環(huán)節(jié)為各個單元模塊分配任務(wù),以控制中間運(yùn)算過程及最后輸出結(jié)果。采用了有限狀態(tài)機(jī)的設(shè)計方法,這是一種結(jié)構(gòu)清晰、設(shè)計靈活的方法,它易于建立、理解和維護(hù),特別是應(yīng)用于大量狀態(tài)轉(zhuǎn)移和復(fù)雜時序控制系統(tǒng)中更顯優(yōu)勢。控制器主要由一個Mealy型有限狀態(tài)機(jī)實現(xiàn),狀態(tài)轉(zhuǎn)移如圖2所示。
初始化狀態(tài)(IDLE):復(fù)位或者一幅圖像解碼完成時進(jìn)入的狀態(tài),重新定位碼流,在解碼開始標(biāo)志有效時跳轉(zhuǎn)到標(biāo)志符解碼狀態(tài)(DeMar-ker)。
標(biāo)志符解碼狀態(tài)(DeMarker):按JPEG碼流語法和JFIF文件格式解析標(biāo)記符,根據(jù)解析出的標(biāo)志符跳轉(zhuǎn)到相應(yīng)的標(biāo)志段解碼狀態(tài),如果解析到SOI標(biāo)志符或者是0xFFFF狀態(tài)不改變。
解碼出錯狀態(tài)(False):若是在標(biāo)志段解碼出錯跳轉(zhuǎn)到False狀態(tài),通過輸出端口將出錯信號輸出,在得到外部反饋后跳轉(zhuǎn)到初始化狀態(tài)IDLE。
應(yīng)用擴(kuò)展標(biāo)志段APPn、幀開始標(biāo)志段SOFO、量化表定義DQT標(biāo)志段、Huffman碼表定義DHT標(biāo)志段和掃描行開始SOS標(biāo)志段的解碼過程是相似的,在相應(yīng)標(biāo)志符后是標(biāo)志段的長度,可以根據(jù)這個長度值,結(jié)合JPEG碼流語法,進(jìn)行碼流解析,將所需的圖像信息如圖像尺寸、圖像格式、量化表、Huffman碼表等寫入相應(yīng)寄存器或者存儲器中,以便于后續(xù)壓縮數(shù)據(jù)的解碼。
Huffman碼流解碼狀態(tài)(DeHuffman):在解析完掃描開始標(biāo)志段SOS后跳轉(zhuǎn)到Huffman碼流解碼狀態(tài),解碼圖像壓縮數(shù)據(jù),主要包括Huffman解碼、反量化、反Z字形重排、IDCT和輸出緩存等。
控制器還負(fù)責(zé)外部輸入的調(diào)配工作,每個時鐘周期,都將本次解碼長度送至碼流緩存模塊,從而重新定位解碼碼流位置。因為有多種圖像格式,所以控制器還要負(fù)責(zé)各個模塊的亮度色度選擇信號的輸入。
1.2 碼流緩存模塊設(shè)計
JPEG碼流是變長碼,數(shù)據(jù)量大,如果采用傳統(tǒng)的解碼方法對碼字的每個比特進(jìn)行處理,其輸出速率勢必不能滿足應(yīng)用要求。JPEG標(biāo)準(zhǔn)中數(shù)據(jù)編碼的最大碼長為26,而在標(biāo)志段解碼時要求碼長為8的整數(shù)倍,所以設(shè)計中采用兩個32位寄存器、一個32位桶形移位器、一個加法器和一個減法器的組合來實現(xiàn)該功能。其中,寄存器Rn負(fù)責(zé)從外部模塊讀取數(shù)據(jù),并和寄存器R1一起作為桶形移位器的輸入緩存。每個解碼周期,桶形移位器移出已解碼流的同時裝載新的待解碼流。減法器用于計算已處理碼長,傳送桶形移位器移位長度,判斷并控制R0的讀取和R1的更新。加法器用于碼流輸入時更新寄存器碼長和桶形移位器移位長度。這樣就為后續(xù)處理單元提供了連續(xù)不間斷的碼流,滿足了并行解碼處理的需求。
桶形移位器的輸出是32位,因此每個時鐘周期R0、R1必須為其提供32位的有效碼流。圖3所示給出了桶形移位器輸入緩存的更新示例。
1.3 Huffman解碼模塊設(shè)計
Huffman碼是變長編碼,若采用傳統(tǒng)的解碼方法逐位讀人碼流,先判斷碼字長度,再進(jìn)行解碼,效率較低,其解碼速率難以滿足應(yīng)用要求。本設(shè)計中提出了一種新的Huffman并行解碼硬件結(jié)構(gòu),Huffman符號表可配置,通用性強(qiáng)。用簡單的算術(shù)運(yùn)算代替復(fù)雜的配對模式,解碼速度快、硬件成本低。
1.3.1 Huffman解碼算法分析
對于一組概率確定的符號,其最佳Huffman編碼有多種碼字分配方式。其中一種特殊的分配方式稱為單調(diào)編碼,這種編碼中長度相等的碼字在數(shù)值上是單調(diào)變化的,JPEG中Huffman編碼采用這種方式。單調(diào)編碼的單調(diào)性是指出現(xiàn)概率較大的符號其對應(yīng)的碼字的值一定小于概率小的符號對應(yīng)的碼字值。具體說來有兩個特性:
(1)在某一特定長度對應(yīng)的碼字集當(dāng)中,碼字大小是連續(xù)變化的。
(2)長度短的碼字Ck的值一定小于長度比它長的碼字Cm,且Ck一定小于Cm的前k位前綴。
根據(jù)單調(diào)編碼的特性,可以證明:對于一個長為X的碼字,其長為K(1≤K<X)位前綴碼的值總是大于長度為K的最大碼字,同時其碼字總是小于長度為Y(Y>X)的最小碼字的K位前綴。這一結(jié)論表明當(dāng)把一串足夠長的碼流并行輸入碼長檢測器時,只可能得到惟一的有效碼長。
1.3.2 Huffman解碼模塊的硬件實現(xiàn)
對于一個給定長度L的碼字,可以用碼長為L的最小碼字和該碼字相對于最小碼字的偏差offset來表示。如果解碼器將相同碼長的解碼符號順序存儲在RAM或者寄存器陣列中,則可以由最小碼字的地址和偏差offset得到解碼符號。解碼符號的地址可由式(1)得到
在Huffman碼表定義DHT標(biāo)志段解碼時,可以得到各長度對應(yīng)的最小碼字Min Code、各最小碼字的地址Base Address和解碼符號Symbol,為了后續(xù)解碼需要,要將這些數(shù)據(jù)存入存儲器中。因為解碼包括了亮度DC系數(shù)、亮度AC系數(shù)、色度DC系數(shù)和色度AC系數(shù)4種情況,所以相應(yīng)地需要多個存儲器。
表1所示給出了本算法和其他算法的實現(xiàn)比較??梢?,本算法的實現(xiàn)在速度和硬件成本綜合權(quán)衡之下比較有優(yōu)勢。
因為Huffman編碼是無損壓縮,不存在誤差,所以Huffman解碼出來的數(shù)據(jù)也是沒有誤差的。本設(shè)計采用一個簡潔的Mealy型狀態(tài)機(jī)實現(xiàn),狀態(tài)轉(zhuǎn)移如圖4所示。圖5所示是相應(yīng)的Huffman解碼硬件結(jié)構(gòu)圖。
接下來結(jié)合圖4和圖5介紹Huffman并行解碼流程。
(1)初始化狀態(tài)(IDLE):復(fù)位或圖像壓縮數(shù)據(jù)解碼完成時進(jìn)入的狀態(tài),初始化相關(guān)寄存器。
(2)解碼狀態(tài)1(S1):首先寄存從碼流緩沖模塊輸入26位圖像碼流,將高16位輸入碼長檢測單元,與Min Code Memory中存儲的各長度最小碼字并行比較,碼長檢測單元由選擇器、比較器和一個16選4的選擇器組成,得到碼字的長度L。接著由碼長為L的Huffman碼與相應(yīng)長度的最小碼字Min(L)計算出偏移量offset,從Base Address Memory中取出最小碼字Min(L)的地址Base Address,將兩者輸入8位加法器中,由式(1)可計算出該碼字對應(yīng)的解碼符號地址。然后根據(jù)這個地址從Symbol Memory中取出解碼符號,對DC來說是SSSS,對AC來說是RRRRSSSS。同時將移位寄存器中的碼字左移L位,將高11位編碼輸入到幅值寄存器中。
(3)解碼狀態(tài)2(S2):將解析出的字長SSSS和碼長L輸入到5位加法器中,得出本次解碼總位長,輸出到碼流緩沖模塊,用于重新定位碼流,更新輸入數(shù)據(jù)。將幅值寄存器的高SSSS位選擇輸入一個12位中間寄存器的低位,該中間寄存器的高(12-SSSS)位移入幅值寄存器的最高位的相反值,若得到的中間寄存器的最高位為“1”,按.JPEG標(biāo)準(zhǔn),要再加1。這樣解析出來的就是頻率系數(shù),即DCT系數(shù),對于DC來說就是差值DIFF。解析完幅值后,進(jìn)行DC/AC系數(shù)解碼。
DC/AC系數(shù)解碼:計數(shù)器用于計算解析系數(shù)在塊數(shù)據(jù)中的位置。若計數(shù)器值為零,表示解析出來的是DC系數(shù)的差值DIFF,要根據(jù)亮度色度選擇信號選擇相應(yīng)DCk-1,根據(jù)DCk=DIFF+DCk-1計算出DC值,并且更新DCk-1。若計數(shù)器值不為零,表示解析出來的是AC值,接下來對應(yīng)的有4個分支:1)若(RRRR,SSSS)=(0,0),表示此圖像塊解碼結(jié)束,輸出塊解碼結(jié)束標(biāo)志DecOneBlock,并清零計數(shù)器;2)若(RRRR,SSSS)=(15,0),表示連續(xù)16個零系數(shù),計數(shù)器加16,不輸出;3)若SSSS不為零,且計數(shù)器值+RRRR=62,表示解析出來的是圖像塊的最后一個系數(shù),計數(shù)器清零,并輸出塊解碼結(jié)束標(biāo)志DecOneBlock和DCT系數(shù)值;4)普通AC系數(shù),計數(shù)器加1,輸出計數(shù)器的值和DCT系數(shù)值。
1.4 反量化模塊設(shè)計
本設(shè)計在Huffman解碼后沒有采用JPEG標(biāo)準(zhǔn)的先反Z字形重排再反量化的流程,而是先進(jìn)行反量化操作。如此只要Huffman解碼有DCT系數(shù)輸出時才需要進(jìn)行反量化運(yùn)算,能減少無效操作,降低功耗。
反量化運(yùn)算時先將相應(yīng)的量化系數(shù)保存在寄存器陣列中,在Huffman解碼模塊有DCT系數(shù)輸入時,按其地址取出相應(yīng)的量化系數(shù),相乘后輸出到后級反Z字形重排模塊。
1.5 反Z字形重排模塊設(shè)計
根據(jù)模塊輸入數(shù)據(jù)的特點,提出了一種優(yōu)化的硬件實現(xiàn)結(jié)構(gòu)。因為一個8×8圖像塊經(jīng)DCT變換后非零系數(shù)個數(shù)一般不超過總數(shù)據(jù)量的10%,所以設(shè)計中為寄存器陣列的每個寄存器都設(shè)定一個一位的使能標(biāo)志,在初始化時先將寄存器陣列中寄存器和相應(yīng)標(biāo)志位都賦零值,在輸入值為非零值時才寫入相應(yīng)地址,并置位對應(yīng)的使能標(biāo)志,這樣在寫入數(shù)據(jù)時不需要進(jìn)行零數(shù)據(jù)的存儲,而在輸出數(shù)據(jù)時只要根據(jù)使能標(biāo)志就能判斷是要讀寄存器陣列還是直接輸出零,所以可以減少對存儲器的讀寫操作,加快數(shù)據(jù)處理速度。
反Z字形重排模塊不僅要接收反量化后的系數(shù),對其進(jìn)行反Z字形重排,同時要對圖像塊數(shù)據(jù)進(jìn)行一次行列轉(zhuǎn)置,這樣可以節(jié)省2個寄存器陣列,降低硬件成本。為了提高運(yùn)算并行度,提高解碼速率,滿足后級模塊數(shù)據(jù)要求,反Z字形重排模塊中采用了兩個64×14位雙端口寄存器陣列,進(jìn)行乒乓操作。
1.6 IDCT模塊設(shè)計
2D-IDCT的實現(xiàn)選用行列分解法,所以主要功能模塊包括1D-IDCT模塊和行列轉(zhuǎn)置模塊。因為全流水線實現(xiàn)系統(tǒng)解碼硬件成本很高,所以設(shè)計中主要通過提高運(yùn)算并行度和在功能模塊內(nèi)部實現(xiàn)流水線運(yùn)算來提高解碼速度。IDCT模塊設(shè)計中采用了兩個1D-IDCT處理單元,并通過流水線技術(shù)實現(xiàn)高運(yùn)算速率。
1.6.1 1D-IDCT模塊設(shè)計
本設(shè)計采用了一種運(yùn)算量少、數(shù)據(jù)流簡單且適于流水線實現(xiàn)的IDCT算法。通過對1D-IDCT數(shù)據(jù)流程的合理劃分,將其分4級,在每級中間插入寄存器,對每級流水線內(nèi)部運(yùn)算的時序進(jìn)行合理安排,在每級流水線內(nèi)共享算術(shù)單元,降低硬件成本。1D-IDCT快速算法的數(shù)據(jù)流程如圖6所示。
通過對1D-IDCT數(shù)據(jù)流程的合理安排和資源共享,本設(shè)計共需4個加法器,4個減法器和4個乘法器,所用硬件資源比較少。而且本設(shè)計的處理速度快,每個時鐘周期輸入兩個像素,完成1D-IDCT的延遲時間是6個時鐘周期。在流水運(yùn)算時計算一個8點1D-IDCT只需要4個時鐘周期。
1.6.2 行列轉(zhuǎn)置模塊設(shè)計
行列轉(zhuǎn)置矩陣的實現(xiàn)大部分設(shè)計采用雙RAM進(jìn)行乒乓操作完成,本設(shè)計采用一個8×8寄存器陣列和方向控制信號完成,可節(jié)省一半硬件資源,且控制簡單。當(dāng)有信號輸入時,方向控制信號值初始設(shè)為0,這時寄存器陣列的輸入輸出方向是從左到右,64個時鐘周期后方向控制信號反向變?yōu)?,這時寄存器陣列的輸入輸出方向是從下到上。如此循環(huán),即可實現(xiàn)行列轉(zhuǎn)置,如圖7所示。
2 綜合、仿真與性能分析
設(shè)計時先用Matlab進(jìn)行算法級仿真與驗證,在RLT級設(shè)計時采用Verilog語言實現(xiàn),在Modelsim6.1中進(jìn)行功能仿真,選擇VIRTEX2系列xc2v250器件進(jìn)行FPGA驗證,從軟硬件方面都驗證了設(shè)計的正確性。
使用Synopsys公司的Design Compiler工具在0.18μm的SMIC CMOS工藝條件下,對RTL代碼進(jìn)行綜合優(yōu)化。通過設(shè)置不同的面積、時序及功耗約束條件,縮短關(guān)鍵路徑的延時,時鐘頻率可達(dá)100 MHz的最優(yōu)設(shè)計,綜合出面積為721 695μm2,不包括存儲單元需要34.6 kB標(biāo)準(zhǔn)門。本設(shè)計能每秒能夠解碼1 920×1 080圖形25幀以上,所以也能用于一些有低成本需求的監(jiān)控、錄像系統(tǒng)。
3 結(jié)束語
介紹了基于靜止圖像壓縮標(biāo)準(zhǔn)JPEG的解碼器IP核的設(shè)計,描述了硬件設(shè)計過程,提出了一種高效、低成本的JPEG解碼器架構(gòu)。設(shè)計通過VIRTEX2平臺進(jìn)行了FPGA驗證,并使用Synopsys公司的DC工具在SMIC 0.18 μmCMOS工藝條件下,對設(shè)計進(jìn)行面積和時間的優(yōu)化,在100 MHz時鐘頻率下工作時電路面積為721 695μm2,每秒能夠解碼1 920×1 080圖形25幀以上。本設(shè)計還支持多種圖像質(zhì)量和圖像格式,有較寬的壓縮比范圍,設(shè)計具有獨立性和完整性,也適用于數(shù)碼相機(jī)、手機(jī)和掃描儀等各種應(yīng)用。