基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

基于FPGA的单目内窥镜定位系统设计(附代码)

该帖子部分内容已隐藏
付费阅读
已售 1
3积分
此内容为付费阅读,请付费后查看

导读

随着现科技的发展和社会的进步,信息科技迅速发展,我们可从互联网、电台等媒体获取大量信息。现代信息的存储、处理和传输变得越来越数字化。在人们的日常生活中,常用的计算机、电视、音响系统、视频记录设备、远程通讯电子设备无一不采用电子系统、数字电路系统。因此,数字技术的应用越来越广泛。尤其在通信系统和视频系统中,数字系统尤为突出。而随着FPGA的出世,数字系统更加受到人们青睐,它为数字系统的设计提供更加便捷的通道,使得数字系统设计可以芯片小型化,电路规模大型化,庞大的逻辑资源,可满足各种数字系统设计。

随着社会的发展,科学技术已经应用于各个领域,尤其是医疗领域尤为突出。而在医疗领域中,心脏电信号模拟器手术辅助仪器发展迅速。为了训练经验少的医生熟悉心脏手术的操作过程,而专门开发心脏信号模拟仪器,让医生迅速掌握心脏手术操作过程,成为一个经验丰富心脏手术医生。

因此,本文将于FPGA平台,以图像处理结合信号采集原理,实现医生在做心脏模拟手术操作导管的过程中,不需要观察心脏内部情况,即可获取导管头在心脏内部信息的功能,采用内窥镜摄像头采集视频和并对导管头进行跟踪定位,信号采集技术可将采集到的导管头在心脏内部触碰区域的信号采集出来送到专业医用仪器,进行心脏3D建模。

本设计的实现对医院培养的经验少的医生尽快掌握心脏手术操作流程很有价值,未来将可以培养更多从事心脏手术工作的医学专业毕业的学生或刚刚从事这个行业的社会医生。

一、绪论

1.1 国际医疗器械发展趋势和现状概述

在医疗器械领域,有助于医疗器械的发展,恢复心脏的功能。它也是最富有成果的领域之一。心血管疾病的治疗手段是医疗器械行业中最重要的产品,无论是在治疗效果方面还是其带动的利益方面,都是一样。心脏辅助装置,无论是在体内还是在体外,电子亦或机械,都变得越来越小,更容易植入。这些设备延长了患者的生命,心血管疾病。在医疗领域中,心脏电生理领域发展迅速。

心脏电生理领域,是以作用于生物体的电作用和生物体所发生的电现象为主要对象的生理学的一个分支领域。因为把随着神经等器官、组织的兴奋所产生的动作电位作为其活动指标是最容易记录的现象,所以常常用记录动作电位来深入研究神经系统等的机能。近代电生理学的发展多借助于细胞内电极和电子管、晶体管等放大技术的发展。由于熟练外科医生的数量较少,当前心脏病患者有机会得到手术治疗的几率只有6%,其中很大一部分患者在等待的过程中贻误时机而去世,绝大部分患者则在高危中带病生存。为解除病患的疾苦,在短时间内培养足量的外科手术医生就显得尤为重要。而当前紧张的医患关系,加之心脏手术自身的复杂性与危险性,使得实习医生通过在真实病患身上做手术从而获得经验的代价太过高昂,从而客观上使得他们成为熟练外科医生的经验积累期非常漫长,这与实际的需求明显相悖。因此着重于发展心脏电生理领域等医疗辅助手段。而这种医疗设备发展离不开图像处理技术。

1.2 FPGA发展现状

FPGA也叫做现场可编程门阵列,目前在通讯领域中发展迅速,各种通讯算法使用FPGA加速,可节约成本和资源,提高通讯质量和稳定性。随着信息科技的发展发展,嵌入式系统设计技术已成为当今信息产业非常流行的技术、应用市场在航空航天、医疗、通信、网络通信、安全、广播、汽车电子、工业、消费市场、测试和测量等领域。随着技术的进步和发展,向越来越多的应用领域扩展。越来越多的设计已经开始从ASIC转向FPGA,FPGA在以各种电子产品的形式进入了我们日常生活中。

1.3 FPGA在医疗领域中的应用

图像处理应用于各大领域中,尤其是在医疗仪器领域中尤为重要,在医疗领域中的对心电图的处理,内窥镜采集图形处理,随着电子科技的迅速的发展,FPGA逐渐在图像处理领域发挥着越来越重要的作用,其并行处理机制加快算法的实时处理,各种算法的实现基本上是流水算法,更加快了整个系统的实时处理速度,实时帧速保证在每秒25帧以上,甚至可达到每秒60帧左右的帧速。另外,FPGA不仅可以应用于图像处理,在通信领域也很强大,早期,FPGA最先应用于通信领域,基带编码、调制解调等算法实现,随着FPGA的进一步发展,逐渐应用于图像领域,医疗仪器的发展离不开图像技术和通信技术。因此,FPGA将在医疗领域将发挥着越来越重要的作用。

