嚴 楓 成海龍 劉 濤 劉艷明 喬 鑫
(駐218廠軍事代表室 北京 100000)
隨著工業(yè)用及商用對視頻清晰度及分辨率要求的不斷提高,視頻格式從低的600×480的分辨率發(fā)展至目前的超高清的4K級乃至8K級。這些劇增的視頻數(shù)據(jù)給傳輸應用帶來了巨大的挑戰(zhàn)[1-2]。例如,當視頻格式為4K級時,如以RGB4:4:4傳輸,幀率為60幀/秒,每個像素為8bit灰度等級,則一路視頻的有效最大數(shù)據(jù)速率為14.4Gbps。直接以網(wǎng)絡或者應用電纜的HDMI(High Definition Multimedia Interface)或者DP(DisplayPort)方式傳輸距離有限,現(xiàn)有應對長距離傳輸?shù)姆椒梢圆捎没贖.265或者H.264的壓縮/解壓,通過以太網(wǎng)傳輸,或者基于FPGA(Field Programmable Gate Array)和光纖的方式進行無損非壓縮傳輸后直接恢復[3-5]。兩者相比較,后者由于采用非壓縮實時傳輸方式,對原有視頻無任何損失,且具有較小的時延及數(shù)據(jù)抖動,因此在視頻質(zhì)量要求高的場所應用較廣泛。
現(xiàn)有基于FPGA及光纖的高清長距離非壓縮視頻傳輸?shù)姆桨改P涂扇鐖D1所示。

圖1 非壓縮光纖視頻傳輸方案架構圖
方案架構中TX為發(fā)送端,RX為接收端。其工作流程為:在發(fā)送端,超高清視頻流(Video in)輸入至FPGA中,F(xiàn)PGA在時鐘晶振OSC(oscillator)的驅(qū)動下,對視頻流的數(shù)據(jù)進行緩存處理,存儲至DDRxSdram(Double Data RateSynchronous Dynamic Random Access Memory,x為0-4) 并同步讀出,通過其自帶的高速串行數(shù)據(jù)口連接至高速光模塊進行發(fā)送;在接收端,高速光模塊接收帶視頻流數(shù)據(jù)的光信號,轉(zhuǎn)換為高速電信號輸入至FPGA高速串行數(shù)據(jù)口,F(xiàn)PGA對信號進行解碼,得到視頻流數(shù)據(jù)存儲至DDRxSdram。并同步讀出視頻數(shù)據(jù),后在OSC的驅(qū)動作用下,恢復原有的視頻格式,輸出視頻流(video out),便于后續(xù)處理。
本文在研究這個方案傳輸機制的基礎上,針對其中的幾個關鍵技術問題,給出了解決方法,實現(xiàn)高效傳輸。其一是超大視頻流數(shù)據(jù)存儲訪問帶寬計算及帶寬分配調(diào)度策略;其二是視頻幀間動態(tài)同步及失步應對方式;其三是時鐘重建及視頻格式恢復方法。
視頻流數(shù)據(jù)進入FPGA后,在對輸入/輸出數(shù)據(jù)速率、系統(tǒng)內(nèi)部帶寬及外部存儲器帶寬進行計算后,可采用更高速度的存儲器,并采取有效的調(diào)度策略,以此達到數(shù)據(jù)延遲時間短、資源利用率最高,系統(tǒng)性能最優(yōu)的目的。
首先對所需的各個環(huán)節(jié)帶寬進行計算,得到理論值。系統(tǒng)帶寬計算結構可如圖2所示。

