高世明,孟令軍,李寶剛,賈至江
(中北大學(xué) 電子測試技術(shù)國家重點實驗室,山西 太原 030051)
目前JPEG解碼有兩種方式:硬件解碼和軟件解碼。硬件解碼是利用專門的芯片來完成對JPEG圖像數(shù)據(jù)的解碼;軟件解碼則是通過相應(yīng)的程序來完成對數(shù)據(jù)的還原。由于軟件解碼需要大量的浮點運算,因此目前大多采用ARM或DSP來實現(xiàn)[1],但是此類方法電路設(shè)計復(fù)雜,且并行處理能力較差,基于此,筆者提出了一種基于NiosII多核處理器的JPEG解碼的方法,本設(shè)計在Altera Cyclone II EP2C35F672C8芯片上實現(xiàn)多軟核系統(tǒng),利用FPGA芯片的并行處理結(jié)構(gòu)以及兩個Nios II軟核處理器間的并行處理和協(xié)作,來完成JPEG的解碼過程,并通過加入自定義模塊來提高系統(tǒng)性能。
NiosII多軟核系統(tǒng)分為兩種:獨立多軟核與資源共享型多軟核。獨立多軟核處理器之間是完全獨立的,各個處理器之間完全沒有通信,所以在提高系統(tǒng)性能方面很有限[2]。本設(shè)計采用的是資源共享型多軟核,處理器間通過共享資源來實現(xiàn)信息交互,形成一個完整的系統(tǒng)。
本系統(tǒng)有兩個NiosII軟核處理器,每個處理器都有獨立的定時器和片上RAM指令存儲器。定時器用作系統(tǒng)看門狗,可有效地防止處理器進入異?;蛩姥h(huán)。每個NiosII處理器的啟動程序和任務(wù)程序都存放在指令存儲器中,因為實現(xiàn)并行處理時,每個CPU核不一定執(zhí)行相同的功能,所以,每個處理器必須具有獨立的指令存儲器。雙核NiosII處理器系統(tǒng)中,必須要把其中一個處理器設(shè)置為主CPU來負(fù)責(zé)控制和調(diào)度整個系統(tǒng),以及FPGA與上位機之間的數(shù)據(jù)傳輸,在本系統(tǒng)中,設(shè)置CPU1作為主要的處理器。因此,處理器CPU1配置有PIO接口和JTAG-UART接口,JTAG-UART接口將用于整個系統(tǒng)的調(diào)試。UART接口(RS-232)被配置在CPU2用于在應(yīng)用軟件程序調(diào)試時監(jiān)測CPU2的狀態(tài)。另外,為了處理尺寸較大的圖片,需要有片外存儲器的支持,因此本設(shè)計中配置了一片SDRAM存儲器,通過SDRAM控制器與Avalon總線相連。NiosII雙核處理器系統(tǒng)的結(jié)構(gòu)框圖如圖1所示。
為了實現(xiàn)兩個處理器對應(yīng)用程序任務(wù)的并行處理,系統(tǒng)必須為兩個處理器提供有效的共享機制來處理數(shù)據(jù)和進程信息。在本系統(tǒng)的設(shè)計中,系統(tǒng)配置提供了兩種存儲器的共享[3]。一個小型的共享存儲體(Process Message Memory)可用于傳輸一些簡單的進程信號,其目的是溝通處理器之間的狀態(tài)。一個共享的片上RAM存儲器(JPEG Data Memory)連接到兩個處理器以提供處理數(shù)據(jù)的共享。本系統(tǒng)由兩個NiosII軟核處理器組成,它們集成構(gòu)成一個硬件處理系統(tǒng),因此,本系統(tǒng)只需要一個系統(tǒng)ID號。當(dāng)兩個處理器核共享片上數(shù)據(jù)存儲器,兩個處理器都會對此存儲器執(zhí)行讀取和寫入操作,這構(gòu)成一個關(guān)鍵的問題是如何在確保系統(tǒng)正確地執(zhí)行讀寫操作的同時存儲器中的數(shù)據(jù)不會被損壞。為此硬件Mutex核被嵌入本雙核處理器系統(tǒng)。Mutex的意義是“相互排斥”,硬件Mutex核正是執(zhí)行了這樣的任務(wù)。Mutex核使得系統(tǒng)中兩個處理器同時只能有一個來訪問共享存儲器。這在多個Avalon總線設(shè)備嘗試同時存取存儲器時,對保護共享存儲器的數(shù)據(jù)是非常有用的。Mutex核作為共享資源提供一個“測試和設(shè)置”操作。如果處理器核測試到Mutex是可用的,那么它將在一個操作中占用Mutex。處理器完成對存儲器的操作后就釋放此Mutex。應(yīng)用程序通過調(diào)用Mutex硬核的API函數(shù)來實現(xiàn)對共享存儲器的互斥訪問。若不使用硬件Mutex核,這種功能通常需要兩個單獨的“測試”和“設(shè)定”指令來完成。而在此“設(shè)定”指令完成之前,另一個處理器也會“測試”共享資源的可利用性。有時會使兩個處理器認(rèn)為它們都成功地占有了共享資源,從而造成共享數(shù)據(jù)的破壞。
圖1 NiosII雙核處理器系統(tǒng)的結(jié)構(gòu)框圖
圖2是基于反離散余弦變換的JPEG解碼過程框圖,本雙核JPEG解碼處理系統(tǒng)是針對JFIF格式的,首先讀入JFIF的頭文件,頭文件中有一系列相應(yīng)的標(biāo)記對應(yīng)于存儲JFIF文件的結(jié)構(gòu)體信息,如圖像的尺寸,量化表和霍夫曼表,水平/垂直采樣因子等[4]。熵編碼是基于二叉樹形成霍夫曼表壓縮存儲的數(shù)據(jù),它使用霍夫曼表恢復(fù)壓縮的圖像數(shù)據(jù)為1直流分量和63交流分量數(shù)據(jù),這些數(shù)據(jù)代表了圖像像素的色彩構(gòu)成編碼。反量化操作利用量化表對量化值進行譯碼,它利用系數(shù)矩陣為放置在8×8數(shù)據(jù)塊中的相應(yīng)位置的64個色彩分量生成乘積矩陣。JPEG文件里一般含一個亮度分量的量化表和一個色度分量的量化表,反量化就是對熵解碼出來的系數(shù)矩陣乘上相應(yīng)的量化矩陣,得出相應(yīng)的色度和亮度矩陣。反離散余弦變換(IDCT)是將色彩矩陣由頻域空間轉(zhuǎn)換到時域空間,并且在執(zhí)行完反離散余弦變換之后,在時域空間中的矩陣仍然是8×8的數(shù)據(jù)塊[5]。最后,為了顯示在屏幕上,圖像必須以RGB的編碼模式出現(xiàn),因此,JPEG解碼的最后一步是把色彩的表現(xiàn)形式從YUV模式轉(zhuǎn)換到RGB模式。
圖2 JPEG解碼過程框圖
圖3是雙核系統(tǒng)的并行處理過程框圖,其中虛線框表示CPU1的處理過程,實線框表示CPU2的處理過程。由圖3可知,第一步兩個處理器分別加載量化表和霍夫曼表。對于彩色圖像,它至少有兩個量化表和兩個霍夫曼表對應(yīng)于Y亮度分量和UV色度分量。當(dāng)數(shù)據(jù)加載完成后,CPU1作為主處理器將在量化表編號,霍夫曼表編號和YUV色彩分量之間完成關(guān)系映射。在第二步中,該系統(tǒng)將實現(xiàn)解碼過程。它是基于每個8×8的數(shù)據(jù)塊,每個處理器核執(zhí)行基于離散余弦變換的解碼過程,具體步驟如下:1)熵解碼。依據(jù)霍夫曼表恢復(fù)1個直流分量和63個交流分量,然后形成8×8的色彩分量矩陣。2)反量化。它利用量化表來實現(xiàn)反量化表操作?;诖瞬僮?,每個色彩分量的值被恢復(fù)出來。3)反離散余弦變換。這一操作將色彩矩陣中的色彩分量從頻域空間轉(zhuǎn)換到時域空間。兩個NiosII處理器核以并行處理的方式,并以8×8的數(shù)據(jù)塊為單位,執(zhí)行上述三項操作。這里應(yīng)該注意的是,由于對每個8×8的數(shù)據(jù)塊的霍夫曼表長度都是改變的,所以在霍夫曼表中不能預(yù)測下一個8×8數(shù)據(jù)塊的起始位置,因此,CPU2只有在CPU1完成前面一個數(shù)據(jù)塊的熵解碼之后,才能夠開始執(zhí)行熵解碼操作。第三步的主要任務(wù)是把色彩分量的編碼方式由YVU轉(zhuǎn)換到RGB。CPU1將從存儲數(shù)據(jù)的起始開始執(zhí)行,CPU2從存儲數(shù)據(jù)的尾部開始執(zhí)行。這樣,這兩個NiosII處理器就可以并行工作。重構(gòu)后的解碼數(shù)據(jù)由主處理器CPU1通過RS-232傳輸給主控計算機。
圖3 雙核處理器并行處理過程框圖
由于YUV到RGB轉(zhuǎn)換對每個像素每次都執(zhí)行對存儲器的讀寫操作,這部分轉(zhuǎn)換操作約占總解碼時間的30%,這樣對存儲器的存取操作顯然會引起明顯的功耗增加?;诖?,筆者提出了一種在系統(tǒng)中集成自定義模塊來定向處理YUV到RGB轉(zhuǎn)換的方法,該方法利用HDL語言來編寫模塊的功能,經(jīng)過編譯、仿真、驗證和測試后,能夠生成相應(yīng)的功能模塊,將此模塊集成到NiosII雙核處理器系統(tǒng)中,來實現(xiàn)執(zhí)行相關(guān)硬件的功能[6]。這樣由YUV到RGB轉(zhuǎn)換操作就由特定的硬件模塊來執(zhí)行,不同于全部的運算都依賴于NiosII處理器,自定義功能模塊有效減少處理器核的工作量,整個系統(tǒng)的運算速度也有明顯提高。表1是幾種不同尺寸的圖像在有自定義模塊的系統(tǒng)和無自定義模塊系統(tǒng)中性能提升的比較表,表中每個系統(tǒng)都以50 MHz的時鐘頻率運行,通過記錄兩個系統(tǒng)實際執(zhí)行解碼任務(wù)的時鐘周期數(shù),就可得出處理器系統(tǒng)性的對比結(jié)果,由表1可知NiosII雙核系統(tǒng)集成了YUV到RGB自定義模塊后,系統(tǒng)的性能大約提高了15%,比普通單核系統(tǒng)處理速度提高了大約40%。
筆者以NiosII雙核處理器為平臺,實現(xiàn)了JPEG解碼的并行處理,并且利用可編程片上系統(tǒng)(SoPC)的特點設(shè)計了JPEG解碼中YUV到RGB轉(zhuǎn)換的自定義功能模塊,并成功將此模塊集成入NiosII處理器系統(tǒng)中,縮短了解碼過程的時間,并在很大程度上提高了整個系統(tǒng)的性能。設(shè)計中充分發(fā)揮了SoPC技術(shù)的優(yōu)勢,可以預(yù)測,基于NiosII的多核處理器系統(tǒng)必將具有良好的應(yīng)用前景。
表1 NiosII雙核系統(tǒng)性能提升表
[1]YIN Ruixiang,SIU Wanchi.A new fast algorithm for computingprime-length DCT through cyclic convolutions[J].signal proce-ssing,2001,81(5):896-906.
[2]沈勝慶.嵌入式操作系統(tǒng)的內(nèi)核研究[J].微計算機信息,2006(2):72-74.
[3]RAVINDRAN K, SATISH N, JIN Yujia, et al.An FPGA-based soft multiprocessor system for IPv4 packet forwarding[J].Field Programmable Logic and Applications,2005(8):487-492.
[4]位娜,卞春江,胡鈦.基于SOPC的通用圖像處理系統(tǒng)設(shè)計[J].微計算機信息,2009(6):290-291.
[5]張春田,蘇育挺,張靜.數(shù)字圖像壓縮編碼[M].北京:清華大學(xué)出版社,2006:1.
[6]蔡偉綱.Nios II軟件架構(gòu)解析[M].西安:西安電子科技大學(xué)出版社,2007:11.
[7]楊金元.嵌入式操作系統(tǒng)實時內(nèi)核分析[J].電視技術(shù),2003,27(7):53-55.