本设计是对心脏手术模拟器所用的导管头进行定位,旨在抓取导管头的坐标并显示供医生观察,方便医生观察心脏手术内部的情况,还有导管头所处的位置信息。而且在此基础上可扩展为多目摄像头,根据采集到的位置信息自动切换场景,定位导管头的空间坐标。

二、FPGA相关介绍

2.1 FPGA工作原理

基于FPGA特殊的电路结构,FPGA能实现电路可编程主要体现在以下三个方面:

a. 可编程逻辑块

b. 可编程IO

c. 可编程布局布线

其基本结构由某种存储器(SRAM、 FLASH等)制成的4输入或6输入1输出的“真值表”加上一个D触发器构成。任何一个4输入1输出组合逻辑电路,都有一张对应的“真值表”,同样的如果用这么一个存储器制成的4输入1输出的“真值表”,只需要修改其“真值表”内部值就可以等效出任意4输入1输出的组合逻辑。这些“真值表”内部值是什么?就是那些01编码而已。如果要实现时序逻辑电路怎么办?这不有D触发器嘛,任何的时序逻辑都可以转换为组合逻辑+D触发器来完成。但这毕竟只实现了4输入1输出的逻辑电路而已,通常逻辑电路的规模那是相当的大哦。那怎么办呢?这个时候就需要用到可编程连线了。在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。最后就是可编程的IO,这其实是FPGA作为芯片级使用必须要注意的。任何芯片都必然有输入引脚和输出引脚。有可编程的IO可以任意的定义某个非专用引脚(FPGA中有专门的非用户可使用的测试、下载用引脚)为输入还是输出,还可以对IO的电平标准进行设置。

2.2 FPGA设计流程

下面将介绍一些常用的FPGA开发工具、仿真工具以及综合工具。

a. 设计输入工具

目前设计输入工具有原理图输入、硬件描述语言输入、IP核输入等,其中原理图输入比较直观,但是不够灵活,不适合大型系统设计,因此硬件描述语言输入弥补了这一缺点。

b. 综合工具

目前有三种主流的综合工具,分别是Synopsys公司的Synplify/Synplify Pro、Leonardo Spectrum以及Xilinx自身的XST等。当然,Altera公司的Quartus II中拥有自带的综合工具。

Synplify/Synplify Pro由于其先进的时序驱动和行为最好算法引擎,具有占地面积小、合成速度快,大型集成工具的优点,使其得到了广泛使用。逻辑的合成主要是将硬件描述语言转换为电路且优化。

c. 仿真工具

目前最为人所熟悉和使用的仿真工具是ModelSim。仿真速度快、仿真精度高是ModelSim的主要特点。此外,还有一些颇具影响力的仿真工具,例如Cadence Verilog-XL和Synopsys VCS。ActiveHDL也是一款很有特色的仿真工具,它可以利用状态机分析视图进行状态机调试。

d. 布局布线工具

实现工具综合后的开发环境主要是ISE、Quartus II自己的映射和布局布线。

一般会有静态时序分析,主要报告关键路径和最大时钟频率。配置下载主要是基于不同的工具来生成一个流文件,并下载到FPGA中。

关于FPGA的设计流程主要有以下几个方面分别是功能定义/设备选型、设计输入、功能仿真、综合优化、综合后仿真、实现、布局布线后仿真、板级仿真和芯片的编程与调试步骤,如图2.1所示。

图片[1]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图2.1 FPGA设计基本流程图

三、系统设计

3.1 设计任务

本文设计是在摄像头的视觉中,可抓取到运动物体的位置,根据医学设备导管的特点,导管整根导管从显示屏边缘进入到摄像头视觉中,不论从那个方向进入,本文旨在抓取导管头端的位置,其他部分不需要。本设计基于FPGA实现,逻辑宏单元不能高于80%。

3.2 方案论证

备选方案:

方案一:基于颜色的摄像头定位系统设计

方案二:基于帧差法的摄像头定位系统设计

方案三:基于背景差法的摄像头定位系统设计

论证方案:

方案一:基于颜色抓取导管头,是抓取特定的颜色分量或者是某个范围内的颜色空间来分割前景和背景,此方法需要在导管头上涂上特定的颜色,摄像头通过识别颜色来获取导管头的位置,此方案需要外部处理导管头,而且对背景要求比较高,故而舍去此方案。

方案二:帧间差分法是一系列连续的图像中,相邻的两帧图像做差分来确定目标轮廓的算法。对于目标处于复杂背景下也可很好的提取出目标轮廓的一种算法。具体做法是当视频场景中出现动态物体时,相邻两帧图像相减,然后去相减结果的绝对值,最后在二值化处理,即可得到运动图像的轮廓。如果场景中没有运动的物体处理结果中没有任何目标轮廓。这种方法类似于高通滤波器,高频动态部分突显,低频抑制,获取目标轮廓。但是也是由于这种方法对高频噪声比较敏感,所以在处理之前一般要去噪声处理。

帧间差分法的优点是由于帧间差分法是针对于运动物体变化来获取轮廓的,所以光线,背景等环境对这种算法的影响不大,处理结果比较稳定。缺点是由于帧间差分法是每隔一段时间将相邻两帧的结果帧差,两帧之间的时间的选择对结果的影响较大,在不同的应用场合中选择不同时间间隔,如果时间间隔较小而运动物体比较快,会导致形成两个目标物体,因为两个目标没有重复的部分。如果时间间隔较大而运动物体较慢,会导致检测不到目标物体,因为相邻两帧图像几乎没有重叠。

