本站点博客将逐步迁移至http://ninghechuanblogs.cn/html
本篇要分享的是基于Xilinx FPGA的视频图像采集系统,使用摄像头采集图像数据,并无用到SDRAM/DDR。这个工程使用的是OV7670 30w像素摄像头,用双口RAM作存储,显示窗口为320x240,并且都知道7670的显示效果也不怎么样,这是一次偶然的机会我获得的资源,便在basys三、zybo、国产FPGA PGT180H上移植成功,整体的显示效果也是可能达到7670应有的标准,7670能够说是最基础的摄像头,基础到你都不想学驱动它,由于画质不好,还有一款基础的摄像头是OV7725,也是30w像素和7670比起来,差异咋就这么大呢(看价格就明白了)。固然这只是一个基础,博主往后也会着手去深刻学习基于FPGA的摄像头的驱动。微信
这是本系统简单的结构框图,主要有摄像头配置模块、图像数据采集模块、像素数据存储模块、VGA显示驱动模块组成。 学习
摄像头模块须要用SCCB协议进行配置,SCCB即咱们常说的I2C总线。设计
该部分由两个模块构成,I2C总线模块,摄像头寄存器存储模块,经过I2C总线,也就是下文的SCCB总线,将摄像头寄存器存储模块中的数据发送到OV7670内,完成摄像头的得配置。视频
SCCB总线在写寄存器时,先写设备地址(0x42),收到从设备应答后再写寄存器地址,最后写将要写入的寄存器的值。 htm
SCCB总线的读取寄存器时序:SCCB总线在读寄存器时,分两个阶段:第一阶段为先写设备地址(0x42),而后再写寄存器地址;第二阶段为写设备地址(0x43),而后读出寄存器地址的值,从而完成对一个寄存器值的读取,blog
I2C协议有两条总线,时钟总线sclk和数据总线sdat,咱们在时钟总线为高电平的中心时采集数据,在时钟总线为低电平的中心改变数据,每发送8位数据会有一个应答。资源
I2C协议写操做,先给一个写命令,而后接着两组8位的数据,这个工程里OV7670一共有165个寄存器须要配置,当第165个寄存器配置完成后config_finished信号拉高,表示寄存器配置完成。开发
从模块引脚上咱们能够看到,7670是8位的像素数据输出,场信号(默认低有效),和行信号有效的同时,开始捕获数据,寄存第一个数据, 拼接到第二个数据, 实现一个完整像素的输出。get
像素数据存储采用的是双口RAM,将RAM数据位宽设置为16,由于我才用的zybo开发板是16位的,深度设置为320x240 = 76800。这是RAM IP Core的顶层实例化。
最后是VGA显示模块,将储存的数据读出,显示在VGA显示器上,这样这个视频采集系统就完成了。这里值得一提的是在使用zybo开发板进行摄像头配置的时候出现了以下问题,最后经上网查阅资料最后得以解决,出现这个问题的缘由是,遇到上面的问题是由于咱们将外部输入的一个时钟管脚 OV7670_PCLK(摄像头输出给FPGA的像素时钟)分配到了一个普通的IO口上面,若是是用一个专用的时钟管脚,好比说ZedBoard有专有时钟管脚 Y9就不会出现这样的错误了。
由于是IO管脚上,因此其周围没有全局时钟 BUFG,因此咱们在 XDC 里使用:set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets {OV7670_PCLK_IBUF}] 来屏蔽 Xilinx 的检测,从而经过编译。这个方式在软件提示的错误中也提供了解决方法,
我这里使用的迪芝伦官方出品的zybo开发板,确定有朋友好奇个人摄像头是怎么插上去的——杜邦线啊,引脚约束文件但是我精心设计的,因此只须要18根连排杜邦线便可,使用杜邦线的显示效果基本不会受影响,若是你的显示效果不好,可不能怪杜邦线确定是你时序的问题。
这是最终的显示效果图,原始图像是没有白框的,可是这个工程会让最开始几列像素数据显示不出来,因此我本身加上白边,遮盖掉每行图像的前几个像素点,其余的数据照常显示。
这里只是大概介绍下视频图像采集系统的设计思路,没有详细介绍每个部分,后面博主计划尝试使用FPGA驱动OV7725 sensor,到时会详细记录开发过程,但愿你们可以相互关注而且共同窗习。哪里很差欢迎提出,欢迎指点。
若是你想得到该设计的工程源码请关注个人微信订阅号:开源FPGA,后台回复“开源FPGA”便可得到该工程源码,欢迎加入开源FPGA-交流群-I进行讨论,群号码:677163633。
转载请注明出处:NingHeChuan(宁河川)
我的微信订阅号:开源FPGA
若是你想及时收到我的撰写的博文推送,能够扫描左边二维码(或者长按识别二维码)关注我的微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan