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