基于FPGA和ARM的视频采集处理系统
|
近年来,视频技术的飞速发展,使得视频产品越来越普及。视频信号采集是整个视频应用的前端部分,扮演着极其重要的作用。传统的图像采集卡面向计算机应用,体积大,可靠性有待进一步提高,于是便产生了一些新的视频采集方法,这些方案有的基于FPGA和DSP,有的基于ARM和编码芯片,在实时性、灵活性、 可维护性方面各有千秋。本文针对FPGA在数字信号处理速度上的优势以及ARM在控制方面的长处,设计了一种全数字化的实时视频采集系统,具有很实用的参考价值。 1 系统构成 本系统的结构框图如图1所示,图像传感器模块负责图像采集,FPGA产生I2 C时序控制CMOS图像传感器芯片,并将采集到的图像数据进行相应处理后送到压缩芯片ZR36060进行压缩;ARM负责压缩芯片的驱动、以太网芯片的控制和UDP/IP协议的实现,以及视频采集系统的指令控制和数据传输, 以太网模块主要实现以太网数据传输。SDRAM做数据暂存与ARM存储空间的扩展,采集到的视频图像以帧为单位通过网卡芯片传送到网络。 图 1 2 硬件设计 2.1 图像传感器 图像传感器采用MICRON公司的MT9M131。它是一种彩色CMOS图像传感器,可支持SXVGA、VGA、QVGA等显示格式,I2 C总线接口,最大支持分辨率1280*1024,在VGA格式下可达到30帧/每秒的采集速度,并具有自动曝光控制、自动增益控制、自动白平衡、自动带通滤波、自动黑级校准等功能。本系统采用VGA格式,CMOS传感器的控制时序由FPGA产生。 2.2 FPGA器件 FPGA器件的主要功能包括图像传感器的控制、采集后的图像数据处理和格式转换,为了采集到质量更好的图像,将来还会在此部分加入一些相应的处理算法。因此,为保证系统的实时性,系统选用了Altera公司Cyclone II系列的EP2C35F672C6。该芯片具有35000个逻辑单元、672个引脚、475个用户自定义I/O接口、35个嵌入式乘法器和4个锁相环,完全可以满足系统要求。 2.3 ARM处理器和网卡芯片 ARM处理器选用三星公司的S3C2410,该处理器拥有独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路串口,4路DMA,4路带PWM的时钟,最高可运行在203MHz。系统采用的网卡芯片是CS8900A,它是用于嵌入式设备的低成本以太局域网控制器。它的高度集成设计使其不再需要其它以太网控制器所必需的昂贵外部器件。 CS8900A包括片上RAM,10Base-T传输和接收滤波器,以及带24毫安驱动的直接ISA-总线接口。除了高度集成,CS8900A还提供其它性能和配置选择。它独特的PacketPage结构可自动适应网络通信量模式的改变和现有系统资源,从而提高系统效率。图2为网卡芯片与S3C2410的接口示意图。
图 2 2.4 视频压缩芯片 JPEG编解码芯片ZR36060是专为视频采集与编辑应用而设计的,可以方便地实现对视频信号的实时压缩和解压缩。在进行压缩时,ZR36060接受 YUV4:2:2数字视频信号,将其编码为JPEG码流输出。ZR36060对像素块和CCIR视频信号可实现高达25~30帧/秒的压缩;灵活的数据接口,支持三种YUV视频接口模式,即8位主模式、16位从模式和8位从模式;3种不同的比特率控制模式用于静止和运动视频的压缩;可以和多种常用视频解码器实现无缝连接[1]。据统计,JPEG格式的压缩比例约为70~80:1,而本系统中采用的分辨率并不高(640*480),直接使用ZR36060进行帧内编码压缩可以满足要求,同时也减少了FPGA部分的开发工作量。 3 关键模块的工作原理 3.1 图像传感器驱动 MT9M131是标准的I2 C总线器件,接口简单,传感器工作时只有6个控制信号。其中MCLK由FPGA产生,是传感器工作时钟输入;FVAL是帧有效信号,它的上升沿表示一帧数据的开始。在FVAL信号的有效期间内包含了480个行有效信号LVAL,而每个LVAL信号的高电平期间包含了数据总线上640个像素数据的输出。所以,在FVAL一个周期内,图像传感器正好输出了完整的一帧图像。分辨率为640×480。仅当FVAL和LVAL信号同时为高电平时,传感器输出数据 D[9:0]有效,FPGA在每个像素时钟PIXCLK上升沿时将有效数据读入。经实测,传感器正常工作时,SCLK,LVAL频率约为7.56kHz和 14.2kHz。 本系统采用Verilog HDL语言来编写CMOS图像传感器的时序驱动。在实际设计中,把控制模块分成两部分:I2C_Config模块根据设定的曝光时间来发生I2 C总线SCLK和SDAT时序,而Capture模块则负责与传感器的数据接口,读入10位的图像数据,并送到下一级模块进行相应处理。以下是 Capture模块部分代码: always@(posedge iCLK or negedge iRST) begin if(!iRST) ……… //各信号清零复位 else begin Pre_FVAL <= iFVAL; if( ({Pre_FVAL,iFVAL}==2'b01) ** mSTART ) //当前帧有效且前一帧处理完 mCMOS_FVAL <= 1; else if({Pre_FVAL,iFVAL}==2'b10) //正 在处理前一帧 mCMOS_FVAL <= 0; mCMOS_LVAL <= iLVAL; mCMOS_DATA <= iDATA; //读取数据送入FPGA if(mCMOS_FVAL) |







