基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

基于FPGA的实时图像边缘检测系统设计(附代码)

导读

随着科学技术的高速发展,FPGA在系统结构上为数字图像处理带来了新的契机。图像中的信息并行存在,因此可以并行对其施以相同的操作,使得图像处理的速度大大提高,这正好适合映射到FPGA架构中用硬件算法得以实现。

本篇阐述了基于FPGA设计一个能够实时采集、实时处理并实时显示的数字图像处理系统的设计思想和流程,分析了摄像头接口的时序;阐述了图像信息的捕获原理;详细介绍了图像边缘检测部分各模块的功能;重点介绍了具有去噪功能的中值滤波模块的设计;简单描述了边缘检测算子的选用;系统的介绍了SDRAM的工作原理以及控制方式;介绍了VGA时序;最后针对整个系统做了验证和总结,包括仿真波形的验证以及板级验证。

该系统基于实体FPGA开发板实现了图像数据的实时采集、实时边缘检测和实时显示,运行稳定,实时性能较高,从而也表明FPGA确实具有海量数据高速传输的能力。

本篇为本人当年的毕业设计部分整理,各位大侠可依据自己的需要进行阅读,参考学习。

第一篇内容摘要:本篇会介绍前言,包括课题研究的背景和意义、相关技术在国内外的发展现状及应用、图像边缘检测技术的主要应用、FPGA技术在国内外的发展现状及应用、系统设计的主要内容及方案、系统的设计流程。

还会介绍基于FPGA实现图像的实时采集部分,包括图像信息的实时采集,摄像头型号及其参数,SCCB总线特点及其工作原理,基于FPGA驱动摄像头接口,图像信息的实时捕获等相关内容。

一、前言

1.1 课题研究的背景和意义

信息化是本世纪最主要的特征之一,在这样一个信息化的时代,计算机显得尤为重要,在各行各业都起着举足轻重的作用。在图像处理领域,数字图像处理技术发展得尤为迅速,并广泛应用于航空航天、电子通信、医学等各个领域,随着技术的不断发展,新开发的产品在图像质量、图像存储容量以及图像处理速度等方面也都有了新的需求。数字图像处理,往往是基于像素进行一些运算,从而有效提高图像质量。在图像处理过程中,处理算法往往比较简单,然而由于参与运算的图像数据量大,大多数图像数据还需要多次重复使用,因此图像处理的速度便成为了整个系统设计的瓶颈。

目前,图像处理的算法研究已经日趋成熟,在这种背景下,有效提高图像处理的时效性,解决实际系统设计的瓶颈问题,便有了很大的应用前景。随着科学技术的高速发展,FPGA在系统结构上为数字图像处理带来了新的契机。图像中的信息并行存在,因此可以并行对其施以相同的操作,使得图像处理的速度大大提高,这正好适合映射到FPGA架构中用硬件算法得以实现。

数字图像处理技术包括图像增强、图像复原、模式识别等,图像中亮度变化明显的点可能就是边缘点,能够有效地检测出图像的边缘,将对图像的后续处理起到事半功倍的作用。通过边缘检测过程,我们可以保留图像中对象的边界信息,这在很大程度上减少了待处理的数据量,从而有效简化了图像的分析过程。

FPGA结构灵活、现场可编程、并行处理信息,兼顾速度和灵活性。另外,其通用性强、适于模块化设计、易于维护和扩展、开发周期较短,适合用来做实时图像处理。因此,基于FPGA设计一个基于VGA实时显示图像边缘检测信息的系统有着广泛的应用前景和深远的现实意义。

 

1.2 相关技术在国内外的发展现状及应用

1.2.1 图像边缘检测技术的主要应用

1)边缘检测在储粮害虫方面的应用

农业是我国的主要根基,虫害是储粮的大敌,近年来,对储粮产生威胁的害虫种类和密度均呈上升趋势,导致国家的储粮损失日益严重。为了降低储粮损失,有效防治害虫,就必须要尽可能准的分析它们的种类、数量、发展趋势及其潜在危害。利用计算机实时采集储粮害虫的相关图像、数字化处理、分析识别,自动提取储粮害虫的种类、数量等相关信息,并由计算机系统输出数据、发出指令,这就构成了当今的科学保粮专家系统。基于机器视觉实时监测虫害信息并智能化处理是虫情检测的发展趋势,虫害图像处理算法则是关键核心问题,其中,图像的边缘检测技术起到了非常关键的作用。

2)图像边缘检测技术在电厂中的应用

在电厂中,其安全和经济运行主要取决于其锅炉燃烧的稳定性。20世纪80年代,出现了一种将计算机技术、数字图像处理技术以及燃烧学等技术相结合应用的跨学科技术——锅炉图像火检技术。其原理是利用计算机分析火焰图像,从而得到关于炉内运行情况的大量原始信息。利用计算机对火焰图像进行数字处理,提取火焰亮度均值、火焰燃烧中心以及火焰锋面位置等参数,从而分析描述炉内燃烧的整体水平、火焰中心位置以及火焰充满程度等信息。该技术的核心之一就是图像边缘检测技术。

目前,边缘检测技术已渗透到各个领域,例如医学细胞检测领域、产品外观检测领域、模式识别领域等。

1.2.2 FPGA技术在国内外的发展现状及应用

FPGA即现场可编程门阵列(Field-Programmable Gate Array),是当前用于IC设计的主流形式之一,具有近乎完美的现场编程架构,极具发展潜力。FPGA所能实现的数据流的高速传输性能是目前没有任何技术能够与之抗衡的,在这个处处都追求速度的社会,FPGA几乎无处不在。随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、 广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。2008年北京奥运会的主舞台中——画卷就用到了4000个FPGA芯片,这是FPGA在图像领域中的应用;FPGA在人脸、车牌等物体检测中得到了广泛应用,航空航天领域中导弹轨迹的实时监测也少不了它;奥迪选择了两个FPGA芯片用于它的导航定位系统,这是FPGA在汽车电子领域中的应用。

FPGA最主要的优势有四点:①FPGA用硬件描述语言(VHDL或Verilog)进行描述,并发执行,除此之外,FPGA内部集成锁相环,可以把外部时钟倍频,核心频率可高达几百兆,在高速领域,FPGA无法被取代;②FPGA可现场编程,具有近乎完美的现场编程架构,可根据用户需求实现定制;③基于FPGA可以实现SOC的设计(内部集成ARM);④FPGA可以内嵌CPU,甚至可以嵌入多核。

随着科技的发展,人们对数字图像处理技术的要求也越来越苛刻,FPGA具有高速运算、微型体积、较低功耗等诸多优点,这使得FPGA技术在数字图像处理领域中必将起着不可替代的作用。

 

1.3 课题研究的主要内容及方案

1.3.1 题研究的主要内容

21世纪是一个高速的信息时代,在众多信息中,图像类信息是其中的一大类,对图像信息实时、高速、准确的处理一直都是学者们研究的一大热点。图像处理一般指数字图像处理:就其技术本身而言,包括图像增强、图像复原、图像匹配、模式识别等,无论是那一种技术,都脱离不开同一个话题——图像边缘检测,换言之,图像处理技术的好坏很大程度上就取决于是否能够对图像边缘的信息处理妥当;就其处理形式而言,包括静态处理和实时处理,所谓图像的静态处理,就是对静态图像的处理,而实时的图像处理,就是对持续更新的图像信息进行处理。

本课题研究的主要内容就是基于VGA实时显示由摄像头所捕获图像的边缘信息,整个系统设计基于FPGA实现:首先是基于FPGA实现图像数据的实时采集;接着对捕获到的信息进行边缘检测,这里分为三步完成(先是将捕获到的彩色图像转换成为亮度文件,接着采用中值滤波对图像进行有效去噪,然后采用sobel算子对图像进行边缘检测);最后基于FPGA驱动VGA接口实时显示检测得到的图像边缘信息。

1.3.2 系统的设计流程

本课题基于FPGA实现,主要涉及到以下内容:1、摄像头接口的驱动;2、图像数据的实时捕获;3、彩色图像到灰度图像的转换;4、中值滤波;5、边缘检测;6、图像数据实时存储;7、图像信息实时显示。具体设计流程如图1-1所示。

图片[1]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图1-1 系统设计流程

二、基于FPGA实现图像的实时采集

2.1 图像信息的实时采集

2.1.1 摄像头型号及其参数

人对视觉的感知往往以图像的形式再现,图像可以由光学设备获取,也可以由人为创作。随着数字采集技术和处理技术的发展,越来越多的图像以数字形式存储,即数字图像。数字图像以二维数字组的形式表示,用数值表示各像素灰度值的集合,用来表示图像的数据体称为图像数据。数字图像处理的过程就是利用计算机对获取的图像数据进行去噪、增强、特征提取的过程。本课题的主要任务就是实现图像的实时采集、实时处理并实时显示,因此我们的首要任务就是实现图像的实时采集,这里我选用摄像头作为我获取图像的设备,基于FPGA按照相应的时序驱动摄像头接口。

