唐 斌
(貴州財經(jīng)大學(xué) 信息學(xué)院,貴州 貴陽 550025)
在多數(shù)的基于FPGA(Field Programmable Gate Arrays)的視頻處理系統(tǒng)中,通常需要使用片外大容量存儲器SDRAM(Synchronous Dynamic Random Access Memory)緩存海量視頻資料[1-2]。同時為了確保視頻流的流暢性,甚至使用多塊SDRAM內(nèi)存和大容量的FIFO(First In First Out)實現(xiàn)乒乓操作以提高讀寫速度[3]。為了節(jié)省內(nèi)存資源和提高系統(tǒng)的數(shù)據(jù)帶寬,本文設(shè)計了一種基于FPGA的視頻緩沖器,系統(tǒng)使用FPGA片內(nèi)4塊小容量的FIFO構(gòu)成雙端口緩沖器,在仲裁器合理的調(diào)度下,采用單塊SDRAM實現(xiàn)了視頻數(shù)據(jù)的實時采集和輸出。
本文的雙端口視頻緩沖器采用FPGA和SDRAM構(gòu)成,系統(tǒng)的結(jié)構(gòu)如圖1所示。由于系統(tǒng)的輸入視頻和輸出視頻像素時鐘可能不同,需要使用FPGA片內(nèi)存儲資源構(gòu)建FIFO完成跨時鐘域視頻數(shù)據(jù)的采集和輸出。由于FPGA片內(nèi)存儲器資源有限,為了確保視頻流的流暢性,還需要借助片外存儲器與FPGA構(gòu)建視頻緩沖器。本系統(tǒng)采用SDRAM暫存采集的海量視頻數(shù)據(jù),并將其內(nèi)存儲單元分成兩塊分別緩存兩幀不同視頻數(shù)據(jù),以乒乓方式完成一幀數(shù)據(jù)的輸入和一幀數(shù)據(jù)的輸出。
圖1 系統(tǒng)方框圖Fig.1 Block diagram of video processing system
在本系統(tǒng)中,所采集的視頻數(shù)據(jù)來源于攝像頭OV7670,其時鐘頻率為25 MHz,視頻數(shù)據(jù)采用RGB565格式,因此采集模塊的數(shù)據(jù)帶寬為400 Mbit/s;而顯示模塊VGA的數(shù)據(jù)帶寬則是400 Mbit/s (16 bits×25 MHz)。SDRAM的工作時鐘頻率選擇為100 MHz,其數(shù)據(jù)帶寬為1 600 Mbit/s (16 bits×100 MHz),因此在理論上整個系統(tǒng)可以使用單存儲器實現(xiàn)一路視頻數(shù)據(jù)的實時采集和顯示。由于SDRAM不支持同時讀寫功能,而整個系統(tǒng)可能會同時存在讀、寫和刷新3種操作請求,因此還需要仲裁器分配SDRAM的總線使用權(quán)。
SDRAM存儲器具有高速度、大容量和高性價比等優(yōu)點,廣泛應(yīng)用于數(shù)據(jù)采集和處理系統(tǒng)中[1]。盡管SDRAM具有高速度優(yōu)點,但其實際帶寬往往低于其理論帶寬。原因有兩個:一是SDRAM是利用電容存取電荷的原理保存信息,由于電容介質(zhì)存在漏電現(xiàn)象,因此需要周期刷新保持?jǐn)?shù)據(jù),而在刷新周期中不允許讀寫SDRAM,因此刷新會降低其實際帶寬;二是因為SDRAM的行列地址線采用復(fù)用方式,每次讀寫數(shù)據(jù)操作都分為行地址準(zhǔn)備和數(shù)據(jù)操作兩個階段,分別消耗時間長度為TREADY和TOPERATE。在列地址準(zhǔn)備階段,需要發(fā)出激活命令,提供讀寫單元的行地址,等待TRCD時間后進(jìn)入數(shù)據(jù)操作階段[1]。對于寫操作,數(shù)據(jù)操作階段發(fā)出寫命令,同時提供讀寫單元的列地址和待寫入的數(shù)據(jù);對于讀操作則需要在發(fā)出第一個讀命令和列地址后等待TCAS時間才能讀取數(shù)據(jù)。因此SDRAM的實際帶寬為:
(1)
SDRAM的讀寫機(jī)制比較復(fù)雜,支持激活和預(yù)充電等諸多操作命令[1]。為了簡化SDRAM的操作,本系統(tǒng)的SDRAM控制器只選取了激活、預(yù)充電、自刷新、空閑、模式寄存器配置、讀和寫等7條指令。為了簡化SDRAM的讀寫操作,SDRAM的操作時序封裝在控制器中,外設(shè)只需提高讀寫數(shù)據(jù)的起始地址和讀寫使能信號就能讀寫SDRAM存儲器。同時為了提高SDRAM的實際帶寬,控制器采用分塊連續(xù)讀寫方式增大操作時間TOPERATE。SDRAM控制器由外設(shè)接口電路、初始化狀態(tài)機(jī)、地址計數(shù)器、命令字解析電路和SDRAM物理接口電路構(gòu)成。其工作時序如圖2所示,具體工作機(jī)制為:在SDRAM初始化時,將其猝發(fā)長度設(shè)置為1,對于讀寫數(shù)據(jù)長度為N的數(shù)據(jù)都分解為N次猝發(fā)長度設(shè)置為1的讀寫操作。當(dāng)外設(shè)提出讀寫請求時,只需提供一幀視頻數(shù)據(jù)的起始地址,命令字解析電路(使用狀態(tài)機(jī)實現(xiàn))發(fā)出行激活命令后給出兩條空操作命令,在T4周期啟動地址計數(shù)器準(zhǔn)備讀寫數(shù)據(jù)的列地址并給出第一個讀或?qū)懨?,N個數(shù)據(jù)讀或?qū)懨钔瓿珊?,發(fā)出預(yù)充電命令關(guān)閉當(dāng)前行完成一次數(shù)據(jù)塊的連續(xù)讀寫,因此一次數(shù)據(jù)塊的讀寫時間固定為(N+4)/Tsclk。(Tsclk為SDRAM控制器時鐘周期)。為了降低地址計數(shù)器和命令字解析電路的復(fù)雜度,數(shù)據(jù)長度N和SDRAM行長度L須設(shè)置為L=K×N(K為整數(shù)),以防出現(xiàn)跨行讀寫現(xiàn)象。
圖2 讀寫時序圖Fig.2 Diagram of reading or writing timing
本系統(tǒng)使用兩塊小容量的異步FIFO和同步FIFO串聯(lián)實現(xiàn)跨時鐘域視頻數(shù)據(jù)的傳輸,F(xiàn)IFO由FPGA中免費的IP核生成。對于寫緩存器而言,異步FIFO與視頻采集模塊連接,其寫端口的時鐘與視頻采集模塊的像素時鐘相同,讀端口的時鐘與SDRAM的工作時鐘相同,其主要功能是實現(xiàn)跨時鐘域數(shù)據(jù)的緩沖[4];同步FIFO與SDRAM控制器直接連接,工作時鐘與異步FIFO的讀端口時鐘一致,為了支持SDRAM控制器的分塊讀寫機(jī)制,將其深度和寬度設(shè)置成數(shù)據(jù)塊的規(guī)格,待傳輸?shù)臄?shù)據(jù)將被切成固定大小的數(shù)據(jù)塊。為確保數(shù)據(jù)塊的大小固定不變,禁止對同步FIFO進(jìn)行同時讀寫操作。
讀緩存器的設(shè)計與寫緩存器稍有不同,同步FIFO連接的是顯示模塊,其工作時鐘與顯示模塊相同,主要功能是預(yù)存待顯示的視頻數(shù)據(jù)。異步FIFO 則與SDRAM控制器相連,讀端口采用顯示模塊的工作時鐘,為確保寫端口數(shù)據(jù)有足夠的建立時間和保持時間[5],工作時鐘頻率SDRAM工作時鐘相同,但相位相差180°。同樣為了支持SDRAM控制器的分塊讀寫機(jī)制,將其寬度設(shè)置成數(shù)據(jù)塊的大小,但深度設(shè)置為數(shù)據(jù)塊深度的2倍。異步FIFO的主要功能是實現(xiàn)跨時鐘域視頻數(shù)據(jù)的緩沖。在同步FIFO未寫滿的情況下,異步FIFO中的數(shù)據(jù)直通同步FIFO。
由于SDRAM的總線采用分時復(fù)用方式,不支持同時讀、寫和刷新功能,為了確保視頻流的流暢性,需要合理分配SDRAM的總線使用權(quán)。常用的仲裁方法有固定優(yōu)先級、隨機(jī)爭用和優(yōu)先級循環(huán)等算法[5]。如果采用固定優(yōu)先級算法時可能會出現(xiàn)讀請求長時間占用總線風(fēng)險而導(dǎo)致寫緩存溢出,或是寫請求長時間占用總線風(fēng)險而導(dǎo)致讀緩存無數(shù)據(jù)可讀。而采用優(yōu)先級循環(huán)算法可能導(dǎo)致刷新命令不能及時得到響應(yīng)造成數(shù)據(jù)丟失。綜上考慮后,本系統(tǒng)采用固定優(yōu)先級算法和優(yōu)先級循環(huán)算法相結(jié)合的混合算法,該算法可以實現(xiàn)讀請求、寫請求優(yōu)先級循環(huán)變換,刷新請求優(yōu)先級設(shè)置為最高。
圖3 仲裁器電路圖Fig.3 Diagram of arbitrator circuit
視頻緩沖器可以結(jié)合行、場同步信號的特點使用。同步信號的周期一般由同步頭、消隱前肩、有效顯示時間和消隱后肩等4部分構(gòu)成[6]。場同步頭可以用來啟動新一幀視頻數(shù)據(jù)的采集和輸出并復(fù)位視頻緩沖器。在整個行同步的周期內(nèi),只要異步FIFO讀空,便產(chǎn)生讀請求信號;寫緩沖器則在行同步和場同步信號均有效期間采集外設(shè)數(shù)據(jù),寫緩沖器的同步FIFO寫滿時,將產(chǎn)生寫請求信號;而刷新請求信號則由計數(shù)器產(chǎn)生,由于在讀寫數(shù)據(jù)期間不能響應(yīng)刷新請求信號。為了解決這個問題,本系統(tǒng)采用了兩種方法:一是將刷新請求優(yōu)先級設(shè)置成最高,讀和寫請求優(yōu)先級設(shè)置成相等。二是將刷新周期縮短(N+10)×Tsclk時間,縮短的時間可以確保完成讀或?qū)懭蝿?wù)后再執(zhí)行刷新操作而不造成數(shù)據(jù)丟失。
仲裁器電路如圖3所示,當(dāng)有刷新請求時關(guān)閉兩個與門屏蔽掉讀、寫請求,因此刷新請求優(yōu)先級最高??刂破鞯墓δ苤皇菍崿F(xiàn)數(shù)據(jù)選擇器輪流查詢3個請求信號;之二是在某個請求獲得使用SDRAM總線的使用權(quán)時,禁止其他信號的請求(即不支持中斷),讀、寫任務(wù)或刷新任務(wù)執(zhí)行過程中控制器關(guān)閉數(shù)據(jù)選擇器。任務(wù)完成后釋放總線,然后控制器打開數(shù)據(jù)選擇器查詢下一個請求信號,如果請求有效,對其授權(quán)總線使用權(quán),否則繼續(xù)查詢下一個請求信號。
為了防止視頻緩沖器出現(xiàn)讀空和寫滿錯誤,在設(shè)計電路時需要對視頻的流暢性分析以選定合適的參數(shù)。影響視頻流暢性的因素有:
(1)讀緩沖器的時鐘周期Trclk、寫緩沖器時鐘周期Twclk和SDRAM系統(tǒng)時鐘周期Tsclk。三者的時鐘周期必須確保SDRAM帶寬大于讀寫緩沖器帶寬之和。
(2)仲裁器的切換時間。盡量壓縮仲裁器的切換時間,本系統(tǒng)仲裁器的切換時間為3個時鐘周期。
(3)行同步信號的消隱前肩和后肩。視頻數(shù)據(jù)的采集和輸出一般在行同步信號的有效顯示期間,但讀緩沖器可以充分利用額外的行消隱前肩和后肩時間預(yù)讀取視頻數(shù)據(jù),而寫緩沖器可以利用額外的行消隱前肩和后肩時間保存數(shù)據(jù)。
(4)讀緩沖器的同步FIFO的容量和寫緩沖器中異步FIFO的容量。兩個FIFO容量的選取須考慮最壞情況。以寫緩沖的異步FIFO為例,如果同時存在讀、寫和刷新請求,但寫請求優(yōu)先級最低,此時異步FIFO 需要緩存數(shù)據(jù)以等待SDRAM完成刷新和寫任務(wù),容量必須大于(N+18)Tsclk/Twclk。寫緩沖獲得總線后,由于本系統(tǒng)不支持同步FIFO同時讀寫,此時異步FIFO容量應(yīng)大于(2N+25)Tsclk/Twclk。寫操作結(jié)束后釋放總線等待讀任務(wù)執(zhí)行,此時容量應(yīng)該大于(2N+25)Tsclk/Twclk+ (N+7)Tsclk/Trclk-N。
最后本文根據(jù)上述分析對相關(guān)參數(shù)進(jìn)行設(shè)置,并對設(shè)計的視頻緩沖器進(jìn)行了仿真。仿真軟件采用的是XILINX[7]的ISE12.4,片外存儲器SDRAM的仿真模型選用的是MT48LC8-M16A2,其工作時鐘頻率根據(jù)初步選擇為100 MHz,F(xiàn)PGA采用的是SPARTAN3系列中的XC3S1200E芯片。數(shù)據(jù)塊設(shè)置為固定的64×16 bit格式,在仿真的過程中FIFO的寬度固定為16位,寫緩沖器的同步FIFO容量與數(shù)據(jù)塊相同,讀緩沖器的異步FIFO容量設(shè)定為數(shù)據(jù)塊的兩倍。其余FIFO的容量根據(jù)實驗結(jié)果調(diào)整為數(shù)據(jù)塊的整數(shù)倍。攝像頭OV7670和VGA分別作為輸入和輸出模塊,工作時鐘頻率都選擇為25 MHz,視頻數(shù)據(jù)采用640×480格式。最后實驗仿真結(jié)果如表1所示。
仿真結(jié)果表明:對于寫緩沖器而言,使用兩個容量為128字節(jié)的FIFO就足夠保證采集的視頻數(shù)據(jù)傳輸無丟失錯誤,增加異步FIFO的容量不能繼續(xù)提高系統(tǒng)的帶寬;對于讀緩沖而言,影響其性能的主要部件是同步FIFO的容量,適當(dāng)?shù)卦黾悠髌淙萘靠梢越档蚐DRAM工作時鐘的頻率。當(dāng)讀寫緩沖器的容量為640字節(jié)時,SDRAM工作頻率須大于110 MHz;當(dāng)讀寫緩沖器的容量為768字節(jié)時,SDRAM工作頻率只需大于71 MHz。用戶可以根據(jù)實際需要在系統(tǒng)穩(wěn)定性和FPGA片內(nèi)存儲器資源之間選擇。
表1 仿真結(jié)果表
使用FPGA 2塊片內(nèi)同步FIFO和2塊異步FIFO結(jié)合片外存儲器SDRAM構(gòu)成了一個雙端口視頻緩沖器。利用FIFO傳輸跨時鐘域數(shù)據(jù)的傳輸,并將數(shù)據(jù)切成固定大小的數(shù)據(jù)塊以支持SDRAM的分塊讀寫數(shù)據(jù)機(jī)制,在仲裁器的合理調(diào)度下,使用單塊存儲器SDRAM實現(xiàn)了視頻數(shù)據(jù)的實時采集和輸出。同時本系統(tǒng)的設(shè)計和調(diào)試簡單,用戶在保證視頻流的流暢性的前提下可以通過提高系統(tǒng)的工作時鐘減少異步FIFO容量,降低FPGA片上存儲資源的使用量;或是在增加FIFO的容量可以降低SDRAM的工作時鐘而提高系統(tǒng)的穩(wěn)定性。因此本設(shè)計具有一定的靈活性和高效率,在視頻圖像處理工程中具有一定的參考價值。
[1] 王騫,丁鐵夫.高速圖像存儲系統(tǒng)中SDRAM控制器的實現(xiàn)[J].液晶與顯示,2006,21(1):48-51.
Wang Q,Ding T F. Realization of SDRAM controller in high-speed image storing system [J].ChineseJournalofLiquidCrystalsandDisplays,2006,21(1):48-51.( in Chinese)
[2] 吉倩倩,蘇光大,向守兵.嵌入式鄰域圖像并行處理機(jī)的液晶顯示系統(tǒng)設(shè)計[J].液晶與顯示,2011,26(6):768-773.
Ji Q Q,Su G D,Xiang S B. Design of LCD display system of embedded neighborhood image parallel computer[J].ChineseJournalofLiquidCrystalsandDisplays,2011,26(6):768-773. (in Chinese)
[3] 呂耀文,王建立,曹景太,等.移動便攜圖像存儲系統(tǒng)的設(shè)計[J].液晶與顯示,2012,27(5):697-702.
Lv Y W,Wang J L,Cao J T,etal. Design of portable image storage system [J].ChineseJournalofLiquidCrystalsandDisplays,2012,27(5):697-702. (in Chinese)
[4] 劉少華,陳明義. 基于FPGA的高速海量FIFO的設(shè)計[J].信息技術(shù),2009,33(9):52-54.
Liu S H,Chen M Y. Design of high speed and great capacity FIFO based on FPGA [J].InformationTechnology,2009,33(9):52-54.(in Chinese)
[5] 李耀榮,王興軍,梁利平.SOC總線仲裁算法的研究[J].微計算機(jī)信息,2007,6(2):113-115.
Li Y R,Wang X J,Liang L P. Researchon SOC bus arbitration algorithm [J].MicrocomputerInformation,2007,6(2):113-115. (in Chinese)
[6] 王鳴浩,吳小霞.基于FPGA的通用液晶顯示控制器的設(shè)計與實現(xiàn)[J].液晶與顯示,2012,27(1):87-88.
Wang M H,Wu X X.Design and realization of general LCD controller base on FPGA [J].ChineseJournalofLiquidCrystalsandDisplays,2012,27(1):87-88. (in Chinese)
[7] 田耕,徐文波,胡彬. Xilinx ISE Design Suite 10.X FPGA開發(fā)指南[M].北京:人民郵電出版社,2008.
Tian G,Xu W B,Hu B.XilinxISEdesignsuite10.XFPGAdevelopmentguide[M]. Beijing:Post &Telecom Press,2008.