H.264視頻解碼芯片中與濾波相關(guān)的存儲器的設(shè)計
摘要:本文對H.264 解碼芯片中的濾波部分所需的數(shù)據(jù)、數(shù)據(jù)的存取及芯片中所用到的存儲器做了深入的分析,同時涉及到DRAM 及SRAM 的設(shè)計,并支持宏塊級幀場自適應(yīng)。為了實現(xiàn)H.264 解碼芯片中的數(shù)據(jù)的快速存取,本文提出了對數(shù)據(jù)存儲的一種優(yōu)化方法,通過此方法可完全達(dá)到濾波過程中對大量數(shù)據(jù)的處理。試驗表明此種方法能節(jié)約存儲器的資源并滿足H.264 濾波中對大數(shù)據(jù)量處理的需求。
H.264 作為新一代的視頻編碼標(biāo)準(zhǔn)有著優(yōu)異的性能,廣泛應(yīng)用于視頻會議、視頻點播、數(shù)字電視廣播、數(shù)字視頻存儲以及消費電子等多個領(lǐng)域。與H.263或MPEG-4 相比,同等圖像質(zhì)量下,碼率能降低一半左右,但是算法復(fù)雜度高。
H.264 標(biāo)準(zhǔn)在低碼率的情況下能產(chǎn)生高質(zhì)量的畫面,主要就是采用了自適應(yīng)的環(huán)路濾波。H.264 采用了基于樹狀結(jié)構(gòu)的塊的運動補償,基于塊的運動補償能很好地降低碼率, 但這同時也引起了方塊效應(yīng)。
由此H.264 采用了一種自適應(yīng)的濾波算法,能夠很好地降低方塊效應(yīng), 但同時也帶來了極大的運算復(fù)雜度。在H.264 中,濾波后的數(shù)據(jù)將作為下一幀的參考幀,因此又稱為環(huán)路濾波。研究表明:在H.264 解碼過程中其中運動補償(MC)約占30%,環(huán)路濾波(DF)約占20%的解碼時間,因此很好的設(shè)計MC 與DF 對解碼器的性能至關(guān)重要。
1 濾波過程用到的數(shù)據(jù)
H.264 中, 在MBAFF 情況下的解碼中宏塊都是以宏塊對的形式出現(xiàn)。因此在存儲數(shù)據(jù)的時候也考慮到以一個宏塊對的數(shù)據(jù)為單位進(jìn)行存儲。在一個宏塊對中, 濾波時整個過程中需要操作的數(shù)據(jù)如圖1 所示。其中每一個小方塊表示一個4×4 像素的block,在濾mb_up 宏塊時需要用到up 所指的數(shù)據(jù),本次設(shè)計支持MBAFF,在濾波過程中需要進(jìn)行幀與場的轉(zhuǎn)化,因此要用到上面二行的block。在濾波最左邊的block時需要用到圖中l(wèi)eft 所指示的一列數(shù)據(jù)。
圖1 濾波中的數(shù)據(jù)
2 DRAM 的規(guī)劃與設(shè)計
DRAM 是一種成本低、容量大、應(yīng)用廣泛的存儲介質(zhì), 對大規(guī)模數(shù)據(jù)的操作十分迅速。然而由于DRAM 中有一個Row 的概念。在操作不同的Row 的情況下DRAM 要先關(guān)閉當(dāng)前的Row, 同時再激活所需的Row,這樣就造成了很多的overhead。試想讀取同一Row 的10 個數(shù)據(jù)與分別處于10 個Row 的10個數(shù)據(jù),后者的時間耗費將會是前者的5~6 倍。因此DRAM 不適合對隨機的分散的數(shù)據(jù)存取。
由于Row 的存在, 對DRAM 中的數(shù)據(jù)結(jié)構(gòu)的設(shè)計就顯得尤為重要。要盡量減少不同Row 之間的訪問,這樣才能提高數(shù)據(jù)的存取效率。本次設(shè)計中采用位寬為64 位的DRAM, 恰好可以存放8 個點的像素值。一幅圖像亮度Y、色度UV 分別存放在一個連續(xù)的空間中。
H.264 解碼后的最后圖像存入DRAM 中,顯示模塊不斷的從DRAM 中取出數(shù)據(jù)送到顯示器, 運動補償單元也要從DRAM 中取出參考幀的數(shù)據(jù)。因此DRAM 的帶寬尤為緊張。合理地分配DRAM 的帶寬是設(shè)計中要考慮的一個重要方面。由于很多模塊都要求對DRAM 進(jìn)行操作, 為了有效地對DRAM 進(jìn)行管理,設(shè)置了DRAMCONtrol 模塊來對DRAM 進(jìn)行控制。
3 DRAMControl 模塊的設(shè)計
DRAMControl 模塊控制著DRAM 與外面其它模塊的交互,是DRAM 與外部其它模塊的接口。主要的功能包括DRAM 的自動刷新、DRAM 的命令的產(chǎn)生等。因為DRAM 工作時的狀態(tài)多,本次設(shè)計中采用狀態(tài)機的方式來實現(xiàn)。其中狀態(tài)圖如圖2 所示。
圖2 DRAMControl 中的狀態(tài)轉(zhuǎn)移圖
設(shè)計中采用了均勻刷新的方式, 每隔一定的時間, 經(jīng)過“IDLE → PRECHALL → AUTORF →IDLE”的過程就完成一次刷新。狀態(tài)轉(zhuǎn)換的主體是讀寫操作過程,判決狀態(tài)(Decision)占用一個時鐘周期判斷當(dāng)前操作所要執(zhí)行的Row 是否處于激活狀態(tài),如果沒有激活則要先關(guān)閉當(dāng)前處于激活狀態(tài)的Row,再激活所需的Row(通過PRECH 和ACT 狀態(tài)完成);如果已經(jīng)激活,則直接進(jìn)行讀寫操作。對于寫操作,針對H.264 中濾波結(jié)束后要更新上邊宏塊,左邊宏塊以及自身宏塊的數(shù)據(jù)來設(shè)計了WRITEUP 或WRITELEFT 和WRITE 這三個狀態(tài)寫入DRAM,而且這些狀態(tài)之間實現(xiàn)了時間上的無縫連接,構(gòu)成了一個完整連貫的BurST 寫操作; 如果上邊宏塊的數(shù)據(jù)或左邊宏塊的數(shù)據(jù)塊處于與待濾波宏塊的數(shù)據(jù)塊不同的Row 中,則在WRITEUP 或WRITELEF 狀態(tài)實現(xiàn)不在本Tile 中數(shù)據(jù)塊的寫操作,這種情況的寫效率顯然比在同一個Row 中的時候下降了, 但這是不可避免的, 當(dāng)宏塊處于本Row 的最左邊或最上邊的時候,其上邊宏塊數(shù)據(jù)或左邊宏塊數(shù)據(jù)塊必然是屬于其它Row 的。本次設(shè)計中,DRAM 一個地址存本block 和下一個block 的同一行, 因此這樣就最多的避免了跨Row 的操作。對于其它情況的寫操作,使用WRITE 狀態(tài)完成。
4 SRAM 的規(guī)劃與設(shè)計
在H.264 解碼過程中,數(shù)據(jù)由熵解碼經(jīng)過運動補償后再通過環(huán)路濾波最終送到存儲器中,之后顯示解碼芯片從存儲器中不斷的提取數(shù)據(jù)送到顯示器上,最終完成數(shù)據(jù)的解碼,如圖3 所示。在濾波的過程中,宏塊中的數(shù)據(jù)頻繁地被調(diào)用。而SRAM 的讀寫速度快的特點能很好地適用這一要求。因為在H.264 中最小的單元為block,運動矢量等都是以block 為單位來進(jìn)行傳遞。因此以block 為單位來進(jìn)行數(shù)據(jù)的存取會帶來很大的方便。本設(shè)計中各個SRAM 每一個地址存放一個block 單元的數(shù)據(jù)(16 個像素點),即采用128bit 的SRAM。
圖3 DRAM 與其它模塊之間的數(shù)據(jù)交互
在H.264 中運動補償結(jié)束后的數(shù)據(jù)交由環(huán)路濾波運算后寫入DRAM, 我們把寫入DRAM 的這一過程稱為Store 過程,由Store 模塊負(fù)責(zé)。由圖3 可以看出MC 與Deblock 是一個串聯(lián)的關(guān)系。為了提高解碼的速度,我們將運動補償與環(huán)路濾波并行執(zhí)行,即當(dāng)前解碼的結(jié)束并不以環(huán)路濾波的結(jié)束為標(biāo)志,而當(dāng)前宏塊的運動補償一結(jié)束我們就可以開始下一個宏塊的解碼。經(jīng)過大量的實驗發(fā)現(xiàn):MC 的時間遠(yuǎn)比block的時間大很多,當(dāng)后一個模塊要進(jìn)行濾波時濾波模塊早已準(zhǔn)備完畢。最后對存儲模塊我們也同樣的用并行的思想來加快解碼的速度。結(jié)果當(dāng)作MBx 的MC 時,做MB(x-1)的濾波,同時MB(x-2)存儲。此時需要注意MB(x-1)的濾波和MB(x-2)的存儲并不是同時開始。因為做MB(x-1)的濾波時也會影響到MB(x-2)中的數(shù)據(jù)。
因此我們要等MB(x-1)的第一條垂直邊濾波結(jié)束后才開始MB(x-2)的存儲。具體的時間關(guān)系如圖4 所示。
圖4 各個模塊之間的時序關(guān)系圖
?。?)濾波前數(shù)據(jù)的存儲及濾波結(jié)束后數(shù)據(jù)的存儲
由于設(shè)計中采用此種流程,我們需要3 片SRAM來存儲MC 的運算結(jié)果。這3 片SRAM 交替地進(jìn)行MC、Deblock 和Store。我們稱這3 片SRAM 為SRAM_M(jìn)B,濾波結(jié)束后的數(shù)據(jù)也存儲在此SRAM 中,在經(jīng)Store 模塊將此數(shù)據(jù)存儲到DRAM 中去。因為濾波結(jié)束時,恰好原來SRAM_M(jìn)B 中的數(shù)據(jù)也已經(jīng)成為無效數(shù)據(jù)。這里需要注意,由于有幀場自適應(yīng)的情況存在,濾波結(jié)束后的數(shù)據(jù)如果幀場情況不一樣,我們還需要根據(jù)數(shù)據(jù)不同的情況進(jìn)行適當(dāng)?shù)膸瑘鲛D(zhuǎn)化,之后再將數(shù)據(jù)存入DRAM。
?。?)垂直濾波后的數(shù)據(jù)的存儲
我們都知道濾波過程是一個先垂直后水平的過程,因此我們需要有一片SRAM 來存儲水平濾波的結(jié)果。這片SRAM 就叫SRAM_BUFFER。因為水平濾波時正在從SRAM_M(jìn)B 中讀取數(shù)據(jù),同一時間不能同時向SRAM 中讀取、寫入數(shù)據(jù)。因此我們用SRAM_BUFFER 來暫存垂直濾波結(jié)束后的數(shù)據(jù)。水平濾波時則從SRAM_BUFFER 中讀取數(shù)據(jù), 濾波后存儲到SRAM_M(jìn)B 中。
5 總結(jié)
本文對H.264 解碼芯片中的濾波、存儲模塊作了深入的分析。并根據(jù)各個時間數(shù)據(jù)的特點作相應(yīng)的存儲器的設(shè)計, 這種設(shè)計方法經(jīng)過驗證能很好地處理H.264 中濾波及存儲時的數(shù)據(jù)的調(diào)度。整個濾波過程約52 個周期就可以完成。在MBAFF 情況時各種數(shù)據(jù)的轉(zhuǎn)化時鐘周期控制在70 個以內(nèi)。這種設(shè)計符合要求,并在FPGA 上驗證后能夠正常的運行,運行時鐘達(dá)到60MHz,能實時地完成對高清圖像的解碼。