本系统选用由豪威公司生产的Ov7725 CMOS Sensor摄像头进行设计和调试。Ov7725 属于VGA分辨率的CMOS Sensor,其分辨率最高达640*480,成像质量优越,功耗小,开发简单,受到很多中低端产品的青睐。Ov7725是一款集成1/4英寸单芯片VGA相机及图像处理器的高性能传感器。由于该型号摄像头的质量和性能可靠,因此在PC相机、玩具、手机等众多移动产品中均有诸多应用。

1)Ov7725 CMOS Sensor摄像头的参数及特点

(1)图像饱和度、锐度、噪声抑制等可调节;

(2)自动调节边缘的增强与衰弱,自动调节噪声的抑制;

(3)具有标准的SCCB(相机控制总线)接口,可以配置输出 RAW RGB、RGB422、RGB565、RGB444、YUV422等格式的视频流;

(4)支持VGA、QVGA以及40*30到CIF(352*288)分辨率的图像尺寸;

(5)能通过配置实现帧同步模式;

(6)高灵敏度,适合低照度使用;

(7)自动曝光(AEC)、自动白平衡(AWB)、自动带通滤波(ABF)、自动黑白电平校准(ABLC);

(8)拥有640*480的感光阵列,最高支持640*480@60hz图像输出。

2)Ov7725 CMOS Sensor摄像头的内部功能模块框架与说明

图片[2]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-1 Ov7725 CMOS Sensor 内部模块框架

如图2-1所示为Ov7725 CMOS Sensor摄像头的内部模块框架,从框架中可以看出,我们可以通过SCCB接口来配置Ov7725的寄存器。其工作原理如下:在XCLK的驱动下,首先由感光元件阵列进行相关图像的采样,并默认输出640*480阵列的原始模拟数据;然后通过12bit的A/D转换,将原始模拟数据转换成为数字信号(原始数字信号格式为 RAW RGB);最后通过DSP进行相关的算法处理,并最终输出10bit 视频流数据。

3)Ov7725传感器的控制信号接口及其功能描述

表2-1 Ov7725传感器控制信号的功能描述

图片[3]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

4)Ov7725传感器的寄存器说明

Ov7725 CMOS Sensor一共有172个配置寄存器,在这172个寄存器中,有的只能读,有的只能写,有的则既可读又可写。在传感器正式工作之前,必须首先对寄存器进行正确的配置,否则将无法得到预期的工作模式,更别说得到较好的画质和相应的图像效果。然而这172个寄存器并非都需要我们配置,需要我们配置的只是个别重要的寄存器。其配置的方式就是通过SCCB总线进行相关操作,其余寄存器则采用默认值。表2-2中所介绍的寄存器主要与视频图像输出格式、采样画质、曝光参数等有关。

表2-2 Ov7725传感器的寄存器介绍

图片[4]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图片[5]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

2.1.2 SCCB总线特点及其工作原理

1)SCCB总线特点

SCCB(Serial Camera Control Bus)接口,即串行相机控制总线。Ov7725的SCCB总线实际上就是我们常用的IIC通信总线,用于完成对绝大多数OmniVision 系列图像传芯片功能的控制。Ov7725的SCCB接口有两根信号线:一根是时钟线SCL;一根是数据线SDA。通过这两根线我们就能够完成Ov7725寄存器的配置,从而驱动Ov7725使其实时采集到我们所需要的图像信息。

SCCB总线的控制方式简单,通信速率较高,具有以下特点:

(1)SCCB总线只需要两根线,一根数据线SDA,一根时钟线SCL;

(2)SCCB总线不需要片选信号就可以实现多个设备的链接,可以通过从机的唯一地址识别码来访问,最终实现器件信息的配置;

(3)SCCB总线上的所有器件都具有“自动应答”功能,从而保证了数据交换的正确性。同时SCCB总线还具有“时钟同步”功能,其时钟频率最大约为400KHz。

2) SCCB总线的接口时序

SCCB总线是由数据线SDA和时钟线SCL构成的串行总线,可以实现数据的发送和接收,SCCB总线的体系结构如图2-2所示。

图片[6]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-2 SCCB总线的体系结构

SCCB总线通过串行方式发送8位数据,基本时序如下:首先发送数据的最高位,最后发送数据的最低位;每发送完一组8bit的数据,都需要通过接收从机发送的一个响应信号来判断本次发送数据是否正确。官方手册所提供的使用SCCB总线发送8位串行数据的时序如图2-3所示,其中信号SCCB_E不需要我们关心。

图片[7]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-3 SCCB总线8bit数据串行发送的时序图

在我们按照SCCB协议发送或接收数据时,需要特别注意以下几点:

