首页资源分类FPGA/CPLDAltera > 《从零开始走进ov7670世界》 韩彬 Bingo

《从零开始走进ov7670世界》 韩彬 Bingo

已有 445176个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:ov7670FPGA

    分    享:

    文档简介

    《从零开始走进ov7670世界》 韩彬 Bingo

    简介:本书主要通过VIP_Board开发板来讲解FPGA的视频图像处理知识。文中首先对这款开发板的硬件资源进行了介绍。接着开始带领我们进入ov7670世界,讲解了摄像头的挑选,到ov7670工作环境的搭建,视频解析解码分析,系统整体架构介绍,以及最后的系统验证。

    文档预览

    既然选择了远方,便不顾风雨兼程,一路走下去…… 从零开始走进 OV7670 世界 编者姓名 个人博客 个人微博 联系邮箱 彬哥域名 文档名称 拟定日期 档案概要 修订记录 Crazy Bingo http://blog.chinaaet.com/crazybingo http://www.cnblogs.com/crazybingo http://weibo.com/thereturnofbingo thereturnofbingo@gmail.com http://crazybingo.googlecode.com/ 《从零开始走进 OV7670 世界》 2013.01.08 2013-01-16 修改文档名:从零开始走进 OV7670 世界 1 Verison 1.0 2012-01-01 15:00 2 Version 2.0 2013-01-16 11:43 Copyright (C) 2012-20xx Crazy Bingo Corporation 版权归 Bingo 所有,抄袭请注明出处! 既然选择了远方,便不顾风雨兼程,一路走下去…… 目录 前沿:视频图像处理开篇—VIP_Board 开发............................................... 1 1. 写在前面的话...........................................................................................1 2. 绝对的值得...............................................................................................2 3. 时代的发展...............................................................................................3 4. 选择这条路的我.......................................................................................6 5. 我终于还是做了.......................................................................................7 开篇:VIP_Board 开发板介绍.............................................................................9 1. 写在前面的话...........................................................................................9 2. 基于 FPGA 的视频图像处理的优势.................................................... 10 3. 开发板功能及资源简介.........................................................................10 4. 开发板电路介绍.....................................................................................12 4.1. 电源模块...................................................................................... 12 4.2. JTAG 模块.................................................................................... 14 4.3. SDRAM 模块................................................................................16 4.4. VGA 模块..................................................................................... 17 4.5. 其他用户模块.............................................................................. 18 4.6. 摄像头模块.................................................................................. 19 Chapter 01: 开启摄像头开发之路..................................................................... 21 1. 写在前面的话.........................................................................................21 2. 关于各种摄像头.....................................................................................21 3. 摄像头通用接口.....................................................................................22 Chapter 02: OV7670 SCCB 初始化.................................................................... 25 1. 写在前面的话.........................................................................................25 2. 最需要注意的部分.................................................................................25 3. I2C 时序 写入设计................................................................................ 26 4. I2C 时序 读取设计................................................................................ 29 5. I2C 调试总结.......................................................................................... 31 Chapter 03: OV7670 寄存器配置...................................................................... 34 1. 写在前面的话.........................................................................................34 既然选择了远方,便不顾风雨兼程,一路走下去…… 2. 很重要的一些寄存器.............................................................................34 3. 寄存器最终版.........................................................................................38 Chapter 04: OV7670 视频接收解析.................................................................. 40 1. 写在前面的话.........................................................................................40 2. 配置 OV7670 寄存器.............................................................................41 3. 视频信号分析.........................................................................................42 4. 视频解码的 Verilog 实现.......................................................................44 5. 特需注意的关节.....................................................................................46 Chapter 05: OV7670 YUV 视频解码..................................................................50 1. 写在前面的话.........................................................................................50 2. ITU-R BT.656 格式简说........................................................................ 50 3. YUV 格式简说........................................................................................52 4. YCbCr 视频流接受................................................................................. 52 4.1. YCbCr422 转 YCbCr444.............................................................. 53 4.2. YCbCr444 转 RGB565................................................................. 54 Chapter 06: OV7670 视频显示系统整体架构.................................................. 57 1. 写在前面的话.........................................................................................57 2. sdram_ov7670_yuv 模型解析.................................................................58 2.1. 顶层模块...................................................................................... 58 2.2. SDRAM 的显示控制器................................................................59 3. 系统统调验证.........................................................................................61 4. 写在最后的话.........................................................................................62 既然选择了远方,便不顾风雨兼程,一路走下去…… 前沿:视频图像处理开篇—VIP_Board 开发 1. 写在前面的话 时间是 2012 年 7 月 15 号,23:24,昨天出差了,今天才回来,不算太累, 想写个最近总结的引言,因为若有所思,若有所悟…… 昨天是 Altera 第一次网友聚会,因为很激动,提前一个小时到了,在西湖边 溜达了一个时辰,心惊胆战地参加了 Altera 杭州版的“青藤茶馆”之行,第一次 走上 100%的陌生人沟通之路。好多神人,好多前辈,众人皆牛,我独嫩……附 上 Altera 中文论坛帖子,希望大家抓住以后的机会: http://www.alteraforum.com.cn/showtopic-2493-4.aspx 1 既然选择了远方,便不顾风雨兼程,一路走下去…… 2. 绝对的值得 谁能找的到我哈…… 自从离校以后,瞬间,发现失去了很多同伴;每当夜幕降临,夕阳西下,莫 名的孤独感。曾经的嚣张跋扈,如今的孤芳自赏,为了追求太多,总是失去更多, 有一种自傲的说法是:“作为一个高手,我习惯了孤独”,当然我不承认我是高手, 因为我认识太多的神,我早就习惯他们的照耀了!听着“我今年二十七八岁了” 的短视频,理着琐碎的记忆碎片,人无远虑,必有近忧,有时候压力真的很大…… “生命在于运动,人生在于沟通”,邂逅的机会,难得的聚会,这是我离校 后,第一次也是意义最深刻的一次座谈。与会的有骏龙科技的 FAE、华为研发的 大佬、自由电子的大神、浙大生仪的前辈、海康大华的牛人等等(最后竟然发现, 有 6 个工程师出道杭电,当然我是最小的一个)。 我,小屁孩一个,只是暂时不是学生,见识短浅,阅历不足,能与众牛人促 膝长谈,不甚荣幸,甚至多么希望自己有一只录音笔,能把交谈全部录下来,回 去慢慢分析。 2 既然选择了远方,便不顾风雨兼程,一路走下去…… 3. 时代的发展 凭着我的回忆,我也只能零星的写下言谈的内容,时代在变化,电子世界, 发展真的太快: 1) 现在还有国家的概念,等若干年以后,网络和电子极度发达,国家的概念会 越来越模糊,取而代之的是人类,地球的概念。 2) Altera 的 Cyclone V,Xilinx 的?,28nm 的 FPGA 兴起,不过 intel 18nm 不 是梦想。14nm 已在测试中,目前正在向 10nm 进军中,震惊! 3 既然选择了远方,便不顾风雨兼程,一路走下去…… http://www.cnbeta.com/articles/149875.htm 3) 万兆以太网的实现,每一路 10G,4*10G=40G,与 PCI-E 完美结合,通信不 在存在问题,瓶颈只是存储的问题。 4) 4G 通讯技术的出现,未来只要手机等移动设备承受的了,以后再也不用骂 娘了 5) 机械与电子的结合,FPGA 发挥致命的作用,超高速控制 1200 针,无缝衣服 3min 一件,早就是现实 6) 美国,6 米内实现指纹捕获,而我们现在的门镜系统 7) 现在的 U 盘,在 80 年代,那是想都不敢想的事情,因此下面这个东西 100W 便宜卖了! 4 既然选择了远方,便不顾风雨兼程,一路走下去…… 8) 通信不存在瓶颈了,以后视频图像处理,依然会是很欠缺的一部分,所以我 的 CCD 降噪…… 9) Altera 从 Max Plus 到 Quartus 12.0,从 MAX 到 Cyclone V,从逻辑到系统, 当出现 SOC,ARM 之后,FPGA 再也不是单纯的逻辑,ARM,FPGA,DSP, 数字系统软硬件,这将会是一个系统的平台。 10) 好多想不起来了,NC 了,有机会再给大家讲故事,给大家秀秀美图吧: 5 既然选择了远方,便不顾风雨兼程,一路走下去…… 开始的生疏,彼此的隔膜,但 5 个小时的座谈,不停的吃,不停的喝,不停 的聊,乐此不疲,最后甚至忘了点,知道近 3 点才有人起身要走。总之,这是我 最值得的一次会议。 4. 选择这条路的我 之所以把这一席话放在这个论坛,这个小组,这个主题之中,是因为我是以 一名“视频图像开发”工程师的身份参加的会议。虽然我还称不上什么工程师。 这次让我见识的前辈们,无不是经过兢兢业业的奋斗,辛辛苦苦的努力,点 点滴滴的积累,有的开了公司,有的做了老师,有的还在坚持,总是,每一个都 是真正的电子玩家。我不知道几年以后的我,会怎样;也不知道,我到底会走哪 一条路;不知道是电子开发,一路到底;还是分道扬镳,寻找出路;不知道是从 事科研,还是从事商业。总之,哪里有属于我的地方,我就会往哪里跑。不过, 至少,短期的几年内,我会努力成为一个是在的电子开发工程师。 视频图像开发,OV7670 摄像头,这只不过是最基本的起步的一个入门,图 像处理未必要用 FPGA,也可以用 ARM,DSP,或者那些所谓的专用 IC。经过 了几个月的努力,无数的崩溃,加上头疼得调试,开发了 VIP_Board 这套系统, 只是希望能够透过这一套最最最基础的入门套件,带你进入视频图像处理的门 槛,让你最底层的懂得视频图像的原理。 “FPGA 是万能的,但让他为所欲为,是万万不能的!”,有了 FPGA,能让 我们的开发变得完美。 6 既然选择了远方,便不顾风雨兼程,一路走下去…… 5. 我终于还是做了 有些人说我这样做有什么意义? 有些人说这些东西记在脑子里就可以了? 有些人说,有点能力就到处炫耀,算什么东西? 我只想说,不管被不被理解,我得到的东西,我就一定会感恩;我认定的事 情,我就一定会做完;我决定的方向,我就不再会回头。不管你是否理解我,“知 我者谓我心忧,不知道者谓我何求”。我也是都被网友们带大的,也许你们并不 知道 3 年前他们喊我什么,O(∩_∩)O 哈哈~ 多年来,在你们的守望下,我一直在努力。我并没有变得膨胀,也并没有变 得嚣张,一直有人指导着我,并不是“自信的力量”,而是“坚持的魔力”,所以 我不太怕失败。不管如何,我跟某些人说过,“有始有终”! 有些人肯定知道,去年暑假我想要搞过一个所谓“VIP_NetTeam”的东东, 也就是一帮志同道合的网友,视频开发的共性,希望一起设计一套牛逼的硬件出 来,开启视频图像之路。但是觉得不太靠谱,慢慢的发现,没有绝对的利益链的 的虚拟机构,难以生存,因为他没有存在的压迫感,还记得老罗说过那么一句话: “不被嘲笑的梦想,是不值得去实现的”。 最后,亮一下我们的 VIP_Board,彬哥会提供整套资料,包括相关资料,代 码,以及最近在总结的,可以整理成小册子的“OV7670 档案”,届时分享给大 家,也算是对自己的一个交代,想买的可以拍了 O(∩_∩)O 哈哈~ 网址:crazyfpga.taobao.com 7 既然选择了远方,便不顾风雨兼程,一路走下去…… 8 既然选择了远方,便不顾风雨兼程,一路走下去…… 开篇:VIP_Board 开发板介绍 1. 写在前面的话 跌跌撞撞,进入了这个领域,徘徊了 4 年光景了;回头想想,“所谓提升, 无非是不断地在失望中寻觅,在匮乏中坚挺,在崩溃中解脱……” 对数字的兴趣,从事 FPGA 开发,断断续续 3 年了。“那些不明真相的群众, 殊不知 FPGA 为何物”。为搞清楚这个问题,我走了很长的一段路。曾经以为 FPGA 是万能的,什么矩阵键盘、1602、PS2,甚至当年年少无知,用 VHDL 驱动过 SD 卡……曾几何时,每设计一样东西,开始有了条件的反射,考虑到“成本”, “性能”,“市场”,“前景”等因素。回头想想,当年用 Nios2 驱动流水灯,可笑 的嚣张…… 几年的努力,认识了很多神,多半鼓励,引导,并且扶持过我,成为挚友的 同时,成为了我的良师。我没有特权那么 NB,也没有牙缝深厚,唯独在机遇和 挑战的同时,得道网络,才让我有了今天(追随着神,幻想站在他们肩膀上 )。 设计过 MAX、MAX II→Cyclone I、II、III、IV 的电路,经历过从 VHDL→Verilog →Nios2→Testbench→Timingquest 的摸索,终于有一天明白了,“FPGA 是万能 的,但让他为所欲为,是万万不能的!” 9 既然选择了远方,便不顾风雨兼程,一路走下去…… 2. 基于 FPGA 的视频图像处理的优势 ARM,DSP,FPGA,各有所长,纵然 FPGA 无所不能,它也有“唯我独尊” 的领域。FPGA 在通信领域,图像处理,大屏显示等方面,发挥其并行高速精确 等优势,以其得天独厚的功力,真正实现其价值。最大的性价比就是用最低的成 本,发挥其最佳的性能。 当 FPGA 处理视频时,以本平台为例:OV7670 视频接收 640*480*30fps, VGA 显示:640*480*60fps,每秒共 30M 的带宽,这对于 FPGA 貌似很低了,但 这对于任意一块普通的 MCU,甚至 ARM,望尘莫及吧。很多人用 OV7670+FIFO 来实现每秒 10fps 的 320*240 图片的读取,但这与 VIP_Board 攀比,不是同一个 境界的。DE2 有 D5M(500W),但充其量也只能实现 640*480 的视频,而且在 设计上不够稳定,甚至没有真正实现视频(他更新的是单个区域的图像,显示从 微观意义上而言,并不完整),每一次看他的代码我都心情不好!!!而我们的 VIP_Board,加上 Bingo 多年积累的代码,理论上能实现 1280*1024 的视频,实 际上已测试过 1024*768@60Hz。。。 最近用 FPGA 做了 SDRAM 的 VGA 控制器,让单片机驱动 1024*768@60Hz 成为了一种可能,实现了多年来被取笑的“用 51 驱动 VGA”的梦想。以后或许 我会多做些视频图像处理,降噪滤波等方面的研究,总之,做单片机做不到的事 情,实现处理器不敢想的事情,那才是王道, 才是 FPGA 的优势所在。当然革 命才刚刚开始,同志仍需努力,知识永远买不到,没有免费的午餐,付出总会有 回报! 3. 开发板功能及资源简介 开发板采用 Altera FPGA,已测试电路稳定可靠,功能上能实现视频图像的 处理,及实时显示等功能。已测试 OV7670 648*480@30Hz 的 RGGB565、YUV422 等视频流实时处理显示,功能完善,运行稳定。 10 既然选择了远方,便不顾风雨兼程,一路走下去…… 当然这不仅仅只是视频处理的套件,由于硬件的支持,你可以当做入门调试 LED,KEY,串口,VGA 等,Bingo 会公布全套多年来不断 Perfect 的代码,得 道网络,馈于网络。当然 VIP_Board 还能实现 VGA 显示控制器的功能,用于外 部处理器的数据显示,让单片机驱动 VGA 成为现实! 序号 电路 功能 1 EP2C5Q208C8(兼 主控核心 FPGA 容 EP2C8Q208C8) 2 EPCS4/EPCS16 Flash 代码存储 3 LED LED 测试灯 8 个 4 KEY 调试按键 4 个 5 SDRAM 64M 大容量视频缓存 2 个,用 来存储视频,当然也可作为 Nios2 系统的内存 6 UART 串口通信接口,可以配合调试 摄像头 6 ADV7123/VGA 真彩 VGA 接口电路,作为视频 图像的显示接口,采用了 RGB565 真彩数据模式 7 CMOS 接口 支持 Ovmnivision,Micron 公司 的摄像头模块:OV7670,OV7725, 11 既然选择了远方,便不顾风雨兼程,一路走下去…… MT9M111,MT9D111 等 备注 1:目前代码暂时只支持 OV7670 的 RGB565 模式以 YUV422 模式,有 待升级(其实各种 CMOS 摄像头雷同,只要修改初始化代码,即配置代码,即 可使用模板) 备注 2:设计两块 SDRAM,是为了便于日后更高分辨率视频图像处理的需 求,比如 1280*1024@60Hz,以防不时之需(目前只用了一片)。 备注 3:摄像头由官哥一手打造,不了解官哥的请进: http://mcudiy.taobao.com/ 4. 开发板电路介绍 4.1. 电源模块 第一部分是 FPGA 的电源模块,包括 IO 电源 3.3V,内核电压 1.2V;第二部 分为 CMOS 电源,这部分主要是由于有些 CMOS 要求 2.8V 的电源,当然可以通 过跳线帽来选择(实际测试 3.3V 的时候图像更好,2.8V 纹波很大,郁闷……)。 以下是实物图,请以实物为准。 12 既然选择了远方,便不顾风雨兼程,一路走下去…… 13 既然选择了远方,便不顾风雨兼程,一路走下去…… 4.2. JTAG 模块 第一部分:这部分顾名思义是 FPGA 的配置模块。一般意义上配置模块包括 JTAG 和 ASP(当然还有并口等)。由于 ASP 使用不平凡,以及降低布线的难度, 直接用 JTAG-jic 代替了 ASP 接口,间接通过 FPGA 来配置 EPCS。 将 sof 文件转换为 jic 文件如下所示,然后直接在 JTAG 模式下下载 jic 文件 即可。 14 既然选择了远方,便不顾风雨兼程,一路走下去…… 第二部分:这部分主要是时钟电路与复位模块。如下实物图,轻触按键(上) 为 FLASH 重配置按键,轻触按键(下)为电路全局复位按键。 15 既然选择了远方,便不顾风雨兼程,一路走下去…… 4.3. SDRAM 模块 这部分是我们硬件以及软件设计最重要,以及难度最大的部分。电路中设计 了 2 片 SDRAM,是 为了 便于 日后更 高分 辨率视 频图像处理 的需 求 ,比 如 1280*1024@60Hz,以防不时之需(目前只用了一片)。 这部分电路驱移植了特权同学的代码(尽管我改了很多很多,我还是得尊重 下这位同学 O(∩_∩)O~),由于对于一般人难度比较大,大家可以使用我设计好 的接口。在后续文档中,我会着重介绍这些模块的定义以及修改,配置,这里从 简! 16 既然选择了远方,便不顾风雨兼程,一路走下去…… 4.4. VGA 模块 ADV7123-KST140,这是 140M 的 DAC 转换芯片,直接将数字信号转换为 VGA 能接受的电平(0-0.7V)。该芯片理论上能达到 1600*1200@100Hz 分辨率 的图像(当然能不能达到这个高度就看你代码的能力了)。 其实玩这个东西很久很久了,第一次驱动 VGA 是 09 年暑假,于是一发而 不可收拾……工程中 Bingo 已经模块化了 VGA 的驱动,经过无数据测试,确保 电路稳定可靠,欢迎抄袭 O(∩_∩)O 哈哈~ 17 既然选择了远方,便不顾风雨兼程,一路走下去…… 4.5. 其他用户模块 以上两部分不用我解释了吧,主要是串口电路,按键电路,以及 8 个 LED 测试等。这些模块都已经定型,可以直接移植,具体内容以后再说,此处省略 1000 字…… 18 既然选择了远方,便不顾风雨兼程,一路走下去…… 4.6. 摄像头模块 最重要当然非他莫属了。摄像头接口,支持 Ovmnivision,Micron 公司的摄 像头模块:OV7670,OV7725,MT9M111,MT9D111 等,定义如下: 19 既然选择了远方,便不顾风雨兼程,一路走下去…… 这是 VIP_Board 核心的核核心,一切精华都在此处。当然我认为电路本身很 简单,PCB 本身难度不大,难度大的是代码部分,所以我认为我的代码价值远 远大于 PCB 电路板本身。前前后后,纯 verilog 实现,五六千行代码,实现了 CMOS I2C 初始化;CMOS 数据捕获,SDRAM 异步视频存储,YUV422 解码, VGA 驱动(本来还有半透明,图形叠加,字幕显示,滚屏,怕大家接受不了, 以后再说)。 所以这不只是一个电路板,一个摄像头的驱动板。能运用自如实现功能,完 全把握我的代码,熟悉每个模块每个电路的同学,必定能学到不少东西。 FPGA 是万能的,但让 FPGA 为所欲为是万万不能的!But,在视频图形领 域,让 FPGA 为所欲为,大展雄威吧。后续设计,包括 CMOS 降噪,滤波,压 缩等等,系统能通过 VIP_Board 给每一个投其所好的朋友,一个简单的门槛!所 以,希望更多的人加入我们: 官方小组:视频图像显示系统开发 http://group.chinaaet.com/116 官方 QQ:VIP_Board 视频开发:248619895 淘宝店铺: crazyfpga.taobao.com (请注意,板子暂时没了,有需求邮件联系,请关注 www.chinaaet.com) 20 既然选择了远方,便不顾风雨兼程,一路走下去…… Chapter 01: 开启摄像头开发之路 1. 写在前面的话 时间是 2012 年 7 月 12 号,21:51,又是一天过去了,时间来去如此匆匆, 没时间抱怨…… 这个文档创建大概是 2 个月以前的事情了,但一直拖,拖,拖到了现在。一 个项目结束了,没有写完总结的档案,总觉是没有做完,心里一直忐忑着,逼着 自己,今天,把这件事收个尾。、 关于 OV7670,或者说关于摄像头吧,进入一个全新的领域,是从 OV7670 开始的。甚至用多个是 FPGA 驱动,没有太多的资料;再者由于 FPGA 设计的 要求,感觉这个过程还是蛮艰辛的。不敢跟那些所谓的神比,总之,对于自己还 是走过了一段崩溃而又充实的路。最近会抽时间把有关摄像头的心得体会全部总 结出来,也算是对自己的一个交代。 2. 关于各种摄像头 首先,关于摄像头的概要,这些都是我个人研究中的心得体会,我不会刻意 去照搬照抄某些文档,也不会去网络上复制粘贴,仅仅听过浅陋的水文,总结前 些日子研究的总结。 既然是“开启摄像头之路”,那本篇主要讲讲摄像头。摄像头主要可分为数 21 既然选择了远方,便不顾风雨兼程,一路走下去…… 字摄像头,和模拟摄像头,即 CMOS 摄像头,与 CCD 摄像头。模拟摄像头也就 三根线,RGB,通过 AD 转换为数字信号,终端接收信号,解码,便能得到视频 图像。CCD 摄像头我将会在研究生截断全面研究,包括编解码,图像算法处理, 因此这件事情以后再说,此处不再说起。 CMOS 摄像头,其实也是通过模拟采样,AD 转换,然后在经过 DSP 等信 号处理,最终得到 D[0..8]这几个摄像头数据接口。相对于 CCD 而言,CMOS 在 电路上要简单得多,因为很大一部分电路都在内部帮用户转换完成了。 一般在电子开发中,尤其是我们 DIY 中,用的比较多的是 OvmniVision 的 摄像头,因为其驱动简单,图像效果还可以,被广泛应用于各种监控领域中。同 时 Micron 的摄像头,以其优质的图像处理功能,兼容的摄像头接口,不过寄存 器量大,驱动稍微难度大了一点,以至于资料不多,亲睐的人没有 OV 多。这两 款芯片我都用过,OV 的便宜点,但 Micron 的图像效果更 OK 一点,各有所长吧。 初学入门,介意用 OvmniVision,更好上手,而且,资料问题啥的更好找些。 3. 摄像头通用接口 22 既然选择了远方,便不顾风雨兼程,一路走下去…… 如上,OV 传感器内部结构(上),以及 Micron 传感器的内部结构(下), 在接口方面,大致雷同,主要由以下这些: 1 都有 I2C 总线(也成 SCCB):SCLK,SDAT,用来配置传感器内部寄存 器 2 都有 XCLK,PCLK,FRAME_VALID,LINE_VALID,DOUT[7..0]信号, 主要是 Sensor 驱动时钟的输入以及采样时钟,帧有效信号,行有效信号,图像 数据的输出。也许业界为了兼容吧,摄像头输出都设置为了 8 位 DOUT[7..0], 所以 PCLK 是像素时钟的 2 倍,这在以后慢慢讲吧。 3 STROBE,STANDBY,或者 PWDN,闪光灯,以及 Sensor 的开关,也 不尽相同,其他就没啥的了。。 摄像头的驱动也差不多,无非就是寄存器配置,然后按照设定的模式配置数 据。不管是 YUV 模式,还是 RGB,Raw 等数据格式,主要按照协议采样,转换 就可以了,这在处理上并没有那么难,就看你 Verilog 的功底了。关于通信协议, 关于时序,以后再讲。。。 在此两项我用过的两款摄像头,OV7670 and MT9M111: 23 既然选择了远方,便不顾风雨兼程,一路走下去…… 24 既然选择了远方,便不顾风雨兼程,一路走下去…… Chapter 02: OV7670 SCCB 初始化 1. 写在前面的话 时间是 2012 年 7 月 12 号,22:32,接下来写 I2C 初始化喽…… 关于摄像头 I2C 初始化部分,是我摄像头驱动画的时间最长的,曾经相当的 崩溃。。。不仅仅由于这一部分不太适合用 FPGA 来做,而且电路,时序等方面, 真的好头疼。因为我没打算随随便便移植某公司开发板的虾米代码,看到那代码 我就心情不好。 最终,还是自己写,其实也不难嘛。 2. 最需要注意的部分 这个,摄像头的 SCLK,SDAT 引脚必须上啦电阻,4.7K 也可以,否则死啦 死啦滴。我就在这上面拜拜浪费了 3 天时间。。。想死的心都有了。。。如下: 25 既然选择了远方,便不顾风雨兼程,一路走下去…… 很多人搞不懂 I2C 总线为什么要上啦电阻,包括我自己。其实这关系到 I2C 的内部结构,如下图所示,I2C 内部采取了 Open Drain,本身只能输出低电平, 只能通过上拉电阻,结构如下图所示: 具体的相关解说请看《I2C 上啦电阻到底要多大》一文,此处不再累赘了,网址如下: http://blog.chinaaet.com/detail/28567.html 3. I2C 时序 写入设计 OvmniVision 很搞笑,他管这个 I2C 叫做 Serial Camera Control Bus (SCCB), 其实所谓 SCCB,其实写入的时序完全一样,只是读取有一丁点儿差别(MT9M111 的 I2C 时序差别更大一点儿)。 一般 I2C 的初始化都有一定的协议。以下主要以 0V 的 IC 为例,写入寄存 器如下所示,先写设备地址,在写寄存器地址,最后才输入寄存器的值,即 ID-Address + SUB-Address + W-Data!OV 的设备地址为 0x42,最后一位是用来 判断读写的,即读的时候为 0x43! 26 既然选择了远方,便不顾风雨兼程,一路走下去…… 从时序图可见,没法送 8 个数据,SDAT 设置为输入,接受一个从机反馈的 信号。如此循环 D-Address + SUB-Address + W-Data,完事儿,代码设计如下, 可见三个雷同的步骤: 代码中清晰可见,诶发送 8 个数据,设置读取 ACK,不解释了。但是当时 由于上拉电阻的问题,无数次查时序,这部分我做了太多的工作,最后完美的实 现任意的操作,主要在此分享几个过程中的图片了,以下是 Modelsim 数据写入 27 既然选择了远方,便不顾风雨兼程,一路走下去…… 的仿真(三态部分无法仿真的,那是读取): 最后,还是抱上了示波器,也告诫大家,跟硬件相关的时序,最好来个示波 器或者逻辑分析仪,让开发变得更容易些。实际我用 Modelsim 3 天没弄出来(当 然是因为上拉电阻),但是用示波器以下是搞定,请看图: 28 既然选择了远方,便不顾风雨兼程,一路走下去…… 4. I2C 时序 读取设计 读取比写入稍微复杂那么一点点儿,因为在发送从机地址,指定寄存器地址 之后,还需要再次发送从机地址(末位置 1),才能读取制定寄存器的地址。在 Verilog 设计中,主要分成第一次指定寄存器,第二次读取寄存器值两个步骤 。 OV 的时序如下: 如上是关于 NA 的手册的阐述,最后非得发送一个 NA 位,让从机确认主机 已经接收完毕,第二部分时序的代码如下所示,这部分代码不管是某公司,还是 很多人都没实现(单片机实现的不算),当时由于不读到寄存器就不甘心,就折 腾着写出来了,其实挺简单的嘛,整个 I2C 模块也就四五百行代码。。。哪能跟 SDRAM 比。。 29 既然选择了远方,便不顾风雨兼程,一路走下去…… Modelsim 的靓照如下所示,读取不能只能看到 3 态的,没有写 I2C 输入的 testbench。 示波器还是王道,当时主要调试的还是读取部分的波形,因为错位了就会导 致数据提前或者滞后,这个非常重要,也许这就是很多人写不出来的原因,FPGA 并行的时序,就是头疼。。示波器时序如下所示: 30 既然选择了远方,便不顾风雨兼程,一路走下去…… 第一次发送 0x42+寄存器,第二次发送 0x43,读取 8bit 的数据,最后发送 一个 NACK,OK。 5. I2C 调试总结 其实读取的时序不大有用,但是有完美主义的我,没写出来就各种不舒服, 当然这也可以测试摄像头是否还活着。可以通过读取厂商识别,或者产片标志, 如下图所示: 31 既然选择了远方,便不顾风雨兼程,一路走下去…… 写入的时序的测试,也未必要跟后端图像采集连接在一起测试,这样工作量 也太大了,大家可以通过寄存器的配置,来改变 PCLK 的频率,是否按照自己的 设计的参数来输出,如下划线部分可以用来调试,包括 PCLK,VS,HS 等,这在 前期很有用。 我当时把摄像头设置成了 640*480 输入 25M,输出 31fps 左右,如下式 HREF 的信号波形,复合实际结果! 32 既然选择了远方,便不顾风雨兼程,一路走下去…… 33 既然选择了远方,便不顾风雨兼程,一路走下去…… Chapter 03: OV7670 寄存器配置 1. 写在前面的话 时间是 2012 年 7 月 12 号,23:34,不能休息,我还在继续…… 关于 OV7670 的寄存器,我折腾了很久,因为没有一个官方的手册,告诉你 哪些寄存器必须怎么初始化,那些寄存器必须以怎样的顺序初始化,你到底要怎 么样。。。 最后我想说,还是按照彬哥这样吧…… 2. 很重要的一些寄存器 首先申明一条,千万不要看中文版的手册,会害死人了。。。不听彬哥言,吃 亏在眼前! 1) 复位,并且选择图像输出模式,YUV,RGB565 (00:YUV,04:RGB)(8x 全局复 位) 34 既然选择了远方,便不顾风雨兼程,一路走下去…… 2) 彩条 0x70 0x71 = 0x80 (00 关闭) 有点无法理解,就是如下“正常”是手册得出的结果,但实际上是“实验” 的结果。郁闷!!! 正常 移位 1 8 彩条 渐变灰 0x70: 00 00 80 80 0x71: 00 80 00 80 实验 8 彩条 移位 1 8 彩条 渐变灰 0x70: 00 00 80 80 0x71: 00 80 00 80 3) 时钟输入设置 这里直接使用了外部时钟,即 FPGA 给的 25MHz,如下: 35 既然选择了远方,便不顾风雨兼程,一路走下去…… 4) PLL 寄存器设置 这里用来设计 PLL 或者外部时钟的分频参数,我直接 0 分频。同时有个很 强大的功能,就是可以通过设置打开内部 LDO,省略了外部电路,如下: 5) PCLK 像素时钟设置 通过这个寄存器的配置,可以改变采样时钟,同时改变输出图像的大小,不 过我 FPGA 当然用了全屏最大,如下: 同时这个寄存器的配置,即 PCLK,还跟 0x73 有关,如下 36 既然选择了远方,便不顾风雨兼程,一路走下去…… 如下,PCLK 4 分频的 SinalTap 图: 6) 设置数据位 RGB565 00-FF,实验证明 YUV 的时候,00-ff 就挂,必须 01-FE 或者更小!如下: 7) 设置 YUV 格式 这需要两个寄存器的合作才能输出固定的序列,如下: 37 既然选择了远方,便不顾风雨兼程,一路走下去…… 3. 寄存器最终版 还有一些寄存器,太多太多,比如说 0x1e 可以调节水平或者竖直镜像等, 如下: 实际配置中,通常设定好比较重要的几个参数,其他的参数,照搬照抄吧。。。 经过长时间的测试研究,我提取出了比较重要的一些参数,如下图所示: 通过这些参数的配置,基本能实现数据格式,帧率,时钟等模式,参数的设 计。其实寄存器设置本身没有一个固定的顺序,只是我把重要的参数都提前了便 38 既然选择了远方,便不顾风雨兼程,一路走下去…… 于修改。我列出的当然只是最基础的部分,关于寄存器的设置,还是要多看看英 文原版手册。手册是万能的! 39 既然选择了远方,便不顾风雨兼程,一路走下去…… Chapter 04: OV7670 视频接收解析 1. 写在前面的话 时间是 2012 年 7 月 13 号,00:14,我好累,明天继续吧,我想休息了,明 天再战吧…… …… …… …… 哈哈,2012 年 7 月 13 号,17:12,再战!脑子里都是电路,因为没写一句话, 脑袋里就生成了一块电路,什么 DFF,MUX,AND,OR,发现自己俨然已经成 了一部机器,行云流水的遨游,飘荡在 0 和 1 的世界里。 接下来解析 CMOS 摄像头视频接收方面的各种知识,一点点记录自己的心 情,把混沌的脑袋整理的干净一点儿…… 40 既然选择了远方,便不顾风雨兼程,一路走下去…… 2. 配置 OV7670 寄存器 如上图所示,设置 CMOS 摄像头的各种模式,主要模式如下所示: 1 VGA 分辨率, RGB565 模式 2 水平镜像,因为摄像头倒置了 3 关闭 PLL,直接使用外部时钟,打开 LDO,使用内部电源 4 PCLK 正常模式,不分频,XCLK=PCLK 5 不设置彩条(这个可以用来调试) 一般我们采用 RGB565 模式,YUV 模式会在后面解说;使用内部 LDO 比外部更加稳定,FPGA 速度够快,因此 PCLK 都不用经过任何分频,直接 输出,挑战 OV 的极限。 41 既然选择了远方,便不顾风雨兼程,一路走下去…… 3. 视频信号分析 计算 PCLK 的参数,如下所示: VSYNC: 510* Line = 3*tLine + 15*tLine +480*tLine HREF: 784*tP = 640*tP + 144*tP HSYNC: 784*tP = 80*tP + 45*tP + 640*tP + 19*tP VGA RGB565, YUV 30fps: PCLK = 784 * 510 * 30 * 2(byte) = 23990400 = 24MHz 因此手册才推介 24MHz 的 XCLK 输入。 简单的说 CMOS 图像的时序跟 VGA 时序非常雷同,只不过 VGA 时序使我 们主动产生的,而 CMOS 时序是我们被动接受的。这需要我们根据固定的协议, 时序,来准确接受每一个像素的数据。 其实 CMOS 摄像头的时序都差不多,因此可以一劳永逸,话说某公司的代 码真的不咋地,但是用来做参考真的很不错,至少他已经告诉了你一个思路,让 你不会那么茫然。 一下是 RGB565 下的 OV 摄像头的图像时序图,PCLK 是连续的(这根 Micron 的摄像头一样),每一行有行有效信号,每一场有场有效信号,在场有效信号开 始,第一个行有效信号的第一个数据便是第一个像素的高八位数据。每一个像素 要分两次送。 42 既然选择了远方,便不顾风雨兼程,一路走下去…… 我在 SignalTap 中也调试过,可以清晰的看得到,数据流的规则,PCLK 上 升呀对准的是每个数据的稳定期(当然 PCLK 的边沿可以在寄存器中调节),因 此可以将 PCLK 作为整个时序逻辑的驱动时钟,直接作为 DFF 的使能时钟。 如下是将 OV7670 输出设置为移位 1 模式,可从 SignalTap 中看出,这些时 序对于前期的调试,认知有很大的帮助,至少心里有了底。 43 既然选择了远方,便不顾风雨兼程,一路走下去…… 4. 视频解码的 Verilog 实现 如果你用 STM32 玩过不带 FIFO 的 OV7670 ,你肯定知道 STM32 的能力, 能在 80 接口的 LCD 显示,坦白说是作弊了。首先你们用 MCU 初始化 OV7670, 同时初始化 LCD 为 8Bit 模式,然后,直接将 OV7670 RGB565 的数据输出给 LCD,LCD 内部经过捕获,叠加,直接输出视频。整个数据流没有经过单片机, 这不属于你,可望而不可及。 当然,就算你用了带 FIFO 的摄像头,可以通过关断来读取整幅图像,但是 效率和速度就大大打折扣了,而且你休想实现 VGA。是否还记的彬哥说过 : “FPGA 是万能的,但让 FPGA 为所欲为,是万万不能的!”我想说,这里,就 是 FPGA 适合的星空,以独到的并行高速处理能力,准确无误实现数据的接受, 搬迁,处理,输出,显示!接下来,我们就通过下面这个时序图,来实现 OV7670 数据的接受。其实很简单的! 44 既然选择了远方,便不顾风雨兼程,一路走下去…… 、 在场信号(默认低有效),和行信号有效的同时,开始捕获数据;寄存第一 个数据,拼接到第二个数据,实现一个完整像素的输出。同时在第二个数据有效 的同时,输出一个使能信号给 FIFO,作为 SDRAM 的异步缓存。当然,场有效 信号,作为 SDRAM 的地址清零信号。真的有那么简单吗? 答案是是的,因为 FPGA 太强大了。 当然这部分中的数据拼接,也可以通过 FIFO 实现,异步 FIFO 有字节拼接 功能,刻意按照您的设置拼接数据,如下图所示(这部分的设计,您可以自行发 挥,我累了) 45 既然选择了远方,便不顾风雨兼程,一路走下去…… 5. 特需注意的关节 1) 丢弃前 10 帧 OV 明确指出,在配置完寄存器之后,保守估计,前 10 帧图像将会不稳定, 介意舍弃。为此必须舍弃这 10 帧的数据,以保证后续图像处理的可靠(直接视 频显示当然没关系,假设你看不到,当然我为了严谨,还是设计上了),如下: 因此在 CMOS_Cpture 中,刻意设置了 Frame 的就算,以至丢弃前 10 帧的 数据,如下: 46 既然选择了远方,便不顾风雨兼程,一路走下去…… 2) PCLK 信号的处理 请看下面一下图像,你会发现图像偏移了,尽管我已经做了时序约束。很诚 实的告诉你,彬哥经过了无数次测试,这真的不是代码问题,真的不是。。。 47 既然选择了远方,便不顾风雨兼程,一路走下去…… 当然也不是杜邦线的问题,因为我是直插的。这部分当时猜想是因为 PCLK 并不是全局时钟,由于电路,布局布线上的不严谨,导致了时序的便宜,尽管布 线已经 OK 了。猜想如果 PCLK 设置成全局时钟输入,那将会解决问题。 最后,自行设计了电路,直接将 PCLK 输入到全局时钟,图像如此的稳定, 不再出现任何偏移,抖动等 bug,非常低 perfpect。 当然,这也不是唯一的解决方案,你完全可以用一个较高的时钟,去采样 PCLK 的上升沿,用边沿检测技术,来捕获使能,有效读取数据,这个,有待升 48 既然选择了远方,便不顾风雨兼程,一路走下去…… 级吧,反正现在 perfect 了。。 3) 杜邦线的处理 如上图,有些人用杜邦线直接连接了板子,说图像不稳定,设置什么都没有 的。。。因为杜邦线串扰等原因,这真的不好。前些日子写过一篇文字,有关于杜 邦线害死人的文章,《片间传输→高速数据的串扰》,此处不再累赘,有兴趣的请 看: http://blog.chinaaet.com/detail/28631.html 4) 最后,亮相一下当年调试过的记录,呵呵,秀一下(这不是 0V7670 哦) 49 既然选择了远方,便不顾风雨兼程,一路走下去…… Chapter 05: OV7670 YUV 视频解码 1. 写在前面的话 时间是 2012 年 7 月 13 号,19:48,我的脑子一直处在兴奋状态,有太多的 东西得记下来,我的大脑处于亢奋状态。每次脑袋剧烈运动,都感到阵阵酸痛…… 可是这件事情既然开始了,就一发而不可收拾。不管有没有价值,还是继续吧, 省得脑袋内存泄露…… Chapter 04 中讲到了 RGB565 视频信号的采样,这样开始讲 YUV 信号的采 样,以及解码等设计思路。 2. ITU-R BT.656 格式简说 ITU-R BT.601 和 ITU-R BT.656 是 国 际 电 信 联 盟 ( International Telecommunication Union)无线通信部门(ITU-R)制定的标准。严格来说,ITU-R BT.656 应该是隶属 ITU-R BT.601 的一个子协议。ITU-R BT.601 是演播室数字电 视编码参数标准,而 ITU-R BT.656 则是 ITU-R BT.601 附件 A 中的数字接口标 准,用于主要数字视频设备(包括芯片)之间采用 27Mhzs 并口或 243Mbs 串行接 口的数字传输接口标准。 详细的说明可以见 Bingo 博文: 50 既然选择了远方,便不顾风雨兼程,一路走下去…… http://www.cnblogs.com/crazybingo/archive/2011/03/27/1996974.html 由于 ITU-R BT.656 视频信号为 YUV 信号,同时,目前 CMOS 摄像头支持 YUV 信号和 RGB565 两种模式。只玩过 RGB565,未免不太爽,不仅仅因为 YUV 解码之后效果会更好,而且,YUV 对视频信号的了解,很有好处。 YUV 信号的提出,是因为国际上出现彩色电视,为了兼容黑白电视的信号 而设计的,其由于视频码率,压缩,兼容性的优势,一直被沿用至今。如下是 YUV4:2:2 的视频格式数据流: 对于视频信号而言,还存在帧头帧尾,FF0000XY。因为传统的电视是隔行 扫描的,通过此序列的采样,能够有效地捕获信号。OV7670 摄像头 YUV 模式 下输出的输出帧头帧尾如下图所示: 帧头,帧尾的设定,主要是为了有小区分奇场,偶场的视频流。因为传统 PAL 是隔行扫描的。 关于 ITU-R BT.656 想了解更多透彻的只是,介意去看看《视频技术手册-第 五版》一书。 51 既然选择了远方,便不顾风雨兼程,一路走下去…… 3. YUV 格式简说 YUV 由 Y、U、V 复合而成,其中 Y:亮度(16-235) ,U:色彩 V:饱和度。 YUV 有很多格式,比如 4:2:2; 4:2:2; 4:2:0 等,一般摄像头 YUV422 格式的数据 模式。如下图所示: YUV422 模式即水平方向上 UV 的采样速度为 Y 的一半,相当于每两个点采 样一个 U,V,每一个点采样一个 Y。这样被允许的原因是因为,我们的眼睛对亮 度的敏感度远大于对色度的敏感度,因此可以通过牺牲色度的采样率来达到图像 数据压缩的目的。 当年的黑白电视,只有亮度,即 Y;YUV 格式的出现很好的兼容了不同制 式的电视,因为 YUV 既能兼容灰度信号,又能通过 YUV2RGB 可以转换为彩色 图像,兼容彩色液晶。不明白的孩子,可以直接让 {R,G,B}={Y,Y,Y},看看是不 是黑白灰度的图像。 YUV 主要应用在模拟系统中,而 YCbCr 是通过 YUV 信号的发展,通过了 校正,主要应用在数字视频中的一种格式,一般意义上 YCBCr 即为 YUV 信号, 没有严格的划分。CbCr 分别为蓝色色差、红色色差,详细的说明请看 Bingo 博 文,这里不是重点。 http://www.cnblogs.com/crazybingo/archive/2012/06/07/2540595.html 4. YCbCr 视频流接受 其实,以上都不是本文的重点,这里,以 OV7670 视频数据为例,捕获 YCbCr 信号的捕获,最大限度的保持数据的同步,确保数据不丢失,设计思路,时序, 电路,请听 Bingo 一一道来! 对于 OV7670 而言,YUV 下的视频流,只是纯粹的 YCbCr 信号,而不是所 52 既然选择了远方,便不顾风雨兼程,一路走下去…… 谓奇场、偶场的 ITU-R BT.656 格式,因此在数据流上,RGB565 与 YCbCr 是数 据总量完全相同,所以完全可以按照前篇中的视频接收方法,直接缓存 与 SDRAM 中。唯一的 RGB565 不同的地方就是,从 SDRAM 中读取之后,需要经 过 YCbCr4:2:2→YCbCr4:4:4→RGB888(RGB565)才能正常显示。因此,通过 这两个步骤去阐述吧。 4.1. YCbCr422 转 YCbCr444 还是上面那幅图示,标准的视频的 YCbCr 信号,以 Cb0 Y0 Cr0 Y1 Cb1 Y2 Cr1 Y3………当然通过合并 8bit 到 16bi(t 为了存储,16bit)后,数据变成了{Cb0Y0} {Cr0Y1} {Cb1Y2} {Cr1Y3}……… 如上是某公司的解码代码如上所示,CbCr 与对应的 Y 肯定错位了,只是肉 眼看不到;但是,既然我们知道问题,我们也能改进,为什么不严谨一点呢?? 为了保持数据上的同步,同时又不能丢失任何一个 Byte,重新组合出一幅 完整的 YCbCr 的图像,我们需要将所谓的 YCbCr4:2:2 转换为 YCbCr4:4:4,即每 一个像素都有完整的亮度色差!但这需要几级寄存,加上数据的拼接,同步设计。 由于时序的严格,为了有效的解码,可以通过如下步骤的序列,来完成!如此, 既保证了数据的同步,不至于色差的错位,同时又有效的拼接了数据,有利于保 存。 1 捕获 Cb0,Y0 53 既然选择了远方,便不顾风雨兼程,一路走下去…… 2 捕获 Cr0,Y1 3 捕获 Cb1,Y2,输出 Y0Cb0Cr0 4 捕获 Cr1,Y3,输出 Y1Cb0Cr0 相关 Verilog 的设计如下图所示: 经过测试,木有问题。 4.2. YCbCr444 转 RGB565 YCbCr 转 RGB888,有这么一个公式,如下: R = 1.164(Y-16) + 1.596(Cr-128) G = 1.164(Y-16) - 0.813(Cr-128) - 0.391(Cb-128) B = 1.164(Y-16) + 2.018(Cb-128) 纠结啊,你们软件设计的,且不管效率如何,可以直接用浮点运算,来实现 YCbCr2RGB。可是,可是 FPGA 是 0 和 1 的世界,不可以的你懂得。怎么办办 呢,只能和进行放大,然后用乘法器或者。。。。 我就不喜欢用乘法器,CPLD 怎么办啊!!!有完美主义的我选择了移位去实 现,倾听彬哥一一分解: 1) 首先,分离变量法,谁都学过吧 R = 1.164Y + 1.596Cr - 222.912 G = 1.164Y - 0.391Cb - 0.813Cr + 135.488 B = 1.164Y + 2.018Cb - 276.928 2) 然后进行放大,加上移位,去掉可恶的浮点 XOUT[19:0] = ((Y*10'd596) + (Cr*10'd817) - 18'd114131)>>9; YOUT[19:0] = ((Y*10'd596) - (Cb*10'd200) - (Cr*10'd416) + 18'd69370)>>9; ZOUT[19:0] = ((Y*10'd596) + (Cb*11'd1033) - 18'd141787)>>9; 3) 最后,到这一步,用 FPGA 的话,可以用乘法器去实现了。可是 CPLD 呢? 所以我不能像某公司的开发板例程那样用 MUX,我还是想继续,完美是没 54 既然选择了远方,便不顾风雨兼程,一路走下去…… 有极限的,如下: XOUT = (((Y<<9)+(Y<<6)+(Y<<4)+(Y<<2)) + ((Cr<<9)+(Cr<<8)+(Cr<<5)+(Cr<<4)+Cr) - 18'd114131)>>9; YOUT = (((Y<<9)+(Y<<6)+(Y<<4)+(Y<<2)) - ((Cb<<7)+(Cb<<6)+(Cb<<3)) - ((Cr<<8)+(Cr<<7)+(Cr<<5)) + 18'd69370)>>9; ZOUT = (((Y<<9)+(Y<<6)+(Y<<4)+(Y<<2)) + ((Cb<<10)+(Cb<<3)+Cb) - 18'd141787)>>9; 4) 最后一步,这是 C 语言也得操作的部分,乘除法出现的溢出,我们要截断, 如下截断正负溢出的部分,使得数据保持在 0-255 以内。如下: 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]; 5) 由于硬件原因,RGB888 转换为 RGB565,这个不多说了。。。 在 Quartus 中综合编译,发现用流水线+移位操作实现 YUV2RGB(能达到 80M),远比用乘法器(只能 50M)速度要快,当然在一定范围内,两者都可以。 当然我还是没满足,继续分布运算,同步逻辑,硬是活生生的将速度提升了上去。 最后,移位转换 RTL 如下所示: 整个系统。整体设计,数据流如下图所示,聪明的你应该知道视频如何存储, 解码了吧…… 55 既然选择了远方,便不顾风雨兼程,一路走下去…… 摄像头输出 CMOS摄 像 头 YCbCr视 频 流 视频数据接收 CM O S _Capture YCbCr4 4 4 转 RG B 888 R G B 8 8 8 转R G B 5 6 5 (根 据 需 要 ) SDRAM缓 存 YCbCr4 2 2 转 YCbCr4 4 4 VGA驱动模块 视频显示 其实这一节没有什么重要的东西,无非就是算法啦,就看你愿不愿意去发挥 了。算法的重要性,以至于她在视频图像处理领域,有着德高望重的地位。有一 位高人写过一篇我看了好多遍,越看越有价值的文章,强烈推介你看一下,请自 行下载:http://www.chinaaet.com/lib/detail.aspx?id=89943 算法的东西太重要了,不管是视频编解码,还是图像去噪,滤波等等算法, 都将是视频图像处理的精髓,这些接口,都是一件衣服罢了…… 56 既然选择了远方,便不顾风雨兼程,一路走下去…… Chapter 06: OV7670 视频显示系统整 体架构 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 这个视频显示系统结构最庞大,因此拿他开刀。详 57 既然选择了远方,便不顾风雨兼程,一路走下去…… 细的代码不做阐述,也不会去讲如何实现,这里只讲框架和思路! 基 于 FPGA 的视频图像显示控制器 外部数据源 (C P U ,摄 像 头 ,存 储 器等 ) 视频 万能 图像 SD RA M控 制 器 显示 数据 控制 流处 器 理 6 4 MBits SD RA M L C D 、L E D VGA等 液 晶、点 阵 显 示器 2. sdram_ov7670_yuv 模型解析 2.1. 顶层模块 系统顶层 RTL 图,主要可以划分为 4 个模块,完成了整个电路的设计,如 下所示。 序号 模块 功能介绍 1 System_ctrl 异步复位,PLL 等的同步处理,模块 2 Sdram_vga_top 基于 SDRAM 的显示控制器 3 I2C_AV_Controller CMOS 摄像头 I2C 初始化模块 4 CMOS_Cputure CMOS 摄像头数据采集模块 整 个 系 统 的 数 据 流 , 就 是 在 CMOS 摄 像 头 初 始 化 完 成 以 后 , 通 过 CMOS_Capter 模块捕获 CMOS 输出的图像数据,写入到 sdram_vga_top 模块。 Sdram_vga_top 模块通过相关存储以及处理,最后实时输出于 VGA 显示器上。 当然,(1)只是个 PLL 以及复位信号的时钟控制电路,以前的博客中我也讲过, 此处不再做累赘阐述;(3)(4)在前面章节都讲过,不接的看前面的 Chapter。 主要需要分析的是(2),基于 SDRAM 的显示控制器,请看下一小节。 58 既然选择了远方,便不顾风雨兼程,一路走下去…… 2.2. SDRAM 的显示控制器 如上图所示,sdram 显示控制器从接口上主要完成了异步数据的处理,sdram 存储器的控制,以及 VGA 显示器的显示,相关接口如下表所示: Sdram_vga_top 内部 RTL 图如上图所示,相关模块以及功能如下表所示: 序号 模块 功能介绍 1 sdram_2fifo_top sdram 控制器的异步缓存顶层模块。 59 既然选择了远方,便不顾风雨兼程,一路走下去…… 2 sdbank_switch 单片 sdram 的内部乒乓实现。 3 video_image_processing 视频图像处理单元,完成 YUV 的解码 4 lcd_display Lcd 显示图像控制模块 5 lcd_top Lcd 接口时序控制电路 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 如下图所示,半透明+字幕滚屏: 3) video_image_processing:这部分将会是以后视频图像研究中的核心算法部 分,以后将在这里实现视频的编解码、图像的滤波,去噪,以及图形变换等 算法,相关算法都可以在这个模块添加。目前实现了 YCbCr 4:2:2 解码以及 RGB 数据流的处理,完成了 OV7670 YUV 模式下的数据流解码。 4) sdbank_switch:在 SDRAM 带宽允许的范围内,实现内部 2 个 bank 的乒乓 操作,使得输入输出视频流读写无冲突。流程如下所示: 输入数 据流选 择单元 M UX2 选1 数据缓存模块 L-B a n k1 数据缓存模块 L-B a n k1 数据预处理 1 数据预处理 2 输出数 据流选 择单元 M U X2 选1 数据流运算 处理模块 5) sdram_2fifo_top:SDRAM 控制器顶层模块,实现 SDRAM 的初始化,SDRAM 突发读写操作,以及异步时钟域数据的交换,以及与 VGA 接口的同步通信。 60 既然选择了远方,便不顾风雨兼程,一路走下去…… 数据流如下图所示: w r_d ata1 W_D C FIFO w r_d a ta 2 S D R A M 读 写 状 态 控制模块 r d _d a ta1 R_D C FIFO r d _d a ta2 这部分内部的 RTL 图如下图所示: sdram_2fifo_top 模块内部功能如下所示: 1 sdram_top 模块实现了 sdram 的突发读写操作,这部分为你们崇拜的特权 同学设计,版权归特权同学所有,我只是给他修改了几个 bug 而已哈哈。。。 2 dcfifo_ctrl 模块为 Bingo 设计,主要通过 DC-FIFO 完成了异步数据的跨 时钟处理。 个人认为这部分的设计相当的重要,要完成各种同步、异步逻辑,以实现视 频数据流实时存储,保证准确不丢失。因此如果 xxx 的话,请不要随意修改,后 果自负! 3. 系统统调验证 系统中采用了 OV7670 摄像头。该摄像头每秒写入 30 帧 640*480 的图像, 同时 VGA 每秒读取 60 帧 640*480 的图像。在 Quartus II 中综合整个系统的设计, 基于 EP2C5Q208C8 FPGA,以“基于 SDRAM 的显示控制器”ip 为核心,同时 驱动 OV7670 摄像头,作为显示控制器的数据源,以及图像处理的目标。 61 既然选择了远方,便不顾风雨兼程,一路走下去…… 经过长时间测试,验证了“基于 FPGA 的视频图像显示控制器”的性能极其 稳定性。测试结果如下所示,其中右边为电脑播放的视频,左边为 OV7670 摄像 头实时捕获并且在 VGA 显示的结果,测试在画面上稳定流畅,清晰保真,在性 能上运行稳定,可靠性强。 4. 写在最后的话 哈哈,终于可以写着一段了。好激动,因为我又可以解脱了,你们可以玩去 吧 O(∩_∩)O 哈哈~ 62 既然选择了远方,便不顾风雨兼程,一路走下去…… 这些天 very very busy,当然也有些收货喽。典型的就是以下几个点,也许 你们会笑我,我觉得很重要,最基本的东西往往是最精髓的东西,随意了: 1 组合输入,逻辑输出,时序边沿严格对齐 2 稍微复杂的电路,最好画出来,在按照时序去设计 code,这样更不容易 出错。一定要分析时序,时序,时序! 3 不要盲目的只用脑袋想,也不要盲目的仿真,示波器和逻辑分析仪来的 更强大(当然也仿真时必须的) 4 设计一个项目的时候,一定要先确定好方案,以及完整的时序,接口, 功能,不然在开发中会变得很渺茫。 5 借口是失败最大的最大的座右铭。 6 Try,try,不停地 try,直到困难向你妥协。峰哥说过:“努力,永不为过”! 如上,就是《从零开始走进 OV7670 世界》的开发套件,由 CrazyBingo 原 创,目前已经批量生产,第三版升级中,有兴趣的朋友可以在一下网页查看细节: http://item.taobao.com/item.htm?spm=a1z09.5.0.40.N2tv1F&id=18278347621 (1)实现了 OV7670 的 I2C 初始化 (2)FPGA 视频图像实时采集 (3)YCbCbr 4:2:4 转 RGB888 视频格式转换 (4)64MBit SDRAM 数据缓存 ( 5 ) 640*480@60Hz VGA 的 实 时 显 示 ( 视 频 1024*768@65M 上 限 , 图 片 : 63 既然选择了远方,便不顾风雨兼程,一路走下去…… 1280*1024@105M 上限) (6)叠加了 VGA 字幕显示 (7)OSD、半透明等特效 (8)当然,板载接口,你还可以进行串口,LED,按键等基本外设,以及排针提供用 户自行开发,同时 Bingo 将贴心的准备所有测试代码,优化了 n 久的! 最终开发工程,完美代码,愿与你共享! 发货清单包括: (1)OV767030W 摄像头 (2)EP2C5/EP2C8 VIP_Board 开发主板(目前 EP2C5) (3)“代码+各种资料”的压缩包(验收满意确认收货后邮件发送) 有问题可以 mail me: thereturnofbingo@qq.com,在适当的时候给你们解答! 发现 bug 或者有更好的介意的同人,欢迎指正,对我的吐槽是对我的尊重 不被嘲笑的梦想是不值得去实现的!既然选择了远方,便看好“视频图像处 理”! OK,闪人,不废话了,CB 要累了,要走了,杭州再见,再见了…… 64

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。