袁 兴,王林林,王桂海,陈新华
(山东科技大学信息科学与工程学院,山东青岛266590)
在工业生产和日常生活中对视频采集、传输系统的应用越来越广泛,且对系统实时性和传输图像质量的要求也越来越高。为满足系统要求,提出采用NiosII处理器结合SOPC技术来实现网络传输。由于NiosII承担着视频采集、网络传输等多个任务,为提高传输的实时性等硬性要求,采用双处理器架构,分别用于视频采集和网络传输。NiosII之间通过资源共享的方式进行信息交互,实现两核之间的协同通信,提高系统效率。软件方面采用Linux系统作为开发平台,通过移植RTP/RTCP流媒体协议实现视频流的网络传输,该系统具有高度集成、可重配置、性价比突出等优点。
基于SOPC实现的系统构架如图1所示。在该系统中,处理器各自拥有独立的Avalon总线。两处理器私有、独立访问的模块 (如SSRAM与UART),需连接到各自的Avalon总线上。在该SOPC系统中,双核NiosII共同享有的模块(如IMG_SDRAM与FLASH),应与两条Avalon总线相连。在为系统各模块分配基地址时,与同一条总线相连的各模块对应的基地址不能重叠,否者会引起访问冲突。若模块不在同一条总线上相连,其地址可以与其另一条总线上的任何模块重叠,而二者共有的模块,则必须设为独有地址[1]。
图1 双NiosII构架的SOPC系统结构框架
视频捕捉和本地显示模块由摄像头、VGA控制器、数据转化构成,其组成框图如图2所示。I2C_Config模块通过I2C协议配置解码芯片ADV7180识别PAL视频数据,硬件模块ITU-R656将解码的数字信号转换成YCrCb信号并得到像素时钟、场同步信号、消隐信号、VGA时序信号等信息。
视频输入信号为隔行扫描,为正确的VGA输出显示需要处理逐行扫描数据,即将隔行的有效视频数据转换成逐行的视频数据。解码后视频数据量大,为保证时序满足并能正确显示,需要一个存储空间作为缓存 (DIS_SDRAM)。为将解码得到的视频数据存入缓存,使用4_Port SDRAM控制器与DIS_SDRAM通信。4_Port_SDRAM有两个Read Port和两个Write Port,如图3所示,分别用于奇场与偶场数据的写入和读出。VGA显示的是一帧视频中的偶场数据,通过VGA_controller产生Read信号作用于RD_FIFO_1,从DIS_SDRAM缓存中得到偶场视频数据进行显示,而RD_FIFO_2读出的奇数场数据用于远程网络传输的数据源。
图2 视频捕捉和本地显示结构框架
图3 4_Port SDRAM Controller框架
由于系统需要实时处理大量的视频数据,而且方便网络发送,需要将视频数据进行存储。为提高系统的执行效率,加快数据的存储与访问速度,系统采用DMA的传输方式[3],将图像数据直接存入IMG_SDRAM中。该模式不过分依赖CPU,可以大大节省系统资源,是内存与外设之间进行批量数据传输的最佳选择。
解码芯片得到的数据经过ITU_R656Decoder模块处理后得到YUV422格式的数据流,并且一行像素的有效行起始(SAV)和行结束 (EAV)标志包含在数据流中,YUV422格式的一行像素的时序图如图4所示。
为将视频正确的采集并存入IMG_SDRAM中,依据YUV数据流的定时基准信号 (SAV、EAV)可以得出一帧图像的开始与结束。SAV(Start of Active Video)与EAV(End of Active Video)分别由4个字节组成,格式为FF 00 00 XY。前3字节是固定前缀,用于定时基准。XY包含了场标识、场消隐、行消隐等信息:其数据格式如表1所示。
图4 YUV422一行像素时序图
表1 定时基准信号XY比特分配表
其中F、V、H信号不同值的组合代表了视频不同场序及有效视频的开始与结束;P0、P1、P2、P3为保护位,它们的值取决于F、V、H的状态,可以依据上述信息判断一帧图像的始末并及时存储在IMG_SDRAM中。
由于SOPC系统中没有相应的IP核完成该系统的DMA任务,为此依据Avalon-MM总线协议[4]规范,自行设计W/R_to_Sdram的IP核[5]。该模块既有主端口信号,也有从端口信号,如图5所示。IP核的从端口接收Image_cpu发送的地址信息,告知IP核将视频数据写入到IMG_SDRAM中的哪个地址段中,同时Image_cpu可通过该端口获得存储过程的状态 (如Start、Done),主端口发出读信号作用与4_Port_sdram_controller的RD_FIFO_2,得到的奇场视频数据直接写入到IMG_SDRAM中。在保证不失系统性能的前提下,为节省存储空间的开销,该模块只将奇数场中的亮度信号Y[7:0]写入到SDRAM中,这样不仅减少数据量便于存储也有利于数据在网络中传输,节省带宽。
图5 W/R_to_Sdram IP核读/写数据框架
该FPGA开发板上只有两片SDRAM(16M*2)DIS_SDRAM和IMG_SDRAM。DIS_SDRAM用于视频捕捉与本地显示模块,另一片IMG_SDRAM用于视频图像的存储和Linux系统的内存。通过划分区域的方法将 IMG_SDRAM分为两个相对独立的内存空间,分别配置给W/R_to_Sdram存储视频和 Net_cpu运行 Linux,实现内存共享。
在SOPC系统中,共享存储IMG_SDRAM分配的地址为0x4000000~0x4ffffff共16M bytes。为将该内存进行划分,通过将SOPC系统生成的custom_fpga.h头文件中的IMG_SDRAM基地址修改成0x4600000,即将IMG_SDRAM的低6M bytes划分给W/R_to_sdram使用,高10M bytes分配给Net_cpu。Linux启动时就会从地址0x4600000开始执行,而不是SDRAM的基地址。
网络发送时,需要将亮度信号从DIS_SDRAM存储空间中转移到IMG_SDRAM中,数据流向如图6所示。W/R_to_Sdram采用DMA方式将亮度信号经过SDRAM控制器写入到IMG_SDRAM。这时,Linux系统需要访问共享内存IMG_SDRAM中的另一块区域Image_data_memory,将该存储区域的视频数据读取并进行网络发送。Linux通过内存管理机制MMU,调用mmap()函数将IMG_SDRAM的物理地址映射到虚拟地址空间,这样对内存的操作不需要调用Read/Write函数,可直接通过地址指针获取,提高访问速度。
内存地址及数据信息全部保存在Linux系统中的/dev/mem设备文件里,调用mmap()函数映射该设备文件实现共享内存的访问。Mmap()调用形式如下:(int*)mmap(void*addr,size_t len,int prot,int flags,int fd,off_t offset);其中len是映射到地址空间的字节数,prot参数指定共享内存的权限,fd参数为映射到进程空间的文件描述符。offset参数一般设置为0,表示从文件头开始映射。addr参数指定文件应被映射到进程空间的起始地址,一般指定为空指针,该任务交给内核完成。函数返回值为内存映射到进程空间的地址,可直接操作该虚拟地址访问物理内存。在该系统中,mmap()函数使用方法如下:先得到文件描述符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);
系统中需要特定机制协调双核之间的通信,防止对共享内存同时进行操作,导致系统崩溃。通常处理器之间的信息交互有以下几种解决方案:
图6 双核间内存共享与数据搬移框架
表2 多核处理器间通信解决方案
基于上述特点,参考方案2和方案4,采用乒乓查询的方式进行双核间通信。双核之间分别设置一个标志位,存在于SDRAM特定地址中,通过查询该特定地址的值,完成双核之间的信息交互。
在搭建SOPC系统时,得到的custom_fpga.h文件包含了系统所有硬件的配置信息。Linux系统在进行内核配置、裁剪时依据配置信息选择UART、DM9000网卡等驱动,内核依照这些选项及custom_fpga.h进行编译,得到定制的Linux系统。
实时传输协议RTP[6]为数据提供了具有实时特征的端对端传送服务,能够在单播或者多播的网络环境中实现流媒体的实时传输。在Linux平台上进行网络编程,需要RTP相关的库作支持。Jrtplib[7]是C++实现的开源RTP库,使用socket机制实现网络通讯,方便在多种系统上移植。所以Linux系统需要移植Jrtplib库支持RTP协议。
对于发送端,首先生成RTPSession类的实例声明此次RTP会话,并调用Creat()函数完成初始化。SetOwnTimestampUnit()函数设置恰当的时间戳,保证数据发送和接收保持同步。数据发送时,先调用SetPortbase()和AddDestination()设置目标地址和端口,之后调用Sendpacket()函数向远程端发送数据。对于远程接收端,调用Jrtplib库中的PollData()函数接收RTP数据报。通过相关函数读出数据报的时间戳和同步源信息,将同一时间戳的数据恢复成一帧图像。函数GotoFirstSource()和GotoNext-Source()遍历发送过来的数据源,调用该函数实现实时接收和存储显示。
RTP发送与接收数据流程如图7所示。对于发送端,一数据包发送的最大字节默认为1400 byte。而一帧图像远远超过1400byte,需采用拆分发送,并将同一帧的拆分包的时间戳设为同一值,这样接收端就将相同时间戳的数据重新组成一帧图像。
图7 RTP发送与接收数据流程
运行设计的系统并设置远程端的IP地址和端口号,摄像头的视频数据经过解码,拆包并依据RTP协议发送到该目的地址,接收端等待接收服务器发送的数据并显示图像。
为保证系统内存映射和数据搬移的正确性,通过测试程序打印出内存地址段中的数据与NiosII IDE在Debug模式下的Memory监视窗口的数值进行对比,验证了映射数据的一致性。系统成功抓取一帧视频数据,通过RTP协议发送到指定的目的地址,接收端遍历接收到的数据源,重新组合成一帧图像进行显示,接收到的图像效果如图8所示。
图8 远程接收端接收到的图像
网络视频传输系统在工业生产、日常生活等方面的应用日益广泛,高性能的系统体现在嵌入式服务器的搭建。本文提出的基于FPGA的双NiosII的SOPC系统方案具有运行稳定可靠,实时性强、可重配置性强等特点。系统通过内存映射可直接访问物理内存而不需要调用write/read函数,加快了访问内存数据的速度,为图像的网络发送提供了可能。系统采用DMA方式将视频数据直接存入到SDRAM中而不经过CPU,提高了系统处理效率。整个传输系统共享同一块SDRAM作为视频存储及Linux系统内存,降低了硬件电路的开销和复杂性,缩减了系统成本。
[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).[张玲,夏博,何伟,等.网络视频监控系统中双NiosII架构的设计与实现 [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的嵌入式网络化视频采集压缩系统 [J].计算机工程与设计,2006,27(16):2939-2942.]
[3]TAO Baoquan,FU 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的视频采集及传输系统的设计[J].应用科技,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设备的设计与实现 [J].中国测试技术,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协议下的MPEG-4视频流传输系统应用研究[J].工业控制计算机,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).[刘建军,阮学斌.基于JRTPLIB下的视频监控系统的实现 [J].计算机与数字工程,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的视频采集与传输系统 [J].电视技术,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的视频采集与处理系统的开发 [J].信息技术,2011(9):121-124.]
[10]XIAO Wencai,FAN Feng.The FPGA design of real-time vi-deo acquisition system [J].Chian Digital Cable Tv,2006(21):2104-2108(in Chinese).[肖文才,樊丰.视频实时采集系统的 FPGA设计 [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的红外图像实时采集系统设计与实现 [J].仪器仪表学报,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设计原理及应用[M].北京:北京航空航天大学出版社,2006.]
[14]WANG Jinming.Verilog HDL programming tutorials[M].Beijing:Posts and Telecom Press,2004(in Chinese).[王金明.Verilog HDL程序设计教程 [M].北京:人民邮电出版社,2004.]
[15]SUN Qiong.Embedded Linux of detailed application development[M].Beijing:Posts and Telecom Press,2006:304-327(in Chinese).[孙琼.嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2006:304-327.]