(1)开始信号和结束信号

当时钟信号SCL为高电平时,数据线SDA由高电平跳变到低电平的时刻即为开始信号,自此时起数据开始传输;当时钟信号SCL为高电平时,数据线SDA由低电平跳变到高电平的时刻即为结束信号,数据传输在此时结束。SCCB总线的开始信号和结束信号的体系结构示意图如图2-4所示。

图片[8]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-4 SCCB总线开始和结束体系结构

(2)应答信号ACK

每8位数据发送完毕之后,外围设备向发送数据的控制器(FPGA芯片)发出低电平应答信号表示已经接收到数据,这个信号叫做应答信号。控制器(FPGA芯片)接收到应答信号之后,会据此判断并作出是否继续传递信号的决定。如果控制器(FPGA芯片)没有接收到应答信号,控制器就会认为是受控制的外围设备出现故障,因此需要重新进行配置,直到成功接收到外围设备所发出的正确的应答信号。SCCB总线应答信号ACK如图2-5所示。

图片[9]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-5 SCCB总线数据传输图

(3)数据传输

SCCB总线在进行数据传输时,时钟信号SCL为高电平,同时数据线SDA上的数据必须保持稳定,只有这样才能够保证所传输数据的稳定性和可靠性。因此只有当时钟信号为低电平时,数据线上的高电平信号或者低电平信号才允许变化。SCCB总线数据传输图如图2-6所示。

图片[10]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-6 SCCB总线数据传输图

3)使用 SCCB总线配置Ov7725的寄存器

基于上述的分析,我们对SCCB总线时序已经有了一定的了解,接下来就可以按照指定的流程来配置Ov7725的寄存器:通过发送器件地址、寄存器地址、寄存器参数数据等参数的配置,最终完成寄存器的读操作和写操作。

(1)SCCB总线寄存器的写入时序

SCCB总线在给寄存器写数据的时候,需要按照一个严格的时序来执行:先写设备地址,再写寄存器地址,最后写入寄存器的参数,即可完成一个寄存器的配置,如图2-7所示。

图片[11]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug图2-7 SCCB总线数据传输图

Phase 1:CMOS传感器的唯一ID地址。豪威(OmniVision)相机的设备地址是0x42,最后1bit是用来判断读/写的:写数据时ID地址是0x42,而读数据时ID地址是0x43;

Phase 2:传感器里面有许多的寄存器,这些寄存器都有着自己唯一的地址,这里我们只关心Sub-address;

Phase 3:在Phase中发送完寄存器的地址之后,该阶段发送的数据就是寄存器的配置数据。

由官网手册可以知道这里面的X代表低电平,也就是逻辑“0”。

(2)SCCB总线寄存器的读数据时序

SCCB总线从寄存器往外读数据的时候,也需要遵循一个严格的顺序:先写设备地址,再写寄存器地址,然后再写入一次设备地址,最后读出数据。读数据的时序如图2-8所示。

图片[12]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug图2-8 SCCB读数据时序

Phase 1:CMOS传感器的唯一ID地址。豪威(OmniVision)相机的设备地址是0x42,最后1bit是用来判断读/写的,即写数据时ID地址是0x42;

Phase 2:传感器里面有许多的寄存器,这些寄存器都有着自己唯一的地址,这里我们只关心Sub-address;

Phase 3:CMOS 传感器的唯一ID地址。豪威(OmniVision)相机的设备地址是0x42,最后1bit是用来判断读/写的,即读数据时ID地址是0x43;

Phase 4:读取传感器发送的指定的寄存器的值。

由官网手册可以知道这里面的X代表低电平,也就是逻辑“0”,NA表示高电平,也就是逻辑“1”。

2.1.3 基于FPGA驱动摄像头接口

理解了SCCB总线的时序,我们就可以按照相应的时序编写控制代码,如图2-9所示为工程RTL级视图中的sccb_config_ctrl模块,其功能是实现摄像头接口的驱动,该模块代码及说明见附录。

图片[13]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-9 工程RTL级视图中的sccb_config_ctrl模块

图片[14]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

2.2 图像信息的实时捕获等相关内容

通过摄像头的采集,我们得到了视频数据流,但是我们所要处理的是单帧的图像数据,因此需要实时捕获数据流中的图像数据,为后续的图像处理做准备。如图2-10所示为工程RTL级视图中的coms_capture_rgb565模块,其功能是实现图像信息的实时捕获,该模块代码及说明见附录。

图片[15]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2-10 工程RTL级视图中的coms_capture_rgb565模块


三、FPGA实现图像的边缘检测

