摘 要: 完成了H.264 baseline解碼器中運動補償模塊" title="運動補償模塊">運動補償模塊的Verilog建模,通過了功能驗證和綜合。該運動補償模塊可用于H.264 baseline解碼器的FPGA實現和ASIC實現。
關鍵詞: H.264 運動補償模塊 硬件設計
H.264是ITU-T(VCEG)和ISO/IEC(JVT)聯合提出的新一代的視頻編碼標準,該標準于2003年公布。H.264標準承諾將在編碼壓縮性能上超過以往所有的視頻編碼標準(MPEG2,MPEG4,H.263等)。H.264包含7個不同的檔次,其中baseline檔次適合于手持設備、個人終端等應用。
在H.264 baseline解碼器的FPGA或ASIC實現中,運動補償模塊占據十分重要的地位。一般來講,在整個解碼器中,運動補償模塊往往是占用硬件復雜度最高、功耗最大的模塊。因此在解碼器的設計過程中,有必要對運動補償模塊進行精心設計。
1 Baseline級別中運動補償的特點
在一般情況下,H.264 baseline解碼器中的運動補償器具有以下特點:
(1)支持4×4到16×16的可變塊大小的運動補償。
(2)支持運動向量的預測和恢復。
(3)在像素插值" title="插值">插值中,亮度像素的插值精度為1/4像素,色度像素的精度為1/8像素。
(4)運動補償器涉及的圖像類型只有I幀和P幀。除此之外,沒有其他類型的圖像。
2 運動補償模塊的硬件設計
運動補償的大致流程為:根據H.264標準所規定的算法,利用解碼得到的運動向量殘差和解碼端計算出運動向量估計值,恢復出當前塊的運動向量。并利用已經掌握的運動向量、參考幀號和當前解碼塊的位置等信息,從外存(本設計支持SDRAM或DDR SDRAM)中讀入所需的參考幀數據。然后,利用讀入的參考幀數據,結合已經計算出的運動向量,完成亞像素" title="亞像素">亞像素插值。插值之后的數據即是像素的預測值,該預測值可以輸出到圖像重建" title="圖像重建">圖像重建模塊中與反量化反變換模塊得到的像素殘差值相加,并回寫入外存中。
由于H.264使用幀內預測和幀間預測,圖像重建模塊需要處理來自幀內補償和運動補償兩個模塊的數據,所以解碼器中,圖像重建模塊并未被劃分到運動補償模塊中,而是獨立成為一個模塊。該模塊的硬件設計也已完成。本運動補償模塊的頂層結構及周邊模塊的結構如圖1所示。其中虛線框所示為運動補償模塊的頂層結構。
2.1 運動向量恢復模塊
在H.264 baseline解碼器中,當前塊的運動向量需要通過本地計算恢復得到。計算方法是:將本地恢復的運動向量估計值和編碼端傳輸過來的運動向量殘差值相加,得到的和即是當前塊的運動向量。其中運動向量估計值的計算完全遵照H.264標準。由于計算當前塊數據時需要用到相鄰塊的數據,所以需要一個本地存儲單元將其暫時存儲。這里所謂的相鄰塊的定義如標準所述。
運動向量恢復模塊的結構如圖2所示。在該模塊中,控制模塊生成控制信號,調度各個子模塊的工作。當前塊的信息首先被輸入到相鄰塊信息生成模塊。該子模塊利用這些信息計算出相鄰塊的位置信息。這些位置信息被提交給本地數據管理模塊,從中調用相鄰塊的運動向量相關信息,并輸出給運動向量估計模塊。運動向量估計模塊利用這些數據,估計出當前塊的運動向量估計值,并將估計值反饋給本地數據管理模塊。在本地數據管理模塊內,運動向量的估計值和殘差值相加得到當前模塊的運動向量。一方面,這個運動向量被作為運動向量恢復模塊的輸出;另一方面,運動向量同時被存儲進本地存儲器,當需要時可被當作今后塊的相鄰塊信息調用。
2.2 參考幀數據讀取模塊
由于參考幀數據被按照一定的格式存儲在外存中(本設計支持SDRAM或DDR SDRAM),為實現運動補償,需要將所需的參考幀數據從外存中讀入;另一方面,插值模塊需要使用到這些讀入的數據。因此,參考幀讀取模塊的主要功能是將參考幀數據讀入,并按照一定的格式輸送給亞像素插值" title="像素插值">像素插值模塊。
H.264標準規定,亮度像素通過6抽頭的濾波器實現半像素插值,色度像素通過2抽頭的濾波器實現半像素插值。因此,對于一個4×4的亮度塊,需要一次讀入一個9×9像素的塊;對于2×2的色度塊,需要一次讀入3×3像素的塊。由于亞像素插值是逐行進行的,亮度像素每次輸出同一列的6個點給亞像素插值模塊;而色度像素則輸出同一列的3個點給亞像素插值模塊。
總體來講,參考幀數據讀取模塊通過一個多層嵌套的狀態機實現。其中頂層的狀態跳轉狀況如圖3所示。
首先,本子模塊根據當前塊的位置和當前塊的運動向量,計算出參考數據塊在參考幀中的位置。這個位置信息和參考幀編號被一起提交給外部的地址轉換模塊,從而申請從外存讀入數據。本子模塊內部包含了一個9×9字節的本地寄存器堆,從外存中讀入的數據被暫時存儲在寄存器堆內,以便這些數據被并發訪問。一旦進入到數據輸出狀態,就按節拍選擇必要的數據輸出給亞像素插值模塊。
2.3 亞像素插值模塊
為盡可能減少片內存儲器的數量并兼顧速度,亞像素模塊對亮度采用4×4塊串行處理的工作方式。即在一段時間內集中處理一個4×4亮度塊的數據。如果當前單元大于4×4,則必定將其劃分為多個4×4塊,并且這些4×4塊之間享有相同的運動向量。類似的,對于色度數據則采用2×2塊串行處理的工作方式,即在一段時間內集中處理一個2×2亮度塊的數據。在同一個4×4或2×2塊內,則采用逐行計算的順序。
對于亮度部分,需采用6抽頭的濾波器來實現整像素到半像素的插值。考慮到6個抽頭的加權系數為[1,-5,20,20,-5,1],如果直接采用乘法器實現乘系數的運算,則必然導致較高的硬件開銷。因此采用兩種基于加法器的設計來分別實現橫向和縱向的半像素插值。這兩種濾波器的結構分別如圖4(a)和圖4(b)所示。
在圖4所示濾波器中,Sx表示將輸入數據向左移x位,而L表示將輸入數據延遲一個時鐘。在圖4(a)中,N×5用N+(N>>2)實現,N×20用(N>>4)+(N>>2)實現。圖4(b)采用類似的方法。經過合理的設計,僅采用一個加法器就實現了對6個抽頭的乘系數操作。
同理,對色度像素也作了基于加法器的設計,整個操作全部采用加法器和移位器實現,大大節省了硬件開銷。
2.4 周邊模塊簡介
圖像重建模塊負責將像素殘差和像素的估計值求和,并將結果回寫入外存。H.264解碼器包含運動補償模塊和幀內補償模塊,像素的估計值可能來自兩者,不同來源地的數據都在該模塊內處理。因此圖像重建模塊被獨立為一個模塊,而不從屬于運動補償模塊。
另一方面,參考幀數據在外存中按照某種結構存儲,對外存的讀寫需要提交存儲器對應地址,而解碼過程中產生的像素位置值是其在圖像中的坐標。地址轉換模塊的作用是完成兩者的轉化,并將轉換結果輸送給DRAM接口。
上述周邊模塊的設計也已完成。
3 功能驗證與綜合
本運動補償模塊已通過利用Modelsim XE 5.7c進行的功能仿真。在功能驗證時,采用與H.264標準配套的jm86生成測試向量。將Verilog模型計算結果與jm86本身運算結果比對,兩者完全一致。
本模塊利用synplify pro 8.1針對XILINX sparten3 的FPGA開發板進行綜合,結果顯示共使用了6157個LUT。利用Synopsys的design vision針對smic18工藝進行綜合,通過了本運動補償模塊的可綜合性驗證。
參考文獻
[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.