前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于FPGA的图像边缘检测系统(一)-原理

基于FPGA的图像边缘检测系统(一)-原理

作者头像
碎碎思
发布2020-06-30 10:37:46
9210
发布2020-06-30 10:37:46
举报
文章被收录于专栏:OpenFPGAOpenFPGA

基于FPGA的图像边缘检测系统(一)-原理

参考文献:手把手教你学FPGA设计:基于大道至简的至简设计法 基于VIP_Board Big的FPGA入门进阶及图像处理算法开发教程-V3.0 以上两篇文章可以点击下载 整个系列文章如下:

基于FPGA的图像边缘检测系统(一)-原理

基于FPGA的图像边缘检测系统(二)-原理

基于FPGA的图像边缘检测系统(三)-设计实现

文章目录

  • 基于FPGA的图像边缘检测系统(一)-原理
    • [基于FPGA的图像边缘检测系统(一)-原理](https://blog.csdn.net/Pieces_thinking/article/details/83150325)
    • [基于FPGA的图像边缘检测系统(二)-原理](https://blog.csdn.net/Pieces_thinking/article/details/83274412)
    • [基于FPGA的图像边缘检测系统(三)-设计实现](https://blog.csdn.net/Pieces_thinking/article/details/83275171)
  • 一、 背景介绍
  • 二、 设计要求
  • 三、 基本原理
    • 3.1 PLL
    • 3.2 OV7670
      • 3.2.1 I2C 时序 写入设计
      • 3.2.2 I2C 时序 读取设计
      • 3.2.3 IIC 调试总结
      • 3.2.4 OV7670 寄存器配置
    • 未完,待续。。。
    • [基于FPGA的图像边缘检测系统(一)-原理](https://blog.csdn.net/Pieces_thinking/article/details/83150325)
    • [基于FPGA的图像边缘检测系统(二)-原理](https://blog.csdn.net/Pieces_thinking/article/details/83274412)
    • [基于FPGA的图像边缘检测系统(三)-设计实现](https://blog.csdn.net/Pieces_thinking/article/details/83275171)

一、 背景介绍

  图像处理入门。

二、 设计要求

  图像边缘检测系统,如图8-1所示。核心处理器为FPGA,外设包括摄像头、VGA设备及SDRAM。首先,摄像头采集到实时视频数据,送到FPGA中,经过相关处理算法将数据缓存至SDRAM中,再从SDRAM中读取并在VGA设备上实时显示。

三、 基本原理

  整个系统的分成及组成如图8-1所示,主要包括,PLL、OV7670、滤波、边缘检测、存储控制等。下面对于涉及到的基本原理及所用的技术进行分析:

3.1 PLL

  这部分介绍:https://blog.csdn.net/Pieces_thinking/article/details/82994982

3.2 OV7670

  摄像头按照信号进行分类,可以分为模拟摄像头和数字摄像头,分别对应有CMOS摄像头和CCD摄像头。模拟摄像头就三根线(RGB),通过AD转换为数字信号,终端接收信号并解码,便能得到视频图像。CCD是一种能够将光学印象转化为数字信号的半导体器件,CCD的作用就像黑胶片一样,但他是把图像像素转换为数字信号。   CMOS 摄像头,其实也是通过模拟采样, AD 转换,然后在经过 DSP 等信号处理, 最终得到 D[0…8]这几个摄像头数据接口。 相对于 CCD 而言, CMOS 在电路上要简单得多,因为很大一部分电路都在内部帮用户转换完成了   常见的摄像头模块厂商为:OvmniVision和Micron,其中OvmniVision摄像头具有驱动简单,图像效果优良等优点被广泛应用,Micron摄像头具有优质的图像处理能力,同时摄像头接口兼容性好等优点,缺点就是配置寄存器量大,驱动开发较OmmniVision摄像头大,所以应用Micron摄像头的人相对较少,由于本次设计为入门级,所以选用OvmniVison摄像头-OV7670   摄像头通用接口:

  如上两图所示,其中上图为OV传感器内部结构,下图为Micron传感器的内部结构,两种结构摄像头接口大致相似,主要由以下信号组成:

  • a) 都有 XCLK, PCLK, FRAME_VALID, LINE_VALID, DOUT[7…0]信号,主要是 Sensor驱动时钟的输入以及采样时钟,帧有效信号,行有效信号,图像数据的输出。也许业界为了兼容吧,摄像头输出都设置为了 8 位 DOUT[7…0],所以 PCLK 是像素时钟的 2 倍。
  • b) 有 I2C 总线(也成 SCCB): SCLK, SDAT, 用来配置传感器内部寄存器。
  • c) STROBE, STANDBY,或者 PWDN,闪光灯,以及 Sensor 的开关,也不尽相同。

  这个摄像头的SCLK及SDAT即IIC总线引脚必须有上拉(4.7K)左右,如下图所示:

  为什么需要上拉电阻呢?   其实这关系到 IIC的内部结构,如下图所示, I2C 内部采取了 Open Drain,本身只能输出低电平,只能通过上拉电阻,结构如下图所示:

3.2.1 I2C 时序 写入设计

  OvmniVision 很搞笑, 他管这个 I2C 叫做 Serial Camera Control Bus (SCCB),其实所谓 SCCB, 其实写入的时序完全一样, 只是读取有一丁点儿差别(MT9M111的 I2C 时序差别更大一点儿)。   一般 I2C 的初始化都有一定的协议。以下主要以 0V 的 IC 为例, 写入寄存器如下所示,先写设备地址,在写寄存器地址,最后才输入寄存器的值,即ID-Address + SUB-Address + W-Data! OV 的设备地址为 0x42,最后一位是用来判断读写的,即读的时候为 0x43

  从时序图可见, 没法送 8 个数据, SDAT 设置为输入, 接受一个从机反馈的信号。如此循环 D-Address + SUB-Address + W-Data,完事儿,代码设计如下,可见三个雷同的步骤:

  代码中清晰可见,发送 8 个数据,设置读取 ACK。

3.2.2 I2C 时序 读取设计

  读取比写入稍微复杂那么一点点儿, 因为在发送从机地址, 指定寄存器地址之后,还需要再次发送从机地址(末位置 1),才能读取制定寄存器的地址。 在Verilog 设计中,主要分成第一次指定寄存器,第二次读取寄存器值两个步骤。  OV 的时序如下:

  上图是关于 NA 的手册的阐述, 最后非得发送一个 NA 位, 让从机确认主机已经接收完毕, 第二部分时序的代码如下所示, 这部分代码不管是某公司, 还是很多人都没实现(单片机实现的不算),当时由于不读到寄存器就不甘心,就折腾着写出来了,其实挺简单的嘛,整个 I2C 模块也就四五百行代码。

  第一次发送 0x42+寄存器,第二次发送 0x43,读取 8bit 的数据,最后发送一个 NACK, OK!

3.2.3 IIC 调试总结

  其实读取的时序不大有用,但是有完美主义的我,没写出来就各种不舒服,当然这也可以测试摄像头是否还活着。可以通过读取厂商识别,或者产片标志,如下图所示:

  写入的时序的测试, 也未必要跟后端图像采集连接在一起测试, 这样工作量也太大了, 大家可以通过寄存器的配置, 来改变 PCLK 的频率, 是否按照自己的设计的参数来输出, 如下划线部分可以用来调试, 包括 PCLK, VS,HS 等, 这在前期很有用。

  当时把摄像头设置成了 640*480 输入 25M, 输出 31fps 左右, 如下式 HREF的信号波形,复合实际结果:

3.2.4 OV7670 寄存器配置

  一些重要的寄存器:

  • 1) 复位, 并且选择图像输出模式, YUV, RGB565 (00:YUV,04:RGB)(8x 全局复位)
    1. 彩条 0x70 0x71 = 0x80 (00 关闭)

      有点无法理解,就是如下“正常” 是手册得出的结果,但实际上是“实验”的结果。郁闷!!

    1. 时钟输入设置

  这里直接使用了外部时钟,即 FPGA 给的 25MHz,如下:

    1. PLL 寄存器设置

  这里用来设计 PLL 或者外部时钟的分频参数,我直接 0 分频。同时有个很强大的功能,就是可以通过设置打开内部 LDO,省略了外部电路,如下:

    1. PCLK 像素时钟设置

  通过这个寄存器的配置,可以改变采样时钟,同时改变输出图像的大小, 不过我 FPGA 当然用了全屏最大,如下:

  同时这个寄存器的配置,即 PCLK,还跟 0x73 有关,如下:

  如下, PCLK 4 分频的 SinalTap 图:

    1. 设置数据位 RGB565 00-FF, 实验证明 YUV 的时候, 00-ff 就挂, 必须 01-FE 或者更小!如下:
    1. 设置 YUV 格式 这需要两个寄存器的合作才能输出固定的序列,如下:
  • 8)寄存器最终版

  还有一些寄存器,太多太多,比如说 0x1e 可以调节水平或者竖直镜像等,如下:

  实际配置中, 通常设定好比较重要的几个参数, 其他的参数, 照搬照抄吧。。 。

  经过长时间的测试研究,我提取出了比较重要的一些参数,如下图所示:

  通过这些参数的配置, 基本能实现数据格式, 帧率, 时钟等模式, 参数的设计。 其实寄存器设置本身没有一个固定的顺序, 只是我把重要的参数都提前了前了便于修改。 我列出的当然只是最基础的部分, 关于寄存器的设置, 还是要多看看英文原版手册。手册是万能。

未完,待续。。。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于FPGA的图像边缘检测系统(一)-原理
    • 基于FPGA的图像边缘检测系统(一)-原理
      • 基于FPGA的图像边缘检测系统(二)-原理
        • 基于FPGA的图像边缘检测系统(三)-设计实现
          • 文章目录
      • 一、 背景介绍
      • 二、 设计要求
      • 三、 基本原理
        • 3.1 PLL
          • 3.2 OV7670
            • 3.2.1 I2C 时序 写入设计
            • 3.2.2 I2C 时序 读取设计
            • 3.2.3 IIC 调试总结
            • 3.2.4 OV7670 寄存器配置
          • 未完,待续。。。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档