3.1 图像数据预处理

为了实现图像的边缘检测,需要对捕获到的图像数据进行预处理操作:后续算法适用于灰度图像,因此首先需要将捕获到的彩色图像转换为保留有亮度信息的灰度图像;实时采集到的图像数据往往都会伴随着噪声,为了使图像处理的结果更加准确,我还采用了中值滤波算法对得到的灰度图像进行有效去噪。

3.1.1 彩色图像数据转灰度图像

本系统所采用的算法全部适用于8位灰度图像,因此在边缘检测和中值滤波之前需要将彩色图像转换成适于研究的8位灰度图像,将图像中的每个像素用下列公式(3-1)计算其灰度值,公式如下:

图片[16]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug(3-1)

式中r、g、b分别为该像素对应的R、G、B颜色分量,然后用求得的灰度值代替原来该像素的R、G、B分量就行了。如图3-1所示,我在本系统设计中按照上述思路实现了从彩色图像往灰度文件的转换。

图片[17]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-1 彩色图像转灰度文件对应的RTL级视图

3.1.2 中值滤波

在图像处理中,为了保护边缘信息和平滑噪声,中值滤波被广泛应用。本系统设计的目的是对实时采集到的图像进行边缘检测,因此边缘信息检测的准确度在很大程度上决定了整个系统设计的性能,为了提高我所设计系统的性能,我采用了中值滤波。中值滤波是一种非线性信号处理技术,基于排序统计理论,可以有效抑制噪声,其基本原理是将数字图像或者数字序列中一点的值用该点所在邻域中各点值的中值代替,让周围的像素值尽可能的接近其真实值,从而能够有效地消除孤立的噪声点。分两步实现:1.采样取出奇数个数据进行排序;2.用排序后的中值代替所要处理的数据。

本设计选择3*3的窗口模板,调用FIFO来对图像数据进行缓存,然后并行输出3行数据,在进行数值比较之后顺序输出中值结果,有效提高了系统的处理速度。

图片[18]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-2 中值滤波模块框图

如图3-2所示为该系统中值滤波模块的框图,调用四个子模块:shift_temp模块、compara_fifo模块、zhongzhilvbo模块和midnum_mem模块。其中,shift_temp模块、compara_fifo模块和midnum_mem模块均为调用的IP核,其模块架构如图3-2所示。

图片[19]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-3 中值滤波模块架构图

 

shift_temp模块调用的IP核是一个移位寄存器,在写请求信号wrreq的控制下,将输入的8bit图像灰度信息移位寄存到24bit寄存器中并实时传送,接着在compara_fifo模块和midnum_mem模块中分别调用了一个FIFO,所谓FIFO就是先入先出存储器,这里用作数据缓存,有效地保证了中值滤波过程中所处理信息的流畅性和可靠性。中值滤波模块的核心运算在zhongzhilvbo模块中得以实现,该模块框图如图3-4所示。

图片[20]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-4 zhongzhilvbo模块框图

中值滤波及其子模块代码及说明见附录,编写测试文件仿真运行即可得到如图3-2所示的仿真波形。

图片[21]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-5 中值滤波模块的仿真波形

 

3.2 边缘检测

一幅图像中灰度变化比较剧烈的区域一般就是图像边缘,图像的边缘信息可以通过计算灰度图像中各区域的梯度幅值来判断。令图像的亮度为f(x,y),则其灰度可以用以下公式来定义:

     图片[22]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug(3-1)

幅值为:           

图片[23]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug(3-2)

方向为:                     

图片[24]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug(3-3)

比较常用的边缘检测算子有Prewitt 边缘检测算子、Roberts 边缘检测算子、Laplacian 边缘检测算子、Sobel 边缘检测算子等。经典Sobel边缘检测算法便是基于梯度的检测,利用垂直梯度和水平梯度2个方向模板和图像进行邻域卷积完成。其中,垂直梯度方向模板和水平梯度方向模板分别用于检测水平边缘和垂直检测。其利用Sobel算子在3*3的图像邻域内和亮度数据作卷积运算,表达式如下:

 

图片[25]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug(3-4)

图片[26]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug(3-5)

我选用如图3-6所示的数据源,并分别采用上述几种算子实施检测,其算子和检测得到的结果分别如图3-7、图3-8、图3-9和图3-10所示。对比上述四幅检测结果图,我最终选用Sobel算子作为我的边缘检测算法。

图片[27]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-6 边缘检测数据

图片[28]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-7 Prewitt算子及边缘检测结果图

图片[29]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-8 Roberts算子及其边缘检测结果

