當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]Motion JPEG視頻壓縮IP核的設(shè)計(jì)與實(shí)現(xiàn)

引言

    隨著多媒體技術(shù)及通信技術(shù)的快速發(fā)展,在嵌入式平臺上實(shí)現(xiàn)連續(xù)圖像壓縮的需求已變得日益廣泛。常用的系統(tǒng)結(jié)構(gòu)是獨(dú)立處理器配和專用圖像壓縮芯片或者是只用一個(gè)高主頻的數(shù)字信號處理器完成主要功能。但隨著大規(guī)模集成電路技術(shù)的發(fā)展及市場對產(chǎn)品低成本的要求不斷提高,一種新的在嵌入式平臺上實(shí)現(xiàn)連續(xù)圖像壓縮的系統(tǒng)結(jié)構(gòu)正逐步成為上述兩種系統(tǒng)結(jié)構(gòu)的替代者。這種新的結(jié)構(gòu)就是Altera公司提出的基于Avalon總線的SOPC結(jié)構(gòu)。SOPC結(jié)構(gòu)可以把處理器,圖像壓縮IP核,通訊單元及控制單元集成到一塊FPGA芯片上。較之以往的結(jié)構(gòu),不但極大地節(jié)約了系統(tǒng)資源和成本,更是減少了系統(tǒng)的復(fù)雜度。尤其是可以用硬件電路實(shí)現(xiàn)軟件處理極為耗時(shí)的運(yùn)算功能,使得在低主頻,低功耗的嵌入式平臺上實(shí)現(xiàn)連續(xù)圖像實(shí)時(shí)壓縮變?yōu)榭赡?。連續(xù)圖像壓縮IP核也成為整個(gè)SOPC系統(tǒng)的一個(gè)關(guān)鍵部件。現(xiàn)有的MPEG系列,H26X系列IP核對FPGA的芯片資源及性能要求極高,難以滿足系統(tǒng)對低成本,低功耗的要求。所以設(shè)計(jì)一個(gè)適合低成本,低功耗的FPGA芯片的視頻壓縮IP核變得極為重要。這即要求壓縮算法的復(fù)雜度不能太高,又要求有適當(dāng)?shù)膲嚎s效果,Motion JPEG算法恰好滿足上述要求。

1.Motion JPEG壓縮算法簡介

    Motion JPEG是一種基于靜態(tài)圖像JPEG壓縮標(biāo)準(zhǔn)的動態(tài)圖像壓縮標(biāo)準(zhǔn),壓縮時(shí)將連續(xù)圖像的每一個(gè)幀視為一幅靜止圖像進(jìn)行壓縮,從而可以生成序列化運(yùn)動圖像。壓縮時(shí)不對幀間的時(shí)間冗余進(jìn)行壓縮,雖然降低了壓縮比,但也同時(shí)降低了復(fù)雜度,易于硬件電路實(shí)現(xiàn)。Motion JPEG標(biāo)準(zhǔn)所根據(jù)的算法是基于離散余弦變換和熵編碼,關(guān)鍵技術(shù)有二維離散余弦變換、量化、差分編碼、霍夫曼編碼和游程編碼等。單幀的處理過程如下圖所示。

 


2.IP核的結(jié)構(gòu)設(shè)計(jì)

2.1二維離散余弦變換模塊
    二維離散余弦變換是由一維離散余弦變換衍生而來的,所以可以用兩個(gè)級聯(lián)的一維離散余弦變換實(shí)現(xiàn)。實(shí)現(xiàn)時(shí)要注意第一級一維離散余弦變換模塊產(chǎn)生的結(jié)果不能直接作為第二級一維離散余弦變換模塊的輸入量,而是等到第一級一維離散余弦變換模塊產(chǎn)生的結(jié)果形成一個(gè)8×8的矩陣后,對這個(gè)8×8的矩陣做轉(zhuǎn)置處理,再把轉(zhuǎn)置后得到的矩陣按行掃描的順序輸出,這時(shí)輸出的數(shù)據(jù)才能作為第二級一維離散余弦變換模塊的輸入量。
    二維離散余弦變換模塊處理的對象是8×8的像素矩陣,來自其前一級模塊預(yù)處理模塊。預(yù)處理模塊一個(gè)時(shí)鐘周期只能輸出一個(gè)數(shù)據(jù),為了滿足二維離散余弦變換模塊中第一級一維離散余弦變換模塊一次運(yùn)算需要8個(gè)輸入數(shù)據(jù)的要求,利用一個(gè)串行轉(zhuǎn)并行模塊,把每個(gè)時(shí)鐘周期內(nèi)預(yù)處理模塊輸出的一個(gè)數(shù)據(jù)緩存起來,當(dāng)數(shù)據(jù)湊滿8個(gè)后再一次傳給二維離散余弦變換模塊。
