,,
(東北大學 信息科學與工程學院,沈陽 110819)
基于FPGA開發(fā)平臺的H.264視頻編碼系統(tǒng)設計*
李貞妮,李晶皎,榮超群
(東北大學 信息科學與工程學院,沈陽 110819)
針對傳統(tǒng)基于嵌入式平臺或DSP構建的H.264編碼系統(tǒng)編碼性能差,可擴展性低的缺點,提出基于FPGA開發(fā)平臺設計的H.264視頻編碼SoC系統(tǒng)。本文主要介紹了其中最重要的熵編碼模塊。實驗結果表明,與傳統(tǒng)的基于嵌入式處理器的編碼系統(tǒng)相比,基于FPGA開發(fā)平臺的編碼系統(tǒng)可以實現(xiàn)視頻采集、實時編碼和存儲,編碼后視頻播放流暢,無數(shù)據(jù)丟失或數(shù)據(jù)出錯等情況,系統(tǒng)各項功能運行良好,并且系統(tǒng)具有很好的可移植性與可配置性,占用資源少、速度快、具有廣泛的應用前景。
FPGA;SoC;H.264;熵編碼;Zynq
H.264以其優(yōu)異的性能在實時網絡視頻通信、數(shù)字廣播電視及高清視頻存儲播放等方面獲得廣泛應用,其目標是高視頻分辨率,提高圖像質量,并能夠覆蓋所有低帶寬和高帶寬的應用[1]。但是由于H.264編碼算法比較復雜、計算量大,需要處理的數(shù)據(jù)量也比較大,因此基于傳統(tǒng)的嵌入式處理器平臺所實現(xiàn)的H.264編碼系統(tǒng),其主要核心算法依然通過軟件實現(xiàn),編碼系統(tǒng)性能較差,很難達到高實時性的要求。而基于專用編碼芯片或視頻編碼DSP所實現(xiàn)的編碼系統(tǒng),雖然編碼性能較好,但系統(tǒng)接口和功能固定,可升級性和可擴展性較差。
因此,本文提出基于FPGA平臺的H.264編碼系統(tǒng)設計方案,利用FPGA平臺,通過設計構建基于片上系統(tǒng)(System on Chip,SoC)的完整的H.264編碼系統(tǒng),其編碼性能高,可編程性強,彌補了上述編碼系統(tǒng)的不足。
SoC是系統(tǒng)級芯片的簡稱,系統(tǒng)不僅包含了處理器內核、存儲器等硬件系統(tǒng),而且還含有相應的嵌入式軟件,是一個真正的軟、硬件均具備的完整體系。利用SoC設計方法可以將一個復雜的系統(tǒng)集成到單一芯片中,并具有低功耗、低成本及高速性的特點。與利用ASIC實現(xiàn)的SoC相比,利用FPGA實現(xiàn)的SoC具有可配置性的特點,因此具有更好的可擴展性和可移植性。[2-3]
Zynq-7000系列是Xilinx公司提出的一款高性能和低功耗的處理器平臺,是靈活和可擴展的解決方案。Zynq-7000 AP SoC平臺采用ARM+FPGA的體系結構。Zynq-7000系列包含了完整的ARM處理子系統(tǒng),每一顆Zynq-7000系列的處理器都包含了雙核的Cortex-A9處理器,而且處理器子系統(tǒng)中集成了內存控制器和大量的外設,使Cortex-A9的核在Zynq-7000中完全獨立于可編程邏輯單元。另外,可編程邏輯部分緊密地與ARM處理單元相結合。FPGA用于擴展子系統(tǒng),具有豐富的擴展能力,有超過3 000個內部互連,連接資源非常豐富,可提供100 Gb/s以上的內部帶寬。
本文提出的H.264編碼系統(tǒng)在結構設計上分為三個層次,分別為SoC系統(tǒng)及外設硬件設計、Linux對外設的驅動,以及Linux下的系統(tǒng)應用軟件設計。
SoC系統(tǒng)及外設硬件設計主要完成基于ARM Cortex-A9硬核的SoC系統(tǒng)的搭建,以及各處理模塊或接口模塊與外設器件的連接。Linux對外設的驅動主要完成的是對底層模塊的驅動和訪問。系統(tǒng)應用軟件設計是在底層模塊的驅動下實現(xiàn)各模塊之間的數(shù)據(jù)傳輸,并編寫QT GUI界面。系統(tǒng)結構設計圖如圖1所示。