图片[30]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3-9 Laplacian算子及其边缘检测结果

图片[31]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug 

图3-10 Sobel算子及其边缘检测结果

四、FPGA驱动VGA接口实现图像边缘的实时显示

4.1 图像数据的缓存

实现了图像数据的边缘检测,接着就需要将其实时显示,该系统设计最终基于VGA实现这一功能。这一功能说起来简单,实现起来却并不容易,由于Ov7725输出数据的时钟和VGA输入的时钟不同,导致无法将检测到的数据直接对接到VGA接口并输出。其解决方案是在VGA实时显示之前将检测到的图像数据先缓存起来,这里选用SDRAM作为图像数据的缓存器,从而解决了这一难题。

SDRAM(Synchronous Dynamic Random Access Memory)即同步动态随机存储器。同步是指其时钟频率与CPU前端总线的时钟频率相同;动态是指SDRAM位电容阵列,需要定期不断的充放电来保证数据不丢失;随机是指不是线性一次存储数据,而是可以进行随机地址的读写操作。该系统设计选用了海力士公司生产的HY57V641620ETP-7,其存储大小约为4Banks x 1Mbits x 16 = 64Mbits,最高频率可达143Mhz,在实际设计中选定SDRAM的驱动频率为100Mhz。

4.1.1 SDRAM的工作原理

SDRAM存储器框图如图4-1所示,其主要功能是实现数据的高速读写操作,内部模块包括逻辑控制单元、地址寄存器和数据寄存器。在众多的SDRAM控制器中,厂家往往会指定相关操作对应的命令,因此在SDRAM内部还有一个命令解码器。SDRAM的上电刷新、读数据和写数据、预充电、刷新等操作实际上就是对每一个命令的操作,SDRAM的基本操作命令如图4-2所示。

图片[32]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-1 SDRAM存储器框图

图片[33]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-2 SDRAM控制命令表

4.1.2 SDRAM的上电刷新

1)SDRAM初始化流程

在正式使用SDRAM之前,有一个非常关键的步骤——SDRAM的初始化,其主要功能是稳定电路和完成SDRAM的配置,从而保证SDRAM能够按照我们预期的工作模式来工作。SDRAM初始化的流程,如图4-3所示。

图片[34]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-3 SDRAM初始化流程图

SDRAM初始化必须按照流程严格执行,否则就会导致SDRAM在读、写数据出现问题。例如初始化流程中100us的等待时间必须给足,不然就会导致整个上电刷新模块出现问题。SDRAM的Logicla Bank是电容结构,电容容易掉电使数据丢失,所以应该定时给SDRAM充电,手册中表示至少每64ms要对所有BANK进行一次刷新,确保数据正确。该系统设计所用SDRAM的刷新周期是 64ms/4096 = 15.625us。模式寄存器配置完成之后,输出一个标志信号作为外部模块读写SDRAM的握手信号,从而保证图像数据的正确读写。

2)模式寄存器设置

在进行SDRAM初始化的时候,必须对模式寄存器(Mode Register,MR)进行配置,模式寄存器的主要功能是配置SDRAM的读/写数据的突发长度(Burst Length)、突发类型(Burst Type)、潜伏期(CAS Latency)、写突发模式(Write Mode)等设置。如果模式寄存器没有设置好,那么SDRAM 就不会按照预先的模式工作;上电初期对模式寄存器所进行的设置,其信息将会持续保持直到下一次编程或者掉电为止,模式寄存器的地址总线及其意义如图4-4所示。

图片[35]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-4 SDRAM模式寄存器设置命令表

现对如图4-4所示表格中的相关信息做一下说明:

⑴A2A1A0所控制的是突发长度,SDRAM进行数据读写时以此为单位,突发长度有1、2、4、8、全页突发(full page)。全页突发是指每一个bank里面的一行中所有的数据,其大小取决于SDRAM的列数,本系统设计所选用的是64Mbits的SDRAM,其列数只有256个存储单位,这就意味着我们一页最多可读写256个数据。

⑵A3控制的是突发类型,分为连续发送和交替发送两种,面对大数据的传输时我们一般选择连续发送,这样能够保证相对较高的速度,本系统设计选择连续发送数据。

⑶A6A5A4控制的是读写数据的潜伏期,潜伏期有1、2、3拍三种;潜伏期越大,系统的运行速度就越高,本系统设计选择3拍潜伏期。

⑷其余地址可以忽略。

4.1.3 SDRAM读写数据

SDRAM读写数据的方式有多种,可以根据需求读取指定地址中的数据,也可以连续读写最多256个数据。本系统设计中,所要缓存的图像数据量比较大,因此选用突发读写整页数据的方式来实现,从而有效提高数据传输的带宽。

