文獻(xiàn)標(biāo)識碼: 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)自公布以來,在視頻會議、數(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平臺上的實(shí)現(xiàn)也變得更為復(fù)雜,。高層次綜合技術(shù)相對于傳統(tǒng)的RTL級設(shè)計能有效地降低硬件的設(shè)計復(fù)雜度,,縮短設(shè)計周期。因其在算法硬件模塊開發(fā)上的高效性,,高層次綜合工具已被廣泛應(yīng)用于復(fù)雜硬件項(xiàng)目開發(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)機(jī)生成等功能,?;赩ivado_HLS高層次綜合的開發(fā)流程如圖1所示。首先將設(shè)計完成的C/C++算法實(shí)現(xiàn)代碼在Vivado_HLS中進(jìn)行編譯,,檢查語法錯誤并驗(yàn)證代碼的功能是否正確,;之后,在增加相應(yīng)優(yōu)化設(shè)置的基礎(chǔ)上進(jìn)行綜合,;綜合完成后進(jìn)行RTL協(xié)同仿真,,驗(yàn)證硬件功能正確性及時序需求;如果不能滿足設(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ù)處理,從而避免除法與浮點(diǎn)數(shù)運(yùn)算,。
變換與量化是兩個相互獨(dú)立的過程,,但在H.264中,將兩個過程合并在一起進(jìn)行,。其優(yōu)勢在于將DCT中的乘法運(yùn)算提取出來合并到量化過程中,,于是變換部分只進(jìn)行整數(shù)的加法與移位運(yùn)算,而乘法運(yùn)算都在量化部分實(shí)現(xiàn),,從而減少運(yùn)算量,。因此逆變換逆量化模塊實(shí)現(xiàn)變換與量化的逆過程。
H.264解碼器中的逆變換逆量化實(shí)現(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 算法實(shí)現(xiàn)
逆變換逆量化環(huán)節(jié)在解碼器中所占的比重較大,同時該計算模塊在解碼過程中被頻繁調(diào)用,,而逆量化部分大量的乘法運(yùn)算需要消耗大量的硬件資源,。本設(shè)計的目標(biāo)是在資源消耗量控制在一定限度的前提下提供盡可能高的數(shù)據(jù)吞吐量。
為了提高數(shù)據(jù)處理速度,,達(dá)到硬件實(shí)現(xiàn)中對亮度信號(Luma)與色度信號(Chroma)的逆量化逆變換的并行執(zhí)行,。算法實(shí)現(xiàn)過程中分別為其設(shè)計單獨(dú)的C函數(shù)并采用獨(dú)立接口。輸入數(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逆量化逆變換算法實(shí)現(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語言算法實(shí)現(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ù)吞吐量,。對于本文的算法實(shí)現(xiàn),,為了實(shí)現(xiàn)資源的充分利用并降低整體的計算延遲,在循環(huán)展開的基礎(chǔ)上,,對相應(yīng)模塊的頂層或合適的位置加入了流水線(PIPLINE)優(yōu)化指令,。
3.2.3 數(shù)組分割
設(shè)計中存在大量的數(shù)組運(yùn)算,默認(rèn)情況下這些數(shù)組在綜合中會使用成ROM或BRAM資源,,由于ROM或BRAM一次能同時讀寫的數(shù)據(jù)個數(shù)有限,,會造成運(yùn)算過程中的延時[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ù)組分割目的在于流水線增強(qiáng)后提升數(shù)據(jù)訪問能力。
4 實(shí)驗(yàn)結(jié)果與分析
本設(shè)計所使用的高層次綜合平臺采用Xilinx Vivado_HLS 2014.4版本,,目標(biāo)FPGA器件為Virtex-7系列的xc7vx485tffg1761-2芯片,,設(shè)置的時鐘約束條件為10 ns,算法實(shí)現(xiàn)采用C語言,,目標(biāo)輸出語言為Verilog,。
經(jīng)過不同優(yōu)化方案后硬件模塊的資源占用與模塊執(zhí)行的時鐘延時如圖3所示。
無優(yōu)化時,,F(xiàn)PGA片上各種資源消耗量均為最低,,但模塊數(shù)據(jù)處理的時鐘延時確最高。因代碼的主體以循環(huán)為主,,為了在速度上得到較大的提升,,最直接的方法就是將代碼中的循環(huán)展開,實(shí)現(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)實(shí)現(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計算單元成倍增加——這是因?yàn)榉戳炕糠值挠嬎阒黧w是乘法為主,而流水線的加入會強(qiáng)制打開循環(huán)結(jié)構(gòu),,因此DSP數(shù)量急劇上升,。
4 結(jié)論
本文采用高層次綜合硬件設(shè)計的方法,實(shí)現(xiàn)了H.264標(biāo)準(zhǔn)中反量化反變換部分的硬件部分設(shè)計,。通過循環(huán)展開,、流水線、數(shù)組分割優(yōu)化方案的加入,,大大降低了計算所需的時間,對硬件模塊的設(shè)計空間進(jìn)行了探索,。只對硬件模塊核心算法進(jìn)行C語言代碼實(shí)現(xiàn),,從而得到RTL級硬件模塊輸出,。極大地縮短了硬件設(shè)計的周期,提高了生產(chǎn)力,。而且本文所呈現(xiàn)的設(shè)計思路不僅適用于本文所實(shí)現(xiàn)的反量化和反變換,,同樣適用于其他各種硬件單元的設(shè)計。因此在未來的工作中,,一方面將會繼續(xù)完成H.264中其他硬件單元的設(shè)計,,實(shí)現(xiàn)整體H.264標(biāo)準(zhǔn)的硬件實(shí)現(xiàn);另一方面,,還會致力于各種復(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].微電子學(xué)與計算機(jī),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].計算機(jī)應(yīng)用研究,2013,,30(11):3349-3352.