圖2 系統(tǒng)帶寬計算示意圖
圖2中fifo為先進先出(first-in-first-out),fifoin1至fifoin n為多路輸入視頻緩存區(qū),fifo out為視頻數(shù)據(jù)輸出緩存區(qū)。BWin1至BWin n為讀取輸入視頻所需帶寬,BW out為視頻輸出帶寬,即為光纖傳輸?shù)墓潭◣?,BW wr為寫入外部存儲器的所需帶寬,BW rd為讀取外部存儲器的所需帶寬。在給定的存儲器條件下,其整體帶寬BW sdram為
BWsdram=BWwr+BWrd
(1)
給定視頻輸入總帶寬為
BWin=BWin1+BWin2+…+BWinn
(2)
為滿足視頻輸入數(shù)據(jù)不丟失要求,BW wr 必須大于或者等于BWin;且為達到光纖通道帶寬最有效利用的要求,BW rd必須大于或者等于BW out。BW rd與BWin無必然聯(lián)系,一般在視頻流無停頓及實時性的要求下,接收端輸出視頻顯示正常時,BW out的基本指標必滿足輸出視頻格式的24幀/秒以上,即BW rd≥BW out≥輸出幀頻24幀/秒。
按照上述視頻流數(shù)據(jù)計算所需帶寬后,實現(xiàn)帶寬最大利用率上需要考慮兩個方面。其一是FPGA內(nèi)部數(shù)據(jù)高速獲取。在上述要求下,多路視頻輸入時,需要滿足在一個固定周期T內(nèi),每路輸入視頻數(shù)據(jù)均需至少讀取一次。為此,在給定外部存儲器的物理條件下,執(zhí)行實現(xiàn)機構設計上最直接也是最有效的方法就是采用多層次存儲結構(Cache)進行視頻數(shù)據(jù)緩沖。其原理是依據(jù)分時復用或者分空間復用性,不斷刷新讀寫數(shù)據(jù),使得內(nèi)部功能單元能快速得到連續(xù)數(shù)據(jù),可大為提升系統(tǒng)內(nèi)部數(shù)據(jù)讀寫性能。具體實施上,需要考慮極限條件(讀寫數(shù)據(jù)最大速率)以及視頻格式,從而在資源利用最有效的情況下,決定Cache緩沖多少行視頻數(shù)據(jù)。Cache實現(xiàn)一般可采用FIFO或者片內(nèi)RAM(Random Access Memory)。
其二是FPGA與外部SDRAM之間的數(shù)據(jù)讀寫最優(yōu)方法。在操作現(xiàn)有的外部各類型大容量高速存儲器SDRAM的過程中,由于總線資源天然的共享限制,其讀寫操作必然存在沖突。為有效解決此類沖突,在設計中,采用令牌環(huán)調(diào)度方式(Round-Robin Scheme)或者固定優(yōu)先級調(diào)度方式(Fixed PriorityScheme)。兩者各自存在自身的優(yōu)缺點,前者帶寬均衡分配,存在延遲等待,浪費帶寬等問題。后者無延遲問題,會出現(xiàn)高優(yōu)先級搶占低優(yōu)先級的情況,導致低優(yōu)先級通道數(shù)據(jù)可能丟失。為解決這些問題,綜合兩者優(yōu)點,采用基于單時鐘條件下的動態(tài)總線競爭和Cache緩存相結合的方式。在每個時鐘的邊沿,讀寫調(diào)度邏輯控制器偵測當前總線歸屬狀態(tài),以及每路視頻數(shù)據(jù)Cache空滿緩存情況,依次分配下一個時鐘的總線控制權。例如其中某路視頻輸入數(shù)據(jù)寫入SDRAM調(diào)度用邏輯語言可表示為:
IF(第1路輸入視頻緩存空 == 真 )且(第2路路輸入視頻緩存空 == 真)且(第3路輸入視頻緩存空 == 假 ) 且(第3路輸入視頻寫允許==真 )且(當前寫SRAM狀態(tài) == 真 ),此時選擇滿足條件的第3路輸入視頻數(shù)據(jù)寫入SDRAM。讀寫調(diào)度邏輯控制器從第3路的Cache中讀取數(shù)據(jù)寫入SDRAM,且考慮SDRAM本身的讀寫效率,一般可選用行觸發(fā)方式。當?shù)?路輸入視頻數(shù)據(jù)寫入SDRAM的數(shù)據(jù)數(shù)量計數(shù)比SDRAM一行數(shù)據(jù)數(shù)量少1時,第3路輸入視頻寫允許為假,第3路輸入視頻數(shù)據(jù)放棄總線控制權,控制權移交給其它數(shù)據(jù)通道。如其它通道滿足類似條件,其就獲得總線權;如有多個通道滿足條件,由于存在Cache緩存,后響應的通道數(shù)據(jù)不會丟失,只是響應滯后,此時Cache緩存容量需要滿足最長時間訪問要求;如都不滿足條件,總線浪費的帶寬所用時間為通道數(shù)乘以時鐘數(shù),依據(jù)此方式,SDRAM總線控制調(diào)度可獲取最高帶寬利用率。
輸入視頻在傳輸中總是會存在輸入視頻源斷開、光纖斷開以及輸入端電路斷電等各種斷路情況,導致從發(fā)射端傳輸至接收端的視頻為不完整的一幀圖像。而斷路情況恢復正常后,接收端需要得到完整的幀圖像,且在接收端接收到的視頻數(shù)據(jù)為無限長的數(shù)據(jù)流,需要從數(shù)據(jù)流中分割出獨立的每幀圖像進行緩存、處理及顯示。解決這些問題需要采取視頻幀間動態(tài)同步方法?,F(xiàn)有幀同步實現(xiàn)方法有兩種:一種是插入標志幀同步法;另一種是利用間隔固定時隙插入固定位同步的方法實現(xiàn)。如圖3所示,本文采用第一種方法并對輸入視頻的格式進行編碼,形成固定長度的標志同步碼。

