唐 斌
(貴州財(cái)經(jīng)大學(xué) 信息學(xué)院,貴州 貴陽 550025)
在多數(shù)的基于FPGA(Field Programmable Gate Arrays)的視頻處理系統(tǒng)中,通常需要使用片外大容量存儲(chǔ)器SDRAM(Synchronous Dynamic Random Access Memory)緩存海量視頻資料[1-2]。同時(shí)為了確保視頻流的流暢性,甚至使用多塊SDRAM內(nèi)存和大容量的FIFO(First In First Out)實(shí)現(xiàn)乒乓操作以提高讀寫速度[3]。為了節(jié)省內(nèi)存資源和提高系統(tǒng)的數(shù)據(jù)帶寬,本文設(shè)計(jì)了一種基于FPGA的視頻緩沖器,系統(tǒng)使用FPGA片內(nèi)4塊小容量的FIFO構(gòu)成雙端口緩沖器,在仲裁器合理的調(diào)度下,采用單塊SDRAM實(shí)現(xiàn)了視頻數(shù)據(jù)的實(shí)時(shí)采集和輸出。
本文的雙端口視頻緩沖器采用FPGA和SDRAM構(gòu)成,系統(tǒng)的結(jié)構(gòu)如圖1所示。由于系統(tǒng)的輸入視頻和輸出視頻像素時(shí)鐘可能不同,需要使用FPGA片內(nèi)存儲(chǔ)資源構(gòu)建FIFO完成跨時(shí)鐘域視頻數(shù)據(jù)的采集和輸出。由于FPGA片內(nèi)存儲(chǔ)器資源有限,為了確保視頻流的流暢性,還需要借助片外存儲(chǔ)器與FPGA構(gòu)建視頻緩沖器。本系統(tǒng)采用SDRAM暫存采集的海量視頻數(shù)據(jù),并將其內(nèi)存儲(chǔ)單元分成兩塊分別緩存兩幀不同視頻數(shù)據(jù),以乒乓方式完成一幀數(shù)據(jù)的輸入和一幀數(shù)據(jù)的輸出。
圖1 系統(tǒng)方框圖Fig.1 Block diagram of video processing system
在本系統(tǒng)中,所采集的視頻數(shù)據(jù)來源于攝像頭OV7670,其時(shí)鐘頻率為25 MHz,視頻數(shù)據(jù)采用RGB565格式,因此采集模塊的數(shù)據(jù)帶寬為400 Mbit/s;而顯示模塊VGA的數(shù)據(jù)帶寬則是400 Mbit/s (16 bits×25 MHz)。SDRAM的工作時(shí)鐘頻率選擇為100 MHz,其數(shù)據(jù)帶寬為1 600 Mbit/s (16 bits×100 MHz),因此在理論上整個(gè)系統(tǒng)可以使用單存儲(chǔ)器實(shí)現(xiàn)一路視頻數(shù)據(jù)的實(shí)時(shí)采集和顯示。由于SDRAM不支持同時(shí)讀寫功能,而整個(gè)系統(tǒng)可能會(huì)同時(shí)存在讀、寫和刷新3種操作請(qǐng)求,因此還需要仲裁器分配SDRAM的總線使用權(quán)。
SDRAM存儲(chǔ)器具有高速度、大容量和高性價(jià)比等優(yōu)點(diǎn),廣泛應(yīng)用于數(shù)據(jù)采集和處理系統(tǒng)中[1]。盡管SDRAM具有高速度優(yōu)點(diǎn),但其實(shí)際帶寬往往低于其理論帶寬。原因有兩個(gè):一是SDRAM是利用電容存取電荷的原理保存信息,由于電容介質(zhì)存在漏電現(xiàn)象,因此需要周期刷新保持?jǐn)?shù)據(jù),而在刷新周期中不允許讀寫SDRAM,因此刷新會(huì)降低其實(shí)際帶寬;二是因?yàn)镾DRAM的行列地址線采用復(fù)用方式,每次讀寫數(shù)據(jù)操作都分為行地址準(zhǔn)備和數(shù)據(jù)操作兩個(gè)階段,分別消耗時(shí)間長度為TREADY和TOPERATE。在列地址準(zhǔn)備階段,需要發(fā)出激活命令,提供讀寫單元的行地址,等待TRCD時(shí)間后進(jìn)入數(shù)據(jù)操作階段[1]。對(duì)于寫操作,數(shù)據(jù)操作階段發(fā)出寫命令,同時(shí)提供讀寫單元的列地址和待寫入的數(shù)據(jù);對(duì)于讀操作則需要在發(fā)出第一個(gè)讀命令和列地址后等待TCAS時(shí)間才能讀取數(shù)據(jù)。因此SDRAM的實(shí)際帶寬為:
(1)
SDRAM的讀寫機(jī)制比較復(fù)雜,支持激活和預(yù)充電等諸多操作命令[1]。為了簡(jiǎn)化SDRAM的操作,本系統(tǒng)的SDRAM控制器只選取了激活、預(yù)充電、自刷新、空閑、模式寄存器配置、讀和寫等7條指令。為了簡(jiǎn)化SDRAM的讀寫操作,SDRAM的操作時(shí)序封裝在控制器中,外設(shè)只需提高讀寫數(shù)據(jù)的起始地址和讀寫使能信號(hào)就能讀寫SDRAM存儲(chǔ)器。同時(shí)為了提高SDRAM的實(shí)際帶寬,控制器采用分塊連續(xù)讀寫方式增大操作時(shí)間TOPERATE。SDRAM控制器由外設(shè)接口電路、初始化狀態(tài)機(jī)、地址計(jì)數(shù)器、命令字解析電路和SDRAM物理接口電路構(gòu)成。其工作時(shí)序如圖2所示,具體工作機(jī)制為:在SDRAM初始化時(shí),將其猝發(fā)長度設(shè)置為1,對(duì)于讀寫數(shù)據(jù)長度為N的數(shù)據(jù)都分解為N次猝發(fā)長度設(shè)置為1的讀寫操作。當(dāng)外設(shè)提出讀寫請(qǐng)求時(shí),只需提供一幀視頻數(shù)據(jù)的起始地址,命令字解析電路(使用狀態(tài)機(jī)實(shí)現(xiàn))發(fā)出行激活命令后給出兩條空操作命令,在T4周期啟動(dòng)地址計(jì)數(shù)器準(zhǔn)備讀寫數(shù)據(jù)的列地址并給出第一個(gè)讀或?qū)懨?,N個(gè)數(shù)據(jù)讀或?qū)懨钔瓿珊?,發(fā)出預(yù)充電命令關(guān)閉當(dāng)前行完成一次數(shù)據(jù)塊的連續(xù)讀寫,因此一次數(shù)據(jù)塊的讀寫時(shí)間固定為(N+4)/Tsclk。(Tsclk為SDRAM控制器時(shí)鐘周期)。為了降低地址計(jì)數(shù)器和命令字解析電路的復(fù)雜度,數(shù)據(jù)長度N和SDRAM行長度L須設(shè)置為L=K×N(K為整數(shù)),以防出現(xiàn)跨行讀寫現(xiàn)象。
圖2 讀寫時(shí)序圖Fig.2 Diagram of reading or writing timing
本系統(tǒng)使用兩塊小容量的異步FIFO和同步FIFO串聯(lián)實(shí)現(xiàn)跨時(shí)鐘域視頻數(shù)據(jù)的傳輸,F(xiàn)IFO由FPGA中免費(fèi)的IP核生成。對(duì)于寫緩存器而言,異步FIFO與視頻采集模塊連接,其寫端口的時(shí)鐘與視頻采集模塊的像素時(shí)鐘相同,讀端口的時(shí)鐘與SDRAM的工作時(shí)鐘相同,其主要功能是實(shí)現(xiàn)跨時(shí)鐘域數(shù)據(jù)的緩沖[4];同步FIFO與SDRAM控制器直接連接,工作時(shí)鐘與異步FIFO的讀端口時(shí)鐘一致,為了支持SDRAM控制器的分塊讀寫機(jī)制,將其深度和寬度設(shè)置成數(shù)據(jù)塊的規(guī)格,待傳輸?shù)臄?shù)據(jù)將被切成固定大小的數(shù)據(jù)塊。為確保數(shù)據(jù)塊的大小固定不變,禁止對(duì)同步FIFO進(jìn)行同時(shí)讀寫操作。
讀緩存器的設(shè)計(jì)與寫緩存器稍有不同,同步FIFO連接的是顯示模塊,其工作時(shí)鐘與顯示模塊相同,主要功能是預(yù)存待顯示的視頻數(shù)據(jù)。異步FIFO 則與SDRAM控制器相連,讀端口采用顯示模塊的工作時(shí)鐘,為確保寫端口數(shù)據(jù)有足夠的建立時(shí)間和保持時(shí)間[5],工作時(shí)鐘頻率SDRAM工作時(shí)鐘相同,但相位相差180°。同樣為了支持SDRAM控制器的分塊讀寫機(jī)制,將其寬度設(shè)置成數(shù)據(jù)塊的大小,但深度設(shè)置為數(shù)據(jù)塊深度的2倍。異步FIFO的主要功能是實(shí)現(xiàn)跨時(shí)鐘域視頻數(shù)據(jù)的緩沖。在同步FIFO未寫滿的情況下,異步FIFO中的數(shù)據(jù)直通同步FIFO。
由于SDRAM的總線采用分時(shí)復(fù)用方式,不支持同時(shí)讀、寫和刷新功能,為了確保視頻流的流暢性,需要合理分配SDRAM的總線使用權(quán)。常用的仲裁方法有固定優(yōu)先級(jí)、隨機(jī)爭(zhēng)用和優(yōu)先級(jí)循環(huán)等算法[5]。如果采用固定優(yōu)先級(jí)算法時(shí)可能會(huì)出現(xiàn)讀請(qǐng)求長時(shí)間占用總線風(fēng)險(xiǎn)而導(dǎo)致寫緩存溢出,或是寫請(qǐng)求長時(shí)間占用總線風(fēng)險(xiǎn)而導(dǎo)致讀緩存無數(shù)據(jù)可讀。而采用優(yōu)先級(jí)循環(huán)算法可能導(dǎo)致刷新命令不能及時(shí)得到響應(yīng)造成數(shù)據(jù)丟失。綜上考慮后,本系統(tǒng)采用固定優(yōu)先級(jí)算法和優(yōu)先級(jí)循環(huán)算法相結(jié)合的混合算法,該算法可以實(shí)現(xiàn)讀請(qǐng)求、寫請(qǐng)求優(yōu)先級(jí)循環(huán)變換,刷新請(qǐng)求優(yōu)先級(jí)設(shè)置為最高。
圖3 仲裁器電路圖Fig.3 Diagram of arbitrator circuit
視頻緩沖器可以結(jié)合行、場(chǎng)同步信號(hào)的特點(diǎn)使用。同步信號(hào)的周期一般由同步頭、消隱前肩、有效顯示時(shí)間和消隱后肩等4部分構(gòu)成[6]。場(chǎng)同步頭可以用來啟動(dòng)新一幀視頻數(shù)據(jù)的采集和輸出并復(fù)位視頻緩沖器。在整個(gè)行同步的周期內(nèi),只要異步FIFO讀空,便產(chǎn)生讀請(qǐng)求信號(hào);寫緩沖器則在行同步和場(chǎng)同步信號(hào)均有效期間采集外設(shè)數(shù)據(jù),寫緩沖器的同步FIFO寫滿時(shí),將產(chǎn)生寫請(qǐng)求信號(hào);而刷新請(qǐng)求信號(hào)則由計(jì)數(shù)器產(chǎn)生,由于在讀寫數(shù)據(jù)期間不能響應(yīng)刷新請(qǐng)求信號(hào)。為了解決這個(gè)問題,本系統(tǒng)采用了兩種方法:一是將刷新請(qǐng)求優(yōu)先級(jí)設(shè)置成最高,讀和寫請(qǐng)求優(yōu)先級(jí)設(shè)置成相等。二是將刷新周期縮短(N+10)×Tsclk時(shí)間,縮短的時(shí)間可以確保完成讀或?qū)懭蝿?wù)后再執(zhí)行刷新操作而不造成數(shù)據(jù)丟失。
仲裁器電路如圖3所示,當(dāng)有刷新請(qǐng)求時(shí)關(guān)閉兩個(gè)與門屏蔽掉讀、寫請(qǐng)求,因此刷新請(qǐng)求優(yōu)先級(jí)最高??刂破鞯墓δ苤皇菍?shí)現(xiàn)數(shù)據(jù)選擇器輪流查詢3個(gè)請(qǐng)求信號(hào);之二是在某個(gè)請(qǐng)求獲得使用SDRAM總線的使用權(quán)時(shí),禁止其他信號(hào)的請(qǐng)求(即不支持中斷),讀、寫任務(wù)或刷新任務(wù)執(zhí)行過程中控制器關(guān)閉數(shù)據(jù)選擇器。任務(wù)完成后釋放總線,然后控制器打開數(shù)據(jù)選擇器查詢下一個(gè)請(qǐng)求信號(hào),如果請(qǐng)求有效,對(duì)其授權(quán)總線使用權(quán),否則繼續(xù)查詢下一個(gè)請(qǐng)求信號(hào)。
為了防止視頻緩沖器出現(xiàn)讀空和寫滿錯(cuò)誤,在設(shè)計(jì)電路時(shí)需要對(duì)視頻的流暢性分析以選定合適的參數(shù)。影響視頻流暢性的因素有:
(1)讀緩沖器的時(shí)鐘周期Trclk、寫緩沖器時(shí)鐘周期Twclk和SDRAM系統(tǒng)時(shí)鐘周期Tsclk。三者的時(shí)鐘周期必須確保SDRAM帶寬大于讀寫緩沖器帶寬之和。
(2)仲裁器的切換時(shí)間。盡量壓縮仲裁器的切換時(shí)間,本系統(tǒng)仲裁器的切換時(shí)間為3個(gè)時(shí)鐘周期。
(3)行同步信號(hào)的消隱前肩和后肩。視頻數(shù)據(jù)的采集和輸出一般在行同步信號(hào)的有效顯示期間,但讀緩沖器可以充分利用額外的行消隱前肩和后肩時(shí)間預(yù)讀取視頻數(shù)據(jù),而寫緩沖器可以利用額外的行消隱前肩和后肩時(shí)間保存數(shù)據(jù)。
(4)讀緩沖器的同步FIFO的容量和寫緩沖器中異步FIFO的容量。兩個(gè)FIFO容量的選取須考慮最壞情況。以寫緩沖的異步FIFO為例,如果同時(shí)存在讀、寫和刷新請(qǐng)求,但寫請(qǐng)求優(yōu)先級(jí)最低,此時(shí)異步FIFO 需要緩存數(shù)據(jù)以等待SDRAM完成刷新和寫任務(wù),容量必須大于(N+18)Tsclk/Twclk。寫緩沖獲得總線后,由于本系統(tǒng)不支持同步FIFO同時(shí)讀寫,此時(shí)異步FIFO容量應(yīng)大于(2N+25)Tsclk/Twclk。寫操作結(jié)束后釋放總線等待讀任務(wù)執(zhí)行,此時(shí)容量應(yīng)該大于(2N+25)Tsclk/Twclk+ (N+7)Tsclk/Trclk-N。
最后本文根據(jù)上述分析對(duì)相關(guān)參數(shù)進(jìn)行設(shè)置,并對(duì)設(shè)計(jì)的視頻緩沖器進(jìn)行了仿真。仿真軟件采用的是XILINX[7]的ISE12.4,片外存儲(chǔ)器SDRAM的仿真模型選用的是MT48LC8-M16A2,其工作時(shí)鐘頻率根據(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ù)實(shí)驗(yàn)結(jié)果調(diào)整為數(shù)據(jù)塊的整數(shù)倍。攝像頭OV7670和VGA分別作為輸入和輸出模塊,工作時(shí)鐘頻率都選擇為25 MHz,視頻數(shù)據(jù)采用640×480格式。最后實(shí)驗(yàn)仿真結(jié)果如表1所示。
仿真結(jié)果表明:對(duì)于寫緩沖器而言,使用兩個(gè)容量為128字節(jié)的FIFO就足夠保證采集的視頻數(shù)據(jù)傳輸無丟失錯(cuò)誤,增加異步FIFO的容量不能繼續(xù)提高系統(tǒng)的帶寬;對(duì)于讀緩沖而言,影響其性能的主要部件是同步FIFO的容量,適當(dāng)?shù)卦黾悠髌淙萘靠梢越档蚐DRAM工作時(shí)鐘的頻率。當(dāng)讀寫緩沖器的容量為640字節(jié)時(shí),SDRAM工作頻率須大于110 MHz;當(dāng)讀寫緩沖器的容量為768字節(jié)時(shí),SDRAM工作頻率只需大于71 MHz。用戶可以根據(jù)實(shí)際需要在系統(tǒng)穩(wěn)定性和FPGA片內(nèi)存儲(chǔ)器資源之間選擇。
表1 仿真結(jié)果表
使用FPGA 2塊片內(nèi)同步FIFO和2塊異步FIFO結(jié)合片外存儲(chǔ)器SDRAM構(gòu)成了一個(gè)雙端口視頻緩沖器。利用FIFO傳輸跨時(shí)鐘域數(shù)據(jù)的傳輸,并將數(shù)據(jù)切成固定大小的數(shù)據(jù)塊以支持SDRAM的分塊讀寫數(shù)據(jù)機(jī)制,在仲裁器的合理調(diào)度下,使用單塊存儲(chǔ)器SDRAM實(shí)現(xiàn)了視頻數(shù)據(jù)的實(shí)時(shí)采集和輸出。同時(shí)本系統(tǒng)的設(shè)計(jì)和調(diào)試簡(jiǎn)單,用戶在保證視頻流的流暢性的前提下可以通過提高系統(tǒng)的工作時(shí)鐘減少異步FIFO容量,降低FPGA片上存儲(chǔ)資源的使用量;或是在增加FIFO的容量可以降低SDRAM的工作時(shí)鐘而提高系統(tǒng)的穩(wěn)定性。因此本設(shè)計(jì)具有一定的靈活性和高效率,在視頻圖像處理工程中具有一定的參考價(jià)值。
[1] 王騫,丁鐵夫.高速圖像存儲(chǔ)系統(tǒng)中SDRAM控制器的實(shí)現(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ì)[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] 呂耀文,王建立,曹景太,等.移動(dòng)便攜圖像存儲(chǔ)系統(tǒng)的設(shè)計(jì)[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ì)[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ì)算機(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è)計(jì)與實(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.