《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 設計應用 > 基于FPGA的高清AVS熵編碼硬件設計
基于FPGA的高清AVS熵編碼硬件設計
來源:電子技術應用2014年第2期
張貞雷,王祖強,蔣 霞,李文軍
(山東大學 信息科學與工程學院,山東 濟南250100)
摘要: 為實現高清AVS熵編碼硬件設計,通過對算法模塊進行分析,將碼表切換、碼字計算和指數哥倫布編碼設計成流水線并行處理單元。利用并行zig-zag掃描,加快了處理速度。同時采用組合邏輯實現碼表查找,設計碼長確定器,節(jié)省了硬件資源。
中圖分類號: TN919.8
文獻標識碼: A
文章編號: 0258-7998(2014)02-0042-04
FPGA-based hardware design of HD entropy coding in AVS
Zhang Zhenlei,Wang Zuqiang,Jiang Xia,Li Wenjun
School of Information Science and Engineering, Shandong University, Ji′nan 250100,China
Abstract: To implement hardware design of HD AVS entropy coding, through analysis of the algorithm module, code table switching, computing of codeword and exponential-Golomb encoding are designed to pipeline processing unit. Parallel zig-zag scan is taken to accelerate the speed of processing. At the same time, combinational logic which implements code table switching and code length determiner is taken to save the hareware resources.
Key words : AVS;entropy encoding;HD;pipeline;code length determiner

    音視頻編碼標準AVS(Audio Video coding Standard)是我國具備自主知產權的第二代信源編碼標準[1]。AVS標準在獲得高編碼效率的同時降低了實現的復雜度[2]。AVS預測殘差系數首先經過整數DCT變換和量化,量化器輸出是一個包含少數非零系數和大量零系數的矩陣,在熵編碼之前必須進行重排序,并對零系數進行有效的表示[3],因此要進行zig-zag掃描和游程編碼。之后的輸出是一個數組,用(run,level)表示,其中run表示非零系數之前的零的個數,level 表示非零系數的值。run、level之間存在很強的相關性,因此run、level共用一個可變長碼字進行編碼,這種編碼方式叫做二維可變長編碼[4]。
    由于AVS熵編碼運算復雜,費時較長,本文采取流水線設計方式,利用并行zig-zag掃描加快了編碼速度,并設計了碼長確定器,節(jié)省了硬件資源,完成高清AVS熵編碼硬件設計。
1 熵編碼硬件設計
    AVS熵編碼硬件設計包括量化數據輸入、zig-zag掃描、游程編碼、碼表切換、組合邏輯查找、指數哥倫布編碼和碼流輸出7個模塊,電路框圖如圖1所示。

1.1 并行zig-zag掃描
    首先將量化系數輸入到Ram0中,一個時鐘輸入8個,因此對于一個8×8的矩陣,只需要8個時鐘就可以完成輸入。然后按圖2所示存入相應的Ram0地址,圖中的數字代表AVS標準中規(guī)定的zig-zag掃描的順序。
    與傳統(tǒng)的MPEG/H.26L的VLC不同,在AVS中,采用zig-zag掃描的系數處理順序,這種掃描順序更易遵循level信息的變化[5]。本文采用并行zig-zag掃描,如圖3所示。一個時鐘周期內讀出4個量化系數Out0、Out1、Out2、Out3,并且Ram0中的數據按圖3括號里的數字所代表的方向順序移動一次。例如表中的4(0)、5(1)分別表示在時鐘沿到來時4號地址的數據移動到0號地址,5號地址的數據移動到1號地址。對于8×8塊,最多需要16個時鐘就可以完成掃描。與以往文獻[6]相比,本設計將掃描時間減少了一半,加快了處理速度。
1.2 游程編碼
    本設計中的并行zig-zag掃描有可能在一個時鐘內讀出4組(run,level),因此在存儲游程編碼輸出時利用了4個深度為16的Ram,結構框圖如圖4所示。

    圖4中的“掃描結果判斷邏輯”的實現方法:對掃描結果Out0~Out3進行非零判斷。為方便描述,規(guī)定若掃描結果不為0,則用1表示,否則用0表示,因此Out0~Out3的結果可以描述為0000~1111。定義變量num,用來表示兩個level之間的0的個數,初始化為0。掃描結果的存儲順序是先存Ram1~Ram4的0號地址,再存Ram1~Ram4的1號地址,依次存儲。例如,若掃描結果為0100,則令run0=num+1,level0=Out1,存儲(run0,level0),并令num=2。若掃描結果為1011,令run0=num, level0=Out0;run1=1,level1=Out2;run2=0,level2=Out3,依次存儲(run0,level0)、(run1,level1)、(run2,level2),并令num=0。
