袁 興,王林林,王桂海,陳新華
(山東科技大學(xué)信息科學(xué)與工程學(xué)院,山東青島266590)
在工業(yè)生產(chǎn)和日常生活中對視頻采集、傳輸系統(tǒng)的應(yīng)用越來越廣泛,且對系統(tǒng)實時性和傳輸圖像質(zhì)量的要求也越來越高。為滿足系統(tǒng)要求,提出采用NiosII處理器結(jié)合SOPC技術(shù)來實現(xiàn)網(wǎng)絡(luò)傳輸。由于NiosII承擔(dān)著視頻采集、網(wǎng)絡(luò)傳輸?shù)榷鄠€任務(wù),為提高傳輸?shù)膶崟r性等硬性要求,采用雙處理器架構(gòu),分別用于視頻采集和網(wǎng)絡(luò)傳輸。NiosII之間通過資源共享的方式進行信息交互,實現(xiàn)兩核之間的協(xié)同通信,提高系統(tǒng)效率。軟件方面采用Linux系統(tǒng)作為開發(fā)平臺,通過移植RTP/RTCP流媒體協(xié)議實現(xiàn)視頻流的網(wǎng)絡(luò)傳輸,該系統(tǒng)具有高度集成、可重配置、性價比突出等優(yōu)點。
基于SOPC實現(xiàn)的系統(tǒng)構(gòu)架如圖1所示。在該系統(tǒng)中,處理器各自擁有獨立的Avalon總線。兩處理器私有、獨立訪問的模塊 (如SSRAM與UART),需連接到各自的Avalon總線上。在該SOPC系統(tǒng)中,雙核NiosII共同享有的模塊(如IMG_SDRAM與FLASH),應(yīng)與兩條Avalon總線相連。在為系統(tǒng)各模塊分配基地址時,與同一條總線相連的各模塊對應(yīng)的基地址不能重疊,否者會引起訪問沖突。若模塊不在同一條總線上相連,其地址可以與其另一條總線上的任何模塊重疊,而二者共有的模塊,則必須設(shè)為獨有地址[1]。
圖1 雙NiosII構(gòu)架的SOPC系統(tǒng)結(jié)構(gòu)框架
視頻捕捉和本地顯示模塊由攝像頭、VGA控制器、數(shù)據(jù)轉(zhuǎn)化構(gòu)成,其組成框圖如圖2所示。I2C_Config模塊通過I2C協(xié)議配置解碼芯片ADV7180識別PAL視頻數(shù)據(jù),硬件模塊ITU-R656將解碼的數(shù)字信號轉(zhuǎn)換成YCrCb信號并得到像素時鐘、場同步信號、消隱信號、VGA時序信號等信息。
視頻輸入信號為隔行掃描,為正確的VGA輸出顯示需要處理逐行掃描數(shù)據(jù),即將隔行的有效視頻數(shù)據(jù)轉(zhuǎn)換成逐行的視頻數(shù)據(jù)。解碼后視頻數(shù)據(jù)量大,為保證時序滿足并能正確顯示,需要一個存儲空間作為緩存 (DIS_SDRAM)。為將解碼得到的視頻數(shù)據(jù)存入緩存,使用4_Port SDRAM控制器與DIS_SDRAM通信。4_Port_SDRAM有兩個Read Port和兩個Write Port,如圖3所示,分別用于奇場與偶場數(shù)據(jù)的寫入和讀出。VGA顯示的是一幀視頻中的偶場數(shù)據(jù),通過VGA_controller產(chǎn)生Read信號作用于RD_FIFO_1,從DIS_SDRAM緩存中得到偶場視頻數(shù)據(jù)進行顯示,而RD_FIFO_2讀出的奇數(shù)場數(shù)據(jù)用于遠程網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)源。
圖2 視頻捕捉和本地顯示結(jié)構(gòu)框架
圖3 4_Port SDRAM Controller框架
由于系統(tǒng)需要實時處理大量的視頻數(shù)據(jù),而且方便網(wǎng)絡(luò)發(fā)送,需要將視頻數(shù)據(jù)進行存儲。為提高系統(tǒng)的執(zhí)行效率,加快數(shù)據(jù)的存儲與訪問速度,系統(tǒng)采用DMA的傳輸方式[3],將圖像數(shù)據(jù)直接存入IMG_SDRAM中。該模式不過分依賴CPU,可以大大節(jié)省系統(tǒng)資源,是內(nèi)存與外設(shè)之間進行批量數(shù)據(jù)傳輸?shù)淖罴堰x擇。
解碼芯片得到的數(shù)據(jù)經(jīng)過ITU_R656Decoder模塊處理后得到Y(jié)UV422格式的數(shù)據(jù)流,并且一行像素的有效行起始(SAV)和行結(jié)束 (EAV)標(biāo)志包含在數(shù)據(jù)流中,YUV422格式的一行像素的時序圖如圖4所示。
為將視頻正確的采集并存入IMG_SDRAM中,依據(jù)YUV數(shù)據(jù)流的定時基準(zhǔn)信號 (SAV、EAV)可以得出一幀圖像的開始與結(jié)束。SAV(Start of Active Video)與EAV(End of Active Video)分別由4個字節(jié)組成,格式為FF 00 00 XY。前3字節(jié)是固定前綴,用于定時基準(zhǔn)。XY包含了場標(biāo)識、場消隱、行消隱等信息:其數(shù)據(jù)格式如表1所示。
圖4 YUV422一行像素時序圖
表1 定時基準(zhǔn)信號XY比特分配表
其中F、V、H信號不同值的組合代表了視頻不同場序及有效視頻的開始與結(jié)束;P0、P1、P2、P3為保護位,它們的值取決于F、V、H的狀態(tài),可以依據(jù)上述信息判斷一幀圖像的始末并及時存儲在IMG_SDRAM中。
由于SOPC系統(tǒng)中沒有相應(yīng)的IP核完成該系統(tǒng)的DMA任務(wù),為此依據(jù)Avalon-MM總線協(xié)議[4]規(guī)范,自行設(shè)計W/R_to_Sdram的IP核[5]。該模塊既有主端口信號,也有從端口信號,如圖5所示。IP核的從端口接收Image_cpu發(fā)送的地址信息,告知IP核將視頻數(shù)據(jù)寫入到IMG_SDRAM中的哪個地址段中,同時Image_cpu可通過該端口獲得存儲過程的狀態(tài) (如Start、Done),主端口發(fā)出讀信號作用與4_Port_sdram_controller的RD_FIFO_2,得到的奇場視頻數(shù)據(jù)直接寫入到IMG_SDRAM中。在保證不失系統(tǒng)性能的前提下,為節(jié)省存儲空間的開銷,該模塊只將奇數(shù)場中的亮度信號Y[7:0]寫入到SDRAM中,這樣不僅減少數(shù)據(jù)量便于存儲也有利于數(shù)據(jù)在網(wǎng)絡(luò)中傳輸,節(jié)省帶寬。
圖5 W/R_to_Sdram IP核讀/寫數(shù)據(jù)框架
該FPGA開發(fā)板上只有兩片SDRAM(16M*2)DIS_SDRAM和IMG_SDRAM。DIS_SDRAM用于視頻捕捉與本地顯示模塊,另一片IMG_SDRAM用于視頻圖像的存儲和Linux系統(tǒng)的內(nèi)存。通過劃分區(qū)域的方法將 IMG_SDRAM分為兩個相對獨立的內(nèi)存空間,分別配置給W/R_to_Sdram存儲視頻和 Net_cpu運行 Linux,實現(xiàn)內(nèi)存共享。
在SOPC系統(tǒng)中,共享存儲IMG_SDRAM分配的地址為0x4000000~0x4ffffff共16M bytes。為將該內(nèi)存進行劃分,通過將SOPC系統(tǒng)生成的custom_fpga.h頭文件中的IMG_SDRAM基地址修改成0x4600000,即將IMG_SDRAM的低6M bytes劃分給W/R_to_sdram使用,高10M bytes分配給Net_cpu。Linux啟動時就會從地址0x4600000開始執(zhí)行,而不是SDRAM的基地址。
網(wǎng)絡(luò)發(fā)送時,需要將亮度信號從DIS_SDRAM存儲空間中轉(zhuǎn)移到IMG_SDRAM中,數(shù)據(jù)流向如圖6所示。W/R_to_Sdram采用DMA方式將亮度信號經(jīng)過SDRAM控制器寫入到IMG_SDRAM。這時,Linux系統(tǒng)需要訪問共享內(nèi)存IMG_SDRAM中的另一塊區(qū)域Image_data_memory,將該存儲區(qū)域的視頻數(shù)據(jù)讀取并進行網(wǎng)絡(luò)發(fā)送。Linux通過內(nèi)存管理機制MMU,調(diào)用mmap()函數(shù)將IMG_SDRAM的物理地址映射到虛擬地址空間,這樣對內(nèi)存的操作不需要調(diào)用Read/Write函數(shù),可直接通過地址指針獲取,提高訪問速度。
內(nèi)存地址及數(shù)據(jù)信息全部保存在Linux系統(tǒng)中的/dev/mem設(shè)備文件里,調(diào)用mmap()函數(shù)映射該設(shè)備文件實現(xiàn)共享內(nèi)存的訪問。Mmap()調(diào)用形式如下:(int*)mmap(void*addr,size_t len,int prot,int flags,int fd,off_t offset);其中l(wèi)en是映射到地址空間的字節(jié)數(shù),prot參數(shù)指定共享內(nèi)存的權(quán)限,fd參數(shù)為映射到進程空間的文件描述符。offset參數(shù)一般設(shè)置為0,表示從文件頭開始映射。addr參數(shù)指定文件應(yīng)被映射到進程空間的起始地址,一般指定為空指針,該任務(wù)交給內(nèi)核完成。函數(shù)返回值為內(nèi)存映射到進程空間的地址,可直接操作該虛擬地址訪問物理內(nèi)存。在該系統(tǒng)中,mmap()函數(shù)使用方法如下:先得到文件描述符fd,即fd=open(“dev/mem”,O_RDWR);之后得到映射后的虛擬地址adr_map,即:
adr_map=(int*)mmap(null,map_length,prot_read|prot_write,map_shared,fd,IMG_SDRAM_BASE);
系統(tǒng)中需要特定機制協(xié)調(diào)雙核之間的通信,防止對共享內(nèi)存同時進行操作,導(dǎo)致系統(tǒng)崩潰。通常處理器之間的信息交互有以下幾種解決方案:
圖6 雙核間內(nèi)存共享與數(shù)據(jù)搬移框架
表2 多核處理器間通信解決方案
基于上述特點,參考方案2和方案4,采用乒乓查詢的方式進行雙核間通信。雙核之間分別設(shè)置一個標(biāo)志位,存在于SDRAM特定地址中,通過查詢該特定地址的值,完成雙核之間的信息交互。
在搭建SOPC系統(tǒng)時,得到的custom_fpga.h文件包含了系統(tǒng)所有硬件的配置信息。Linux系統(tǒng)在進行內(nèi)核配置、裁剪時依據(jù)配置信息選擇UART、DM9000網(wǎng)卡等驅(qū)動,內(nèi)核依照這些選項及custom_fpga.h進行編譯,得到定制的Linux系統(tǒng)。
實時傳輸協(xié)議RTP[6]為數(shù)據(jù)提供了具有實時特征的端對端傳送服務(wù),能夠在單播或者多播的網(wǎng)絡(luò)環(huán)境中實現(xiàn)流媒體的實時傳輸。在Linux平臺上進行網(wǎng)絡(luò)編程,需要RTP相關(guān)的庫作支持。Jrtplib[7]是C++實現(xiàn)的開源RTP庫,使用socket機制實現(xiàn)網(wǎng)絡(luò)通訊,方便在多種系統(tǒng)上移植。所以Linux系統(tǒng)需要移植Jrtplib庫支持RTP協(xié)議。
對于發(fā)送端,首先生成RTPSession類的實例聲明此次RTP會話,并調(diào)用Creat()函數(shù)完成初始化。SetOwnTimestampUnit()函數(shù)設(shè)置恰當(dāng)?shù)臅r間戳,保證數(shù)據(jù)發(fā)送和接收保持同步。數(shù)據(jù)發(fā)送時,先調(diào)用SetPortbase()和AddDestination()設(shè)置目標(biāo)地址和端口,之后調(diào)用Sendpacket()函數(shù)向遠程端發(fā)送數(shù)據(jù)。對于遠程接收端,調(diào)用Jrtplib庫中的PollData()函數(shù)接收RTP數(shù)據(jù)報。通過相關(guān)函數(shù)讀出數(shù)據(jù)報的時間戳和同步源信息,將同一時間戳的數(shù)據(jù)恢復(fù)成一幀圖像。函數(shù)GotoFirstSource()和GotoNext-Source()遍歷發(fā)送過來的數(shù)據(jù)源,調(diào)用該函數(shù)實現(xiàn)實時接收和存儲顯示。
RTP發(fā)送與接收數(shù)據(jù)流程如圖7所示。對于發(fā)送端,一數(shù)據(jù)包發(fā)送的最大字節(jié)默認為1400 byte。而一幀圖像遠遠超過1400byte,需采用拆分發(fā)送,并將同一幀的拆分包的時間戳設(shè)為同一值,這樣接收端就將相同時間戳的數(shù)據(jù)重新組成一幀圖像。
圖7 RTP發(fā)送與接收數(shù)據(jù)流程
運行設(shè)計的系統(tǒng)并設(shè)置遠程端的IP地址和端口號,攝像頭的視頻數(shù)據(jù)經(jīng)過解碼,拆包并依據(jù)RTP協(xié)議發(fā)送到該目的地址,接收端等待接收服務(wù)器發(fā)送的數(shù)據(jù)并顯示圖像。
為保證系統(tǒng)內(nèi)存映射和數(shù)據(jù)搬移的正確性,通過測試程序打印出內(nèi)存地址段中的數(shù)據(jù)與NiosII IDE在Debug模式下的Memory監(jiān)視窗口的數(shù)值進行對比,驗證了映射數(shù)據(jù)的一致性。系統(tǒng)成功抓取一幀視頻數(shù)據(jù),通過RTP協(xié)議發(fā)送到指定的目的地址,接收端遍歷接收到的數(shù)據(jù)源,重新組合成一幀圖像進行顯示,接收到的圖像效果如圖8所示。
圖8 遠程接收端接收到的圖像
網(wǎng)絡(luò)視頻傳輸系統(tǒng)在工業(yè)生產(chǎn)、日常生活等方面的應(yīng)用日益廣泛,高性能的系統(tǒng)體現(xiàn)在嵌入式服務(wù)器的搭建。本文提出的基于FPGA的雙NiosII的SOPC系統(tǒng)方案具有運行穩(wěn)定可靠,實時性強、可重配置性強等特點。系統(tǒng)通過內(nèi)存映射可直接訪問物理內(nèi)存而不需要調(diào)用write/read函數(shù),加快了訪問內(nèi)存數(shù)據(jù)的速度,為圖像的網(wǎng)絡(luò)發(fā)送提供了可能。系統(tǒng)采用DMA方式將視頻數(shù)據(jù)直接存入到SDRAM中而不經(jīng)過CPU,提高了系統(tǒng)處理效率。整個傳輸系統(tǒng)共享同一塊SDRAM作為視頻存儲及Linux系統(tǒng)內(nèi)存,降低了硬件電路的開銷和復(fù)雜性,縮減了系統(tǒng)成本。
[1]ZHANG Ling,XIA bo,HE Wei.Design and implementation of dual NiosII architecture in the network video surveillance system[J].Information And Electronic Engineering,2007,5(4):275-279(in Chinese).[張玲,夏博,何偉,等.網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)中雙NiosII架構(gòu)的設(shè)計與實現(xiàn) [J].信息與電子工程,2007,5(4):275-279.]
[2]SUN Yanjing,LIShiyin,DONG Yang.Embedded networked video acquisition and compressed system based on RTP [J].Computer Engineering and Design,2006,27(16):2939-2942(in Chinese).[孫彥景,李世銀,董楊.基于RTP的嵌入式網(wǎng)絡(luò)化視頻采集壓縮系統(tǒng) [J].計算機工程與設(shè)計,2006,27(16):2939-2942.]
[3]TAO Baoquan,F(xiàn)U Yongqing,LIANG Pan.Design of video capture and transmission system based on SOPC [J].Applied Science and Technology,2010,37(4):31-34(in Chinese).[陶寶泉,付永慶,梁盼.基于SOPC的視頻采集及傳輸系統(tǒng)的設(shè)計[J].應(yīng)用科技,2010,37(4):31-34.]
[4]Altera.Avalon interface specifications[EB/OL].[2012-04-01].http://www.altera.com.
[5]GAO Feng,WANGYusong.Design and implementation of user-defined Avalon device on NiosII[J].China Measurement Technology,2007,33(4):105-108(in Chinese).[高楓,王玉松.基于NiosII自定制Avalon設(shè)備的設(shè)計與實現(xiàn) [J].中國測試技術(shù),2007,33(4):105-108.]
[6]WANG Lihu,LIU Chunsheng.Application of MPEG-4 video streaming transmission based on RTP/RTCP [J].Industrial Control Computer,2006,2006,19(3):31-32(in Chinese).[汪理虎,劉春生.RTP/RTCP協(xié)議下的MPEG-4視頻流傳輸系統(tǒng)應(yīng)用研究[J].工業(yè)控制計算機,2006,19(3):31-32.]
[7]LIU Jianjun,RUAN Xuebin.Realization of JRTPLIB-based video monitor system [J].Computer and Digital Engineering,2011,39(4):186-187(in Chinese).[劉建軍,阮學(xué)斌.基于JRTPLIB下的視頻監(jiān)控系統(tǒng)的實現(xiàn) [J].計算機與數(shù)字工程,2011,39(4):186-187.]
[8]ZHANG Zhengbing,DENG Huiping,XIA Zhenhua.A video capture and transmission system based on NiosII[J].Video Engineering,2007,31(6):28-29(in Chinese).[張正炳,鄧慧萍,夏振華.基于NiosII的視頻采集與傳輸系統(tǒng) [J].電視技術(shù),2007,31(6):28-29.]
[9]WANG Xuguo,YU Shuanglin.Development of the video capture and process system based on ARM [J].Information Technology,2011(9):121-124(in Chinese).[王緒國,余雙林.基于ARM的視頻采集與處理系統(tǒng)的開發(fā) [J].信息技術(shù),2011(9):121-124.]
[10]XIAO Wencai,F(xiàn)AN Feng.The FPGA design of real-time vi-deo acquisition system [J].Chian Digital Cable Tv,2006(21):2104-2108(in Chinese).[肖文才,樊豐.視頻實時采集系統(tǒng)的 FPGA設(shè)計 [J].中國有線電視,2006(21):2104-2108.]
[11]GUO Yongcai,SU Yuwei,GAO Chao.Design and implementation of real time infrared image collection system based on FPGA [J].Chinese Journal of Scientific Instrument,2011,32(3):514-518(in Chinese).[郭永彩,蘇渝維,高潮.基于FPGA的紅外圖像實時采集系統(tǒng)設(shè)計與實現(xiàn) [J].儀器儀表學(xué)報,2011,32(3):514-518.]
[12]Altera.NIOSsoftware development handbook[EB/OL].[2012-04-01].http://www.altera.com/literature/hb/nios2/n2sw_nii5v2.pdf.
[13]LI Lanying.Design principle and application of the SOPCbased on embedded NiosII[M].Beijing:Beijing University of Aeronautics and Astronautics Press,2006(in Chinese).[李蘭英.NiosII嵌入式軟核SOPC設(shè)計原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.]
[14]WANG Jinming.Verilog HDL programming tutorials[M].Beijing:Posts and Telecom Press,2004(in Chinese).[王金明.Verilog HDL程序設(shè)計教程 [M].北京:人民郵電出版社,2004.]
[15]SUN Qiong.Embedded Linux of detailed application development[M].Beijing:Posts and Telecom Press,2006:304-327(in Chinese).[孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解[M].北京:人民郵電出版社,2006:304-327.]