二維離散余弦變換模塊輸出的數(shù)據(jù)是8×8的二維離散余弦系數(shù)矩陣,傳遞給其后一級模塊量化模塊。量化模塊一個(gè)時(shí)鐘周期只能接收一個(gè)數(shù)據(jù),為了滿足二維離散余弦變換模塊中第二級一維離散余弦變換模塊一次運(yùn)算產(chǎn)生8個(gè)輸出數(shù)據(jù)的條件,使用一個(gè)并行轉(zhuǎn)串行模塊,把每隔8個(gè)時(shí)鐘周期二維離散余弦變換模塊輸出一次的8個(gè)數(shù)據(jù)緩存起來,在等待下一次二維離散余弦變換模塊輸出數(shù)據(jù)的8個(gè)時(shí)鐘周期的等待隔內(nèi),把數(shù)據(jù)串行傳給量化模塊。

2.1.1第一級一維離散余弦變換模塊
    根據(jù)一維離散余弦變換的定義和cos函數(shù)的互補(bǔ)對稱性,參考Weiping Li提出的Skew Circular Convolution的概念,能夠使一維離散余弦變換達(dá)到非常精簡的硬件架構(gòu)。但是考慮到處理的對像是連續(xù)幀這個(gè)條件,速度就成為主要因素,因此沒有完全依照其提出的方法,而是適當(dāng)?shù)脑黾与娐访娣e來夠造新的11階全流水線結(jié)構(gòu),從而獲得最大的運(yùn)算速度。處理過程可劃分為4個(gè)階段。

   階段1:消耗3個(gè)時(shí)鐘周期,完成8位有符號數(shù)的加減運(yùn)算,結(jié)果為9位有符號數(shù)。
   階段2:消耗2個(gè)時(shí)鐘周期,完成9位有符號數(shù)的固定系數(shù)乘法,因?yàn)槌说南禂?shù)是小數(shù),所以要把小數(shù)轉(zhuǎn)換為二進(jìn)制表示。

   階段2中的乘法操作是用EP2C35芯片中的28個(gè)嵌入式乘法單元實(shí)現(xiàn)的。EP2C35芯片中共有70個(gè)嵌入式乘法單元,一個(gè)嵌入式乘法單元可以實(shí)現(xiàn)兩個(gè)9位數(shù)的乘法,兩個(gè)嵌入式乘法單元并聯(lián)可以實(shí)現(xiàn)兩個(gè)大于9位小于18位數(shù)的乘法。根據(jù)這一特性,假如在階段1中實(shí)現(xiàn)乘法會因輸入量是8位而浪費(fèi)了一個(gè)嵌入式乘法單元的全部能力,假如在階段3或階段4中實(shí)現(xiàn)乘法又會因輸入量或系數(shù)中每個(gè)元素的長度大于9位而耗用兩個(gè)嵌入式乘法單元去完成一個(gè)乘法操作,又很不經(jīng)濟(jì)。所以在階段2中實(shí)現(xiàn)乘法操作是最為合理的,階段2的輸入量為9位,恰好耗用一個(gè)個(gè)嵌入式乘法單元。這也同時(shí)要求乘法中的固定系數(shù)的位數(shù)為9位,位數(shù)的過多或過少都不能充分利用芯片上的硬件資源。
    階段3:消耗3個(gè)時(shí)鐘周期完成9位有符號數(shù)的加減運(yùn)算,結(jié)果為9位有符號數(shù)。一般的9位有符號數(shù)的加減的結(jié)果應(yīng)該用10位有符號數(shù)來表示,因?yàn)檫M(jìn)位操作或借位操作導(dǎo)致結(jié)果的位數(shù)從9位增長到10位。但是階段3的輸入序列是由9位有符號數(shù)乘以固定系數(shù)得到的,且固定系數(shù)的值都小于0.5,所以序列之間的加減操作不會引起進(jìn)位操作或借位操作,9位有符號數(shù)足夠表示加減操作的結(jié)果序列。
    階段4:消耗3個(gè)時(shí)鐘周期完成9位有符號數(shù)的加減運(yùn)算,結(jié)果為10位有符號數(shù),也是第一級一維離散余弦變換的最終結(jié)果。


