AVS I幀視頻編碼器的FPGA實時實現(xiàn)
第一節(jié) 系統(tǒng)設(shè)計
本文引用地址:http://2s4d.com/article/201612/326842.htm本項目基于FPGA平臺完成CIF分辨率圖像的實時采集、AVS全I幀壓縮編碼,和網(wǎng)絡(luò)傳輸。本項目主要由視頻采集系統(tǒng),數(shù)據(jù)調(diào)度系統(tǒng),I幀編碼系統(tǒng)和以太網(wǎng)傳輸系統(tǒng)構(gòu)成,其實現(xiàn)框圖如圖1-1所示。
視頻采集系統(tǒng)主要完成將復(fù)合視頻解碼成YUV(4:2:0)數(shù)字視頻,為AVS 全I幀編碼準備好視頻數(shù)據(jù)。
數(shù)據(jù)調(diào)度系統(tǒng)主要完成向I幀編碼系統(tǒng)提供原始數(shù)據(jù),同時將編碼后的碼流傳輸?shù)揭蕴W(wǎng)傳輸系統(tǒng)。視頻數(shù)據(jù)吞吐量大,帶寬高,涉及到低速存儲器(如DDR)和高速存儲器(如FPGA內(nèi)部RAM)之間大量的數(shù)據(jù)交換,成功的數(shù)據(jù)調(diào)度策略是實時實現(xiàn)編碼的關(guān)鍵技術(shù)之一。本系統(tǒng)包含實驗室設(shè)計的DDR控制器IP核和數(shù)據(jù)調(diào)度IP核。
I幀編碼系統(tǒng)主要完成AVS視頻I幀實時編碼,整個系統(tǒng)包括幀內(nèi)預(yù)測模塊,變換量化熵編碼模塊和控制模塊。整個系統(tǒng)使用硬件描述語言獨立設(shè)計完成。
以太網(wǎng)傳輸系統(tǒng)主要完成對AVS碼流的打包,傳輸?shù)絇C機。本系統(tǒng)包含實驗室設(shè)計的以太網(wǎng)控制器IP核和網(wǎng)絡(luò)傳輸協(xié)議IP核。
PC機上的AVS播放器采用DirectShow架構(gòu),基于本實驗室完成的AVS解碼器設(shè)計了AVS實時播放器,用來驗證AVS編碼系統(tǒng)的實時編碼能力。
第二節(jié) 數(shù)據(jù)采集與數(shù)據(jù)交換
前端視頻采集模塊采用TVP5150PBS視頻解碼器將輸入的PAL視頻信號進行轉(zhuǎn)換成數(shù)字YUV(4:2:2)信號,輸出格式為ITU-R BT.656。
系統(tǒng)上電后,F(xiàn)PGA通過IIC總線對TVP5150解碼器進行初始化配置,接通復(fù)合視頻信號后,TVP5150即可正確輸出8位數(shù)字YUV視頻信號至FPGA。由于接收的視頻信號為ITU565格式,視頻信息僅由8位視頻信號組成,沒有獨立的行、場同步信息,所以,F(xiàn)PGA需要從接收的8位視頻信號中提取行場同步信號,并將相鄰8位數(shù)據(jù)(亮度、色差信號)轉(zhuǎn)換成16位視頻信號。
轉(zhuǎn)換后的16位視頻信號經(jīng)DDR SDRAM控制器寫入到外部DDR SDRAM存儲器中,系統(tǒng)采用的DDR SDRAM存儲器容量為16M*16bit,利用迸發(fā)模式,將接收的一行視頻信號存儲到DDR SDRM的一行,則一幀視頻信號可存儲器在DDR 的一個Bank空間。
視頻編碼時,按照宏塊順序從DDR 中讀取數(shù)據(jù),即第一個宏塊數(shù)據(jù)為DDR SDRAM中的第1行至第16行、列地址0至15的前16個地址數(shù)據(jù),第二個宏塊為DDR SDRAM第1行至第16行、列地址16至23的數(shù)據(jù)內(nèi)容,其余宏塊讀取地址依次類推。
第三節(jié) 模塊設(shè)計
3.1 幀內(nèi)預(yù)測模塊
幀內(nèi)預(yù)測模塊從功能上可以分為參考樣本獲取模塊和像素值預(yù)測模塊兩部分。
3.1.1 參考樣本獲取模塊
1. 功能描述:
參考樣本獲取模塊主要是將重構(gòu)數(shù)據(jù)按子塊進行保存,暫存到雙端口RAM中,并從重構(gòu)子塊中提取相應(yīng)的邊界數(shù)據(jù),即當前子塊的右列、下行和右下像素值,并將其存儲在寄存器中,作為下一子塊的參考數(shù)據(jù);保存的當前塊邊界進行重組得到參考樣本,該參考樣本作為像素值預(yù)測模塊的邊界參考數(shù)據(jù)。
由圖1-1可知,子塊0需要保存右列像素用于子塊1預(yù)測時的左邊參考樣本,下行像素保存用于子塊2的上邊參考樣本,右下像素點保存用于子塊3的左上參考樣本點;子塊1的下行保存作為子塊3的上邊參考樣本,右下像素點保存作為相鄰的下一個宏塊的子塊2的左上參考像素點,右列保存和子塊3的右列一起作為下一相鄰宏塊的左邊參考樣本;子塊2的右列保存作為子塊3的左邊參考樣本;子塊2和3的下行保存一起作為下一宏塊行的相鄰宏塊上邊參考樣本。一個宏塊的子塊1和3的右列在宏塊級更新,子塊2和3的下行在宏塊行級更新。
2. 實現(xiàn)該功能的狀態(tài)轉(zhuǎn)移圖如下:
stidle為空閑狀態(tài),streceive 為數(shù)據(jù)接收狀態(tài),stm 為中間的判斷狀態(tài),根據(jù)count值,分別執(zhí)行不同的指令。st0 st1 st2 st3產(chǎn)生用于各個子宏塊預(yù)測的邊界參考數(shù)據(jù), strans 狀態(tài)時輸出邊界參考數(shù)據(jù),stwait 狀態(tài)等待下一個子宏塊的重構(gòu)數(shù)據(jù)。
仿真結(jié)果如圖所示:
datain為輸入的16x16宏塊參考數(shù)據(jù),dataout為用于子宏塊0預(yù)測的參考數(shù)據(jù)。
該部分綜合后的使用資源如下圖所示:
3.1.2像素值預(yù)測模塊
1. 功能描述:
幀內(nèi)預(yù)測模式有亮度和色度之分,亮度有5種預(yù)測模式,分別是V(垂直)、H(水平)、DC、DDL(左下)和DDR(右下);色度有4種預(yù)測模式V(垂直)、H(水平)、DC和P(Plane)。像素值預(yù)測模塊主要完成的是在參考樣本獲取模塊之后得到當前塊的左邊、左上和上邊參考樣本數(shù)據(jù)和當前塊數(shù)據(jù),數(shù)據(jù)流遍歷各種模式,多種模式并行掛起,得到各種模式的預(yù)測值并存儲到對應(yīng)的雙端口RAM中,同時將預(yù)測值與當前塊像素值進行SAD和值計算,通過冒泡排序法得到最小SAD值對應(yīng)的模式值作為最佳預(yù)測模式,選擇輸出最佳模式對應(yīng)的最佳預(yù)測值。最佳模式值輸出供熵編碼使用,最佳預(yù)測值與當前塊數(shù)據(jù)做殘差供DCT變換使用。 2. 實現(xiàn)該功能的狀態(tài)轉(zhuǎn)移圖如下:
Idle為空閑狀態(tài),streceive狀態(tài)完成數(shù)據(jù)接收(當前8x8塊64個數(shù)據(jù),33個邊界參考數(shù)據(jù)),當接受完數(shù)據(jù)后狀態(tài)機進入stcalculate狀態(tài),將相鄰的三個數(shù)進行低通濾波((a+2b+c+2)>>2),而后進入stm4狀態(tài),保存各個模式下的預(yù)測數(shù)據(jù),預(yù)測完成后進入stcompare狀態(tài),比較各種模式下的代價值,并且選出最佳預(yù)測模式。sttrans為輸出最佳模式和預(yù)測數(shù)據(jù)的過程。
仿真結(jié)果如圖所示:
datain為輸入的宏塊數(shù)據(jù),datain_edge為宏塊邊界數(shù)據(jù),dataout為輸出的預(yù)測數(shù)據(jù)。
綜合后資源占用如下圖所示:
3.2 RDQIIR模塊
功能描述
本設(shè)計中將殘差—DCT變換—量化—反量化—逆DCT變換—重構(gòu)(簡稱為RDQIIR模塊)作為一個整體實現(xiàn)。殘差數(shù)據(jù)經(jīng)DCT變換、量化后,數(shù)據(jù)送到熵編碼模塊;同時將量化后的數(shù)據(jù)再進行反量化和反DCT,得到8x8子宏塊的重構(gòu)數(shù)據(jù),重構(gòu)的數(shù)據(jù)反饋給幀內(nèi)預(yù)測模塊,進行下一個8x8子宏塊的預(yù)測。
2.整個模塊由一個狀態(tài)機實現(xiàn),狀態(tài)轉(zhuǎn)移圖如下所示:
stidle為復(fù)位時的空閑狀態(tài),等待使能信號有效。streceive是數(shù)據(jù)接收狀態(tài),當使能信號有效時接收8*8塊的殘差數(shù)據(jù)。stread、stline和stdefer狀態(tài)時,讀取8*8塊的一行數(shù)據(jù),進行DCT水平變換,并將變換后的數(shù)據(jù)存入ram中。stread1、stvertical和stdefer1狀態(tài)讀取8*8塊的一列數(shù)據(jù),進行DCT垂直變換,并將變換后數(shù)據(jù)存入ram。stread2、stquant和stdefer2狀態(tài)開始對數(shù)據(jù)量化,量化后的數(shù)據(jù)通過dataout信號輸出。stread3、stvertical1和stdefer3狀態(tài)對數(shù)據(jù)進行反DCT垂直變換的狀態(tài)。sttransmit狀態(tài)下輸出量化后的數(shù)據(jù)。
仿真結(jié)果如下圖所示:
圖3-9中是xAVS算法中某一8×8子塊的重構(gòu)數(shù)據(jù),圖3-10是在ModelSim SE 6.2b環(huán)境下RDQIIR模塊的仿真結(jié)果,重構(gòu)數(shù)據(jù)從端口dina_sun_top_o輸出。二者結(jié)果完全一致,說明RDQIIR模塊符合算法要求。
綜合后資源占用如下圖所示:
3.3 熵編碼模塊
1. 功能描述
熵編碼主要分為zig-zag掃描、游程編碼、碼字計算、碼表切換、指數(shù)哥倫布編碼和碼流輸出共6個子模塊。整個熵編碼部分需要3塊RAM,2塊ROM存儲器。RAM1接收量化系數(shù)矩陣,經(jīng)zig-zag掃描后的(run,level)對存儲在RAM2中,RAM3暫存指數(shù)哥倫布編碼后數(shù)據(jù);ROM1用于存放優(yōu)化后的碼表,ROM2用于存放逃逸事件中用到的RefAbsLevel_T。
stidle表示狀態(tài)機處于空閑狀態(tài)。streceive狀態(tài)按照zig_zag掃描順序接收8×8塊亮度系數(shù)。strle完成游程編碼得到( run , level )對。sttable狀態(tài)利用run和level聯(lián)合查表得到碼字,并完成指數(shù)哥倫布編碼。ststream對碼字進行整理并輸出。
對一個8×8子宏塊熵編碼進行驗證,圖3-14內(nèi)存1中自地址0x00E90068起存放的是由參考軟件xAVS編碼得到的碼流,圖3-15 ModelSim SE 6.2b仿真得到的碼流由端口dataout輸出。經(jīng)過比較,二者輸出結(jié)果一致,說明本設(shè)計功能符合標準算法要求。
通過輸入不同的量化系數(shù)矩陣觀察仿真波形,輸出的碼流信息與AVS參考軟件輸出的結(jié)果一致。經(jīng)仿真驗證,本設(shè)計正確且資源利用效率高。時鐘最高頻率達到130MHz,可用于高分辨率實時AVS編碼器中。
第四節(jié) 綜合驗證
本設(shè)計使用VHDL 硬件描述語言進行實現(xiàn),Xilinx ISE 進行綜合,Modelsim仿真,器件選用Xilinx 公司的xc2vp30-6ff896,最高工作頻率110MHZ 情況下,使用的資源如下圖所示。
利用編解碼軟件截取一個宏塊的數(shù)據(jù)作為參考數(shù)據(jù)輸入,使用ISE綜合,Modelsim進行仿真, 對一個宏塊的驗證如下圖所示:
datain_mb為輸入的一個宏塊數(shù)據(jù), datain_u5_top_o的輸出是一個宏塊編碼后的碼流。從圖中數(shù)據(jù)可以看出,輸出結(jié)果一致,說明本設(shè)計符合編碼器標準要求。
CIF分辨率,4:2:0圖像格式,若達到25幀/s實時圖像播放的要求,100MHz的頻率下,處理一個宏塊所需要的周期限定在N==10101內(nèi),本設(shè)計在100MHz的頻率下,用Modelsim仿真一個宏塊的周期大約為7000,完全滿足實時要求。
第五節(jié) 展望
本設(shè)計實現(xiàn)了AVS全I幀的編碼器,CIF分辨率,4:2:0圖像格式下能達到實時處理的要求。進一步的工作可以對程序優(yōu)化,提高處理速度,同時還可以加入P幀和B幀的編碼,從而進一步提高編碼效率。
評論