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