贺婷
摘要:为使FPGA视频监控系统的显示画面更流畅,数据存储采用兵乓机制设计。先将视频数据直接存储于SDRAM中,采用两个异步FIFO作为缓冲器,轮流接收SDRAM的数据,在将接收YUV422格式数据通过数据转换得到RGB565格式数据并驱动显示。该方案的顶层模块在modelsim中仿真成功,满足时序要求。
关键词:乒乓存储机制;视频监控;FPGA;
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)31-0189-02
1 系统总体方案
FPGA视频监控系统结构如图1所示,主要包括分频模块、 摄像头数据采集模块、数据I2C配置模块、两个异步FIFO存储模块、SDRAM控制模块、图像数据处理模块以及VGA控制模块等,如图1所示[1-3]。设计采用OV7670摄像头,输出速度最高能达到30帧/秒。视频数据输出后直接存储于SDRAM中,采用乒乓存储机制,保证传输的实时性与可靠性,采用异步FIFO做为数据缓冲器,在SDRAM接收到一帧的数据,立即将数据输送给其中一个深度是1024宽度为8的异步FIFO模块,两个FIFO模块轮流接收SDRAM的数据,之后将数据处理后通过VGA显示。
图1 FPGA视频监控系统结构框图
2 I2C配置模块
I2C总线当串行时钟(SCL)在高电平期间串行数据(SDA)由高电平向低电平发生跳变,表示数据传输开始。SCL在高电平时SDA发生由低电平向高电平跳变,表示数据传输终止,此后SDA和SCL都处于高电平状态,总线被判定为空闲状态。I2C总线在进行数据传输时每次发送一个字节,在发送的字节后必有ACK应答。主机设备发送8位数据之后,将SDA设置为输入(高阻状态便于从设备应答),同时从机设备接受到8位数据后在第9个脉冲时输出低电平表示应答信号,主设备在第9个脉冲时读取SDA的状态来判断从机设备是否给出ACK信号,应答信号为低电平时,规定为有效应答位,表示从机设备已经成功接收了主机设备发送的数据,应答信号为高电平时,规定为非应答位,一般表示从机设备没有成功接收主机设备发送的数据。
2.1 I2C写数据控制
图2 写仿真时序图
图3 读仿真时序图
如图2所示,i2c_sdat表示SDA,i2c_sclk表示SCL,在i2c_sclk高电平期间,i2c_sdat由高电平向低电平跳变,表示数据开始传输,i2c_sclk前8个时钟周期传输8位数据,第8位数据时低电平表示写状态。第9个时钟周期时拉高i2c_sdat表示主机设备传输数据终止。等待从机设备应答。在下一个时钟周期再拉低i2c_sdat表示主设备传输数据开始。一直循环以上步骤直到数据传输完成。
2.2 I2C读数据控制
i2c_sdat表示串行数据SDA,i2c_sclk表示串行时钟SCL,由图3中可以看出,在i2c_sclk高电平期间,i2c_sdat由高电平向低电平跳变,表示数据开始传输,i2c_sclk前8个时钟周期传输8位数据,第8位数据时低电平表示写状态。第9个时钟周期时拉高i2c_sdat表示主设备传输数据终止。在下一个时钟周期时再次发送8位数据,第8位是高电平,表示读状态,再等待从设备应答。此时才完成度指定寄存器的操作,在下一个时钟周期时读取寄存器的数据,一致循环直到数据传输完成。
3 SDRAM控制模块
SDRAM的控制器主要实现SDRAM的初始化、自动刷新、读写操作以及数据乒乓存储控制[4]-[5]。SDRAM上电进入初始化状态,先使所有存储单元充电,充电状态完成后 进入自动刷新状态,之后通过配置SDRAM模式寄存器来操作SDRAM的工作模式。
图4 SDRAM控制器状态图
SDRAM控制器的状态转移图如图4所示,SDRAM要求定时刷新,采用33M的PCI总线时钟,使用计数器计数420产生刷新命令,一次刷新操作需完成两个刷新操作命令。SDRAM控制器仿真波形如图5所示,其中clk为系统时钟,reset_n为复位信号,addr_in是地址信号,rd_reg和wr_reg分别为读、写请求信号,sdram_a是数据信号。SDRAM采用地址线行列复用技术,对于存储器单元的访问基于页面,而外部地址线总线是独立的,与SDRAM的地址线并不能直接相连,这样就需要SDRAM控制器提供一种地址映射,将外部地址的高位映射到SDRAM的行地址,低位地址映射到SDRAM页面内的列地址。SDRAM控制器在空闲状态下等待读写信号出现,出现读写信号后进入激活状态,控制器激活指定的存储单元进行读或者写操作,读写操作完成之后进入预充电状态,充电完成之后进入空闲状态,等待下一次读写操作。所以,从仿真图可以看出设计满足时序要求。
图5 SDRAM控制器仿真波形图
4 数据处理模块
通过配置OV7670摄像头寄存器使数据输出为YUV422格式,通过数据处理模块使YUV422转换成YUV444再转换成RGB565[6]。
4.1 YUV422转YUV444
YUV422格式是每采样两个Y分量就采样一个UV分量,相比YUV444每一次采样缺少一个UV分量。所以转换过程为首先捕获Cb0,Y0信号,之后捕获Cr0,Y1信号,捕获Cb1,Y2信号,捕获Cr1,Y3,输出Y0Cb0Cr0和Y1Cb0Cr0,则将YUV444格式缺少的UV分量补齐,转换为YUV444格式。
4.2 YUV444转RGB565
采用分离变量法避免浮点运算,将变量分离。YUV转RGB公式变量分离后如式1,然后放大512倍,避免浮点运算,再右移9位,缩小512倍,输出变量XOUT、YOUT、ZOUT,如式2。 最后为避免出现溢出,需截断正负溢出的部分,使得数据保持在0-255以内,程序如式3所示,最后得到RGB565格式的数据。
[R=1.164Y+1.596Cr-222.912G=1.164Y-0.391Cb-0.813Cr+135.488B=1.164Y+2.018Cb-276.928] (1)
[XOUT[19:0]=((Y*10'd817)-18'd114113)>>9YOUT[19:0]=((Y*10'd596)-(Cb*10'd200)-(Cr*10'd416)+18'd69370)>>9ZOUT[19:0]=((Y*10'd596)+(Cb*11'd1033)-18'd141787)>>9] (2)
[R<=XOUT[10]?8'h0:(XOUT[8:0]>9'd255?8'hff:XOUT[7:0]G<=YOUT[10]?8'h0:(YOUT[8:0]>9'd255)?8'hff:YOUT[7:0]B<=ZOUT[10]?8'h0:(ZOUT[8:0]>9'd255?8'hff:ZOUT[7:0]] (3)
5 结束语
图6 顶层模块仿真图
顶层模块的仿真图如图7所示,通过对时序的分析可知,OV7670模块能够采集数据,I2C模块能够读写,SCL与SDA能够满足规范的要求,SDRAM存储模块己成功完成了初始化、读写操作及刷新等功能,并能对图像数据进行有效的存储,VGA模块能够读取数据并显示,设计满足所有模块的时序要求。
参考文献:
[1] 彭勃. 基于FPGA的视频拼接系统的设计与实现[D].北京: 北京化工大学, 2013.
[2] 蔡青青, 龚立群, 黄益新. 基于FPGA的视频监控系统[J]. 微型机与应用, 2012(4): 37-39.
[3] 司孝平. 基于SDRAM的FPGA实时图像采集系统的设计[J]. 西南大学学报:自然科学版, 2011(1): 128-132.
[4] 侯宏录, 张文芳. 基于FPGA的SDRAM控制器设计方案[J]. 兵工自动化, 2012(2): 57-60.
[5] 陆军, 高乐, 刘涛,等. 基于FPGA的全景图像处理系统SDRAM控制器设计与实现[J]. 应用科技, 2012(1): 55-60.
[6] 蒙育. 基于FPGA视频图像处理系统设计及算法研究[D].呼和浩特: 内蒙古大学, 2010.