2.1.2并行矩陣轉(zhuǎn)置模塊
    常用的8×8矩陣轉(zhuǎn)置的方法是,先把64個(gè)矩陣元素按行掃描的順序一個(gè)個(gè)串行輸入到一個(gè)RAM(64個(gè)存儲空間)中,然后按轉(zhuǎn)置后的矩陣的行掃描順序把RAM中64個(gè)矩陣元素逐次輸出。這種方法最少需要128時(shí)鐘周期才能完成一個(gè)8×8矩陣的轉(zhuǎn)置。可稱其為串行矩陣轉(zhuǎn)置。串行矩陣轉(zhuǎn)置一次接收一個(gè)輸入數(shù)據(jù)與一維離散余弦變換一次產(chǎn)生8個(gè)輸入數(shù)據(jù)在傳輸速率上不匹配,第一級一維離散余弦變換模塊需要在串行矩陣轉(zhuǎn)置工作期間等待,當(dāng)串行矩陣轉(zhuǎn)置完成后再產(chǎn)生新的一維離散余弦變換系數(shù)并傳遞給串行矩陣轉(zhuǎn)置模塊。這也是二維離散余弦變換難以設(shè)計(jì)為全并行的原因。
    本文提出了一種新的矩陣轉(zhuǎn)置方法,稱為其并行矩陣轉(zhuǎn)置。用8個(gè)RAM(每個(gè)RAM有8個(gè)存儲空間)代替一個(gè)RAM(有64個(gè)存儲空間),再增加兩個(gè)8通道的旋轉(zhuǎn)多路器,同時(shí)配合對8個(gè)RAM的變址讀操作。一次輸入原始矩陣的一列,20個(gè)周期后完成一個(gè)8×8矩陣的轉(zhuǎn)置。比串行矩陣轉(zhuǎn)置節(jié)省至少100個(gè)時(shí)鐘周期。
    并行矩陣轉(zhuǎn)置模塊的寫操作:每個(gè)時(shí)鐘周期變換一次RAM_BANK的接入順序,每個(gè)RAM_BANK每次寫入地址隨時(shí)鐘周期而順序遞增從,0增加到7,每次增加1。

 

 


    并行矩陣轉(zhuǎn)置模塊的讀操作:每個(gè)時(shí)鐘周期變換一次RAM_BANK的輸出順序,每個(gè)RAM_BANK每次讀出地址隨時(shí)鐘周期而變化,且同一時(shí)鐘周期內(nèi)不同的RAM_BANK有不同的讀出地址。

 

    


    在實(shí)際設(shè)計(jì)時(shí),通過接入旋轉(zhuǎn)多路器實(shí)現(xiàn)每個(gè)時(shí)鐘周期改變第一級一維離散余弦變換輸出端與RAM_BANK的接入順序,通過輸出旋轉(zhuǎn)多路器實(shí)現(xiàn)每個(gè)時(shí)鐘周期改變一次RAM_BANK與第二級一維離散余弦變換輸入端的接入順序。這兩個(gè)旋轉(zhuǎn)多路器,都是以8個(gè)時(shí)鐘周期為1個(gè)旋轉(zhuǎn)周期,在1個(gè)旋轉(zhuǎn)周期內(nèi)實(shí)現(xiàn)8個(gè)通道的旋轉(zhuǎn)接通。每個(gè)RAM_BANK的讀寫地址都依靠同一個(gè)地址產(chǎn)生器產(chǎn)生,在一個(gè)時(shí)鐘周期內(nèi)所有RAM_BANK的寫地址相同,讀地址不同。
    在設(shè)計(jì)具體的硬件電路時(shí),一個(gè)RAM_BANK就是一個(gè)雙端口RAM,為提高工作效率,每個(gè)RAM_BANK實(shí)際含有32個(gè)存儲單元而不是理論上的8個(gè)存儲單元。這樣一個(gè)RAM_BANK就可以分為4個(gè)區(qū)塊,每個(gè)區(qū)塊8個(gè)存儲單元,在寫入一個(gè)區(qū)塊的同時(shí)可以讀出前一個(gè)已經(jīng)寫入數(shù)據(jù)的區(qū)塊,形成一種乒乓緩沖的結(jié)構(gòu),用電路面積換取運(yùn)行效率。整個(gè)矩陣轉(zhuǎn)置模塊是一個(gè)13階的流水線結(jié)構(gòu),每階流水耗用一個(gè)時(shí)鐘周期。

 


    圖5是并行矩陣轉(zhuǎn)置模塊在ModelSim仿真軟件中的時(shí)序仿真結(jié)果,仿真的時(shí)鐘頻率設(shè)定為100Mhz。從輸入數(shù)據(jù)到開始得到結(jié)果,中間間隔了13個(gè)時(shí)鐘周期。