基于帧差法抓取导管头,通过导管头的动态变化来获取导管头的位置,此方案无需对导管头进行处理,而且对背景复杂度要求较低。然而,获取的目标二值图像主要体现边缘,中间空缺,需要做帧缓冲,在基于FPGA实现上,实现难度也略大。

方案三:背景差分法是非常经典且实用简单的算法,原理非常简单,就是处理带有目标的图像之前,预先存储一张未带有目标的图像,即背景图像,将其存储起来,等到实时处理时,将实时图像与背景图像相减,即可得到目标图像的轮廓。但是这种方法有一个致命的缺点,即当背景发生变化时,实时图像与背景图像相减的结果就不一定是目标轮廓了,因此这种算法会受到背景环境变化的影响,导致误判目标。要解决环境变化的影响,需要对背景的存储实时更新,即要实现背景更新算法,背景更新算法有很多,而且需要做多帧图像的缓冲,常用的背景更新算法有均值法、中值法、卡尔曼滤波法、高斯滤波法等。

基于背景差法抓取导管头,通过抓取的实时图像减去背景图像从而获得目标图像导管头的位置,此方案也不需要外部处理导管头,而且对背景复杂度要求较低,获取的目标二值图像饱和。然而,由于环境的可变性,导致结果定位不准确。因此,需要对背景图像实时更新。此方法的最大的难点就是在基于FPGA硬件算法上,背景更新算法实现难度比较大,背景更新算法的不同效果也有差异,根据实现的环境和难度,均值法、中值法、卡尔曼滤波法等算法相对适合FPGA实现。

根据上述方案的论证,总结出表一方案特点。

表3.1 方案特点

图片[2]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

论证结果:综合上述三种方案的论证,结合方案在本设计实现特点和难易度,选择方案二来实现本次设计。

3.3 关键问题

1. 图像帧缓冲问题;

2. 图像预处理;

3. 帧差处理问题;

4. 乒乓操作问题;

5. 格式转换问题;

6. 二值图像投影问题;

7. 判断正确的目标坐标问题。

3.4 解决关键问题的方法

图像帧缓冲:关于本方案的设计,图像的帧缓冲是技术重点也是技术难点,本方案需要至少三个端口同时访问sdram,第一个是camera写入到sdram 不同两个的存储区,第二个和第三个是将两个存储区的数据同时输出,所以为了达到这一点要求需要做sdram双缓冲,sdram写一端接了两个fifo,读一端接了两个fifo,这样就可以满足上面的方案需求。

图像预处理:图像预处理是通过形态学算法处理的,有腐蚀算法和膨胀算法,其中腐蚀算法可去除孤立噪点,而膨胀算法可扩充目标像素点数。

帧差处理:帧差就是两帧图像相减得到的值,到底是前一帧减去后一帧还是后一帧减去前一帧,理论上来说都可以,这本项目中,我使用两帧相减的绝对值来输出,所以,不管是谁减谁都无所谓了。

乒乓操作:乒乓操作问题是很多通信、图像项目中都会用到的技术手法,原理就是写操作是当采集到的第一帧图像来到时,将这帧图像存储到第一个缓冲区中,当第二帧图像来到时,将这帧图像存储到第二个缓冲区中;当第三帧图像来到时,将这帧图像存储到第一个缓冲区中,当第四帧图像来到时,将这帧图像存储到第二个缓冲区中,…,以此类推;读操作同理。关于缓冲区的切换是一个易错的问题,如果使用采集模块或输出模块的完成信号来切换缓冲区,会造成数据堆积在fifo中被复位信号清除,导致部分数据丢失。所以我采用sdram内部发出完成信号来作为乒乓操作缓冲区的切换信号。

格式转换:在格式转换中,需要把YUV422转成YUV444,再把YUV444转成RGB888,最后把RGB888转成RGB565,其中YUV444转成RGB888采用查找表的方式。

二值图像投影:二值图像投影分为水平方向投影和垂直方向投影,水平方向投影就是把x轴方向各个地址对应的数据加在一块,垂直方向投影就是把y轴方向各个地址对应的数据加在一块。最终存储起来就得到二值图像的投影。

判断正确的目标坐标:投影的结果可以算出四条边界线,可确定目标所在区域范围。通过边界线可得到具体的端点坐标,示意图如图3.1所示。示意图图3.2为图3.1可放大区的放大图像,通过横轴的边界线可以获取到端点5和端点6,然后计算出他们的中心端点7,接着用右边界线减去端点7的纵坐标得到的结果和用端点7的纵坐标减去左边界线的结果相比较,可确定导管头摆放的方向,然后判断处在边界上的点为非目标点,未处在边界上的点为目标点,最后将目标点输出,即为导管头端坐标。

图片[3]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3.1 二值投影示意图
 

图片[4]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3.2二值投影放大示意图
 