圖3 幀同步示意圖
建立同步碼需要考慮如下幾個問題:
1)同步碼長度與誤碼率的關系。由于視頻數(shù)據(jù)樣本量大,若選取同步碼長度短,出現(xiàn)視頻數(shù)據(jù)與同步碼一樣的概率大。在極限條件下,參考KRONE誤碼率標準10E-12,即零誤碼率標準,其倒數(shù)換算成十六進制為0X0E8D4A51000,長度為40位二進制。選取同步碼長度可為40位以上,當選取40位以上長度的同步碼后,出現(xiàn)視頻數(shù)據(jù)本身與同步碼一致的概率接近于0。
2)碼字選取。確定同步碼長度后,選取碼字參照8421編碼方式以及滿足信號線路均衡需要,選擇同步碼為“0XAA55F0F08421”。
3)在FPGA內(nèi)部的同步實現(xiàn)上,建立如圖4所示的緩存輸入輸出均同步的同步機制。

圖4 同步機制
在發(fā)送端視頻輸入的同步判定中,當且僅當檢測到同步碼時,從緩存cache in中得到的第一個輸入視頻數(shù)據(jù)(可以是RGB4:4:4或者YCrCb4:2:2格式)寫入至SDRAM中本路輸入視頻定義的初始地址,后續(xù)依次從緩存cache in讀取數(shù)據(jù)寫入SDRAM。依此方式至下次檢測到同步碼,重復開始寫入新的一幀輸入視頻數(shù)據(jù)。從SDRAM中讀出視頻數(shù)據(jù)傳輸給緩存cache out時,依舊是當且僅當檢測到同步碼,下一行(SDRAM獲取數(shù)據(jù)按行突發(fā)方式)讀取的地址必為本路輸出視頻定義的初始地址。
在接收端視頻數(shù)據(jù)的同步判定中與發(fā)送端處理一致,只是當同步碼丟失后,必須能夠重新同步。本文中采取的方式為,設定一個固定時間(該時間應長于2幀圖像間隔時間),在此時間內(nèi)無同步碼出現(xiàn),清除輸入cache in緩存的數(shù)據(jù),寫入SDRAM的地址清零至初始地址,從而確保完整的一幀圖像輸入至接收端的緩存cache in中。由此機制及按帶寬計算的要求,可在滿足實時視頻數(shù)據(jù)的輸入與輸出速率需要的同時,極大降低了視頻數(shù)據(jù)幀誤碼率,解決上述文中所提及的各種輸入視頻數(shù)據(jù)斷路問題,提高了視頻輸出顯示的穩(wěn)定性。
按行業(yè)內(nèi)視頻各種格式標準,視頻輸入端的分辨率格式可從640×480@50Hz至4096×2016@60Hz,時鐘頻率從25MHz至297MHz,涵蓋幾十種格式及頻率,而視頻輸出端不能通過其他有效方式獲知發(fā)送端視頻格式,但同時需自動輸出相同視頻格式。為滿足此要求,本文給出一種編碼及自適應的方法。步驟為:
首先在發(fā)送視頻輸入端進行格式編碼。參照圖4,在視頻發(fā)送端,同步碼發(fā)生器通過計數(shù)檢測視頻輸入行的有效像素個數(shù)、一幀中行的行數(shù)目及一幀的場同步間隔時間,從而可確定輸入視頻格式。獲知格式后,采用8bit對視頻格式進行編碼,例如,0×01表示為640×480@50Hz,0×02表示為640×480@60Hz,…,0×0FF表示為4096×2160@60Hz。其可表示的格式類別為256種,能夠滿足現(xiàn)有絕大部分視頻格式。格式編碼完成后,此編碼數(shù)據(jù)與視頻輸入數(shù)據(jù)融合一起寫入緩存cache in。
其次在接收視頻輸出端進行解碼及恢復視頻格式。上述編碼一直隨視頻數(shù)據(jù)進行緩存、寫入SDRAM及傳輸至接收端輸出。當接收端從SDRAM讀出視頻數(shù)據(jù)輸出至緩存cache out時,視頻數(shù)據(jù)同步判定完成后,可獲取當前的視頻格式編碼。得到格式編碼,需恢復視頻格式。恢復視頻格式的過程包括產(chǎn)生輸出視頻像素時鐘及行、列、場同步信號,如圖5所示。其中重點為產(chǎn)生合適的輸出視頻像素時鐘,現(xiàn)有的產(chǎn)生方式有FPGA片內(nèi)產(chǎn)生及片外專用芯片(ASIC)產(chǎn)生。圖5中產(chǎn)生的行信號作為讀取緩存cache out的有效使能信號,在像素時鐘及行、列及場信號的作用下,讀取視頻數(shù)據(jù)輸出直接顯示。