1.3 流水線設計
    流水線技術的本質是把一個很大的總運算單元劃分成多個獨立的子運算單元,某一個時間段內各個子單元可以并行工作,從而提高數據處理速度。
    本設計中將碼表切換、組合邏輯查找和指數哥倫布編碼設計成流水線結構,同時這種硬件結構也節(jié)省了大量存儲中間結果所需要的空間。流水線結構如圖5所示,圖中的1~5表示第1~5組(run,level)。
1.4 碼表切換模塊設計
    本模塊的功能是得到當前(run,level)組對應的碼表號。實現過程為:若前一組level的絕對值大于跳轉門限,則根據AVS標準中的碼表跳轉規(guī)則進行碼表切換,得到當前(run,level)組的碼表號tablenum,并更新跳轉門限;否則,碼表號tablenum不變,即當前組的碼表號是由上一組level的絕對值決定的。該硬件結構如圖6所示。1.5 組合邏輯查找

    編碼時從最后一組(run,level)開始,為節(jié)約存儲器資源,本文采取組合邏輯映射查表的方法,避免了訪問存儲器帶來的延遲[7]。該方法由run、level和碼表號tablenum組成查表索引,輸入到組合邏輯中,得到對應的碼字codenum。由于AVS熵編碼正常編碼部分對應的碼字是0~59(共60個),很多查表索引對應相同的碼字codenum,因此把相同的索引路徑合并,從而有效減少映射路徑,提高索引效率。例如由于表VLC0_Intra中(run,level)為(3,1)時所對應的碼字和表VLC1_Intra中(run,level)為(2,1)時所對應的碼字都是6,因此可將這兩條索引路徑合并,由同一條索引路徑映射出碼字。
1.6 指數哥倫布編碼
    在AVS標準中宏塊層以上的語法元素采用定長碼或0階指數哥倫布碼編碼[8]。殘差系數采用基于上下文的二維變長編碼,即對通過組合邏輯查找得到的碼字codenum進行0、1、2或3階指數哥倫布編碼,逃逸編碼則采用0或1階指數哥倫布編碼,在AVS標準中已經規(guī)定了每張碼表對應的指數哥倫布編碼的階數。圖7為產生階數K的硬件電路,其中flag為標志位,若該碼字為正常編碼,則flag為0;若為逃逸編碼,則flag為1。

1.7 碼長確定器和碼字輸出
    由于指數哥倫布編碼屬于變長編碼,因此在編碼時指數哥倫布碼長度的確定是影響整個編碼器效率的關鍵問題[9]。若要準確地輸出,就必須確定出碼字的具體位數,以往文獻[10]中是另外開辟存儲空間來存儲每一個碼字的位數。本設計使用了碼長確定器結構,直接從讀出的碼字進行位數的判斷,從而節(jié)省了存儲空間。
    由于碼字的后綴部分不超過16 bit,因此該結構將高16位輸入分為兩組進行檢測。“或門”將高8位輸入進行“或”運算,用來檢測碼字高8位中是否含有1。在MUX中,如果“或門”的輸出為1,則選擇Code[15:8]作為輸入;否則,選取Code[7:0]。編碼器從輸入的最高位開始逐位檢查是否為1,若為1則輸出編碼值。如果最高位為1,則輸出111;如果次高位為1,則輸出110,依次類推,R[2:0]依次減1輸出。如果“或門”的輸出為1,則選擇器對R[2:0]進行加8操作,否則R[2:0]的值不變。選擇器的輸出M就是首1的具體位置。根據式(3)就可以得到碼字的長度Length。碼長確定器的硬件結構如圖8所示。
    在碼字輸出時,熵編碼將各種信息以二進制的形式逐個比特寫入碼流,最終以字節(jié)為單位進行封裝,這樣會增加運算時間,使得編碼效率極低[10]。本設計中采用雙字節(jié)為單位寫入碼流,極大地加快了熵編碼速度。實現方法:將完成編碼的碼字Code存儲到寬度為16的Ram中,設置一個32 bit的碼流緩沖器,變量pos表示碼流緩沖器中有效碼字的位置,初始值為31,在有效碼字數大于或者等于16(即pos<16)時,碼流緩沖器左移輸出16 bit數據Codestream,然后pos加16。變量Length表示輸入到緩沖器中碼字的位數。輸出模塊的硬件結構如圖9所示。

 

 