2.1.3第二級一維離散余弦變換模塊
    第二級一維離散余弦變換模塊在計(jì)算結(jié)構(gòu)上與第一級一維離散余弦變換模塊一樣也分為4個(gè)階段,完成一次運(yùn)算耗用13個(gè)時(shí)鐘周期,每個(gè)時(shí)鐘周期完成一個(gè)流水線操作,實(shí)際的電路結(jié)構(gòu)是13階的流水線結(jié)構(gòu)。
    階段1:消耗3個(gè)時(shí)鐘周期,完成10位有符號數(shù)的加減運(yùn)算,結(jié)果為11位有符號數(shù)。
    階段2:消耗4個(gè)時(shí)鐘周期,完成11位有符號數(shù)的固定系數(shù)乘法。
    這個(gè)階段與第一級一維離散余弦變換模塊的有所不同,沒有使用嵌入式乘法單元,因?yàn)橥瓿梢粋€(gè)11位有符號數(shù)的固定系數(shù)乘法需要2個(gè)嵌入式乘法單元并聯(lián),完成整個(gè)階段28個(gè)乘法操作需要56個(gè)嵌入式乘法單元,這占整個(gè)芯片嵌入式乘法單元的80%。一個(gè)模塊過多的耗用嵌入式乘法單元會造成Cyclone II芯片在布局布線時(shí)跨越區(qū)域過大,從而導(dǎo)致布線延時(shí)過大。
    第二級一維離散余弦變換模塊在這個(gè)階段中采用Altera的Mega function中的PARALLEL_ADD模塊實(shí)現(xiàn)固定系數(shù)乘法操作。PARALLEL_ADD模塊可以在4個(gè)時(shí)鐘周期內(nèi)完成8個(gè)16位有符號數(shù)的加法操作。11位有符號數(shù)的乘法轉(zhuǎn)化為8個(gè)以內(nèi)的11位有符號數(shù)的加法。固定系數(shù)都小于0.5,所以PARALLEL_ADD模塊的結(jié)果可取11位。上述方法可理解為用并行加法來實(shí)現(xiàn)了一個(gè)簡單的陣列乘法器。
    這種用并行加法來實(shí)現(xiàn)了一個(gè)簡單的陣列乘法,在不使用嵌入式乘法單元的條件下,是一種實(shí)現(xiàn)固定系數(shù)乘法的合理選擇。在后來的驗(yàn)證中也證明,除了在計(jì)算過程比嵌入式乘法單元多兩個(gè)時(shí)鐘周期,電路面積有所增加以外,其計(jì)算精度和運(yùn)行速度都基本與嵌入式乘法單元相同。運(yùn)算過程中比使用嵌入式乘法單元多出的多兩個(gè)時(shí)鐘周期也會因?yàn)檎麄€(gè)二維離散余弦變換是全流水結(jié)構(gòu)而只增加了流水線的鋪滿時(shí)間,流水線一旦鋪滿后,這個(gè)兩個(gè)時(shí)鐘周期的延遲對運(yùn)算延遲的影響將不再存在。
    階段3:消耗3個(gè)時(shí)鐘周期,完成11位有符號數(shù)的加減法操作,結(jié)果仍為11位有符號數(shù)。結(jié)果仍為11位有符號數(shù)而不是12位有符號數(shù)的原因在第一級一維離散余弦變換模塊的階段3中已說明。
    階段4:消耗3個(gè)時(shí)鐘周期完成11位有符號數(shù)的加減運(yùn)算,結(jié)果為12位有符號數(shù),也是二維離散余弦變換的最終結(jié)果。


