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