2 驗證、實現結果及仿真分析
2.1 驗證

    驗證思路是將AVS參考軟件產生的測試向量作為激勵,輸入到熵編碼模塊,然后將其結果與軟件編碼的結果進行比對,從而驗證熵編碼模塊設計的正確性。本設計中參考軟件產生的測試向量為2,0,2, 0,1,0,11,5,2,
7,0,1,0,0,2,8,4,0,2,0,0,1,1,0,1,0&hellip;&hellip;0共64個數據。熵編碼模塊的仿真輸出結果如圖10所示。

    通過觀察熵編碼的仿真輸出結果與AVS參考軟件的輸出結果是一致的,從而驗證了本設計的功能。
2.2 硬件實現結果
    硬件模塊采用Verilog HDL硬件描述語言,實現了AVS熵編碼模塊的硬件設計,使用Quartus II 8.0進行綜合與仿真,目標器件是Cyclone II系列的EP2C35F672C8。結果表明約消耗38K邏輯門,工作頻率約為120 MHz。在所有量化系數有50%不為零的情況下(實際中不為零的量化系數所占比例遠低于50%),完成一個8&times;8塊的數據編碼所需的時鐘周期為48,即所需時間為4&times;10-7 s。對于高清編碼(1 080p,30 f/s,視頻格式4:2:2),要求完成一個8&times;8塊所需時間為5&times;10-7 s,因此完全滿足高清編碼的要求。
2.3 仿真分析
    本設計的整體仿真結果如圖11所示。

    從圖11中可以看出,本設計一個時鐘內讀出4個量化數據Out0~Out3,并且根據Out0~Out3中非零個數完成游程編碼,完成了本文中的并行zig-zag掃描的設計目標;碼表切換、組合邏輯查找和指數哥倫布編碼按照本文設計的流水線結構進行。此外,碼長確定器的輸出Length正確,完成了本文中碼長確定器的設計目標,可直接從讀出的碼字進行位數的判斷。
    本文采用組合邏輯進行碼表查找,設計了碼長確定器,節(jié)省了硬件資源;采用流水線設計和并行zig-zag掃描,加快了熵編碼的處理速度,編碼性能達到了高清視頻編碼的要求,對AVS高清視頻編碼芯片設計具有一定的參考意義。
參考文獻
[1] AVS工作組.信息技術先進音視頻編碼:視頻[M].北京:中國標準出版社,2006.
[2] 李文軍,王祖強,徐輝.基于FPGA的AVS幀內預測電路設計[J].電子技術應用,2013,39(8):50-53.
[3] 劉寧.基于DSP的DCT變換和量化技術研究[D].浙江:浙江大學,2007.
[4] Wang Qiang,Zhao Debin,Gao Wen.Context-based 2D-VLC entropy coder in AVS video coding standard[J].Journal of Computer Science and Technology,2006,21(3):315-322.
[5] Xu Long,Deng Lei,Ji Xingyang,et al.Hardware architecture for AVS entropy encoder[C].Consumer Electronics (ICCE),2008.
[6] 劉錦陽.基于FPGA的AVS實時高清視頻編碼器的研究與實現[D].上海:上海大學,2009.
[7] 黃玄,陳杰,李霞,等.AVS高清視頻變長解碼器算法與電路實現[J].微電子學與計算機,2009,26(1):76-80.
[8] 周小龍,王祖強,魏先政.AVS及H.264雙??勺冮L解碼器設計[J].計算機工程,2012,38(12):222-224.
[9] 王小東.AVS視頻編碼器的熵編碼與插值部分的FPGA設計與實現[D].濟南:山東大學,2011.
[10] 白玉婷,張剛.AVS熵編碼的FPGA實現[J].軟件,2012,33(2):102-104.

此內容為AET網站原創(chuàng),未經授權禁止轉載。