图片[36]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-5 SDRAM读数据时序

如图4-5所示为SDRAM读数据的时序图:在上电刷新时,需要在模式寄存器内设置好突发长度和潜伏期,上图中的潜伏期CL = 2,突发长度是4;分析上图不难发现,自发出第一次读命令后,读数据操作便会自动运行。

如果不想突发中断数据的读取,实现数据的连续读取,只需控制好两次发送读命令的间隔周期即可。在本系统设计中,需要处理的是边缘检测以后的视频流数据,因此设置为连续的突发读写模式,同时选择全页读写的方式进行数据的操作,从而达到更大的带宽、更高的效率,以实现更快的速度。这样做的前提是在每次SDRAM读数据或者写数据时,都必须要为其准备好至少256个数据缓冲器,以保证数据可以连续的读写,因此需要调用FIFO作为SDRAM的缓冲器。

4.1.4 图像数据缓存的FPGA实现

基于是上述分析,我们就可以基于FPGA编写SDRAM的控制器代码,同时必须要调用两个FIFO分别用作SDRAM的读数据和写数据缓冲器,如图4-6即为工程编译成功以后图像数据缓存模块所对应的RTL级视图。

图片[37]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-6 图像数据缓存模块所对应的RTL级视图

 

4.2 图像数据的实时显示

VGA(Video Graphics Array,视频图形阵列)是一种电脑显示标准,对于现如今的个人电脑市场来说,这个标准已十分过时。然而,VGA却是众多显示设备制造商所共同支持的一个低标准,因此具有一定的通用性。因此,本系统设计就选择VGA作为图像缓存数据到显示器的桥梁,将边缘检测后的视频图像数据实时显示到相关的显示设备上。如图4-7所示,VGA接口与串口的硬件结构相类似,分为公头与母头(PC接口为母头)。

图片[38]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-7 VGA接口示意图

VGA接口使用15针的D型接口,拥有15根信号线,分成三组,每组5根信号线。接口编号顺序为:公头从左到右,依次递增;母头从右到左,一次递减,两者相互对应,各引脚功能描述见表4-1。

表4-1 VGA接口各引脚功能描述

图片[39]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

4.2.1 VGA时序分析

广义的VGA为VGA显示器,狭义的VGA为VGA分辨率的时序。由IBM推出的采用RGB模拟信号的VGA视频标准,定义了具有60Hz刷新频率、可产生16万种色彩的640*480像素格式。VGA显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是从屏幕左上角第一个点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一线,扫完一屏后再返回来扫描剩下的线,隔行扫描的显示器闪烁快速,可能会使使用者眼睛疲劳(本实验采用逐行扫描的方式)。扫描原理清楚以后,紧接着再来看看VGA的行、列同步时序。

1)VGA行列时序

VGA列同步时序如图4-8所示:

图片[40]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-8 VGA列同步时序图

VGA行同步时序如图4-9所示:

图片[41]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-9 VGA行同步时序图

VGA 中定义行时序和列时序都需要同步脉冲(a 段)、显示后沿(b 段)、显示时序段(c 段)和显示前沿(d 段)四部分。VGA 工业标准显示模式要求:行同步、列同步都为负极性,即同步脉冲要求是负脉冲。

由 VGA 行时序可知:每一行都有一个负极性行同步脉冲(a 段),是数据行的结束标志,同时也是下一行的开始标志。在同步脉冲之后为显示后沿(b段),在显示时序段(c 段)为显示器亮的过程,RGB 数据驱动一行上的每一个像素点,从而显示一行。在一行的最后为显示前沿(d 段)。在显示时间段之外没有图像投射到屏幕,而是插入消隐信号。同步脉冲、显示后沿和显示前沿都是在行消隐间隔内,当消隐有效时,RGB 信号无效,屏幕不显示数据。

2)VGA显示标准

“分辨率”是衡量物体精确程度的一个参数,对于显示器而言,分辨率越高,意味着显示图像的清晰度越高,包含跟过的信息,具有更多细节的画质,图像更加保真细致。由于人眼的视觉暂留特性,想要实现CRT显示器画面不闪烁,至少需要实现每秒至少25帧的画面更新。而显示器为了保证画面流畅,视觉效果更佳,通常一般的扫描帧速在每秒60帧以上。不同像素的行/列扫描刷新时序见表4-2。

表4-2 VGA标准显示表

图片[42]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

