基于Xtensa可配置處理器技術(shù)的視頻加速引擎技術(shù)
1、設(shè)計視頻加速引擎的傳統(tǒng)RTL方法
上一代視頻ASIC的設(shè)計主要對MPEG-2進行編碼和譯碼,因為這是DVD標(biāo)準(zhǔn)。有些視頻ASIC還支持MPEG-1,用于VCD(視頻CD)播放。在多數(shù)情況下,MPEG-2編碼器和譯碼器都采用RTL設(shè)計方法。一個典型MPEG-2視頻ASIC體系結(jié)構(gòu)如圖1所示,其中包括由各個RTL模塊構(gòu)成的視頻子系統(tǒng)、主控制器和片上存儲器。
圖1 MPEG-2視頻ASIC體系結(jié)構(gòu)
采用硬線RTL體系結(jié)構(gòu)支持多種視頻標(biāo)準(zhǔn),然而,這也意味著每個視頻標(biāo)準(zhǔn)都需要一個專用的RTL模塊來實現(xiàn)。采用硬線RTL模塊實現(xiàn)一個多種標(biāo)準(zhǔn)的視頻加速引擎具有一定的局限性。無論是實現(xiàn)一個新的視頻標(biāo)準(zhǔn)、更新已有的標(biāo)準(zhǔn)還是消除其中的故障都需要重新進行芯片加工。
2、采用處理器作為視頻加速引擎的優(yōu)勢
可編程處理器能夠滿足多種視頻標(biāo)準(zhǔn)的靈活性要求。與RTL模塊設(shè)計方法相比,可編程處理器具有如下幾個優(yōu)勢:一是易于將編解碼器與處理器接口;二是滿足新的視頻標(biāo)準(zhǔn)要求、更新現(xiàn)有編解碼器或者采用軟件方法在芯片投片后也可以修改故障;三是可以采用軟件更新的方法很容易地提高視頻編解碼器的性能。
然而,傳統(tǒng)的32位處理器存在性能瓶頸,因為它們是面向通用代碼設(shè)計的,而不是面向視頻加速引擎設(shè)計的。嵌入式DSP也并非專門為視頻量身定做的,而是包括硬件功能部件、指令和接口,專門應(yīng)用于通用DSP領(lǐng)域。因此,為了在傳統(tǒng)RISC和DSP處理器上實現(xiàn)視頻編解碼器,就必須使這些處理器運行在很高的速度(Mhz)上,需要大量的存儲器空間,因此需要很大的功耗,不適合便攜式應(yīng)用。
通過研究一個視頻內(nèi)核程序所需要的計算量,即可一目了然。比如,一個絕對差值累加運算SAD,該運算是大部分視頻編碼算法中運動估計一步常采用的方法。SAD算法將會在相鄰兩個連續(xù)視頻幀中找出宏塊的運動情況,為此,需要計算兩個宏塊中每一組對應(yīng)的像素值之間絕對差值的累加和。
下面C代碼給出了SAD核心算法的簡單實現(xiàn):
for (row = 0; row numrows; row++) {
for (col = 0; col numcols; col++) {
accum += abs(macroblk1[row][col] - macroblk2[row][col]);
} /* column loop */
} /* row loop */
SAD核心算法的基本計算方法如圖2所示。正像圖中所示的那樣,SAD核心算法首先執(zhí)行減法操作,然后取絕對值,最后對前面的結(jié)果進行累加。
圖2 差值絕對值累加(SAD)主要計算方法
在一個RISC處理器上計算一個由兩個16x16宏塊組成的SAD運算需要256次減法運算、256次絕對值運算和256次累加運算,共需要768次算術(shù)運算,這還不包括因數(shù)據(jù)轉(zhuǎn)移需要的取數(shù)和存數(shù)操作。由于這需要對每一幀的所有宏塊進行操作,因此,隨著分辨率的提高引起視頻幀增加,使得計算成本極度昂貴。
事實上,對于一個一般的通用RISC處理器而言(包括一些DSP指令,如乘法指令和乘累加指令),執(zhí)行一個H.264基準(zhǔn)譯碼算法需要250 MHz的性能(CIF分辨率),而執(zhí)行一個H.264基準(zhǔn)編碼算法則需要超過1 GHz的性能(CIF分辨率)。完成上述運算,僅處理器內(nèi)核就需要500mW的功耗,更不要說由訪存和視頻SOC的其它部件所用的功耗。
3、可配置處理器方法
在一個處理器上實現(xiàn)SAD核心算法的一個更加有效的途徑是建立 “減法-絕對值-加法”專用指令。這將大大降低算術(shù)運算的開銷,對一個16x16宏塊而言,運算次數(shù)將從768次降為256次。而且,由于采用一個功能部件就可以實現(xiàn)多個簡單算術(shù)運算的融合操作,因此上面的運算只需一個指令周期就可以完成,這相當(dāng)于原來的256個周期。 用戶不能往一個標(biāo)準(zhǔn)的32位RISC處理器中添加指令,但是,完全可以往一個可配置處理器中添加專用指令。可配置處理器允許設(shè)計人員從可配置選項菜單中選擇相關(guān)配置命令來擴展處理器功能,包括增加專用指令、寄存器文件和接口等。
下面是現(xiàn)代可配置處理器(例如Tensilica公司的 Xtensa處理器)提供的配置和擴展選項,這對于傳統(tǒng)的固定模式處理器而言是做不到的。
(i) 配置選項:選項菜單包括下面幾項:
a. 設(shè)計人員需要或者不需要的指令。例如,16x16的乘法或者乘累加、移位、浮點指令等等。
b. 零開銷循環(huán)、五級或者七級流水線、局部數(shù)據(jù)加載或者存儲部件個數(shù)等。
c. 是否需要存儲器保護、存儲器地址轉(zhuǎn)換或者存儲器管理部件(MMU)
d. 包含或者不包含系統(tǒng)總線接口
e. 系統(tǒng)總線寬度和局部存儲器接口寬度
f. 局部(緊密耦合)存儲器大小和數(shù)量。
g. 中斷數(shù)量及中斷類型和中斷優(yōu)先級。
(ii) 擴展選項:增加設(shè)計人員自己定義的功能部件,包括:
a. 寄存器和寄存器文件。
b. 多周期、仲裁復(fù)雜指令功能部件。
c. 單指令流多數(shù)據(jù)流SIMD功能部件。
d. 將單發(fā)射處理器變?yōu)槎喟l(fā)射處理器。
e. 用戶定制接口,可以直接對數(shù)據(jù)通路進行讀寫操作,例如,類似GPIO(通用輸入/輸出)引腳的處理器內(nèi)核端口或者引腳,用于擴展先進先出FIFO隊列的隊列接口(可以與其它邏輯或者處理器內(nèi)核進行接口)。
配置選項的好處是讓設(shè)計人員通過僅選擇與其應(yīng)用有關(guān)的選項,就可以構(gòu)建一個規(guī)模適度的處理器,并能夠滿足其特定應(yīng)用。擴展選項的好處是讓設(shè)計人員根據(jù)應(yīng)用定制處理器,包括建立專用指令、寄存器文件、功能部件和相關(guān)接口,用于加速系統(tǒng)應(yīng)用算法的執(zhí)行。
4、自動化軟件開發(fā)工具套件支持
可配置和可擴展的關(guān)鍵是不僅能夠自動產(chǎn)生預(yù)先經(jīng)過驗證的RTL代碼,用于設(shè)計人員定制處理器(包括所有系統(tǒng)擴展功能),而且還能夠自動產(chǎn)生完整的軟件工具,包括一個與處理器相匹配并經(jīng)過優(yōu)化的開發(fā)工具套件、一個基于時鐘周期的指令集仿真器以及系統(tǒng)模型。
這種自動化意味著編譯器知道設(shè)計人員所添加的新指令、相關(guān)的寄存器以及寄存器文件。因此,編譯器能夠?qū)τ脩舳x的指令進行調(diào)度,并執(zhí)行寄存器分配操作。類似地,軟件開發(fā)人員在調(diào)試時除了處理器本身的基本寄存器,還能夠了解設(shè)計人員定義的寄存器和寄存器文件;同時,軟件開發(fā)人員能夠利用指令集仿真器對設(shè)計人員定義的新指令進行仿真。與處理器相關(guān)的實時操作系統(tǒng)RTOS端口和系統(tǒng)模型也能夠自動產(chǎn)生。Tensilica的軟件工具能夠在一個小時內(nèi)自動產(chǎn)生上述軟件工具,這是對使用可配置處理器用戶的核心承諾,能夠執(zhí)行諸如SAD運算,而不必采用RTL那樣的實現(xiàn)方法。
5、采用可配置處理器構(gòu)建視頻加速引擎建立多操作功能部件
將SAD這樣的融合操作加到一個可配置處理器中是一件麻煩的事情。一條稱為“sub.abs.ac”的新指令可以完成“減法-絕對值-累加”運算操作。這條新指令能夠?qū)D2中的操作變成圖3中的復(fù)操作。
圖3 使用新指令計算“減法-絕對值-累加”操作
將該指令添加到處理器中后,C編譯器能夠識別這條新的“sub.abs.ac”指令,并調(diào)度相關(guān)指令;調(diào)度器將顯示“sub.abs.ac”功能部件所使用的內(nèi)部信號;匯編器能夠處理這條新指令;指令集仿真器ISS能夠按照時鐘周期模式進行仿真。
新的專用視頻功能部件插入處理器后的數(shù)據(jù)通路簡圖如圖4所示。注意到,除了產(chǎn)生功能部件邏輯外,硬件生成工具還能夠自動插入前饋通路、控制邏輯以及旁路邏輯,以便將新的功能部件與數(shù)據(jù)通路中的其它邏輯互連。
圖4 插入sub.abs.ac視頻專用功能部件后的簡化數(shù)據(jù)通路示意圖
包含新指令的C代碼描述的SAD算法如下:
for (row = 0; row numrows; row++) {for (col = 0; col numcols; col++) {
sub.abs.ac( accum, macroblk1[row][col], macroblk2[row][col]);
} /* column loop */
} /* row loop */
正如前面提到的,對于一個16x16宏塊而言,增加新指
評論