圖1 H.264編碼系統(tǒng)系統(tǒng)結構圖
本文提出了一種將H.264編碼算法作為IP核的設計方法,也是基于FPGA的H.264編碼系統(tǒng)的SoC設計的核心部分。依據(jù)H.264的編碼框架,采用模塊化設計方式,根據(jù)具體的數(shù)據(jù)流向將H.264幀內編碼IP核劃分為如下具體模塊:幀內亮度預測模塊(Intra4×4)、幀內色度預測模塊(Intra8×8Chroma)、整數(shù)DCT變換模塊(DCT)、哈達瑪變換模塊(DCHadamard)、量化模塊(Quantisation)、逆整數(shù)DCT變換(iDCT)、逆量化模塊(deQuantisation)、CALVC熵編碼(CALVC)、重建模塊(Reconstruction)、位轉字節(jié)模塊等。同時,AXI Stream接口和存儲RAM數(shù)據(jù)寬度為32位,因而總線接口數(shù)據(jù)寬度也限制為32位。H.264編碼IP核設計框架圖如圖2所示,后面主要討論熵編碼模塊的設計實現(xiàn)。
3.1 熵編碼模塊的設計實現(xiàn)
CALVC熵編碼模塊是本設計的核心內容,為了使熵編碼處理速度更快,采用將殘差數(shù)據(jù)進行逆Zigzag掃描的方法。在CALVC熵編碼模塊外需要一個RAM來存儲一行40個宏塊的NC(Number Current)值,這里選取的RAM大小為512×5位。而在CALVC熵編碼模塊內部建立含有8個5位寄存器的寄存器組,來分別存儲左側亮度宏塊和色度宏塊的NC值。在整個編碼模塊中,首先要獲得的是統(tǒng)計信息,即編碼一個4×4塊前先得到該塊的非零系數(shù)數(shù)目和拖尾系數(shù)數(shù)目,同時也需要獲得計算后的NC值,用來判斷查找表。

圖2 H.264編碼IP核設計框架圖
經過16個時鐘周期,經過逆Zigzag掃描后的4×4塊系數(shù)串行讀入到CALVC編碼器的寄存器中。與此過程中,幅值計數(shù)器分別判斷輸入的系數(shù)值是0還是非0值。如果輸入的系數(shù)是非0值,則存入到幅值寄存器中。在此同時,拖尾系數(shù)計數(shù)器、非零系數(shù)計數(shù)器和零值個數(shù)計數(shù)器將在每讀入一個系數(shù)時更新一次。16個時鐘周期掃描結束后,將根據(jù)查表序號寄存器獲得查找表的地址,然后輸出查表后得到的碼字。
熵編碼模塊主要劃分為如下小模塊:統(tǒng)計模塊、NC計算模塊、編碼coeff_token、編碼trailingone_sign、編碼levels和編碼totalzeros。由于待編碼系數(shù)數(shù)據(jù)塊有4×4和2×2兩種,輸入的數(shù)據(jù)數(shù)有16、15、4三種情況,統(tǒng)計模塊通過計數(shù)輸入的有效數(shù)據(jù)數(shù)目maxcoeffs來判定當前處理的是4×4塊還是2×2塊。如果maxcoeffs為4,則當前處理的是2×2塊,那么在對coeff_token和totalzeros進行編碼時,需要選擇直流編碼表格。
計算模塊根據(jù)當前4×4塊的位置確定使用NC的來源,計算結果暫存在NC寄存器中。coeff_token的碼字從4個變成表和一個定長表中獲得,totalcoeffs和trailingones是表的索引。如果使用H.264的標準表,碼字最長為16位,在構建碼表時需要設計數(shù)據(jù)位數(shù)為16位的ROM區(qū),會浪費較多的資源。通過對4個變長表進行研究,發(fā)現(xiàn)碼字的構成都是若干個0作為前綴,后綴為“有意義”的碼字,而后綴長度均不超過6位。因此,本文對原有的碼表進行了改造。并且,為了減少邏輯資源,用判斷NC高位是否為零代替判斷NC的取值范圍。trailingone_sign編碼碼字由統(tǒng)計模塊完成,碼字的長度等于trailingone。totalzeros的編碼通過查表完成,同樣為了節(jié)省硬件資源,對該碼表進行了精簡改造。

圖3 CAVLC熵編碼模塊仿真圖
用查表法計算Exp-Golumb熵編碼,會占用較多的硬件資源。通過歸納總結Exp-Golumb熵編碼的編碼規(guī)律,通過使用構造碼字的方式計算碼字。對于ue(v),設定編碼后碼字的比特串格式為“前綴+后綴”,從而有:
① 后綴=codeNum+1。如codeNum=3,則后綴值為4,后綴的比特串為100。
② 前綴的比特數(shù)較后綴的比特數(shù)少1,且前綴的各位比特為0,如codeNum=3,則最終編碼所得的比特串為00100。

