摘 要: 完成了H.264 baseline解碼器中運(yùn)動補(bǔ)償模塊" title="運(yùn)動補(bǔ)償模塊">運(yùn)動補(bǔ)償模塊的Verilog建模,通過了功能驗(yàn)證和綜合。該運(yùn)動補(bǔ)償模塊可用于H.264 baseline解碼器的FPGA實(shí)現(xiàn)和ASIC實(shí)現(xiàn)。
關(guān)鍵詞: H.264 運(yùn)動補(bǔ)償模塊 硬件設(shè)計(jì)
H.264是ITU-T(VCEG)和ISO/IEC(JVT)聯(lián)合提出的新一代的視頻編碼標(biāo)準(zhǔn),該標(biāo)準(zhǔn)于2003年公布。H.264標(biāo)準(zhǔn)承諾將在編碼壓縮性能上超過以往所有的視頻編碼標(biāo)準(zhǔn)(MPEG2,MPEG4,H.263等)。H.264包含7個不同的檔次,其中baseline檔次適合于手持設(shè)備、個人終端等應(yīng)用。
在H.264 baseline解碼器的FPGA或ASIC實(shí)現(xiàn)中,運(yùn)動補(bǔ)償模塊占據(jù)十分重要的地位。一般來講,在整個解碼器中,運(yùn)動補(bǔ)償模塊往往是占用硬件復(fù)雜度最高、功耗最大的模塊。因此在解碼器的設(shè)計(jì)過程中,有必要對運(yùn)動補(bǔ)償模塊進(jìn)行精心設(shè)計(jì)。
1 Baseline級別中運(yùn)動補(bǔ)償?shù)奶攸c(diǎn)
在一般情況下,H.264 baseline解碼器中的運(yùn)動補(bǔ)償器具有以下特點(diǎn):
(1)支持4×4到16×16的可變塊大小的運(yùn)動補(bǔ)償。
(2)支持運(yùn)動向量的預(yù)測和恢復(fù)。
(3)在像素插值" title="插值">插值中,亮度像素的插值精度為1/4像素,色度像素的精度為1/8像素。
(4)運(yùn)動補(bǔ)償器涉及的圖像類型只有I幀和P幀。除此之外,沒有其他類型的圖像。
2 運(yùn)動補(bǔ)償模塊的硬件設(shè)計(jì)
運(yùn)動補(bǔ)償?shù)拇笾铝鞒虨椋焊鶕?jù)H.264標(biāo)準(zhǔn)所規(guī)定的算法,利用解碼得到的運(yùn)動向量殘差和解碼端計(jì)算出運(yùn)動向量估計(jì)值,恢復(fù)出當(dāng)前塊的運(yùn)動向量。并利用已經(jīng)掌握的運(yùn)動向量、參考幀號和當(dāng)前解碼塊的位置等信息,從外存(本設(shè)計(jì)支持SDRAM或DDR SDRAM)中讀入所需的參考幀數(shù)據(jù)。然后,利用讀入的參考幀數(shù)據(jù),結(jié)合已經(jīng)計(jì)算出的運(yùn)動向量,完成亞像素" title="亞像素">亞像素插值。插值之后的數(shù)據(jù)即是像素的預(yù)測值,該預(yù)測值可以輸出到圖像重建" title="圖像重建">圖像重建模塊中與反量化反變換模塊得到的像素殘差值相加,并回寫入外存中。
由于H.264使用幀內(nèi)預(yù)測和幀間預(yù)測,圖像重建模塊需要處理來自幀內(nèi)補(bǔ)償和運(yùn)動補(bǔ)償兩個模塊的數(shù)據(jù),所以解碼器中,圖像重建模塊并未被劃分到運(yùn)動補(bǔ)償模塊中,而是獨(dú)立成為一個模塊。該模塊的硬件設(shè)計(jì)也已完成。本運(yùn)動補(bǔ)償模塊的頂層結(jié)構(gòu)及周邊模塊的結(jié)構(gòu)如圖1所示。其中虛線框所示為運(yùn)動補(bǔ)償模塊的頂層結(jié)構(gòu)。
2.1 運(yùn)動向量恢復(fù)模塊
在H.264 baseline解碼器中,當(dāng)前塊的運(yùn)動向量需要通過本地計(jì)算恢復(fù)得到。計(jì)算方法是:將本地恢復(fù)的運(yùn)動向量估計(jì)值和編碼端傳輸過來的運(yùn)動向量殘差值相加,得到的和即是當(dāng)前塊的運(yùn)動向量。其中運(yùn)動向量估計(jì)值的計(jì)算完全遵照H.264標(biāo)準(zhǔn)。由于計(jì)算當(dāng)前塊數(shù)據(jù)時需要用到相鄰塊的數(shù)據(jù),所以需要一個本地存儲單元將其暫時存儲。這里所謂的相鄰塊的定義如標(biāo)準(zhǔn)所述。
運(yùn)動向量恢復(fù)模塊的結(jié)構(gòu)如圖2所示。在該模塊中,控制模塊生成控制信號,調(diào)度各個子模塊的工作。當(dāng)前塊的信息首先被輸入到相鄰塊信息生成模塊。該子模塊利用這些信息計(jì)算出相鄰塊的位置信息。這些位置信息被提交給本地?cái)?shù)據(jù)管理模塊,從中調(diào)用相鄰塊的運(yùn)動向量相關(guān)信息,并輸出給運(yùn)動向量估計(jì)模塊。運(yùn)動向量估計(jì)模塊利用這些數(shù)據(jù),估計(jì)出當(dāng)前塊的運(yùn)動向量估計(jì)值,并將估計(jì)值反饋給本地?cái)?shù)據(jù)管理模塊。在本地?cái)?shù)據(jù)管理模塊內(nèi),運(yùn)動向量的估計(jì)值和殘差值相加得到當(dāng)前模塊的運(yùn)動向量。一方面,這個運(yùn)動向量被作為運(yùn)動向量恢復(fù)模塊的輸出;另一方面,運(yùn)動向量同時被存儲進(jìn)本地存儲器,當(dāng)需要時可被當(dāng)作今后塊的相鄰塊信息調(diào)用。
2.2 參考幀數(shù)據(jù)讀取模塊
由于參考幀數(shù)據(jù)被按照一定的格式存儲在外存中(本設(shè)計(jì)支持SDRAM或DDR SDRAM),為實(shí)現(xiàn)運(yùn)動補(bǔ)償,需要將所需的參考幀數(shù)據(jù)從外存中讀入;另一方面,插值模塊需要使用到這些讀入的數(shù)據(jù)。因此,參考幀讀取模塊的主要功能是將參考幀數(shù)據(jù)讀入,并按照一定的格式輸送給亞像素插值" title="像素插值">像素插值模塊。
H.264標(biāo)準(zhǔn)規(guī)定,亮度像素通過6抽頭的濾波器實(shí)現(xiàn)半像素插值,色度像素通過2抽頭的濾波器實(shí)現(xiàn)半像素插值。因此,對于一個4×4的亮度塊,需要一次讀入一個9×9像素的塊;對于2×2的色度塊,需要一次讀入3×3像素的塊。由于亞像素插值是逐行進(jìn)行的,亮度像素每次輸出同一列的6個點(diǎn)給亞像素插值模塊;而色度像素則輸出同一列的3個點(diǎn)給亞像素插值模塊。
總體來講,參考幀數(shù)據(jù)讀取模塊通過一個多層嵌套的狀態(tài)機(jī)實(shí)現(xiàn)。其中頂層的狀態(tài)跳轉(zhuǎn)狀況如圖3所示。
首先,本子模塊根據(jù)當(dāng)前塊的位置和當(dāng)前塊的運(yùn)動向量,計(jì)算出參考數(shù)據(jù)塊在參考幀中的位置。這個位置信息和參考幀編號被一起提交給外部的地址轉(zhuǎn)換模塊,從而申請從外存讀入數(shù)據(jù)。本子模塊內(nèi)部包含了一個9×9字節(jié)的本地寄存器堆,從外存中讀入的數(shù)據(jù)被暫時存儲在寄存器堆內(nèi),以便這些數(shù)據(jù)被并發(fā)訪問。一旦進(jìn)入到數(shù)據(jù)輸出狀態(tài),就按節(jié)拍選擇必要的數(shù)據(jù)輸出給亞像素插值模塊。
2.3 亞像素插值模塊
為盡可能減少片內(nèi)存儲器的數(shù)量并兼顧速度,亞像素模塊對亮度采用4×4塊串行處理的工作方式。即在一段時間內(nèi)集中處理一個4×4亮度塊的數(shù)據(jù)。如果當(dāng)前單元大于4×4,則必定將其劃分為多個4×4塊,并且這些4×4塊之間享有相同的運(yùn)動向量。類似的,對于色度數(shù)據(jù)則采用2×2塊串行處理的工作方式,即在一段時間內(nèi)集中處理一個2×2亮度塊的數(shù)據(jù)。在同一個4×4或2×2塊內(nèi),則采用逐行計(jì)算的順序。
對于亮度部分,需采用6抽頭的濾波器來實(shí)現(xiàn)整像素到半像素的插值??紤]到6個抽頭的加權(quán)系數(shù)為[1,-5,20,20,-5,1],如果直接采用乘法器實(shí)現(xiàn)乘系數(shù)的運(yùn)算,則必然導(dǎo)致較高的硬件開銷。因此采用兩種基于加法器的設(shè)計(jì)來分別實(shí)現(xiàn)橫向和縱向的半像素插值。這兩種濾波器的結(jié)構(gòu)分別如圖4(a)和圖4(b)所示。
在圖4所示濾波器中,Sx表示將輸入數(shù)據(jù)向左移x位,而L表示將輸入數(shù)據(jù)延遲一個時鐘。在圖4(a)中,N×5用N+(N>>2)實(shí)現(xiàn),N×20用(N>>4)+(N>>2)實(shí)現(xiàn)。圖4(b)采用類似的方法。經(jīng)過合理的設(shè)計(jì),僅采用一個加法器就實(shí)現(xiàn)了對6個抽頭的乘系數(shù)操作。
同理,對色度像素也作了基于加法器的設(shè)計(jì),整個操作全部采用加法器和移位器實(shí)現(xiàn),大大節(jié)省了硬件開銷。
2.4 周邊模塊簡介
圖像重建模塊負(fù)責(zé)將像素殘差和像素的估計(jì)值求和,并將結(jié)果回寫入外存。H.264解碼器包含運(yùn)動補(bǔ)償模塊和幀內(nèi)補(bǔ)償模塊,像素的估計(jì)值可能來自兩者,不同來源地的數(shù)據(jù)都在該模塊內(nèi)處理。因此圖像重建模塊被獨(dú)立為一個模塊,而不從屬于運(yùn)動補(bǔ)償模塊。
另一方面,參考幀數(shù)據(jù)在外存中按照某種結(jié)構(gòu)存儲,對外存的讀寫需要提交存儲器對應(yīng)地址,而解碼過程中產(chǎn)生的像素位置值是其在圖像中的坐標(biāo)。地址轉(zhuǎn)換模塊的作用是完成兩者的轉(zhuǎn)化,并將轉(zhuǎn)換結(jié)果輸送給DRAM接口。
上述周邊模塊的設(shè)計(jì)也已完成。
3 功能驗(yàn)證與綜合
本運(yùn)動補(bǔ)償模塊已通過利用Modelsim XE 5.7c進(jìn)行的功能仿真。在功能驗(yàn)證時,采用與H.264標(biāo)準(zhǔn)配套的jm86生成測試向量。將Verilog模型計(jì)算結(jié)果與jm86本身運(yùn)算結(jié)果比對,兩者完全一致。
本模塊利用synplify pro 8.1針對XILINX sparten3 的FPGA開發(fā)板進(jìn)行綜合,結(jié)果顯示共使用了6157個LUT。利用Synopsys的design vision針對smic18工藝進(jìn)行綜合,通過了本運(yùn)動補(bǔ)償模塊的可綜合性驗(yàn)證。
參考文獻(xiàn)
[1] Draft ITU-T Recommendation and pre-publish draft international standard of jointVid sopecification(ITU-T Rec.H.264ISO/IEC 14496-10:2005(E)) Joint Video Team(JVT), Mar.2005.
[2] Iain G.Richardson.International electrotechnical commission video coding for next-generation multimedia,0-470-84837-5,2003.
[3] HE Wei feng,MAO Zhi gaig,WANG Jin riang,et al.Design and implementation of motion compensation for MPEG-4 AS profile streaming video decoding,0-7803-7889-x/03,IEEE,2003.
[4] CHIEN Chih Da,CHEN Ho Chun,HUANG Lin-Chieh,et? al.A low-power motion compensation IP core design for? MPEG-1/2/4 video decoding,0-7803-8834-8/05,IEEE, 2005.