基于FPGA的嵌入式图像采集系统设计
在图像处理系统中,首先对摄像头采集的视频信号进行A/D转换,将模拟图像信号转化为数字信号,提供给后端的处理系统进行图像处理。而视频图像采集系统是多媒体信息处理、视频监控等系统的前端子系统,是视频处理系统中不可缺少的部分。传统视频采集系统一般电路复杂、成本高,而且较难满足实时性的要求,而采用视频摄像头+视频解码器+FPGA的模式,可简化电路的复杂性,其中视频解码器对摄像头采集的信号进行AD转换,FPGA对信号的采样进行控制。FPGA的时钟频率高、时间延迟小,可以满足实时性的要求。基于以上的优点文中采用些结构来实现视频图像的采集。
1 视频解码器SAA7113H
SAA7113H是Philips公司的一种增强型视频输入处理器,内部有一系列寄存器,寄存器的读、写通过I2C总线完成。包括一个双通道的模拟预处理电路、可编程静态增益和自动增益控制电路、时钟生成电路、数字多标准解码电路、亮度、对比度、饱和度控制电路和I2C总线控制电路。SAA7113H需外接24.576 MHz晶体,内部锁相环PLL可输出27 MHz的时钟。自动检测50 Hz和60 Hz的场频,可在PAL、NTSC两种制式之间自动转换。具有4路模拟视频信号输入,通过内部寄存器的不同配置可以实现4路信号的转换;输入可以是4路CVBS或2路Y/C信号或1路Y/C信号2路CVBS,输出为标准ITU656 YUV4:2:2格式的VPO数据总线(8-bit)。SAA7113H模拟部分和数字部分采用+3.3V,数字I/O接口兼容+5V。
2 系统总体方案及工作原理
系统选用Altera公司的CycloneⅡ系列中的EP2C20Q240C8为系统的硬件平台,该芯片内部有18752个LE,26个乘法器和4个锁相环等。视频解码芯片采用Philips的SAA7113H。系统主要由SAA7113H图像采集接口模块、I2C总线配置模块、控制模块、像素存储模块、格式转换模块和显示接口模块组成。设计中利用VHDL语言在QuartusⅡ下进行编程和调试。系统基本结构如图1所示。
3 主要模块功能介绍
3.1 SAA7113H图像采集接口模块
该模块负责视频图像的采集并将模拟视频信号转换为数字视频信号,为后面的视频处理做准备。该模块与SAA7113H的VPO数据总线、RTS0、RTS1、及LLC相连,RTS0和RTS1分别配置为行同步和场同步信号,只有在这两个信号同时有效时,输出数据是有效图像数据,否则是消隐信号。有效的视频信号分为奇数场和偶数场,共576行有效数据,其中奇数场有效数据为23~310行,偶数场有效数据为336~623行,其余
为垂直控制信号。
SAA7113H的VP0总线输出数据的频率是27 MHz,在每个LLC的上升沿输出1 Byte有效数据。标准ITU YUV 4:2:2格式视频信号的每个像素都有各自的亮度分量Y,每两个相邻的像素公用一对的色差数据Cb和Cr。在存储像素数据时,可认为每两个连续字节表示一个像素,当需要格式转换或进行其他的处理时,要一次提取两个相邻的像素的数据,进行相应处理。其中,每行有数据864个采样点中有效数据720个,消隐期间数据144个。在完整的一帧图像数据中第一场的消隐EAV为FF 00 00 BX,第一场消隐SAV为FF 00 00 AX;第一场有效数据SAV为FF 00 00 8X,有效数据EAV为FF 00 00 9X,其他场类推。奇数场有效数据阶段的SAV为“FF 00 00 80”,偶数场有效数据阶段的SAV为“FF 00 00 C7”。在每个时钟的上升沿读取8位数据,当检测到一行数据的开始标志FF 00 00 XY时,检测到SAV或EAV信号,提取H、F、V信号。然后开始对图像数据进行解码,根据8位数据自带的信息,判断该数据是Y、Cb还是Cr,从而得到Y、Cb、Cr各分量。
3.2 I2C总线配置模块
该模块通过I2C总线协议对SAA7113H进行配置,时钟频率为20 kHz。通过该模块完成SAA7113H配置。配置模块如图2所示。
其中,inicio_conf信号表示启动对SAA7113H进行配置,高电平有效。clk为时钟信号。reset为外部复位信号高电平有效。SCL和SDA为SAA7113H配置信号。CONFIGURACION_OK表示解码芯片配置好以后输出一个控制信号给控制模块,以启动数据采集。
SAA7113H的寄存器地址从00H开始,只有01H~05H前端输入配置部分,06H~13H、15H~17H解码部分,40H~60H常规分离数据部分,这些可读写,其余为保留地址或只读寄存器,将需要配置的寄存器数据存在查找表con_data中,并用count表示当前对哪个寄存器配置,配置时逐个写入寄存器。
根据I2C总线数据传输的时序,总线控制器的状态机分为空闲状态、启动状态、数据传输状态、应答状态和停止状态。Idle状态表示总线空闲状态,SCL和SDA都为高电平,若clk=1则进入Start状态。Start状态表示总线启动,此时保持SCL为高电平,将SDA由高电平变为低电平,从而启动数据传输。Data_trans状态中一次传1 Byte数据。在本状态中,1 Byte数据的传输过程为将时钟线变为低电平,然后将数据放在数据线SDA上。再将时钟线变为高电平,让接收方进行数据接收。传输完1 Byte后进入Hold。Hold状态用来表示应答阶段,主要是产生一个时钟脉冲,让接收方对1 Byte的数据产生应答信号。在此状态中进行对本次数据连续传送是否完毕进行判断。如未传输完则继续到Start状态进行下一次数据的传输,并将count-1。Stop状态表示数据传输结束。在SCL高电平期间将SDA由低转为高。然后输出一个配置完成的信号。寄存器配置状态机如图3所示。
3.3 控制模块
控制模块由control_enable模块和control_interface模块组成主要负责图像采集模块和显示接口模块的同步和使能。当解码芯片配置完成后,从CONFIGURACION_OK输入使能信号,启动该模块,同时通过href和odd信号启动图像采集模块和显示接口模块,href=1表示SAA7113H通过VPO传输像素数据;odd=1表示奇数场,odd=0表示偶数场。
3.4 像素存储模块
图像的一帧为720×625提取其中的有效像素640×576存入SDRAM中,再读出480行数据进行格式转换和显示。
由于SDRAM每个单元为16位,所以将一个Y和一个Cb或Cr合存在一个地址空间中,即两个时钟周期产生一个地址。SDRAM有4端口模式,2个用于将FIFO中的数据写SDRAM,2个用于将数据读到FIFO中,读写采用的时钟不同,写时钟采用解码芯片的27MHz,而渎时钟采用VGA的25MHz,由于SDRAM的读写速度为50 MHz,时钟频率不同,不能直接写入,因此需要一个FIFO将数据暂时储存,再将其写到SDRAM中。
此处关键问题是隔行扫描到逐行扫描的转换。SAA7113H是先奇数场后偶数场的顺序输出,即隔行输出,而VGA显示是逐行显示的,因此要进行去隔行操作。利用对SDRAM的读写地址的控制能够有效解决隔行到逐行的转换问题,数据写入SDRAM是将隔行数据写入到SDRAM的0-640× 576的地址空间中,其中640×23-640×310为1、3、5、…奇数场的有效数据,640×336-640×623为2、4、6、…偶数场的有效数据。两场数据分别通过不同的FIFO读出,格式转换时交叉读取两个FIFO中的数据,这样读出的数据即1、2、3、4、…逐行数据。
3.5 格式转换模块
要将摄像头采集的图像显示在显示器上,需进行数据的格式转换,将YUV格式的数据转换成RGB格式的数据。YUV 4:2:2格式的数据两个相邻的像素共用一对Cb和Cr分量,所以在进行格式转换时要先解交织,即一次从FIFO中提取相邻的两个像素数据,将Cb和Cr各复用一次,使得YUV变成4:4:4格式,然后进行格式的转换。将转换好的数据存放在reg_RGB中,VGA显示的时候交叉读取这两个寄存器中的数据。转换公式如下所示
由于在FPGA中进行浮点运算较困难,因此可将式(1)中的各系数转化为整数在进行运算,采用将各系数放大1 024倍的方法,得到r、g、b后再除以1 024,放大后的公式为
根据上述公式得到r、g、b。然后将结果均右移10位完成除法运算,得到RGB值。由于r、g、b均为8位,取值范围为0~255,而运算过程较易生成负数和超过255的正数,因此运算结果需将负数取0,超过255的正数取为255。此方法虽然会引入误差,但对最终图像的显示效果不会有较大影响。
3.6 显示接口模块
由interface_vga负责图像的显示,从reg_RGB寄存器中读取转换好的数据,对这两个像素的读取由一个转换电路负责在两个寄存器之间切换。显示接口模块将r、g、b以及hsync、vsync一起发送给编码芯片THS8134,通过VGA显示出来,hsync和vsyne分别是行和场同步信号。在仿真中,选用CycloneⅡEP2C20Q240C8芯片,用QuartusⅡ8.0进行综合与仿真。图4是对显示接口模块的仿真。由仿真结果可以看出,行同步和场同步符合时序要求。
- 一种基于DSP的张力、深度、速度测量系统(04-15)
- I2C总线及EEPROM的Linux驱动程序的设计(01-05)
- 基于C语言的I2C总线软件模块设计(01-09)
- 基于MSP430单片机的智能IC卡水表控制器(07-08)
- 实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序(07-25)
- I2C串行总线协议的VHDL实现(06-05)