文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2016.11.005
中文引用格式: 陳新偉,孟祥剛,高騰,等. H.264中逆量化逆變換的高層次綜合實現[J].電子技術應用,2016,42(11):25-28.
英文引用格式: Chen Xinwei,Meng Xianggang,Gao Teng,et al. High level synthesis implementation of inverse quantification and inverse transformation in H.264[J].Application of Electronic Technique,2016,42(11):25-28.
0 引言
H.264標準自公布以來,在視頻會議、數字電視、視頻監控等領域中得到廣泛的使用。新一代視頻壓縮編碼標準H.264/AVC在以往標準的基礎上做了很大的改進,從而具有了很高的壓縮性能和網絡自適應能力[1]。然而高壓縮性能是以較高的算法復雜度為代價,尤其是變換與量化部分,其RTL代碼設計與在FPGA平臺上的實現也變得更為復雜。高層次綜合技術相對于傳統的RTL級設計能有效地降低硬件的設計復雜度,縮短設計周期。因其在算法硬件模塊開發上的高效性,高層次綜合工具已被廣泛應用于復雜硬件項目開發中。
本文的設計在H.264標準基礎上,采用高層次綜合技術,利用 C語言進行算法描述,通過高層次綜合過程及其綜合優化進行硬件生成,完成符合設計需求的硬件模塊。
1 高層次綜合技術
高層次綜合技術可以將高級編程語言(C/C++等)的算法描述綜合成RTL級代碼,完成算法級到寄存器傳輸級的轉換。高層次綜合工具可以完成各個任務的寄存器分配、任務調度與綁定、狀態機生成等功能。基于Vivado_HLS高層次綜合的開發流程如圖1所示。首先將設計完成的C/C++算法實現代碼在Vivado_HLS中進行編譯,檢查語法錯誤并驗證代碼的功能是否正確;之后,在增加相應優化設置的基礎上進行綜合;綜合完成后進行RTL協同仿真,驗證硬件功能正確性及時序需求;如果不能滿足設計需求,則可重新更改優化條件進行綜合。得到正確的RTL代碼后可將其封裝成IP核或直接導出RTL代碼繼續通過Vivado或者ISE等RTL綜合工具完成傳統RTL設計流程[2]。
相對于C/C++編程語言標準,Vivado_HLS高層次綜合工具支持其大部分語法,但高層次綜合工具的輸出針對于具體硬件電路的設計[3],因此,需要系統級支持的動態內存分配和二級指針等功能不能通過高層次綜合工具進行綜合,算法設計中需要避免此類語法和底層函數的應用。
變換與量化是根據圖像像素之間的相關性來對數據進行壓縮,不同量化參數的設置可以改變圖像像素的動態取值范圍。在H.264標準中對直流系數采用的是哈達瑪(Hardmard)變換,對殘差系數采用的是離散余弦變換(DCT),并且通過4×4分塊的DCT變換降低圖像的塊效應[4]。量化部分采用的是標量量化,采用移位方法進行數據處理,從而避免除法與浮點數運算。
變換與量化是兩個相互獨立的過程,但在H.264中,將兩個過程合并在一起進行。其優勢在于將DCT中的乘法運算提取出來合并到量化過程中,于是變換部分只進行整數的加法與移位運算,而乘法運算都在量化部分實現,從而減少運算量。因此逆變換逆量化模塊實現變換與量化的逆過程。
H.264解碼器中的逆變換逆量化實現流程如圖2所示,對于含有直流(DC)分量的數據,先對其中的DC系數進行逆哈達瑪變換,然后對DC系數與交流(AC)系數進行逆量化,然后對DC與AC系數進行重組,對重組后的數據進行逆變換(IDCT)。
對于AC系數,逆量化方法如式(1)所示:
對于幀內16×16的亮度子塊的DC系數,逆量化方法如式(2)所示:
其中,QP表示量化系數,QP的取值直接影響視頻壓縮比,QP取值越大,視頻壓縮的壓縮比越大,但信噪比會相應降低。
3 基于高層次綜合的設計
3.1 算法實現
逆變換逆量化環節在解碼器中所占的比重較大,同時該計算模塊在解碼過程中被頻繁調用,而逆量化部分大量的乘法運算需要消耗大量的硬件資源。本設計的目標是在資源消耗量控制在一定限度的前提下提供盡可能高的數據吞吐量。
為了提高數據處理速度,達到硬件實現中對亮度信號(Luma)與色度信號(Chroma)的逆量化逆變換的并行執行。算法實現過程中分別為其設計單獨的C函數并采用獨立接口。輸入數據包括幀內16×16亮度塊、幀內4×4亮度塊以及2×2色度塊,根據輸入的數據類型選擇相應的逆量化方法。
對于算法中的逆變換部分,將二維數組的變換轉換成兩次一維變換:先對數據進行一次行變換,對行變換后的數據進行列變換。H.264逆量化逆變換算法實現偽代碼如算法1所示。對其中含有DC分量的數據,先進行逆哈達瑪變換,然后再分別對DC、AC系數進行逆量化;對于不含DC系數的數據則直接進行逆量化。最后對量化后的數據進行IDCT變換,輸出相應的數據。
算法 1 H.264逆量化逆變換的HLS設計
1:procedure IQIT
2: inverse_scan(data_in)
3: if(luma_intra_16X16)
4: i_hardmard4x4(luma_DC)
5: i_quantification (luma_DC’, luma_AC)
6: else if(chroma)
7: i_hardmard2x2(chroma_DC)
8: i_quantification(chroma_DC’, chroma_AC)
9: else
10: i_quantification (luma_AC)
11: IDCT4x4(i_quantified_data)
12:end procedure IQIT
3.2 高層次綜合優化
3.2.1 循環展開
對于C語言算法實現中的循環部分,默認狀態下循環體內的操作是順序執行的。為達到性能要求,在設計中的循環部分插入循環展開綜合指示指令(UNROLL),高層次綜合工具在綜合過程中會將循環展開成并行的結構,在以資源消耗升高為代價的前提下使得單位時間內執行的操作數得到提升[5]。
3.2.2 流水線優化
流水線優化主要針對一系列順序執行的任務,將其綜合成多級流水線結構,從而提高數據吞吐量。對于本文的算法實現,為了實現資源的充分利用并降低整體的計算延遲,在循環展開的基礎上,對相應模塊的頂層或合適的位置加入了流水線(PIPLINE)優化指令。
3.2.3 數組分割
設計中存在大量的數組運算,默認情況下這些數組在綜合中會使用成ROM或BRAM資源,由于ROM或BRAM一次能同時讀寫的數據個數有限,會造成運算過程中的延時[6]。因此,在以上兩種優化的基礎上,設計加入數組分割(ARRAY PARTATION)指令,從而指示高層次綜合工具將大型數組按輸入配置分割成多組小型數組,提升片上數據訪問速度,從而更好地配合數據計算的并行執行。
以上優化處理的選擇,遵循綜合后分析輸出結果,進行最直接優化的方法。循環展開目的在于增加循環內數據處理的并行度;流水線優化用以提升并行后數據處理的吞吐量;數組分割目的在于流水線增強后提升數據訪問能力。
4 實驗結果與分析
本設計所使用的高層次綜合平臺采用Xilinx Vivado_HLS 2014.4版本,目標FPGA器件為Virtex-7系列的xc7vx485tffg1761-2芯片,設置的時鐘約束條件為10 ns,算法實現采用C語言,目標輸出語言為Verilog。
經過不同優化方案后硬件模塊的資源占用與模塊執行的時鐘延時如圖3所示。
無優化時,FPGA片上各種資源消耗量均為最低,但模塊數據處理的時鐘延時確最高。因代碼的主體以循環為主,為了在速度上得到較大的提升,最直接的方法就是將代碼中的循環展開,實現對數據的并行處理。而圖3中循環展開部分為對代碼中的不同部分進行依次展開并得到綜合后的結果。
由于反掃描模塊在每個計算支路上都被采用,因此對反掃描進行循環展開有效地降低了模塊的時鐘延時數量,而沒有消耗更多的硬件資源。其原因歸結為反掃描部分只采用數據映射,因此其循環展開不消耗過多硬件卻使得映射并發的執行。而算法中除了反掃描部分所呈現的映射外,還存在多個循環結構實現的數據映射,對其進行同樣展開,結果與上文分析相同。
而對于luma反量化和chroma反量化部分,其計算單元主要以乘法為主,因此在進行循環展開后,DSP單元的消耗量有所升高。但兩個循環的展開只分別降低了1.1%和0.4%的延時。這是由于這兩個部分分別是多個數據通路中某個通路的一個中間單元,因此這兩個模塊的循環展開只是降低了單個通路上的時鐘延遲,但對于頂層模塊的總體時鐘延遲沒有產生足夠影響。然而這不代表這兩個部分的循環展開優化沒有作用,在后面的其他模塊展開后,這兩個模塊的優化會配合其他的優化而對數據通路的并行執行起到明顯的作用。
在以上優化的基礎上,對每個數據通路上都需要進行的IDCT模塊進行循環展開。C代碼描述算法中多個計算通路可以調用同一IDCT函數,然而在高層次綜合過程中,會將多個函數調用綜合為多個重復的相同功能模塊。因此在對IDCT模塊做循環展開后,時鐘延時數量得到了明顯降低,而IDCT模塊的主體是加減法和移位,因此循環展開后資源的消耗并沒有明顯增高。由于整個反量化和反變換模塊中,主要的計算消耗在于反量化模塊中的矩陣乘法,因此對矩陣乘法做循環展開,DSP單元的使用量產生大幅的提升。
對Choma數據反量化模塊的循環展開,相對于Luma數據的反量化循環展開,資源消耗增加了57%,相對于Luma數據處理部分的增加更加明顯,其原因歸結為Chroma數據的位寬較寬。相對于Luma數據反量化單元的展開,時鐘延遲方面得到了明顯的降低,多條數據通路的循環展開,使得整體模塊的計算時鐘延遲得到了降低,這一結果與上文對Luma數據反量化單元的循環展開分析結果相吻合。
最后對代碼中剩余部分的循環體進行相應的展開操作,對應圖中的全展開的數據結果,對整體時鐘延時的提升不明顯,硬件資源消耗略有升高。
循環的展開提高了數據處理的并行性,但是在硬件設計中數據路徑上的并行并不能使硬件處理性能得到最大提升,因此對設計中多處位置插入了流水線的優化,從圖中時鐘延時曲線可以看出,流水線的加入使得時鐘延遲得到成倍的縮減,FF和LUT的總量變化不大而DSP計算單元成倍增加——這是因為反量化部分的計算主體是乘法為主,而流水線的加入會強制打開循環結構,因此DSP數量急劇上升。
4 結論
本文采用高層次綜合硬件設計的方法,實現了H.264標準中反量化反變換部分的硬件部分設計。通過循環展開、流水線、數組分割優化方案的加入,大大降低了計算所需的時間,對硬件模塊的設計空間進行了探索。只對硬件模塊核心算法進行C語言代碼實現,從而得到RTL級硬件模塊輸出。極大地縮短了硬件設計的周期,提高了生產力。而且本文所呈現的設計思路不僅適用于本文所實現的反量化和反變換,同樣適用于其他各種硬件單元的設計。因此在未來的工作中,一方面將會繼續完成H.264中其他硬件單元的設計,實現整體H.264標準的硬件實現;另一方面,還會致力于各種復雜算法的高層次綜合實現與優化。
參考文獻
[1] FLEMING K,LIN C C,DAVE N,et al.H.264 decoder:A case study in multiple design points[C].MEMOCODE.IEEE,2008:165-174.
[2] 樊宗智,周煦林,劉彬.基于高層次綜合的JPEG編碼器設計[J].微電子學與計算機,2015,32(6):1-4.
[3] 何賓.Xilinx_FPGA權威設計指南-Vivado 2014集成開發環境[M].北京:電子工業出版社,2015,2:348-403.
[4] WANG T C,HUANG Y W,FANG H C,et al.Parallel 4x4 2d transform and inverse transform architecture for mpeg-4 avc/h.264[C].ISCAS,vol.2.IEEE,2003:II-800.
[5] Zhong Guanwen,Vanchinathan Venkataramani,Yun Liang,et al.Design space exploration of multiple loops on FPGAs using high level synthesis[C].2014 32nd IIEEE International Conference on Computer Design,Seoul,South Korea,2104:456-463.
[6] 張茉莉,楊海鋼,崔秀海,等.基于數組分塊的FPGA高級綜合編譯優化算法[J].計算機應用研究,2013,30(11):3349-3352.