2.1.4并行全流水結(jié)構(gòu)的二維離散余弦變換模塊
    在不考慮二維離散余弦變換中輸入數(shù)據(jù)的串行轉(zhuǎn)為并行,輸出數(shù)據(jù)的并行轉(zhuǎn)為串行的條件下。即假設(shè)二維離散余弦變換模塊的前一級模塊可以在每一個(gè)時(shí)鐘周期內(nèi)為其提供64位數(shù)據(jù),二維離散余弦變換模塊的后一級模塊可以在每一個(gè)時(shí)鐘周期內(nèi)接受其產(chǎn)生的96位數(shù)據(jù)。這時(shí)本文提出的并行全流水線結(jié)構(gòu)的二維離散余弦變換模塊只需要43個(gè)時(shí)鐘周期就可以完成一個(gè)8×8矩陣的二維離散余弦變換。
    圖6及圖7是該模塊在ModelSim仿真軟件中的時(shí)序仿真結(jié)果,仿真的時(shí)鐘頻率設(shè)定為100Mhz,43個(gè)時(shí)鐘周期完成一次8×8二維離散余弦變換。

 

 

 

 

    相同數(shù)據(jù)在Matlab中二維離散余弦變換結(jié)果見圖8。

 

 

 


    二者差值的分析:本文提出的二維離散余弦變換模塊在對小數(shù)乘法結(jié)果的處理上采取了截尾方式,沒有保留小數(shù)參加后續(xù)的運(yùn)算。這與Matlab中64位的浮點(diǎn)運(yùn)算的運(yùn)算結(jié)果相比在變換系數(shù)中的直流系數(shù)上和第1個(gè)交流系數(shù)上相差的數(shù)值為8,其它系數(shù)可以認(rèn)為是近似相同的。
    對小數(shù)乘法結(jié)果的處理采取截尾方式的原因有兩點(diǎn):
    1:保留小數(shù)位數(shù)過多會導(dǎo)致在后續(xù)的計(jì)算中輸入數(shù)據(jù)位數(shù)過長,特別是對于全8路并行結(jié)構(gòu)更易產(chǎn)生數(shù)據(jù)偏移或時(shí)鐘偏移,同時(shí)也會降低模塊的運(yùn)行頻率。
    2:考慮到后續(xù)的量化模塊,采用標(biāo)準(zhǔn)的量化表時(shí)直流系數(shù)的量化步長為16是差值8的2倍,而且量化過程中有對量化結(jié)果四舍五入的處理。所以差值8會在量化過程中基本被消除。這一點(diǎn)在后面的實(shí)際圖像測試中得到了映證,壓縮后的圖像在視覺上與原始圖像一致。

2.2量化模塊
    量化過程就是每個(gè)離散余弦變換系數(shù)除以各自的量化步長并對結(jié)果取整的過程。取整采用的是四舍五入的方式。
為了方便在FPGA中實(shí)現(xiàn),離散余弦變換系數(shù)除以各自的量化步長改為乘以量化步長的倒數(shù),量化步長的倒數(shù)使用二進(jìn)制小數(shù)表示,選取長度為12位。乘法器用EP2C35中兩個(gè)嵌入式乘法單元并聯(lián)實(shí)現(xiàn)。因?yàn)殡x散余弦變換系數(shù)的長度為12位有符號的數(shù),所以乘操作后得到的24位結(jié)果,保留高12位,低12位舍去。具體電路在算法結(jié)構(gòu)上分為3個(gè)階段,由5階的流水線組成,完成整個(gè)量化操作耗時(shí)5個(gè)時(shí)鐘周期。

 

 

2.3 ZigZag掃描模塊
    經(jīng)過量化處理后的離散余弦變換系數(shù)的高頻分量大部分為零。經(jīng)過ZigZag掃描后,一個(gè)二維的8×8離散余弦變換系數(shù)矩陣變?yōu)橐粋€(gè)一維含64個(gè)元素的序列,頻率分量按從低到高排列,一維序列的高頻部分會出現(xiàn)大量的連續(xù)零元素。產(chǎn)生這種一維序列的目的是為了使用熵編碼中游程編碼,進(jìn)一步提高壓縮效率。
    從電路功能的角度上看,ZigZag掃描模塊的作用就是把按列順序輸入的量化后的離散余弦變換系數(shù)以ZigZag掃描的順序輸出。處理時(shí)以一個(gè)8×8的離散余弦變換系數(shù)矩陣為一個(gè)處理單元,在接收一個(gè)以列順序輸入的8×8的離散余弦變換系數(shù)矩陣的同時(shí),把前一個(gè)已經(jīng)接收完畢的8×8的離散余弦變換系數(shù)矩陣以ZigZag掃描的順序輸出。一個(gè)擁有128個(gè)存儲單元,每個(gè)存儲單元長度為9位的雙口RAM可以完成上述功能。RAM的128個(gè)存儲單元在使用上分為兩個(gè)操作區(qū),每個(gè)操作區(qū)64個(gè)存儲單元,一個(gè)操作區(qū)用于接收以列順序輸入的8×8的離散余弦變換系數(shù)矩陣,同時(shí)另一個(gè)操作區(qū)以ZigZag掃描的順序輸出前一個(gè)已經(jīng)接收完畢的8×8的離散余弦變換系數(shù)矩陣。兩個(gè)操作區(qū)輪換交替,形成一種乒乓操作模式。在這里使用乒乓操作是為了保持整個(gè)IP核的整體全流水線設(shè)計(jì)。
    乒乓操作是一種常用于數(shù)據(jù)流控制的處理技巧。其特點(diǎn)是相互配合切換多個(gè)存儲單元并完成數(shù)據(jù)的處理,把處理后的數(shù)據(jù)沒有停頓的運(yùn)送到下一個(gè)處理模塊。把一個(gè)乒乓操作模塊當(dāng)作一個(gè)整體,從其兩端看數(shù)據(jù),輸入數(shù)據(jù)和輸出數(shù)據(jù)都是連續(xù)不斷的,沒有任何停頓,因此非常適合流水線結(jié)構(gòu)。圖11是ZigZag掃描模塊在ModelSim仿真軟件中的時(shí)序仿真結(jié)果,仿真的時(shí)鐘頻率設(shè)定為100Mhz。輸入數(shù)據(jù)是一個(gè)8×8的二維矩陣。按列掃描順序輸入的如下矩陣:

 

