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