3.5 总体设计

系统设计旨在完成导管头在视频中的二维坐标定位,按照模块分类可分为以下几大模块,采集模块、缓冲模块、处理模块、解码模块、显示模块等几大模块组成具体如图3.3所示。

图片[5]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3.3系统整体框图

3.5.1 电源模块

FPGA系统因为有着低功耗和高性能等特点,其设计应用于各大领域中。而其系统级的供电问题对于电源的有效管理也是非常重要的。

在本系统中,各路模块需要供电电压,如VCC(5V)、3.3V、2.8V、2.5V、1.2V,这些电压将采用AMS1117芯片产生。AMS1117是一个正向低压降稳压器,AMS1117有两种:一种为固定输出电压,输出电压值有:1.2V、1.5V、1.8V、2.5V、2.8V、3.0V、3.3V;另一种为可调输出电压。对于AMS1117厂家做了保护系统,防止过热和过流。接一个22uF的电容,使AMS1117更加稳定。

3.5.2 采集模块

本设计将采用摄像头传感器来作为采集模块,摄像头主要分为数字摄像头和模拟摄像头,也就是市场经常用到的CMOS和CCD摄像头。模拟摄像头也就三根线,RGB,通过AD转换为数字信号,终端接受信号,解码,便能得到视频图像。所有CCD芯片都属于模拟的设备。当图像进入计算机是数字的。如果信号在摄像头、采集卡两部分完成数字化的,这个是模拟摄像头。数字摄像头事实上是由内置于摄像头的数字化设备完成数字化过程,这样可以减少图像噪音。数字摄像头比模拟摄像头信噪比更高,而且更增加摄像头的动态区间、最大化图像灰度区间。

基于开发难度我选择使用OV7670 CMOS摄像头,如图3.4所示,在接口方面大致相同,主要有以下这些:

1) 都有配置寄存器来设置传感器功能参数,其使用SCCB总线和IIC总线协议;

2) 都有XCLK,PCLK,FRAME_VALID,LINE_VALID,DOUT[7..0]信号,主要是Sensor驱动时钟的输入以及采样时钟,帧有效信号,行有效信号,图像数据的输出。为了兼容,摄像头的输出都设置了8位,PCLK是像素时钟的2倍。

3) 另外还有STROBE,STABDBY,或者PWDN,闪灯,以及Sensor的开关,等功能,不同的摄像头可能功能有所不同。

图片[6]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3.4 OV7670摄像头

 

3.5.3 缓冲模块

SDRAM芯片设计具有价格低廉,缓冲速度快等特点,因此作为本设计首先存储器芯片,Synchronous Dynamic Random Access Memory,同步动态随机存储器,同步是指 Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。

本设计选用hynix公司生产的型号为H57V2562GTR 256M (16Mx16bit) Hynix SDRAM Memory 可稳定运行到200MHz时钟,4个bank,13位地址宽度,数据宽度为16位,可存储YCbCr(4:2:2)数据流,工作在视频采集环境下,可设置为页写突发,配合突发中断,构成任意突发长度读写,增加缓冲速度,应用于视频实时处理。

3.5.4 显示模块

本设计选择使用VGA接口作为显示设备如图3.5所示,其通用性比较高,目前各种计算机设备均使用这种接口,VGA是社会上一种比较通用视频传输标准,其分辨率很高、输出频率迅速、色彩丰富多样等诸多好处,在市场上大量应用。不支持热插拔,不支持音频传输。

图片[7]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图3.5 VGA实物图

四、硬件设计

硬件设计包括有电源电路、FPGA外围电路、采集电路、缓冲电路和显示电路。

4.1 电源电路

电路设计:使用接口连接电源并且附带串口输出,电源输出需要VCC(5V)、3.3V、2.8V、2.5V、1.2V。其中某些外设需要VCC、和3.3V供电,而3.3V、2.8V、2.5V、1.2V是FPGA芯片和其外围电路的供电以及摄像头电路和SDRAM电路。

设计如图4.1所示。

图片[8]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.1 电源电路原理图

4.2 FPGA外围电路

芯片选型:本设计电路使用Altera公司的clcone  IV系列的EP4CE6F17C8型芯片。

电路设计:FPGA外围电路包括JTAG电路,EPCS电路和晶振电路等主要的电路。电路图如下,图4.2 JTAG电路,图4.3 EPCS电路,图4.4 晶振电路。

图片[9]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.2 JTAG电路原理图

图片[10]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.3 EPCS电路原理图

图片[11]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.4 晶振电路原理图

 

4.3 采集电路

电路设计:采集电路设计在设计时,将cmos_sclk和cmos_sdat上拉4.7k电阻即可,类似于I2C总线。设计如图4.5所示。

图片[12]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.5 摄像头采集电路原理图

4.4 缓冲电路

电路设计:按照官方设计存储器外围电路如图4.6所示。

图片[13]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.6 SDRAM电路原理图

 

4.5 显示电路

电路设计:VGA设计电路如图4.7所示。

图片[14]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图4.7 VGA电路原理图

五、软件设计

以下是对各个模块具体的设计和划分,整体设计如图5.1所示。

图片[15]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.1 软件模块设计

图5.1可分为5大块,采集模块(OV7670采集图像)、缓冲模块(SDRAM图像缓冲)、处理模块(乒乓输入、乒乓输出、帧差、二值图像投影并计算目标)、解码模块(YUV格式转RGB565格式)、显示模块(打印出坐标信息、驱动VGA)。详细设计在接下来的章节中一一讲解。

5.1 采集模块

5.1.1. 初始化SCCB(I2C)协议实现

SCCB 由OV公司生产,通过配置寄存器,来设置摄像头功能,从而达到采集数据的目的。通讯协议和I2C差不多,都是有一个时钟线和一个数据线,数据线是双向的,如图5.2所示为SCCB主机和从机电气连接图。SCCB协议的主机发出启动停止和数据信号,从机响应应答信号和非应答信号,主机在SCLK为高电平时,将SDAT从高拉低,这时触发启动信号,在SCLK为高电平时,将SDAT从低拉高,这时触发停止信号,至于发送数据信号,只有在启动信号和停止信号之间,SCLK为低电平时,SDAT才允许改变,但是在SCLK为高电平时,SDAT必须保持不变,换句话来说,SDAT只有在SCLK为低电平时才能改变。主机使用FPGA,从机为摄像头。每个从机都会有一个独一无二的地址,软件访问从机时,识别从机地址即可。根据厂家使用手册SCLK和SDAT需要接上拉电阻。

接下来,讲一下SCCB传输的基本格式,其传输格式与I2C基本上一样,如图5.3所示,总共写时序有三个部分。每一部分都传输特定的数据,第一部分由8bit组成,最低位是读写选择控制,高7bit由从唯一机地址组成,最后当从机接收到8bit数据后,会向主机反馈一个应答信号ACK。第二部分,由8bit数据组成,其为从机内部寄存器地址,最后当从机接收到8bit数据后,会向主机反馈一个应答信号ACK。第三部分,由8bit数据组成,其为从机内部寄存器数据,最后当从机接收到8bit数据后,会向主机反馈一个非应答信号NACK。

图片[16]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.2 SCCB电气连接

图片[17]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.3 SCCB时序图

通过ModelSim仿真可以得到相应的SCCB时序图,如图5.4所示。

图片[18]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.4 仿真时序图

结论:SCCB总线仿真时序图和厂家手册时序图一致,i2c_sdat为数据信号,ui2c_sclk为时钟信号。在时钟高电平时,数据从高拉低为起始信号,数据从低拉高为停止信号,在时钟低电平时,数据信号可以改变,而且可以收到应答信号,时钟为高电平时数据保持。

5.1.2. 像素数据捕获设计

在驱动摄像头时,摄像头输出时序是按照图5.5输出的,本设计按照摄像头产生的行有效信号HREF和捕获时钟PCLK对相应的数据进行捕获即可。

图片[19]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.5 摄像头输出时序图

5.2 缓冲模块

sdram控制器:动态随机访问存储器(Synchronous Dynamic Random Access Memory)价廉,容量大,但控制复杂。SDRAM以及随后的DDR2,DDR3成为当前数字系统主要的存储器器件,SDRAM器件电气接口如图5.6所示。

图片[20]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.6 SDRAM器件的端口图

然后介绍sdram控制器设计步骤以及相应时序图和仿真图。

5.2.1. 器件初始化:

1). 加载电源(VDD和VDDQ)

2). CKE设置为低(LVTTL逻辑低电平)

3). 加载稳定的时钟信号

4). 等待至少100us,此时的命令保持为INHIBIT或NOP

5). 在步骤4的100us中的某个时刻,将CKE设置为高,命令仍然保持为INHIBIT或NOP

6). 步骤4的100us结束后,即可发出一个全部Bank的预充电命令(PRECHARGE ALL)

7). 等待至少tRP(行预充电最小周期),此时命令保持为NOP或DESELECT

8). 发出一个自动刷新命令(AUTO REFRESH)

9). 等待至少tRFC(自动预充电周期),此时的命令仅允许是NOP或INHIBIT

10). 再发出一个自动刷新命令( AUTO REFRESH )

11). 再等待至少tRFC(自动预充电周期),此时的命令仅允许是NOP或INH

12). 使用LMR命令设置模式寄存器

13). 等待至少tMRD(LMR命令至激活或刷新命令的最小间隔),此时的命令仅允许是NOP或DESELECT

图片[21]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.7 sdram控制器初始化时序图

图片[22]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.8 sdram控制器初始化仿真时序图

结论:仿真如图5.8所示,达到厂家时序图5.7所示的指标,按照厂家时序步骤设计时序仿真图红色光标线标明。要注意的是在发出上电命令之前要发出NOP指令100us以上,设计100.0025us满足指标。

5.2.2. sdram刷新操作

SDRAM的刷新分为自动刷新(Auto Refresh)和自刷新(Self  Refresh) ,前者由外部控制,必须定时给出刷新命令,后者在cke为低时SDRAM器件自己进行,无需外部干预。自动刷新(Auto Refresh)时,SDRAM内部的自动刷新计数器定时对所有Bank的行进行刷新。刷新期间所有操作要停止。自动刷新命令是由外部发出的(SDRAM控制器发出)。通常存储电容的充放电周期为64ms,8192行(13位行地址寻址范围)。以下是自动刷新步骤以及时序图如图5.9所示和仿真图如图5.10所示。

1). 所有Bank执行预充电(关闭所有Bank的行)

2). 等待至少tRP,期间的命令保持为INHIBIT或NOP

3). 执行Auto Refresh命令

4). 等待至少tRFC,期间不能有任何可执行命令,仅允许INHIBIT或NOP

5). 若要执行背靠背刷新,则执行下一个Auto Refresh

6). 若无背靠背(Back to back, 即A10=1执行预充电),则刷新结束,可以开始激活新的bank

7). 自动刷新周期保证每行(所有Bank)满足行刷新周期64ms,因此刷新周期=64ms/8192=7.813us

注意:对所有bank充电(如果使用突发中断指令,可以不用充电);第一次自动刷新(第一次刷新必须);第二次自动刷新(第二次刷新可选)。

图片[23]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.9 sdram控制器自动刷新时序图

图片[24]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.10 sdram控制器自动刷新仿真时序图

结论:按照厂家手册再刷新之前需要做充电操作,然后再做两次刷新操作,如果设置模式成页写突发中断模式,则不需要充电,只需要一次刷新即可。

5.2.3. sdram写操作

图5.12为写操作时序图,图5.13为写操作仿真图,以下是写操作步骤。

a. 发出激活指令,同时加载行地址,如图5.11所示;

b. 经过时间tRCD后,发出写指令,加载列地址和有效数据;

c. 数据突发。

图片[25]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.11 激活时序图

图片[26]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.12 写操作时序图

图片[27]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.13 写操作仿真图

结论:写操作之前一定要发出激活指令,同时加载行地址,才能发出写命令加载数据和行地址,延时参数和厂家手册指标一致。

5.2.4. sdram读操作

图5.14为读操作时序图,图5.15为读操作仿真图,以下是读操作步骤。

a. 发出激活指令,同时加载行地址,如图5.11所示;

b. 经过时间tRCD后,发出读指令,加载列地址;

c. 经过CL=3,3拍潜伏期之后可读出数据;

d. 数据突发。

图片[28]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.14 读操作时序图

图片[29]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.15 读操作仿真图

结论:读操作之前一定要发出激活指令,同时加载行地址,才能发出读命令加载行地址,最后得出数据,延时参数和厂家手册指标一致。

为了便于图像的实时缓冲,在sdram控制器两端专门设计了fifo端点,以适应不同时钟域数据的缓冲,详细设计如下。

二端点缓冲:sdram控制器两端接有两个异步fifo(一个写fifo和一个读fifo),用户可对一个写fifo和一个读fifo同时进行操作,而且sdram控制器是页写突发。

图片[30]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.16 二端点缓冲仿真图

四端点缓冲:sdram控制器两端接有两个异步fifo(两个写fifo和两个读fifo),用户可对两个写fifo和两个读fifo同时进行操作,而且sdram控制器是页写突发。

图片[31]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.17 四端点缓冲仿真图

结论:二端点缓冲要求在任意时刻一端口写入一帧数据,另一端口在任意时刻能无损的读出写入的图像,图5.18红色光标线标明设计满足要求;四端点缓冲要求在任意时刻写1端口写入一帧数据,读1端口在任意时刻能无损的读出写入的图像,在任意时刻写2端口写入一帧数据,读2端口在任意时刻能无损的读出写入的图像,图5.17红色光标线标明设计满足要求;根据本文设计要求写入一端乒乓写入一帧图像,另一端同时同步读出相邻两帧图像数据,则需要做3端口访问,四端点缓冲刚好满足需求。

5.3 处理模块

处理模块总共包括三个处理模块,乒乓输入、帧差且乒乓输出、投影直方图和目标定位模块。

乒乓操作:包括乒乓输入和乒乓输出,在关键问题解决方法中已经详细讲述其原理,在这里讲述设计实现方法及需要注意的问题。

1). 通过sdram缓冲模块输出的完成信号,在状态机的控制下完成乒乓输入切换和输出切换。

2). 注意切换标志信号不能使用输入模块(摄像头采集模块)或输出模块(VGA显示模块)的完成信号,否则会造成sdram缓冲模块数据未完全缓冲完毕,从而丢失数据。

帧差:在本设计中,通过乒乓操作使我采集到的相邻的两帧图像同时输出,两帧图像相减得到的值,到底是前一帧减去后一帧还是后一帧减去前一帧,理论上来说都可以,如果使用两帧相减的绝对值来输出,不管是谁减谁都无所谓了。

投影直方图和目标定位:二值投影分为水平方向的投影和垂直方向的投影,水平方向投影就是把x轴方向各个地址所对的数据加在一块,然后存储到内存里面,垂直方向投影就是把y轴方向各个地址所对的数据加在一块,然后存储到内存里面。最终存储起来就得到二值图像的投影。使用状态机检测输入数据是否为1来进行直方图计数并写入ram中。同关键问题解决方法一节中,通过硬件描述语言设计出来,得到相应目标坐标。

