文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.11.005
中文引用格式: 陳新偉,孟祥剛,高騰,等. H.264中逆量化逆變換的高層次綜合實現(xiàn)[J].電子技術(shù)應(yīng)用,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標(biāo)準(zhǔn)自公布以來,在視頻會議、數(shù)字電視、視頻監(jiān)控等領(lǐng)域中得到廣泛的使用。新一代視頻壓縮編碼標(biāo)準(zhǔn)H.264/AVC在以往標(biāo)準(zhǔn)的基礎(chǔ)上做了很大的改進(jìn),從而具有了很高的壓縮性能和網(wǎng)絡(luò)自適應(yīng)能力[1]。然而高壓縮性能是以較高的算法復(fù)雜度為代價,尤其是變換與量化部分,其RTL代碼設(shè)計與在FPGA平臺上的實現(xiàn)也變得更為復(fù)雜。高層次綜合技術(shù)相對于傳統(tǒng)的RTL級設(shè)計能有效地降低硬件的設(shè)計復(fù)雜度,縮短設(shè)計周期。因其在算法硬件模塊開發(fā)上的高效性,高層次綜合工具已被廣泛應(yīng)用于復(fù)雜硬件項目開發(fā)中。
本文的設(shè)計在H.264標(biāo)準(zhǔn)基礎(chǔ)上,采用高層次綜合技術(shù),利用 C語言進(jìn)行算法描述,通過高層次綜合過程及其綜合優(yōu)化進(jìn)行硬件生成,完成符合設(shè)計需求的硬件模塊。
1 高層次綜合技術(shù)
高層次綜合技術(shù)可以將高級編程語言(C/C++等)的算法描述綜合成RTL級代碼,完成算法級到寄存器傳輸級的轉(zhuǎn)換。高層次綜合工具可以完成各個任務(wù)的寄存器分配、任務(wù)調(diào)度與綁定、狀態(tài)機生成等功能?;赩ivado_HLS高層次綜合的開發(fā)流程如圖1所示。首先將設(shè)計完成的C/C++算法實現(xiàn)代碼在Vivado_HLS中進(jìn)行編譯,檢查語法錯誤并驗證代碼的功能是否正確;之后,在增加相應(yīng)優(yōu)化設(shè)置的基礎(chǔ)上進(jìn)行綜合;綜合完成后進(jìn)行RTL協(xié)同仿真,驗證硬件功能正確性及時序需求;如果不能滿足設(shè)計需求,則可重新更改優(yōu)化條件進(jìn)行綜合。得到正確的RTL代碼后可將其封裝成IP核或直接導(dǎo)出RTL代碼繼續(xù)通過Vivado或者ISE等RTL綜合工具完成傳統(tǒng)RTL設(shè)計流程[2]。
相對于C/C++編程語言標(biāo)準(zhǔn),Vivado_HLS高層次綜合工具支持其大部分語法,但高層次綜合工具的輸出針對于具體硬件電路的設(shè)計[3],因此,需要系統(tǒng)級支持的動態(tài)內(nèi)存分配和二級指針等功能不能通過高層次綜合工具進(jìn)行綜合,算法設(shè)計中需要避免此類語法和底層函數(shù)的應(yīng)用。
變換與量化是根據(jù)圖像像素之間的相關(guān)性來對數(shù)據(jù)進(jìn)行壓縮,不同量化參數(shù)的設(shè)置可以改變圖像像素的動態(tài)取值范圍。在H.264標(biāo)準(zhǔn)中對直流系數(shù)采用的是哈達(dá)瑪(Hardmard)變換,對殘差系數(shù)采用的是離散余弦變換(DCT),并且通過4×4分塊的DCT變換降低圖像的塊效應(yīng)[4]。量化部分采用的是標(biāo)量量化,采用移位方法進(jìn)行數(shù)據(jù)處理,從而避免除法與浮點數(shù)運算。
變換與量化是兩個相互獨立的過程,但在H.264中,將兩個過程合并在一起進(jìn)行。其優(yōu)勢在于將DCT中的乘法運算提取出來合并到量化過程中,于是變換部分只進(jìn)行整數(shù)的加法與移位運算,而乘法運算都在量化部分實現(xiàn),從而減少運算量。因此逆變換逆量化模塊實現(xiàn)變換與量化的逆過程。
H.264解碼器中的逆變換逆量化實現(xiàn)流程如圖2所示,對于含有直流(DC)分量的數(shù)據(jù),先對其中的DC系數(shù)進(jìn)行逆哈達(dá)瑪變換,然后對DC系數(shù)與交流(AC)系數(shù)進(jìn)行逆量化,然后對DC與AC系數(shù)進(jìn)行重組,對重組后的數(shù)據(jù)進(jìn)行逆變換(IDCT)。
對于AC系數(shù),逆量化方法如式(1)所示:
對于幀內(nèi)16×16的亮度子塊的DC系數(shù),逆量化方法如式(2)所示:
其中,QP表示量化系數(shù),QP的取值直接影響視頻壓縮比,QP取值越大,視頻壓縮的壓縮比越大,但信噪比會相應(yīng)降低。
3 基于高層次綜合的設(shè)計
3.1 算法實現(xiàn)
逆變換逆量化環(huán)節(jié)在解碼器中所占的比重較大,同時該計算模塊在解碼過程中被頻繁調(diào)用,而逆量化部分大量的乘法運算需要消耗大量的硬件資源。本設(shè)計的目標(biāo)是在資源消耗量控制在一定限度的前提下提供盡可能高的數(shù)據(jù)吞吐量。
為了提高數(shù)據(jù)處理速度,達(dá)到硬件實現(xiàn)中對亮度信號(Luma)與色度信號(Chroma)的逆量化逆變換的并行執(zhí)行。算法實現(xiàn)過程中分別為其設(shè)計單獨的C函數(shù)并采用獨立接口。輸入數(shù)據(jù)包括幀內(nèi)16×16亮度塊、幀內(nèi)4×4亮度塊以及2×2色度塊,根據(jù)輸入的數(shù)據(jù)類型選擇相應(yīng)的逆量化方法。
對于算法中的逆變換部分,將二維數(shù)組的變換轉(zhuǎn)換成兩次一維變換:先對數(shù)據(jù)進(jìn)行一次行變換,對行變換后的數(shù)據(jù)進(jìn)行列變換。H.264逆量化逆變換算法實現(xiàn)偽代碼如算法1所示。對其中含有DC分量的數(shù)據(jù),先進(jìn)行逆哈達(dá)瑪變換,然后再分別對DC、AC系數(shù)進(jìn)行逆量化;對于不含DC系數(shù)的數(shù)據(jù)則直接進(jìn)行逆量化。最后對量化后的數(shù)據(jù)進(jìn)行IDCT變換,輸出相應(yīng)的數(shù)據(jù)。
算法 1 H.264逆量化逆變換的HLS設(shè)計
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 高層次綜合優(yōu)化
3.2.1 循環(huán)展開
對于C語言算法實現(xiàn)中的循環(huán)部分,默認(rèn)狀態(tài)下循環(huán)體內(nèi)的操作是順序執(zhí)行的。為達(dá)到性能要求,在設(shè)計中的循環(huán)部分插入循環(huán)展開綜合指示指令(UNROLL),高層次綜合工具在綜合過程中會將循環(huán)展開成并行的結(jié)構(gòu),在以資源消耗升高為代價的前提下使得單位時間內(nèi)執(zhí)行的操作數(shù)得到提升[5]。
3.2.2 流水線優(yōu)化
流水線優(yōu)化主要針對一系列順序執(zhí)行的任務(wù),將其綜合成多級流水線結(jié)構(gòu),從而提高數(shù)據(jù)吞吐量。對于本文的算法實現(xiàn),為了實現(xiàn)資源的充分利用并降低整體的計算延遲,在循環(huán)展開的基礎(chǔ)上,對相應(yīng)模塊的頂層或合適的位置加入了流水線(PIPLINE)優(yōu)化指令。
3.2.3 數(shù)組分割
設(shè)計中存在大量的數(shù)組運算,默認(rèn)情況下這些數(shù)組在綜合中會使用成ROM或BRAM資源,由于ROM或BRAM一次能同時讀寫的數(shù)據(jù)個數(shù)有限,會造成運算過程中的延時[6]。因此,在以上兩種優(yōu)化的基礎(chǔ)上,設(shè)計加入數(shù)組分割(ARRAY PARTATION)指令,從而指示高層次綜合工具將大型數(shù)組按輸入配置分割成多組小型數(shù)組,提升片上數(shù)據(jù)訪問速度,從而更好地配合數(shù)據(jù)計算的并行執(zhí)行。
以上優(yōu)化處理的選擇,遵循綜合后分析輸出結(jié)果,進(jìn)行最直接優(yōu)化的方法。循環(huán)展開目的在于增加循環(huán)內(nèi)數(shù)據(jù)處理的并行度;流水線優(yōu)化用以提升并行后數(shù)據(jù)處理的吞吐量;數(shù)組分割目的在于流水線增強后提升數(shù)據(jù)訪問能力。
4 實驗結(jié)果與分析
本設(shè)計所使用的高層次綜合平臺采用Xilinx Vivado_HLS 2014.4版本,目標(biāo)FPGA器件為Virtex-7系列的xc7vx485tffg1761-2芯片,設(shè)置的時鐘約束條件為10 ns,算法實現(xiàn)采用C語言,目標(biāo)輸出語言為Verilog。
經(jīng)過不同優(yōu)化方案后硬件模塊的資源占用與模塊執(zhí)行的時鐘延時如圖3所示。
無優(yōu)化時,F(xiàn)PGA片上各種資源消耗量均為最低,但模塊數(shù)據(jù)處理的時鐘延時確最高。因代碼的主體以循環(huán)為主,為了在速度上得到較大的提升,最直接的方法就是將代碼中的循環(huán)展開,實現(xiàn)對數(shù)據(jù)的并行處理。而圖3中循環(huán)展開部分為對代碼中的不同部分進(jìn)行依次展開并得到綜合后的結(jié)果。
由于反掃描模塊在每個計算支路上都被采用,因此對反掃描進(jìn)行循環(huán)展開有效地降低了模塊的時鐘延時數(shù)量,而沒有消耗更多的硬件資源。其原因歸結(jié)為反掃描部分只采用數(shù)據(jù)映射,因此其循環(huán)展開不消耗過多硬件卻使得映射并發(fā)的執(zhí)行。而算法中除了反掃描部分所呈現(xiàn)的映射外,還存在多個循環(huán)結(jié)構(gòu)實現(xiàn)的數(shù)據(jù)映射,對其進(jìn)行同樣展開,結(jié)果與上文分析相同。
而對于luma反量化和chroma反量化部分,其計算單元主要以乘法為主,因此在進(jìn)行循環(huán)展開后,DSP單元的消耗量有所升高。但兩個循環(huán)的展開只分別降低了1.1%和0.4%的延時。這是由于這兩個部分分別是多個數(shù)據(jù)通路中某個通路的一個中間單元,因此這兩個模塊的循環(huán)展開只是降低了單個通路上的時鐘延遲,但對于頂層模塊的總體時鐘延遲沒有產(chǎn)生足夠影響。然而這不代表這兩個部分的循環(huán)展開優(yōu)化沒有作用,在后面的其他模塊展開后,這兩個模塊的優(yōu)化會配合其他的優(yōu)化而對數(shù)據(jù)通路的并行執(zhí)行起到明顯的作用。
在以上優(yōu)化的基礎(chǔ)上,對每個數(shù)據(jù)通路上都需要進(jìn)行的IDCT模塊進(jìn)行循環(huán)展開。C代碼描述算法中多個計算通路可以調(diào)用同一IDCT函數(shù),然而在高層次綜合過程中,會將多個函數(shù)調(diào)用綜合為多個重復(fù)的相同功能模塊。因此在對IDCT模塊做循環(huán)展開后,時鐘延時數(shù)量得到了明顯降低,而IDCT模塊的主體是加減法和移位,因此循環(huán)展開后資源的消耗并沒有明顯增高。由于整個反量化和反變換模塊中,主要的計算消耗在于反量化模塊中的矩陣乘法,因此對矩陣乘法做循環(huán)展開,DSP單元的使用量產(chǎn)生大幅的提升。
對Choma數(shù)據(jù)反量化模塊的循環(huán)展開,相對于Luma數(shù)據(jù)的反量化循環(huán)展開,資源消耗增加了57%,相對于Luma數(shù)據(jù)處理部分的增加更加明顯,其原因歸結(jié)為Chroma數(shù)據(jù)的位寬較寬。相對于Luma數(shù)據(jù)反量化單元的展開,時鐘延遲方面得到了明顯的降低,多條數(shù)據(jù)通路的循環(huán)展開,使得整體模塊的計算時鐘延遲得到了降低,這一結(jié)果與上文對Luma數(shù)據(jù)反量化單元的循環(huán)展開分析結(jié)果相吻合。
最后對代碼中剩余部分的循環(huán)體進(jìn)行相應(yīng)的展開操作,對應(yīng)圖中的全展開的數(shù)據(jù)結(jié)果,對整體時鐘延時的提升不明顯,硬件資源消耗略有升高。
循環(huán)的展開提高了數(shù)據(jù)處理的并行性,但是在硬件設(shè)計中數(shù)據(jù)路徑上的并行并不能使硬件處理性能得到最大提升,因此對設(shè)計中多處位置插入了流水線的優(yōu)化,從圖中時鐘延時曲線可以看出,流水線的加入使得時鐘延遲得到成倍的縮減,F(xiàn)F和LUT的總量變化不大而DSP計算單元成倍增加——這是因為反量化部分的計算主體是乘法為主,而流水線的加入會強制打開循環(huán)結(jié)構(gòu),因此DSP數(shù)量急劇上升。
4 結(jié)論
本文采用高層次綜合硬件設(shè)計的方法,實現(xiàn)了H.264標(biāo)準(zhǔn)中反量化反變換部分的硬件部分設(shè)計。通過循環(huán)展開、流水線、數(shù)組分割優(yōu)化方案的加入,大大降低了計算所需的時間,對硬件模塊的設(shè)計空間進(jìn)行了探索。只對硬件模塊核心算法進(jìn)行C語言代碼實現(xiàn),從而得到RTL級硬件模塊輸出。極大地縮短了硬件設(shè)計的周期,提高了生產(chǎn)力。而且本文所呈現(xiàn)的設(shè)計思路不僅適用于本文所實現(xiàn)的反量化和反變換,同樣適用于其他各種硬件單元的設(shè)計。因此在未來的工作中,一方面將會繼續(xù)完成H.264中其他硬件單元的設(shè)計,實現(xiàn)整體H.264標(biāo)準(zhǔn)的硬件實現(xiàn);另一方面,還會致力于各種復(fù)雜算法的高層次綜合實現(xiàn)與優(yōu)化。
參考文獻(xiàn)
[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編碼器設(shè)計[J].微電子學(xué)與計算機,2015,32(6):1-4.
[3] 何賓.Xilinx_FPGA權(quán)威設(shè)計指南-Vivado 2014集成開發(fā)環(huán)境[M].北京:電子工業(yè)出版社,2015,2:348-403.
[4] WANG T C,HUANG Y W,F(xiàn)ANG 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] 張茉莉,楊海鋼,崔秀海,等.基于數(shù)組分塊的FPGA高級綜合編譯優(yōu)化算法[J].計算機應(yīng)用研究,2013,30(11):3349-3352.