14 

15 

27 

28 

13 

16 

26 

29 

42 

12 

17 

25 

30 

41 

43 

11 

18 

24 

31 

40 

44 

53 

10 

19 

23 

32 

39 

45 

52 

54 

20 

22 

33 

38 

46 

51 

55 

60 

21 

34 

37 

47 

50 

56 

59 

61 

35 

36 

48 

49 

57 

58 

62 

63 


 

2.4熵編碼模塊
    熵編碼與前面介紹的量化都是數(shù)據(jù)壓縮的手段,但二者有所不同,熵編碼利用信號的統(tǒng)計(jì)特征來降低位率,理論上不會丟失信息,量化會丟失信息。實(shí)現(xiàn)熵編碼有多種方式,本文根據(jù)ISO/IEC10918協(xié)議,使用了游程編碼和霍夫曼編碼兩種方式。游程編碼的原理是把沿一定方向排列的等大小量化值的離散余弦變換系數(shù)作為連續(xù)的整體,用特定碼字替代這種連續(xù)的整體就會達(dá)到數(shù)據(jù)量減少的效果?;舴蚵幋a是一種變長編碼,將多次出現(xiàn)的代碼用較短的碼字代表,很少出現(xiàn)的代碼用較長的碼字代表。產(chǎn)生哈夫曼編碼要求掃描兩遍原始數(shù)據(jù),第一遍掃描是為了在原始數(shù)據(jù)中精確地統(tǒng)計(jì)每個(gè)值出現(xiàn)的頻率,第二遍利用構(gòu)造的哈夫曼樹得到編碼,兩次掃描耗時(shí)巨大,因此數(shù)據(jù)壓縮難以滿足實(shí)時(shí)性要求。ISO/IEC10918協(xié)議中在對大量8位精度圖像的平均統(tǒng)計(jì)基礎(chǔ)上,給出了4個(gè)合適大多數(shù)應(yīng)用的個(gè)哈夫曼碼表。在實(shí)現(xiàn)硬件電路時(shí)把哈夫曼碼表存儲在片上ROM中,使用時(shí)直接查找。因?yàn)殡x散余弦變換中直流系數(shù)和交流系數(shù)分別使用不同的碼表,且直流系數(shù)不需要進(jìn)行游程編碼,所以直流系數(shù)和交流系數(shù)使用不同的模塊來處理。

2.4.1直流系數(shù)處理模塊
    直流系數(shù)是8×8矩陣內(nèi)64個(gè)像素均值的度量,是包含了整個(gè)圖像能量的重要部分。利用相鄰的8×8矩陣的直流系數(shù)具有很強(qiáng)的相關(guān)性,對直流系數(shù)使用差分壓縮編碼。前一個(gè)8×8矩陣的直流系數(shù)作為當(dāng)前矩陣的直流系數(shù)的預(yù)測值,求出現(xiàn)實(shí)值和預(yù)測值之間的差值后,再對差值做霍夫曼編碼。在硬件實(shí)現(xiàn)時(shí),直流系數(shù)只有一個(gè)值,所以不需要做游程編碼,對其處理的第一步就是求得其與預(yù)測值之間的差值。根據(jù)差值的大小和正負(fù)查找存儲在片上ROM的標(biāo)準(zhǔn)霍夫曼碼表,得出前綴代碼和前綴代碼長度,同時(shí)根據(jù)ISO/IEC10918協(xié)議中提出的尾碼產(chǎn)生方式得到對應(yīng)的尾碼代碼及尾碼代碼長度。上述處理完成之后再經(jīng)過合并前綴代碼與尾碼代碼為霍夫曼代碼,則直流系數(shù)的熵編碼完成,之后等待被變長編碼模塊封裝。具體的實(shí)現(xiàn)電路由4階流水線組成,直流系數(shù)的熵編碼處理過程耗時(shí)4個(gè)時(shí)鐘周期。

 

 