5.4 解码模块

摄像头配置模式为YUV(4:2:2)模式,通过摄像头采集到的YUV格式需要转换成RGB格式才能在VGA上输出。在格式转换中,需要把YUV422转成YUV444,再把YUV444转成RGB888,最后把RGB888转成RGB565,其中YUV444转成RGB888采用查找表的方式。下面详细说明一下转换方法。

5.4.1. YUV422转成YUV444,标准的视频的YCbCr信号,以Cb0 Y0 Cr0 Y1 Cb1 Y2 Cr1 Y3…,通过合并8bit到16bit(为了存储,16bit)后,数据变成了{Cb0 Y0}{Cr0 Y1}{Cb1 Y2}{Cr1 Y3}…,为了保持数据的同步,同时又不能丢失任何一个byte,重新组合出一幅完整的YCbCr图像,我们将所谓的YUV422转成YUV444,即每一个像素都有完整的亮度色差,但是这需要几级寄存来完成。如此,既保证了数据的同步,不至于色差错位,同时又有效的拼接了数据,有利于保存。以下是捕获步骤。

1). 捕获Cb0 Y0

2). 捕获Cr0 Y1

3). 捕获Cb1 Y2,输出Y0Cb0Cr0

4). 捕获Cr1 Y3,输出Y1Cb0Cr0

5.4.2. YUV444转成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)

如果使用c语言方式设计,它支持浮点运算,非常易于实现。但是FPGA中仅仅只有逻辑低和逻辑高,那就需要另想办法设计了,好在上述的一些小数我们可以量化之后再通过一位就可以实现,这样就不需要涉及到小数运算和乘法运算问题了。具体设计如以下步骤。

1). 首先,分离变量,将公式化简

R=1.164Y+1.596Cr-222.912

G=1.164Y- 0.813Cr- 0.391Cb+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*10’d1033)-18’d141787)>>9

3). 乘法器出现溢出,我需要截断正负溢出部分,使得数据保持在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];

4). 最后由于硬件原因,需要将RGB888转换成成RGB565,这一步仅仅只需要做截断操作即可。

5.5 显示模块

显示模块分为两大部分,第一部分为字符打印模块,在已有图像的基础上打印出要写的字符或图标;第二部分为VGA驱动模块,驱动硬件设备。下面具体设计如下。

字符打印模块:在VGA显示图像的基础上,在画面上打印出一串字符,并且可以控制其位置、内容任意改变。设计结构如图5.18所示。其原理是根据输入图像的地址矩阵构成字符或者图标,在对应的地址上将原始像素数据替换成特定的值,这个就可以在不影响原始图像的基础上打印出想要的字符或者图标。

图片[32]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.18 字符模块设计图

VGA驱动模块:标准的VGA接口有15个接口,但是真正用到的只有5个接口,分别是三个色彩信号,R,G,B,场同步信号VSYNC,行同步信号HSYNC,时序部分要通过控制行同步信号和场同步信号,色彩部分要控制RGB,先来看时序部分。对于一个分辨率为800*600的显示器,简单的说像素的刷新是从左到右,从上到下一行一行的刷新的,每一行要刷新的点成为行同步信号的帧长,有多少行称为场同步信号的帧长,从上到下刷新完一遍称为一帧,我们电脑上说的屏幕刷新频率就是说屏幕一秒钟能够刷新多少帧,当达到一定的帧数,我们的肉眼也就分辨不出来了,这样我们就看到我们的电脑屏幕,我们在操作的时候是连续的了。

5.5.1. 水平时序

水平同步信号HSYNC如图5.19所示,HSYNC使用一个负同步脉冲表示一行像素的开始时刻,到下一个负脉冲出现为一行像素的结束时刻。实际的一行有效图像数据是在25.422us的时间窗口内发送的,而水平同步信号之间的间隔是31.77us。没有图像数据发送的这段时间定义为消隐区,此时的图像为黑色。如果有25.422us的时间段来输出一行有效图像数据,做一些计算如下,640*480的VGA显示模式下,待填充的640个像素需要在25.422us内发送给显示器。即每个像素的时间为 25.422us/640 = 39.71875ns。可以算得最小时间单位是 25.175MHZ,这个即驱动VGA时FPGA所需要的时钟频率。

5.5.2. 垂直时序

垂直同步信号VSYNC如图20所示,VSYNC与水平同步信号相似,只不过其同步负脉冲表示整个一帧图像的开始和结束。一帧图像的有效图像数据是在15.25ms的时间窗口内发送的,而同步信号之间的间隔是16.68ms。同理,如果有15.25ms的时间段来输出一帧有效图像数据,做计算如下,640*480的VGA显示模式下15.25ms/480 = 0.031ms。可以算得完成填充一行640个有效像素数据的时间为0.031ms,即每一行的频率为31.46875Khz,显示像素数据或电子束退回到行首开始新的水平扫描时,RGB信号需要置为黑色,即全为零。

图片[33]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.19 VGA行数据时序

