CrazyBingo

Chapter 06: OV7670 视频显示系统整体构架

0
阅读(6269)

Chapter 06: OV7670 视频显示系统整体架构

wps_clip_image-2154

wps_clip_image-7583

1. 写在前面的话

时间是2012年8月23号,11:31,过的好快好快,写到Chapter 05的时候是8月13号,不知不觉,忙了30天,一直都木有时间,烧脑啊。

明天就要去另一个地方了,很远……今天给自己留点时间,整理好心情再出发。不管你们认不认可,我还是得把这个东西写完。某些人一直催我,催我,催我把最后一点写写掉,不知道不觉自己的整理成了众目睽睽的任务了。不写完心中无比的不踏实,虽然……,但感觉欠你们一个交代似的,郁闷……

记得前面写过《OV7670 开启视频开发之路》、《OV7670 SCCB初始化》、《OV7670 寄存器配置》、《OV7670 视频接收解析》、《OV7670 YCbCr视频解码》,从认识OV7670摄像头到视频开发之路,从SCCB初始化到摄像头配置,从图像采样到视频编解码,终于在VGA上面显示点什么了。

零零散散的组合,还记得小学的一篇文章:《走一步,再走一步》,只要“不抛弃,不放弃”,总能走得远。今天打算发下哪些所示,终于可以挤点时间,整理一下最后的思路,将OV7670视频下时系统整体架构详细的分析给大家,也算是在CMOS摄像头入门开发商,画上一个完整的句号。

由于sdram_ov7670_yuv这个视频显示系统结构最庞大,因此拿他开刀。详细的代码不做阐述,也不会去讲如何实现,这里只讲框架和思路!

wps_clip_image-1089

2. sdram_ov7670_yuv模型解析

2.1. 顶层模块

wps_clip_image-32008

系统顶层RTL图,主要可以划分为4个模块,完成了整个电路的设计,如下所示。

image

整个系统的数据流,就是在CMOS摄像头初始化完成以后,通过CMOS_Capter模块捕获CMOS输出的图像数据,写入到sdram_vga_top模块。Sdram_vga_top模块通过相关存储以及处理,最后实时输出于VGA显示器上。当然,(1)只是个PLL以及复位信号的时钟控制电路,以前的博客中我也讲过,此处不再做累赘阐述;(3)(4)在前面章节都讲过,不接的看前面的Chapter。主要需要分析的是(2),基于SDRAM的显示控制器,请看下一小节。

2.2. SDRAM的显示控制器

wps_clip_image-28254

如上图所示,sdram显示控制器从接口上主要完成了异步数据的处理,sdram存储器的控制,以及VGA显示器的显示,相关接口如下表所示:

wps_clip_image-8781

Sdram_vga_top内部RTL图如上图所示,相关模块以及功能如下表所示:

image

Sdram_vga_top模块作为整个系统的核心电路,包括了以上五个部分。其中每部分功能如下:

1) lcd_top:作为VGA显示器的时序电路,主要完成VGA的驱动。这部分在过去我的博文中,写过n遍,如下:

http://www.cnblogs.com/crazybingo/archive/2011/07/28/2119948.html

2) lcd_display:作为VGA显示控制电路,主要完成数据流的选择,同时可以在该模块完成字幕,半透明等操作。关于字幕的实现可以参考Bingo当年博文:

http://www.cnblogs.com/crazybingo/archive/2011/08/10/2134185.html

如下图所示,半透明+字幕滚屏:

wps_clip_image-24026

3) video_image_processing:这部分将会是以后视频图像研究中的核心算法部分,以后将在这里实现视频的编解码、图像的滤波,去噪,以及图形变换等算法,相关算法都可以在这个模块添加。目前实现了YCbCr 4:2:2解码以及RGB数据流的处理,完成了OV7670 YUV模式下的数据流解码。

4) sdbank_switch:在SDRAM带宽允许的范围内,实现内部2个bank的乒乓操作,使得输入输出视频流读写无冲突。流程如下所示:

wps_clip_image-6037

5) sdram_2fifo_top: SDRAM控制器顶层模块,实现SDRAM的初始化,SDRAM突发读写操作,以及异步时钟域数据的交换,以及与VGA接口的同步通信。数据流如下图所示:

wps_clip_image-3564

这部分内部的RTL图如下图所示:

wps_clip_image-17983

sdram_2fifo_top模块内部功能如下所示:

① sdram_top模块实现了sdram的突发读写操作,这部分为你们崇拜的特权同学设计,版权归特权同学所有,我只是给他修改了几个bug而已哈哈。。。

② dcfifo_ctrl模块为Bingo设计,主要通过DC-FIFO完成了异步数据的跨时钟处理。

个人认为这部分的设计相当的重要,要完成各种同步、异步逻辑,以实现视频数据流实时存储,保证准确不丢失。因此如果xxx的话,请不要随意修改,后果自负!

3. 系统统调验证

系统中采用了OV7670摄像头。该摄像头每秒写入30帧640*480的图像,同时VGA每秒读取60帧640*480的图像。在Quartus II中综合整个系统的设计,基于EP2C5Q208C8 FPGA,以“基于SDRAM的显示控制器”ip为核心,同时驱动OV7670摄像头,作为显示控制器的数据源,以及图像处理的目标。

经过长时间测试,验证了“基于FPGA的视频图像显示控制器”的性能极其稳定性。测试结果如下所示,其中右边为电脑播放的视频,左边为OV7670摄像头实时捕获并且在VGA显示的结果,测试在画面上稳定流畅,清晰保真,在性能上运行稳定,可靠性强。

wps_clip_image-31093

wps_clip_image-181

4. 写在最后的话

哈哈,终于可以写着一段了。好激动,因为我又可以解脱了,你们可以玩去吧O(∩_∩)O哈哈~

这些天very very busy,当然也有些收货喽。典型的就是以下几个点,也许你们会笑我,我觉得很重要,最基本的东西往往是最精髓的东西,随意了:

① 组合输入,逻辑输出,时序边沿严格对齐

② 稍微复杂的电路,最好画出来,在按照时序去设计code,这样更不容易出错。一定要分析时序,时序,时序!

③ 不要盲目的只用脑袋想,也不要盲目的仿真,示波器和逻辑分析仪来的更强大(当然也仿真时必须的)

④ 设计一个项目的时候,一定要先确定好方案,以及完整的时序,接口,功能,不然在开发中会变得很渺茫。

⑤ 借口是失败最大的最大的座右铭。

⑥ Try,try,不停地try,直到困难向你妥协。峰哥说过:“努力,永不为过”!

近期的一批板子木有了,卖的卖了,送的送完,这个板子以后可能还会做,有兴趣的可以关注:www.chinaaet.com

或者我博客:http://blog.chinaaet.com/crazybingo

有问题可以mail me: thereturnofbingo@gmail.com,在适当的时候给你们解答!发现bug或者有更好的介意的同人,欢迎指正,

做什么事情都得坚持,看好“视频图像处理”!

OK,闪人,不废话了,CB要累了,要走了,杭州再见,再见了…… 

wps_clip_image-2615