2.4.2交流系數(shù)處理模塊
    交流系數(shù)首先要現(xiàn)經(jīng)過游程編碼處理。在游程編碼中非零交流系數(shù)前的零交流系數(shù)的個(gè)數(shù)是游程長度,前綴代碼及尾碼代碼的含義與直流系數(shù)中的一致,只不過在交流系數(shù)處理中游程長度和前綴代碼重新組合為一個(gè)新的查找索引來查找新的前綴代碼。ISO/IEC10918協(xié)議中給出的交流系數(shù)標(biāo)準(zhǔn)霍夫曼碼表里有兩個(gè)特殊的代碼。一個(gè)特殊代碼ZRL,ZRL代表游程編碼中游程長度大于16,如果游程長度大于32,48,56,分別用1個(gè)ZRL,2個(gè)ZRL,3個(gè)ZRL表示,盈余的游程長度加入下一個(gè)游程長度計(jì)算中。ZRL代碼只有前綴代碼,沒有尾碼代碼。為了方便實(shí)現(xiàn),直接把ZRL的尾碼代碼長度設(shè)為零,起到屏蔽尾碼的作用。另一個(gè)特殊代碼EOB,EOB代表最后一個(gè)零行程中只有零元素直接代表當(dāng)前矩陣的游程編碼已經(jīng)掃描結(jié)束,若當(dāng)前矩陣的最后一個(gè)交流系數(shù)是非零數(shù)的則以正常結(jié)束一個(gè)游程長度的計(jì)數(shù)作為當(dāng)前矩陣游程編碼的結(jié)束。同ZRL類似,EOB也沒有尾碼代碼,所以使用同樣的處理手段。具體的實(shí)現(xiàn)電路由4階流水線組成,交流系數(shù)的熵編碼處理耗時(shí)4個(gè)時(shí)鐘周期。

 


