JPEG-LS多路并行譯碼的FPGA實現(xiàn)
摘 要: 提出了一種基于FPGA的JPEG-LS的多路并行譯碼系統(tǒng),運用VHDL語言實現(xiàn),以提高圖像的譯碼速度。系統(tǒng)主要分為檢測模塊、譯碼模塊和碼流分配模塊三部分。在檢測模塊中提取和去除頭文件的圖像信息,譯碼模塊則根據(jù)算法對圖像數(shù)據(jù)進行恢復,碼流分配模塊為多路并行算法的關(guān)鍵,利用流水線結(jié)構(gòu)的思路采用乒乓操作將碼流從檢測模塊傳送到外部RAM。在譯碼時采用同樣的方法將數(shù)據(jù)送入多個譯碼模塊進行譯碼。
關(guān)鍵詞: 現(xiàn)場可編程邏輯門陣列;碼流分配;多路并行;流水線;乒乓操作
JPEG-LS無損和近無損壓縮算法已經(jīng)在醫(yī)療和遙感圖像領(lǐng)域得到了廣泛應用。在現(xiàn)有的硬件譯碼中實現(xiàn)高性能的JPEG-LS譯碼大都采用流水線處理方式[1]。并行運算在硬件譯碼中的應用使得其相對于軟件譯碼更有明顯的優(yōu)勢。由于FPGA具有系統(tǒng)結(jié)構(gòu)和邏輯單元靈活、集成度高、開發(fā)周期短、可適用于較大規(guī)模的電路等優(yōu)點,因此本設(shè)計中采用FPGA作為硬件開發(fā)平臺,對圖片的譯碼采用多路并行的方式[2]來實現(xiàn)高速譯碼。為了節(jié)省系統(tǒng)資源,本設(shè)計采用四路并行譯碼。由于處理的圖像信息量比較大,在圖片處理過程中需要對數(shù)據(jù)進行緩存,而在芯片內(nèi)部的RAM無法滿足要求的情況下,采用外掛RAM對從檢測模塊和解碼模塊出來的圖片信息進行緩存[3]。本多路并行譯碼系統(tǒng)主要由檢測模塊、譯碼模塊和碼流分配模塊組成。
1 檢測模塊
檢測模塊用來對圖片信息的頭文件進行處理。對于每一種圖像壓縮算法,其頭文件都有固定的一種格式。在檢測模塊中,接收到頭文件信息后首先檢測標識號是否正確。為了正確提取頭文件中的圖像信息,設(shè)計中設(shè)置一個計數(shù)器對輸入的時鐘進行計數(shù)。如果標識號正確,則進入下一個狀態(tài)并且計數(shù)器開始計數(shù);若錯誤則停留在當前狀態(tài)檢測下一個標識號,計數(shù)器保持為0。標識好并正確后去除標識號信息,從頭文件后面的信息中在不同的狀態(tài)根據(jù)計數(shù)器的不同分別提取出圖像的高、寬、精度等信息。頭文件信息提取完之后,根據(jù)碼流長度的值判斷選擇對數(shù)據(jù)進行緩存。當碼流長度依次遞減為0時,狀態(tài)選擇跳轉(zhuǎn)為最初狀態(tài),等待下一幅圖片的輸入。
2 譯碼模塊
譯碼模塊是對壓縮后的圖片信息進行恢復。JPEG-LS的編碼方法是一種利用Glomb編碼和上下文建模的編碼方法。
建模建立在上下文的基礎(chǔ)上。在上下文建模時,每個樣本值都是以周圍幾個像素的值為條件的,要確定一個概率分布用來編碼當前樣本值。若樣本為x,如圖1所示,上下文是由圖中a、b、c、d 4個位置的重建樣本值來確定的。圖像數(shù)據(jù)的掃描順序是按從左到右從上到下進行。通過對4個重建樣本值計算出3個梯度值D1、D2、D3,然后根據(jù)3個梯度值決定對x位置的樣本值采用游長編碼還是采用常規(guī)編碼。當梯度值D1、D2、D3全為0時或者全部小于近無損壓縮控制的壓縮比控因子(NEAR)值時選擇游長編碼,否則選擇常規(guī)編碼。
常規(guī)編碼主要是一個對預測值、預測誤差的編碼過程和一個變量更新過程。在上下文建模之后是預測過程。預測值是由如圖1所示的a、b、c、d位置的樣本重建值對x位置的樣本值的一個預測。預測誤差則是預測值與實際值之間的差值。預測誤差后則根據(jù)上下文對其修正補償在預測過程中的系統(tǒng)偏差。對近無損壓縮而言,要對預測誤差進行量化。
在游長編碼中,如果a、b、c、d位置的樣本重建值的梯度值均為0,或者樣本重建值之間梯度值在近無損壓縮控制因子的范圍之內(nèi),則上下文建模選擇游長編碼。游長編碼過程不需要對樣本預測值和預測誤差編碼,編碼器從x位置開始對連續(xù)出現(xiàn)樣本值相同的樣本均用a位置的樣本值來重建,直到樣本值之間的梯度值不滿足要求,或者到本行結(jié)束時,結(jié)束游長編碼。
圖像的解碼過程和編碼過程大致相同,即根據(jù)上下文之間重建樣本值的關(guān)系來確定x位置的樣本值,采用同樣的方式選擇是常規(guī)譯碼還是游長譯碼。
3 碼流分配模塊
3.1 碼流分配方案
碼流分配模塊為多路并行算法的關(guān)鍵,也是本設(shè)計的頂層模塊,負責對輸入碼流[5]的走向進行調(diào)配。在本設(shè)計中采用4個外掛的RAM存儲解碼過程中的碼流數(shù)據(jù)。為了節(jié)省FPGA系統(tǒng)資源,本設(shè)計采用4路并行的方式,如圖2所示。首先碼流通過檢測模塊對圖像的頭文件進行處理,將處理后的結(jié)果順序緩存到RAM1和RAM2中。當緩存RAM寫滿之后,RAM中的數(shù)據(jù)送入4個譯碼模塊dec1、dec2、dec3、dec4開始譯碼。譯碼后的數(shù)據(jù)順序緩存到RAM3和RAM4中,然后顯示器循環(huán)調(diào)用RAM3和RAM4中的數(shù)據(jù)進行顯示。
設(shè)計中將每個RAM的地址空間劃分為四個部分,分別存放一幀數(shù)據(jù)中4幅圖像的數(shù)據(jù)。在譯碼部分提取數(shù)據(jù)時也可根據(jù)RAM中存放圖片的位置對應提取出所要譯碼圖片的信息。為了提高設(shè)計的整體性能和效率,設(shè)計中對檢測模塊和譯碼模塊采用不同頻率的時鐘,在檢測模塊采用50 MHz的時鐘,譯碼模塊則采用90 MHz的時鐘。由于對RAM讀寫時鐘采用不同的頻率,保證了時序控制上有嚴格的要求。在第一個緩存周期中,從檢測模塊出來的數(shù)據(jù)采用乒乓操作的方法[4]首先存儲到RAM1的4個空間中。在第二個緩存周期,如果RAM1存儲滿、RAM2為空,則檢測輸出選擇信號將切換到RAM2上,開始對RAM2進行寫操作,同時譯碼模塊輸入選擇信號切換到RAM1并對RAM1中的4幅圖像的數(shù)據(jù)采用流水線方式4路并行譯碼。在第三個緩存周期中,如果RAM1譯碼完成、RAM2寫滿,則先將RAM1復位,再將檢測輸出選擇信號選擇RAM1,并對RAM1進行寫操作,譯碼輸入選擇信號選擇RAM2,開始對RAM2中的4幅圖像譯碼。對RAM3和RAM4的讀寫也采用相同的乒乓操作方式。在第三個緩存周期,譯碼輸出選擇RAM3,并對RAM3開始寫操作,當RAM3寫滿、RAM4為空時,進入第四個緩存周期,譯碼輸出選擇對RAM4寫操作,屏幕顯示調(diào)用RAM3中的數(shù)據(jù)。到下一個操作時序時,RAM3中的數(shù)據(jù)讀完、RAM4存儲滿,則對RAM3復位,譯碼輸出選擇RAM3,屏幕顯示調(diào)用RAM4中的數(shù)據(jù)。如此實現(xiàn)圖片的不間斷輸出。
3.2 乒乓操作并行控制的VHDL實現(xiàn)及仿真
設(shè)計中的乒乓操作主要體現(xiàn)在對RAM1和RAM2的讀寫時序控制上。對RAM1和RAM2的寫操作采用50 MHz的時鐘,而讀操作則采用90 MHz的時鐘。本設(shè)計在Modeltech_6.3a仿真工具下做時序和功能仿真。測試文件采用10位精度壓縮后的碼流作為譯碼的輸入,選擇16數(shù)據(jù)線的RAM作為緩沖儲存器。
設(shè)計中,用來控制RAM1寫信號的為碼流輸入判斷信號fram,當fram信號為1時則為有碼流輸入;data_valid用來控制是否為有效數(shù)據(jù);fram_flag1作為判斷一幀數(shù)據(jù)的4幅圖像在RAM1中是否存儲完成的標志;fram_flag2作為判斷一幀數(shù)據(jù)的4幅圖像在RAM2中是否存儲完成的標志。如果一幀數(shù)據(jù)的4幅圖像在RAM1寫完則fram_flag1為1。同樣如果在RAM2中存儲完成則fram_flag2為1;ram1_ready為判斷RAM1是否準備好接收數(shù)據(jù)的標志。當ram1_ready為1時表示已經(jīng)復位完成,準備接收數(shù)據(jù);ram2_ready則為判斷RAM2是否準備好接收數(shù)據(jù)的標志;read_empty1為RAM1讀空信號;read_empty1_delay為read_empty1的一個時鐘的延遲信號;ram1_2為RAM1和RAM2之間的切換信號。ram1_2為0時表示選擇RAM1,為1時表示選擇RAM2;ram1_strm、ram2_strm為RAM中的輸入碼流信息;cnt1為以8為碼流計數(shù),當其為奇數(shù)時RAM地址+1,當其為偶數(shù)時RAM地址不變。
在50 MHz時鐘的上升沿,如果read_empty1=1、read_empty1_delay=0,則ram1_ready=1。如圖3所示為RAM1寫操作時各寫操作控制信號的波形圖。
設(shè)計中用來控制RAM讀操作的信號有write_full1,它是判斷RAM1是否寫滿的標志。復位時,write_full1為0,當一幀輸入碼流存儲到RAM1中后,write_full1為1。RAM2的滿標志用write_full2信號來判斷。dec_end1為RAM1中信息譯碼結(jié)束標志,RAM1中信息譯碼結(jié)束時dec_end1為1,復位時dec_end1為0。dec_end1_delay為dec_end1的一個時鐘延遲信號。dec_end2和dec_end2_delay分別為RAM2譯碼結(jié)束標志和對譯碼標志的一個延時。dec_permit為RAM1、RAM2的譯碼允許標志。ram1_rd、ram2_rd分別為RAM1、RAM2的讀信號。dec_start1、dec_start2分別為RAM1和RAM2開始譯碼的標志位。
當dec_end1_delay=0、dec_end1=1時,dec_permit=1。當dec_end2_delay=0、dec_end2=1時,dec_permit=0。
當write_full1=1、dec_end1=0、dec_permit=0時,RAM1的譯碼開始標志位為1,表示開始對RAM1的譯碼。當write_full2=1、dec_end2=1、dec_permit=1時,RAM2的譯碼開始標志位為1,表示開始對RAM2的譯碼。
圖4為RAM1讀操作控制波形圖。從圖中可以看出,4個譯碼模塊采用流水線的方式根據(jù)RAM的地址分別讀取4幅圖像的數(shù)據(jù)進行解碼。
本設(shè)計采用4路并行譯碼的方式,芯片的面積利用率為90%,雖然占用的邏輯單元數(shù)量比較多,但是譯碼速度卻有很大提高,充分體現(xiàn)出面積和速度之間的關(guān)系。設(shè)計是在ISE7.1的軟件環(huán)境下進行綜合的。譯碼部分使用邏輯單元數(shù)目為4 414個,占所用邏輯單元總數(shù)的17%,使用片內(nèi)RAM為11個,占片內(nèi)RAM總數(shù)的3%,綜合頻率達到了135.485 MHz。采用90 MHz的時鐘譯碼,使得譯碼圖像輸出幀之間相隔約9 ms,真正實現(xiàn)了圖片譯碼的實時傳輸。在測試階段采用多幅遙感圖像對多路譯碼器進行了測試,實驗結(jié)果表明,在采用多路并行譯碼的情況下,能夠?qū)崿F(xiàn)快速、準確的傳輸。本設(shè)計具有很好的可移植性,能夠應用到圖片處理的許多領(lǐng)域中。
參考文獻
[1] PAPADONIKOLAKIS M E, KAKAROUNTAS A P. Efficient high-performance implementation of JPEG2LS encoder[J]. Journal of Real-time Image, 2008(3):303-307.
[2] 王浩,劉文怡,韓志軍.多通道同步數(shù)據(jù)采集與處理系統(tǒng)的設(shè)計與實現(xiàn)[J].通信技術(shù),2009,42(1):297-299.
[3] 莊懷宇,吳成柯,鄧家先,等.JPEG2000 T2編碼快速算法及硬件實現(xiàn)[J].系統(tǒng)工程與電子技術(shù),2004,26(12):1939-1942.
[4] 王智,羅新民.基于乒乓操作的異步FIFO設(shè)計及VHDL實現(xiàn)[J].電子工程師,2005,31(6):13-16.
[5] 鄧家先,肖江,吳成柯,等.JPEG2000的重要性編碼[J].電路與系統(tǒng)學報,2003,8(5):145-148.