利用可配置處理器來創(chuàng)建多標(biāo)準(zhǔn)多分辨率視頻引擎
隨著消費類電子產(chǎn)品,尤其是手機、PDA和便攜式媒體播放器(PMP)的急劇發(fā)展,其對于終端硅供應(yīng)商的要求也大大提高。對這些供應(yīng)商來說,設(shè)計僅僅能夠適用于一到兩個多媒體編解碼器或無線標(biāo)準(zhǔn)的IC已經(jīng)遠遠不夠了。消費者希望他們的設(shè)備能夠播放各種采用不同的編碼標(biāo)準(zhǔn)和無線下載標(biāo)準(zhǔn)的媒體。因此,必須采取一個新的更具靈活性的途徑來更好地適配新的媒體標(biāo)準(zhǔn)。在本文中,我們主要談一談視頻解碼器和編碼器引擎所面對的挑戰(zhàn)和機遇。
基于RTL的傳統(tǒng)視頻引擎設(shè)計方法
上一代視頻ASIC設(shè)計的目的是為了解碼和編碼MPEG-2,因為這是DVD所使用的標(biāo)準(zhǔn)。其中也有些支持MPEG-1,可以播放VCD。大多數(shù)情況下,這種單個應(yīng)用的邏輯實現(xiàn)策略就是:利用RTL(寄存器轉(zhuǎn)換層,寄存器轉(zhuǎn)換邏輯)來設(shè)計定制化MPEG-2解碼器和編碼器。下圖1是一個典型的MPEG-2視頻ASIC結(jié)構(gòu),展示了由視頻子系統(tǒng)、主控制器和片上存儲器組成的RTL功能塊。
圖1:典型的MPEG-2視頻ASIC結(jié)構(gòu)
隨著市場形勢的改變,現(xiàn)在的視頻ASIC必須能夠支持多種視頻標(biāo)準(zhǔn),并具有多個分辨率。由于下列原因,傳統(tǒng)的RTL方法已經(jīng)不再有效:
·隨著標(biāo)準(zhǔn)數(shù)量的增加,RTL功能塊的數(shù)量和復(fù)雜性也增加;
·無論是執(zhí)行一個新的視頻標(biāo)準(zhǔn),還是升級現(xiàn)有的已執(zhí)行的標(biāo)準(zhǔn),或者修改bug,都需要進行硅芯片重制;
·在第一代硅執(zhí)行之后的這4-5年內(nèi),視頻編解碼器,尤其是編碼器在性能上(比特率、性能)有很大的改進。要執(zhí)行這些改進的成果,也必須在所有的RTL方法中進行硅芯片重制。
在視頻引擎中使用處理器,而不是固定的RTL
那么,有沒有其它辦法呢?使用一個可編程處理器是最佳方案,因為它可以解決上面提到的所有問題:(1)處理器和編解碼器之間很容易建立連接端口;(不論是采用新的視頻標(biāo)準(zhǔn),還是升級現(xiàn)有的編解碼器或者修改bug,都可以很容易地在軟件中進行);(3)通過軟件升級,可以很容易地應(yīng)用視頻編解碼器執(zhí)行中的改進。
但是,由于其性能瓶頸,傳統(tǒng)的處理器只能用于一般的編碼,而不能用于視頻引擎。嵌入式DSP也不是專為視頻而設(shè)計的,但擁有通用DSP應(yīng)用所需的硬件功能單元、指令和接口。因此,要在傳統(tǒng)的RISC和DSP處理器上執(zhí)行視頻編解碼,就意味著這些處理器必須以非常高的速度運行(MHz),而且還需要大量內(nèi)存并消耗大量功率,但是在便攜式設(shè)備中,這顯然是行不通的。
只要我們對某個視頻內(nèi)核中所需的計算次數(shù)作一個簡單分析,就很容易得出這一點。絕對誤差和是大多數(shù)視頻解碼運算的動作估計中所進行的一個重要計算步驟。SAD運算的目的在于發(fā)現(xiàn)兩個連續(xù)視頻幀之間的宏模塊的運動。它是通過計算這兩個宏模塊中每套相應(yīng)的象素值之間的絕對誤差之和來實現(xiàn)這一目的的。
下面的C代碼展示了SAD運算的一次簡單執(zhí)行:
圖2展示了SAD運算中的基本計算步驟。如圖所示,其中主要進行的計算有減、算絕對值和結(jié)果累計。
圖2:絕對誤差和(SAD)內(nèi)核中進行的主要計算
計算一個RISC上的兩個16x16宏模塊的SAD需要進行256次減法、256次求絕對值和256次相加――總共進行了768次計算,還不包括傳輸數(shù)據(jù)所需的負載與內(nèi)存。由于每一幀當(dāng)中所有的宏模塊都必須進行這一運算,很顯然這在計算上成本是很昂貴的,而且會隨著視頻幀分辨率的增加而越來越難。
實際上,在一個帶有一些如相乘和乘法累加等指令的中等范圍通用型RISC處理器上,如果要以CIF的分辨率進行H。26?Baseline解碼,需要250MHz的速率,而如果進行H。26?Baseline編碼,所需速率更是超過1GHz。這意味著光是處理器內(nèi)核就要消耗將近500mW的功率,更不用提內(nèi)存和視頻片上系統(tǒng)中其它部分消耗的功率了。很顯然這種處理器不能作為嵌入式多媒體處理器用于便攜式設(shè)備中。[!--empirenews.page--]
可配置處理器解決了問題
如何在處理器中進行SAD運算呢?有一個方法是編寫一個能夠同時進行“減-求絕對值-加”計算的指令。這可以將16x16宏模塊所需的計算次數(shù)從768減少到256。另外,由于一個執(zhí)行這種綜合化簡單運算的功能單元一般都能夠優(yōu)化成一個周期,意味著計算周期也被減少到了256。
但是如何執(zhí)行這個“減-求絕對值-加”指令呢?
在這個時候,就需要可配置處理器了??膳渲锰幚砥魇乔度胧降?,設(shè)計者可以配置選項菜單中進行選擇,并通過添加特殊應(yīng)用指令、寄存器文件和接口來擴展處理器功能。
下面是目前的可配置處理器具備的一些可配置和可擴展性功能,傳統(tǒng)的固定式處理器是沒有這些功能的:
可配置性,有下面的一系列選項可供選擇:
·設(shè)計者想要或者不想要的指令,包括:16x16相乘或乘法累加、漏斗轉(zhuǎn)換、浮點指令等;
·零耗循環(huán)、5或7個步進管線、本地數(shù)據(jù)加載/存儲單元的數(shù)量等各種功能;
·是否需要內(nèi)存保護、內(nèi)存轉(zhuǎn)換或者一個全內(nèi)存管理單元(MMU);
·是否需要一個系統(tǒng)總線接口;
·系統(tǒng)總線和本地內(nèi)存接口的寬度;
·本地內(nèi)存的數(shù)量和大小;
·中斷的次數(shù)、種類和等級
可擴展性,可自由添加下列由設(shè)計者自定義的組件:
·寄存器和寄存器文件;
·多周期、任意復(fù)雜功能單元;
·SIMD功能單元;
·將基本型處理器轉(zhuǎn)換成多發(fā)射處理器;
·定制能夠直接從數(shù)據(jù)路徑讀取和寫入的接口,例如在處理器內(nèi)核上的類似于GPIO(通用IO)的端口或管腳,以及可以用來和其它邏輯或者處理器內(nèi)核進行連接的外置FIFO。
可配置性的優(yōu)點在于使你可以通過選擇你的應(yīng)用所需的功能選項來構(gòu)建一個規(guī)模適中的處理器,而可擴展性的優(yōu)點則是讓設(shè)計者可以通過創(chuàng)造能加快應(yīng)用速度的指令、寄存器文件、功能單元和接口來定制處理器,使之完全與其視頻應(yīng)用相匹配。但必須注意的是,只有當(dāng)今先進的可配置處理器才具能提供設(shè)計者自定義可擴展性。
利用可配置處理器來構(gòu)建視頻引擎
創(chuàng)建能進行多次運算的功能單元
這一步即是SAD運算和加速SAD運算的內(nèi)容。
對于可配置處理器來說,要添加這一綜合運算功能簡直是小菜一碟。它可以添加名為"sub。abs。acc(減-求絕對值-加)"的新指令來進行“相減、求絕對值和相加”運算。如圖3所示。
圖3:進行“相減、求絕對值和相加”運算的新指令[!--empirenews.page--]
現(xiàn)代的可配置處理器(例如Tensilica的Xtensa處理器)所配的軟件工具會自動修改編輯器工具,包括C/C++編輯器、匯編程序、調(diào)試器、模仿器和ISS(指令集仿真器)。此時,C編輯器會識別新的C內(nèi)部指令"sub。abs。acc"并安排相應(yīng)的指令,調(diào)試器則顯示sub。abs。acc功能模塊中使用的內(nèi)部信號,同時,匯編程序會將之作為一個新的指令進行處理,而ISS則對之進行周期精確級仿真。
創(chuàng)建新的加載/存儲接口
要在如此之大的寄存器文件(和相應(yīng)的SIMD功能單元)中讀出和寫入數(shù)據(jù),要求可以進行大規(guī)模的加載和存儲。還是在可配置處理器中,設(shè)計者可以自定義加載和存儲指令來直接在自定義寄存器文件中加載和存儲數(shù)據(jù)。接著,編輯器會自動生成對應(yīng)于這個加載/存儲接口的加載/存儲指令,從而將數(shù)據(jù)從內(nèi)存中加載到寄存器文件中。
圖6是處理器數(shù)據(jù)路徑的更新圖。如圖中所示,硬件生成工具自動生成大的自定義寄存器文件和加載/存儲接口以及所有相關(guān)的正向控制和旁路邏輯。特別需要注意的是這些工具還會生成硬件邏輯來將數(shù)據(jù)從基本寄存器文件轉(zhuǎn)移到用戶自定義的寄存器文件中。
圖6
加載或存儲時更新地址
創(chuàng)建指令來進行自定義加載或存儲時,最好能在加載或存儲的同時更新地址。這種新的加載/存儲指令可以同時進行:
加載A1←存儲器(地址1);地址1=地址1+索引更形
這種能夠同時進行數(shù)據(jù)加載/存儲和地址更新的指令使得處理器可以進行背靠背加載/存儲,而不需要一個中介指令來進行地址更新。
創(chuàng)建FIFO接口和通用IO端口
可配置處理器中另一個重要特征是可以定義FIFO接口和通用IO(GPIO)端口來直接從數(shù)據(jù)路徑中讀取和寫入數(shù)據(jù)。這些FIFO接口和GPIO端口的寬度可以是任意的(在這個例子中是1024b),在數(shù)字上沒有任何限制(例如,F(xiàn)IFO和GPIO端口的寬度都可以是1024)。這些寬的數(shù)據(jù)路徑直接接口可以提供多媒體和網(wǎng)絡(luò)應(yīng)用所需的高數(shù)據(jù)吞吐量,來通過處理器內(nèi)核讀取、處理和寫入數(shù)據(jù)。
圖7顯示的是帶有這樣的FIFO接口和GPIO端口的數(shù)據(jù)路徑。(有了這種方法)我們可以創(chuàng)建一個指令來發(fā)射兩個FIFO(只要確保這兩個不是空的),進行一次復(fù)雜的計算(例如循環(huán)乘加),并將結(jié)果傳到另一個輸出FIFO上(只要這個FIFO還沒有滿)。接著,再次由硬件生成工具生成適當(dāng)?shù)慕涌谛盘枴⒖刂七壿嫼团月愤壿?,并生成已配置處理器所需的完整RTL,同時,軟件生成工具則自動生成一套完整的編輯器工具和模仿新指令的周期精確級ISS。
圖7:通過FIFO接口和GPIO端口進行的高速通信
加速復(fù)雜控制代碼
多媒體應(yīng)用中控制代碼的數(shù)量和復(fù)雜性已經(jīng)增加到這樣的一個程度:它所消耗的計算時間和工作幾乎和代碼的數(shù)據(jù)密集型部分一樣多。H。26?Mainprofile解碼器中的一個關(guān)鍵部分-CABAC算法(內(nèi)容自適應(yīng)二進制算術(shù)編碼)就是這樣的一個例子:這種算法幾乎就是一棵控制流程判定樹,有各種各樣復(fù)雜的數(shù)據(jù)計算和比較。
由于CABAC計算過于復(fù)雜,很多傳統(tǒng)的處理器方案不得不放棄CABAC而選擇一個專用的RTL加速器。但是,CABAC可以在可配置處理器上作為一套指令擴展而產(chǎn)生作用,不僅在性能足以媲美RTL方案的性能,同時比起RTL加速器還有另外一個優(yōu)勢,那就是它的數(shù)據(jù)不需要進出處理器。這樣一來就顯示出處理器指令擴展的另外一個優(yōu)勢—由于特殊應(yīng)用硬件位于處理器內(nèi)部,你可以更好地分割硬件和軟件。
總結(jié)
現(xiàn)代的可配置及可擴展處理器是創(chuàng)建視頻和音頻引擎的完美選擇,迄今為止已經(jīng)為眾多的半導(dǎo)體ASIC供應(yīng)商所廣泛采用。另外也有一些作為嵌入式SoC模塊的視頻和音頻IP產(chǎn)品。例如,Tensilica公司及其合作伙伴就能供應(yīng)一套完整的視頻和音頻IP產(chǎn)品,其中包括XtensaHiFi2音頻引擎和一系列多標(biāo)準(zhǔn)多分辨率視頻方案,以及H。26?(基本類、主流類和高級類)、MPEG-4(SPandASP)、MPEG-2、VC-1/WM9及各種標(biāo)準(zhǔn)的編碼器和解碼器軟件(編解碼器)。這些視頻方案覆蓋了QCIF、CIF和SD,都以實現(xiàn)HD分辨率為目標(biāo),并以低功耗和小封裝為設(shè)計起點。
由于消費者的需求擴展了消費類設(shè)備中ASIC的技術(shù)規(guī)格要求,越來越多的應(yīng)用將通過使用可配置處理器來執(zhí)行。借助于可配置處理器所帶來的自動設(shè)計流程,新的功能支持將會像軟件升級一樣簡單,而設(shè)計和驗證時間也將大大降低。