2.4.3交織模塊和冗余ZRL消除模塊
    交織模塊的作用是把前綴代碼和尾碼代碼合并為一個(gè)霍夫曼代碼,合并后的代碼易于進(jìn)行下一階段的變長編碼操作,變長編碼操作過程需要的移位位數(shù)由前綴代碼長度加上尾碼代碼長度做和得到,這個(gè)求和過程也在交織模塊中實(shí)現(xiàn)。該模塊具體實(shí)現(xiàn)電路由2階流水線組成。
    冗余ZRL消除模塊不是ISO/IEC10918協(xié)議的一部分,但它源于標(biāo)準(zhǔn)協(xié)議里對EOB的定義。從EOB之前直到最近一個(gè)的非零交流系數(shù)出現(xiàn),中間產(chǎn)生的ZRL都是可以消除的。基于全流水線結(jié)構(gòu)的電路設(shè)計(jì)一般很難滿足這一要求,原因是全流水線結(jié)構(gòu)的電路每級產(chǎn)生的結(jié)果都會直接傳遞給下一級,不對結(jié)果作保留。唯一的方法就是構(gòu)造一個(gè)同步FIFO來緩存前幾個(gè)時(shí)鐘周期內(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變長編碼模塊
    變長編碼的作用是把交織編碼輸出的含有不等長有效位的霍夫曼碼字,提取其中的有效位并將其組合為一個(gè)連續(xù)的32位碼流。
    編碼原理是把交織編碼輸出的含有不等長有效位的霍夫曼碼字向右位,移動的位數(shù)是前一個(gè)霍夫曼碼字的代碼長度。移位完成后的當(dāng)前霍夫曼碼字與提供移動的位數(shù)的前一個(gè)霍夫曼碼字做或運(yùn)算,同時(shí)累加兩個(gè)霍夫曼碼字的代碼長度。累加和大于24時(shí)表明變長編碼的第一步完成。第二步是檢查前一步產(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é)果輸出。這個(gè)32位數(shù)據(jù)也是整個(gè)IP核輸出的最終壓縮結(jié)果。

 

 

3.基于SOPC結(jié)構(gòu)的實(shí)際驗(yàn)證系統(tǒng)

    經(jīng)驗(yàn)證,Motion JPEG IP核可以實(shí)時(shí)處理由NTSC制式攝像頭采集經(jīng)ADV7181處理后輸出的CCIR656標(biāo)準(zhǔn)數(shù)據(jù),完成對連續(xù)視頻幀的實(shí)時(shí)壓縮。

 


    驗(yàn)證系統(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模塊是一個(gè)工業(yè)級的SDRAM控制器,可以將一個(gè)SDRAM數(shù)據(jù)端口仿真成四個(gè)虛擬的數(shù)據(jù)端口(兩個(gè)寫端口+兩個(gè)讀端口)。SDRAM在存儲空間使用上劃分為4個(gè)區(qū)塊,在lineswitcher模塊寫入一個(gè)區(qū)塊的同時(shí),Motion JPEG IP核讀出前一個(gè)已寫入亮度分量的區(qū)塊。Motion JPEG IP核輸出端是一個(gè)Avalon總線上的具有流控制屬性從端口。DMA控制器與Motion JPEG IP核以流控制的方式進(jìn)行數(shù)據(jù)傳輸,并把數(shù)據(jù)轉(zhuǎn)移到SRAM中。整個(gè)過程無需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。

   

 

    考慮到芯片上的資源,驗(yàn)證時(shí)只對ADV7181輸出的亮度分量進(jìn)行壓縮,舍棄了色差分量。雖然沒有了色差分量,但是仍然可以得到清晰直觀的驗(yàn)證效果。

 


4.結(jié)論

    本設(shè)計(jì)主要有以下幾個(gè)特點(diǎn)。

    1:以全流水線結(jié)構(gòu)來實(shí)現(xiàn)Motion JPEG視頻壓縮IP核。
    雖然流水線技術(shù)已經(jīng)是一種眾所周知的技術(shù),但是現(xiàn)有的Motion JPEG視頻壓縮IP核仍未實(shí)現(xiàn)全部流水線結(jié)構(gòu),一般多以狀態(tài)控制模塊為核心來協(xié)調(diào)各個(gè)子模塊。這就導(dǎo)致系統(tǒng)中最慢的子模塊在處理數(shù)據(jù)時(shí),其它子模塊只能等待,對數(shù)據(jù)塊訪問的效率低下。同時(shí)由于數(shù)據(jù)塊的被多個(gè)子模塊所使用而又需要復(fù)雜的仲裁機(jī)制。本文提出的全流水線結(jié)構(gòu)把整個(gè)處理過程分解為198個(gè)小操作,每個(gè)時(shí)鐘周期內(nèi)由一階流水線完成一個(gè)小操作。當(dāng)整個(gè)流水線鋪滿之后,整個(gè)數(shù)據(jù)處理過程中沒有等待延遲,沒有仲裁協(xié)議,大幅提高了系統(tǒng)的運(yùn)行效率并降低了系統(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個(gè)時(shí)鐘周期。二維離散余弦變換在采用了并行矩陣轉(zhuǎn)置之后,也實(shí)現(xiàn)了全部并行處理,43個(gè)時(shí)鐘周期完成了一次二維離散余弦變換,效率提高顯著。
    3:因采用全流水線結(jié)構(gòu)而取得的較高的運(yùn)行頻率。
    本文設(shè)計(jì)的Motion JPEG視頻壓縮IP核在Quartus II 6.0中進(jìn)行靜態(tài)時(shí)序分析,得到的最高運(yùn)行頻率是150Mhz。

 


     現(xiàn)有IP核與本文設(shè)計(jì)的IP核的運(yùn)行頻率比較

 

 

    實(shí)際驗(yàn)證時(shí)不僅對處理CCIR656標(biāo)準(zhǔn)數(shù)據(jù)的能力給予驗(yàn)證,同時(shí)也為100Mhz的運(yùn)行頻率進(jìn)行了驗(yàn)證,結(jié)果證明IP核可以在100Mhz的運(yùn)行頻率下正常工作。驗(yàn)證方法是把7幀952×568的亮度分量文件存入SDRAM中作為原始數(shù)據(jù),整個(gè)驗(yàn)證系統(tǒng)以100Mhz頻率運(yùn)行,經(jīng)過0.05秒完成7幀的壓縮,幀率可達(dá)147 frame/s。壓縮后圖像的大小為原來亮度圖像的十分之一。

    4:可以在低成本,低功耗,高密度的CycloneII系列FPGA芯片上運(yùn)行,通過Avalon總線與NIOSII處理器構(gòu)成SOPC系統(tǒng),為將來實(shí)際產(chǎn)品的設(shè)計(jì)搭建了一個(gè)良好的平臺。


參考文獻(xiàn)
【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-TingSun, 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è)計(jì)教程-DE2實(shí)踐. 西安: 西安電子科技大學(xué)出版社, 2007年4月.
【9】吳繼華,王誠. AlteraFPGA/CPLD設(shè)計(jì)(高級篇). 北京: 人民郵電出版社,2005年7月
【10】簡弘倫.精通VerilogHDL IC設(shè)計(jì)核心技術(shù)實(shí)例詳解.北京:電子工業(yè)出版社, 2005年10月.

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