圖5 視頻格式恢復示意圖
為驗證本文中所提出方法的可行性,設計如圖6所示的實物進行驗證。實物設計采用了Xilinx公司的Spartan6中的XC6SLX45器件及二片外置SDRAM。采用了ChipScope工具在線進行數(shù)據(jù)及時序觀測,觀測的結果如圖6所示。
圖中的數(shù)據(jù)獲取結果表明,帶寬的調(diào)度及同步碼的方式能夠滿足要求。
最后,進行光纖視頻的傳輸,傳輸?shù)囊曨l格式為1920×1080P,視頻輸出顯示結果如圖7所示。并經(jīng)過長時間連續(xù)測試,視頻輸出無抖動,無像素缺失;在接收端進行斷電,光纖拔插,視頻均能自動恢復。
非壓縮的高清或者超高清視頻光纖傳輸方式與采用直接電纜方式、壓縮傳輸方式或者網(wǎng)絡傳輸?shù)姆绞奖容^而言,在延長視頻傳輸距離及保障視頻質(zhì)量方面具有一定的優(yōu)勢。本文在基于FPGA電路的基礎上,對大容量視頻數(shù)據(jù)的光纖傳輸?shù)姆椒ㄟM行了較為深入的討論。對其涉及的幾個主要問題,如帶寬的計算及調(diào)度、幀同步機制的建立與實現(xiàn)以及視頻格式的自適應恢復等提出了解決方法。后進行了電路實物設計驗證,驗證的結果實現(xiàn)了視頻長時間穩(wěn)定透明傳輸,表明文中所提方法具有可行性,并可為未來需要高質(zhì)量視頻如超高清8K級或者其它方式的光纖傳輸提供了一條路徑。