Motion JPEG視頻壓縮IP核的設(shè)計與實現(xiàn)
2.4熵編碼模塊
本文引用地址:http://2s4d.com/article/84771.htm熵編碼與前面介紹的量化都是數(shù)據(jù)壓縮的手段,但二者有所不同,熵編碼利用信號的統(tǒng)計特征來降低位率,理論上不會丟失信息,量化會丟失信息。實現(xiàn)熵編碼有多種方式,本文根據(jù)ISO/IEC10918協(xié)議,使用了游程編碼和霍夫曼編碼兩種方式。游程編碼的原理是把沿一定方向排列的等大小量化值的離散余弦變換系數(shù)作為連續(xù)的整體,用特定碼字替代這種連續(xù)的整體就會達到數(shù)據(jù)量減少的效果?;舴蚵幋a是一種變長編碼,將多次出現(xiàn)的代碼用較短的碼字代表,很少出現(xiàn)的代碼用較長的碼字代表。產(chǎn)生哈夫曼編碼要求掃描兩遍原始數(shù)據(jù),第一遍掃描是為了在原始數(shù)據(jù)中精確地統(tǒng)計每個值出現(xiàn)的頻率,第二遍利用構(gòu)造的哈夫曼樹得到編碼,兩次掃描耗時巨大,因此數(shù)據(jù)壓縮難以滿足實時性要求。ISO/IEC10918協(xié)議中在對大量8位精度圖像的平均統(tǒng)計基礎(chǔ)上,給出了4個合適大多數(shù)應(yīng)用的個哈夫曼碼表。在實現(xiàn)硬件電路時把哈夫曼碼表存儲在片上ROM中,使用時直接查找。因為離散余弦變換中直流系數(shù)和交流系數(shù)分別使用不同的碼表,且直流系數(shù)不需要進行游程編碼,所以直流系數(shù)和交流系數(shù)使用不同的模塊來處理。
2.4.1直流系數(shù)處理模塊
直流系數(shù)是8×8矩陣內(nèi)64個像素均值的度量,是包含了整個圖像能量的重要部分。利用相鄰的8×8矩陣的直流系數(shù)具有很強的相關(guān)性,對直流系數(shù)使用差分壓縮編碼。前一個8×8矩陣的直流系數(shù)作為當(dāng)前矩陣的直流系數(shù)的預(yù)測值,求出現(xiàn)實值和預(yù)測值之間的差值后,再對差值做霍夫曼編碼。在硬件實現(xiàn)時,直流系數(shù)只有一個值,所以不需要做游程編碼,對其處理的第一步就是求得其與預(yù)測值之間的差值。根據(jù)差值的大小和正負查找存儲在片上ROM的標(biāo)準(zhǔn)霍夫曼碼表,得出前綴代碼和前綴代碼長度,同時根據(jù)ISO/IEC10918協(xié)議中提出的尾碼產(chǎn)生方式得到對應(yīng)的尾碼代碼及尾碼代碼長度。上述處理完成之后再經(jīng)過合并前綴代碼與尾碼代碼為霍夫曼代碼,則直流系數(shù)的熵編碼完成,之后等待被變長編碼模塊封裝。具體的實現(xiàn)電路由4階流水線組成,直流系數(shù)的熵編碼處理過程耗時4個時鐘周期。
2.4.2交流系數(shù)處理模塊
交流系數(shù)首先要現(xiàn)經(jīng)過游程編碼處理。在游程編碼中非零交流系數(shù)前的零交流系數(shù)的個數(shù)是游程長度,前綴代碼及尾碼代碼的含義與直流系數(shù)中的一致,只不過在交流系數(shù)處理中游程長度和前綴代碼重新組合為一個新的查找索引來查找新的前綴代碼。ISO/IEC10918協(xié)議中給出的交流系數(shù)標(biāo)準(zhǔn)霍夫曼碼表里有兩個特殊的代碼。一個特殊代碼ZRL,ZRL代表游程編碼中游程長度大于16,如果游程長度大于32,48,56,分別用1個ZRL,2個ZRL,3個ZRL表示,盈余的游程長度加入下一個游程長度計算中。ZRL代碼只有前綴代碼,沒有尾碼代碼。為了方便實現(xiàn),直接把ZRL的尾碼代碼長度設(shè)為零,起到屏蔽尾碼的作用。另一個特殊代碼EOB,EOB代表最后一個零行程中只有零元素直接代表當(dāng)前矩陣的游程編碼已經(jīng)掃描結(jié)束,若當(dāng)前矩陣的最后一個交流系數(shù)是非零數(shù)的則以正常結(jié)束一個游程長度的計數(shù)作為當(dāng)前矩陣游程編碼的結(jié)束。同ZRL類似,EOB也沒有尾碼代碼,所以使用同樣的處理手段。具體的實現(xiàn)電路由4階流水線組成,交流系數(shù)的熵編碼處理耗時4個時鐘周期。
2.4.3交織模塊和冗余ZRL消除模塊
交織模塊的作用是把前綴代碼和尾碼代碼合并為一個霍夫曼代碼,合并后的代碼易于進行下一階段的變長編碼操作,變長編碼操作過程需要的移位位數(shù)由前綴代碼長度加上尾碼代碼長度做和得到,這個求和過程也在交織模塊中實現(xiàn)。該模塊具體實現(xiàn)電路由2階流水線組成。
冗余ZRL消除模塊不是ISO/IEC10918協(xié)議的一部分,但它源于標(biāo)準(zhǔn)協(xié)議里對EOB的定義。從EOB之前直到最近一個的非零交流系數(shù)出現(xiàn),中間產(chǎn)生的ZRL都是可以消除的?;谌魉€結(jié)構(gòu)的電路設(shè)計一般很難滿足這一要求,原因是全流水線結(jié)構(gòu)的電路每級產(chǎn)生的結(jié)果都會直接傳遞給下一級,不對結(jié)果作保留。唯一的方法就是構(gòu)造一個同步FIFO來緩存前幾個時鐘周期內(nèi)產(chǎn)生的結(jié)果,根據(jù)之前輸入的數(shù)據(jù)量和當(dāng)前輸入的數(shù)據(jù)量是否滿足ZRL的冗余條件而選擇性的對FIFO輸出的結(jié)果做屏蔽。屏蔽的手段就是把FIFO輸出數(shù)據(jù)的對應(yīng)的霍夫曼代碼長度清零。這樣在下一步的變長編碼中會因ZRL的霍夫曼代碼長度為零而消除冗余的ZRL。
2.4.4變長編碼模塊
變長編碼的作用是把交織編碼輸出的含有不等長有效位的霍夫曼碼字,提取其中的有效位并將其組合為一個連續(xù)的32位碼流。
編碼原理是把交織編碼輸出的含有不等長有效位的霍夫曼碼字向右位,移動的位數(shù)是前一個霍夫曼碼字的代碼長度。移位完成后的當(dāng)前霍夫曼碼字與提供移動的位數(shù)的前一個霍夫曼碼字做或運算,同時累加兩個霍夫曼碼字的代碼長度。 累加和大于24時表明變長編碼的第一步完成。第二步是檢查前一步產(chǎn)生的24位封裝結(jié)果中是否有FF字節(jié),若有則直接在FF字節(jié)后面添加00字節(jié)。并不是所有的24位封裝結(jié)果都需要在FF字節(jié)后面添加00字節(jié),所以在第二步處理中還有移位處理。移位處理采用的方法與第一步移位處理的方法相同的,把24位封裝結(jié)果和添加00字節(jié)后的32位封裝結(jié)果,統(tǒng)一封裝為32位結(jié)果輸出。這個32位數(shù)據(jù)也是整個IP核輸出的最終壓縮結(jié)果。
3.基于SOPC結(jié)構(gòu)的實際驗證系統(tǒng)
經(jīng)驗證,Motion JPEG IP核可以實時處理由NTSC制式攝像頭采集經(jīng)ADV7181處理后輸出的CCIR656標(biāo)準(zhǔn)數(shù)據(jù),完成對連續(xù)視頻幀的實時壓縮。
驗證系統(tǒng)結(jié)構(gòu)如圖15所示,lineswitcher模塊把CCIR656標(biāo)準(zhǔn)數(shù)據(jù)的亮度分量以跳址寫入的方式通過Multi-Port SDRAM Controller模塊寫入到SDRAM中,亮度分量數(shù)據(jù)從隔行掃描變?yōu)橹鹦写尜A。Multi-Port SDRAM Controller模塊是一個工業(yè)級的SDRAM控制器,可以將一個SDRAM數(shù)據(jù)端口仿真成四個虛擬的數(shù)據(jù)端口(兩個寫端口+兩個讀端口)。 SDRAM在存儲空間使用上劃分為4個區(qū)塊,在lineswitcher模塊寫入一個區(qū)塊的同時,Motion JPEG IP核讀出前一個已寫入亮度分量的區(qū)塊。Motion JPEG IP核輸出端是一個Avalon總線上的具有流控制屬性從端口。DMA控制器與Motion JPEG IP核以流控制的方式進行數(shù)據(jù)傳輸,并把數(shù)據(jù)轉(zhuǎn)移到SRAM中。整個過程無需NIOSII處理器干預(yù),只須等DMA控制器寫滿SRAM后以中斷的方式通知 NIOSII處理器以使其掛起Motion JPEG IP核,防止存入SRAM中數(shù)據(jù)被覆蓋。最后使用DE2_Control_Panel傳輸SRAM中壓縮后的數(shù)據(jù)到PC中,便可看到采集后圖像經(jīng)壓縮后的效果。NIOSII處理器的作用是初始化DMA控制器和通過I2C總線設(shè)置ADV7181。
考慮到芯片上的資源,驗證時只對ADV7181輸出的亮度分量進行壓縮,舍棄了色差分量。雖然沒有了色差分量,但是仍然可以得到清晰直觀的驗證效果。
4.結(jié)論
本設(shè)計主要有以下幾個特點。
1:以全流水線結(jié)構(gòu)來實現(xiàn)Motion JPEG視頻壓縮IP核。
雖然流水線技術(shù)已經(jīng)是一種眾所周知的技術(shù),但是現(xiàn)有的Motion JPEG視頻壓縮IP核仍未實現(xiàn)全部流水線結(jié)構(gòu),一般多以狀態(tài)控制模塊為核心來協(xié)調(diào)各個子模塊。這就導(dǎo)致系統(tǒng)中最慢的子模塊在處理數(shù)據(jù)時,其它子模塊只能等待,對數(shù)據(jù)塊訪問的效率低下。同時由于數(shù)據(jù)塊的被多個子模塊所使用而又需要復(fù)雜的仲裁機制。本文提出的全流水線結(jié)構(gòu)把整個處理過程分解為198個小操作,每個時鐘周期內(nèi)由一階流水線完成一個小操作。當(dāng)整個流水線鋪滿之后,整個數(shù)據(jù)處理過程中沒有等待延遲,沒有仲裁協(xié)議,大幅提高了系統(tǒng)的運行效率并降低了系統(tǒng)的復(fù)雜度。
2:并行矩陣轉(zhuǎn)置結(jié)構(gòu)的提出及基于并行矩陣轉(zhuǎn)置的并行二維離散余弦變換結(jié)構(gòu)。
并行矩陣轉(zhuǎn)置結(jié)構(gòu)較之以往的串行矩陣轉(zhuǎn)置在處理8×8矩陣上至少節(jié)省了100個時鐘周期。二維離散余弦變換在采用了并行矩陣轉(zhuǎn)置之后,也實現(xiàn)了全部并行處理,43個時鐘周期完成了一次二維離散余弦變換,效率提高顯著。
3:因采用全流水線結(jié)構(gòu)而取得的較高的運行頻率。
本文設(shè)計的Motion JPEG視頻壓縮IP核在Quartus II 6.0中進行靜態(tài)時序分析,得到的最高運行頻率是150Mhz。
現(xiàn)有IP核與本文設(shè)計的IP核的運行頻率比較
實際驗證時不僅對處理CCIR656標(biāo)準(zhǔn)數(shù)據(jù)的能力給予驗證,同時也為100Mhz的運行頻率進行了驗證,結(jié)果證明IP核可以在100Mhz的運行頻率下正常工作。驗證方法是把7幀952×568的亮度分量文件存入SDRAM中作為原始數(shù)據(jù),整個驗證系統(tǒng)以100Mhz頻率運行,經(jīng)過0.05秒完成7幀的壓縮,幀率可達147 frame/s。壓縮后圖像的大小為原來亮度圖像的十分之一。
4:可以在低成本,低功耗,高密度的CycloneII系列FPGA芯片上運行,通過Avalon總線與NIOSII處理器構(gòu)成SOPC系統(tǒng),為將來實際產(chǎn)品的設(shè)計搭建了一個良好的平臺。
參考文獻
【1】Weiping Li, A New Algorithm to Compute the DCT and its Inverse, IEEE TRANSATIONS ON SIGNAL, PROCESSING, VOL. 39. NO. 6, JUNE 1991
【2】Shaw-MinLei, Ming-Ti ngSun, An Entropy Coding System for Digital HDTV Applications, IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY, VOL. 1, NO.1, MARCH 1991
【3】ISO/IEC International Standard 10918-1. June 1992
【4】Altera Corporation. Quartus II Version 7.2 Handbook. October 2007
【5】Altera Corporation. Nios II Processor Reference Handbook. October 2007
【6】Altera Corporation. Nios II Software Developer's Handbook. October 2007
【7】Altera Corporation. Avalon Streaming InteRFace Specification. September 2007
【8】張志剛. FPGA與SOPC設(shè)計教程-DE2實踐. 西安: 西安電子科技大學(xué)出版社, 2007年4月.
【9】吳繼華,王誠. AlteraFPGA/CPLD設(shè)計(高級篇). 北京: 人民郵電出版社,2005年7月
【10】簡弘倫.精通VerilogHDL IC設(shè)計核心技術(shù)實例詳解.北京:電子工業(yè)出版社, 2005年10月.
評論