以本设计的显示标准 640*480*60Hz 为例。(640 为列数,480 为行数,60Hz为刷新一屏的频率),时钟频率大约是 25.175Mhz。列时序:屏幕对应的行数为800(a+b+c+d=e 段),其中 640(c 段)为显示行;每行均有行同步信号(a 段),为96个行周期的低电平。行时序:每个显示行包括525列(a+b+c+d=e段),其中480(c段)为有效显示区,每列均有列同步信号(a段),为2个列周期的低电平。

3)VGA驱动电路设计

由于FPGA输出的是3.3V电平,而VGA要求0~0.714V的模拟信号,为了设计VGA的标准接口,完成电平的转换,需要设计DAC数模转换电路,来实现0~0.714V模拟视频信号的传输,针对RGB的分辨率高低,可以采用不同的数模实现方案,在VGA驱动电路设计中,我们最需要关心的几组信号见表4-3。

表4-3 VGA驱动电路信号表

图片[43]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

HSYNC与VSYNC为3.3V数字信号,再设计中无须考虑电平转换,可以直接接与FPGA互联。而RGB为0~0.714V模拟信号,这是需要我们转换处理的部分,本设计采用专用的视频转换DAC芯片,其稳定的ASIC保证了视频传输的质量,具有很好的性价比。采用Analog Devices的视频转换芯片ADV7123,其参数如下:

⑴最大采样率是330Mhz;

⑵3路10位视频DAC转换器;

⑶兼容TTL电平输入;

⑷5V/3.3V单电源工作;

⑸输出电流达到2~26mA;

⑹低功耗。

ADV7123具体的硬件电路图如图4-10所示。

图片[44]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-10 ADV7123电路结构图

4.2.2 VGA接口的FPGA驱动

分析了VGA接口的时序,我们就可以按照时序基于FPGA编写相应的VGA驱动代码,如图4-11所示即为系统工程成功编译以后VGA驱动模块对应的RTL级视图。

图片[45]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4-11 VGA驱动模块对应的RTL级视图


五、系统验证

在本系统设计过程中,我以自顶向下的层次化设计思想为主进行系统的顶层架构设计,明确各模块的功能以及各模块之间的握手关系,之后分模块编写代码并加以验证,调试代码使得各模块功能得以实现,最后基于顶层模块进行仿真验证,如图5-1和5-2为系统顶层模块的仿真波形,其中图5-1为全局波形,图5-2为局部放大的波形。

图片[46]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5-1 系统顶层模块的全局仿真波形
 

图片[47]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug 图5-2 系统顶层模块的局部仿真波形

随后连接FPGA开发实验板并更新其驱动程序,按照开发板的配置文件分配引脚,全编译通过后下板进行板级测试。本系统验证时所采用的开发板是实体FPGA开发板。

实体FPGA开发板采用的是Altera Cyclone IV代系列的EP4CE10E22C8N芯片。该开发板是一款FPGA图像开发板,其核心芯片EP4CE10E22C8N拥有6272个逻辑单元和150个IO引脚,开发板上配置有VGA、USB、CMOS接口、SDRAM、按键、LED等很多种外部设备,可以作为本系统设计验证的硬件工具。

实体FPGA开发板的主要参数如下表6-1所示。

表5-1 FPGA开发板的主要参数

图片[48]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

下板结果表明我所设计的数字图像边缘检测系统的功能已经实现,能够实时采集图像、实时处理并实时显示,这里截取的是图片,现实场景显示可以根据摄像头的移动实时显示。

图片[49]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图片[50]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图片[51]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

六、结论

图片[52]-基于FPGA的实时图像边缘检测系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

本系统设计中,我基于FPGA驱动的主要设备如下:型号为Ov7725的摄像头;具有通用性的VGA接口。同时,我研究了相关的边缘检测算法,为了数据处理结果更加准确,我还根据系统需要进行了图像数据的预处理操作:先将彩色图像转换成为灰度文件;接着采用中值滤波技术对采集到的图像数据进行了有效去噪。通过本系统的设计,我深刻理解了基于FPGA驱动外部设备的基本原理,掌握了基于FPGA、运用Verilog语言驱动外部设备和实现算法的能力,感受到了FPGA的先进,也进一步确定了自己的发展方向。在进行系统验证时,基于FPGA开发板实现了图像数据的实时采集、实时边缘检测和实时显示,系统性能良好,实时性能较高,结果证明FPGA能够轻松实现海量数据的高速传输。

附:部分主要代码

图像实时采集模块的主要代码:

图像实时捕获模块的主要代码:

中值滤波模块的主要代码:

图像缓存模块的主要代码:

图像实时显示模块的主要代码

 

请登录后发表评论