注:a (行消隐) , b(行消隐后沿),c(行显示),d(行消隐前沿),E(行时序总长度)

图片[34]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.20 VGA场数据时序

注:a (场消隐) , b(场消隐后沿),c(场显示),d(场消隐前沿),E(场时序总长度)

图片[35]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.21 VGA行数据仿真图

图片[36]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图5.22 VGA场数据仿真图

不同的分辨率下,行同步和场同步信号的周期是不同的,时序上的时间也不一样。附录2列出了VGA的常用分辨率参数。

结论:图5.21设计为行时序满足VGA设计行时序,图5.22设计为场时序满足VGA设计场时序。

 

六、系统调试与测试

本设计对系统的性能和系统的功能分别进行了测试,性能测试是对FPGA的资源利用情况和运行速度情况进行测试,功能测试有腐蚀算法测试,帧差算法测试,定位功能调试等。

6.1 系统资源性能调试与分析

本设计中,FPGA使用资源如图6.1所示,组合逻辑资源使用45%,分布式寄存器资源使用23%,总的逻辑宏单元使用52%,存储器单元使用了15%,一个锁相环。EP4CE6F17C8共有2个锁相环,总逻辑宏单元使用资源小于80%。满足设计任务需求。

图片[37]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.1 EP4CE6F17C8资源使用情况

缓冲模块稳定运行时钟200M,可用逻辑分析仪SigalTap验证,验证结果如图6.2和图6.3所示。

图片[38]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.2 SDRAM传输数据图

图片[39]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.3 SDRAM传输数据图

结论:设计缓冲长度为512,缓冲节点在256,每次突发256个数据,如图6.2和图6.3,在数据有效信号范围内,传输数据正确。而且工作时钟在200MHz下运行的,基本能满足多端点图像数据缓冲需求。

6.2 系统功能测试

腐蚀功能测试:腐蚀前可以看到有许多孤立噪声点在视频输出上,输出结果如图6.4所示,当进行腐蚀算法处理后孤立噪声点明显减少,输出结果如图6.5所示。

图片[40]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.4 腐蚀前图像和帧差结果

图片[41]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.5 腐蚀后图像和帧差结果

图片[42]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.6 帧差结果

帧差法调试:调试过程中遇到了如下一些问题以及对应的解决方法。

出现问题:

a. 移屏,整个屏幕的图像向左方移动一部分,图像未失真,如图6.6所示。

b. 帧差结果出现混乱,如图6.6所示。

分析问题及解决方法:

a. 移屏问题原因分析,由于SDRAM缓冲读写问题,读上一帧时,还未来得及将所有数据读完,下一帧图像已经来临,SDRAM写的优先级高于读优先级,所以下一帧数据会将上一帧图像部分数据覆盖导致每一帧的输出的图像都会有偏差而出现移屏。因此,解决方法为调节复位延时参数,使得写入帧和读出帧保持在先写入,延时一段时间后在读出的关系。

b. 帧差结果混乱原因分析,一开始使用16位RGB565数据做帧差,结果如图6.6所示,出现混乱,所以使用合成图像RGB565做帧差导致出现各个通道颜色对应颜色相减溢出到其他通道的情况,所以最终相减的结果出现混乱。因此解决的方法是对其灰度图像进行帧差,两帧图像相减,再对相减的结果取绝对值(注意进行减法操作和取绝对值操作时,防止数据溢出),即为正确帧差结果,如图6.4和6.5所示。观察这两张图像边缘轮廓明显,且有明显的拖尾现象。

图片[43]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.7 运动目标定位

图片[44]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.8 运动目标定位

图片[45]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

图6.9 运动目标定位

功能测试结果:定位如图6.7所示,随着目标物体的运动,运动目标物体有很多坐标点输出,根据设计任务要求,我们只输出目标尾端的坐标,下图右上角为要抓取目标的坐标显示,可以看到目标所处的位置和输出的坐标基本符合,图6.7,图6.8和图6.9为运动目标在不同位置的定位结果。

结论

本文通过以下几种手段解决了帧差算法实现,导管头定位问题和系统工作性能问题。

1. 乒乓操作将摄像头采集到的图像交替存储到两个不同的SDRAM存储空间,通过SDRAM的缓冲作用,在VGA向SDRAM发出请求信号时,同时读出相邻两帧的数据,然后就可做帧差。

2. 导管头的定位是通过对帧差后的图像作水平方向和垂直方向的投影,确定出运动目标四条边界,可确定四个坐标点输出,但是仅仅有一个坐标点是导管头的端点,所以计算上边界与运动物体的交点坐标与左右两条边界的距离,判断导管头是左上到右下进入摄像头视觉还是左下到右上进入摄像头视觉,确定导管两点坐标输出,然后再判断剩余的两点坐标是否在整张图像边界上,确定导管头坐标输出。

3. 这个算法设计更多的使用流水算法,使用移位和拼接运算代替乘法器和除法器,提高系统运行速度,减少资源利用率。

附录A VGA的常用分辨率参数表

图片[46]-基于FPGA的单目内窥镜定位系统设计(附代码)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

附录B 主要代码

 

请登录后发表评论