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

2020-06-30 10:37:46 浏览数 (1)

基于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 可以调节水平或者竖直镜像等,如下:

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

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

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

未完,待续。。。

0 人点赞