表1 語法元素值與codeNum關系
對于se(v),則按照表1進行轉換 ,其中Ceil()函數(shù)表示向上取整。
① 語法元素值為負數(shù),則乘2取反,轉換成 “;”。
② 語法元素值為正數(shù),則乘2減1,轉換成“。”。
然后按ue(v)編碼規(guī)則進行編碼。
因而,對于16位的有符號語法元素signNum[15:0],若最高位為0,則語法元素值為正,那么后綴suffix=signNum×2-1+1=signNum×2,通過右移1位完成;若最高位為1,則語法元素值為負,那么后綴suffix=-signNum×2+1, signNum的負值使用減法器完成,將結果右移1位,并將最低位置1。得到后綴suffix后,再確定碼字的長度codelenth,并將高位補零。碼字長度的確定方法如下:碼字的長度一定是奇數(shù),而且是后綴長度suffixlenth的兩倍加1。通過判斷suffix高位零的個數(shù)就可以得到suffixlenth。如果suffix[15:1]均為零,那么suffix只可能是0或者1,因而suffixlenth=1,沒有前綴,codelenth=1;如果suffix[15:2]均為零,那么suffix只可能是2、3,因而suffixlenth=2, codelenth=3;其他高位為零的判斷情況類似。高位為零的判斷使用優(yōu)先級選擇器。
4.1 熵編碼模塊的仿真測試結果
針對實現(xiàn)的熵編碼模塊,使用ModelSim 10.0a對其進行功能仿真,并使用Xilinx ISE測試模塊的最大工作頻率Fmax。
根據(jù)表1可知,0的有符號Exp-Golumb熵編碼后的碼字是1’b1,;1編碼后的碼字是3’b010,碼字長度為3;-1編碼后的碼字是3’b011,碼字長度為3;2編碼后的碼字是5’b00100,碼字長度為5;-2編碼后的碼字是5’b00101,碼字長度為5。Exp-Golumb熵編碼仿真圖如圖4所示。

圖4 ExpGolumb熵編碼模塊仿真圖
4.2 H.264編碼系統(tǒng)的性能測試結果
測試采用的硬件開發(fā)平臺為FPGA Zynq-7000,開發(fā)環(huán)境為Xilinx ISE 14.4 (64位)。使用Xilinx XPS (Xilinx Platform Studio) 構建SoC系統(tǒng),將H.264 編碼 IP核以及HDMI控制IP核添加到SoC上。為了比較準確地得到測試數(shù)據(jù),系統(tǒng)并非實時采集和編碼,而是采集完一定幀數(shù)后再進行編碼過程。同時,由于所實現(xiàn)的編碼系統(tǒng)只針對分辨率為640×480的視頻,業(yè)內并無這樣分辨率的標準測試視頻,因而無法將本編碼系統(tǒng)與其他編碼系統(tǒng)直接進行對比測試。為了解決該問題,本文提出采用宏塊編碼速度,即以宏塊為單位來考慮編碼系統(tǒng)的性能。宏塊編碼速度MBencodespeed的定義如下:
MBencodespeed=MBtotal/t=Frametotal×MBnum/t
(1)
其中,MBtotal是編碼宏塊總數(shù),F(xiàn)rametotal是編碼幀總數(shù),而MBnum是編碼一幀中宏塊總數(shù)。MBencodespeed的單位是宏塊每秒(mbps)。
為了測試系統(tǒng)的編碼性能,在設定QP=28的前提下,使用編碼系統(tǒng)對不同場景進行多次編碼,并分別計算編碼速度、壓縮比以及PNSR,以確定編碼效率。對比測試對象為在ARM926EJ-S平臺實現(xiàn)的H.264編碼系統(tǒng),QP=28。在關閉QT界面下只進行編碼測試,編碼速度對比測試結果如表2所列。

表2 編碼速度對比測試表
可知本系統(tǒng)的平均編碼速度能夠達到21.69 fps(26 030 mbps),是ARM926EJ-S平臺的88.9倍。由于本系統(tǒng)只實現(xiàn)幀內預測編碼,并沒有實現(xiàn)幀間預測,因而本系統(tǒng)在壓縮性能上和ARM926EJ-S平臺仍有一定差距,可通過后續(xù)添加幀間預測模塊來改善。編碼后視頻Y分量、Cr和Cb分量的平均PSNR分別達到均36.92 dB、39.59 dB和38.06 dB,編碼后視頻質量良好。

[1] 羅軍,黃啟俊,常勝,等. H.264中整數(shù)變換與量化的FPGA實現(xiàn)[J].中國圖像圖形學報,2011,16(5):740-745.
[2] L Pei, Z Jian.A high reliable SoC on-board computer based on Leon3[J].2012 IEEE International Conference on Science and Automation Engineering(SCAE 2011),2012(1):360-363.
[3] H ChunMing, W ChienMing, Y Chih-Chyau, et al.Programmable System-on-Chip (SoC) for silicon prototyping[J].IEEE Transactions on Industrial Electronics, 2011,58(3): 830-838.
H.264EncodingSystemDesignBasedonFPGAPlatform
LiZhenni,LiJingjiao,RongChaoqun
(College of Information Science and Engineering,Northeastern University,Shenyang 110819,China)
The H.264 encoding system based on the traditional embedded developing platform has many disadvantages such as has low encoding performance,low extensibility and so on.In order to solve the problems,the H.264 video encoding SoC system based on FPGA development platform design is proposed.The most important module is the entropy encoding module in the system.The experiment results indicate that,the encoding system can realize the video collecting,encoding,and storage comparing with the H.264 encoding system based on the traditional embedded developing platform.After encoding,the video plays smoothly,without data missing or errors.Furthermore,the system has good portability and configurability,therefore it has a broad application prospects.
FPGA;SoC;H.264;entropy encoding;Zynq
國家自然科學基金資助項目(61370153)。
TP391.41
A
2017-06-07)