登录站点

用户名

密码

ModelSim+Synplify+Quartus的Altera FPGA的仿真与验证

已有 1683 次阅读  2009-09-21 16:16   标签Altera  FPGA  ModelSim  Quartus  Synplify 
基于视觉图像的微小零件边缘检测算法研究
2009年9月3日 14:49     

来源:维库电子

1 引言

边缘是指局部强度变化最显著部分.主要存在于目标与目标、目标与背景、区域与区域之间,是图像分割、纹理特征和形状特征等图像分析的重要基础。如何快速、准确提取图像的边缘信息一直是国内外研究的热点,目前已有多种边缘检测算法,其中最经典的算法就是Sobel算法。该算法由于计算量小、速度快,广泛应用于诸多领域,但其检测方向有限,抗噪能力较低,因此,该算法也具有一定的局限性。而且,实际应用中,像素级已无法满足精度要求,只能采用亚像素级的细分算法。

这里给出扩展的4个方向的Sobel算子,即采用4个方向的模板,细化处理其梯度方向图,鉴于插值法计算量小、精度高的特点,故选用二次多项式插值法实现亚像素细分。

2 扩展的Sobel细化算子

2.1 扩展的两个模板

图像目标的边缘是灰度不连续性的反映,其种类可粗略区分为:阶跃性边缘和层顶状边缘。前者的两边像素点灰度值显著不同,后者位于灰度值从增加到减少的变化转折点。为了更准确描述图像边缘点.减少噪声对其检测结果的影响,提高算子的抗噪能力,在水平、垂直模板的基础上重新构造2个3x3的模板,模板各个位置的权重是由该位置到中心点的距离以及该位置在模板中所在的方向决定的,等距离的点具有相同权重,如图l所示。这里选用最高输出模板所对应的边缘梯度值作为像元边缘梯度强度。

2.2 Sobel算子细化边缘

图像边缘包含图像的大量信息,但模板计算的数值仅仅只是图像对应的梯度图像,边缘出现于梯度较大位置,若想提取图像边缘必须设定阈值将其二值化。由一阶梯度算子得到梯度图像,一般边缘较粗,若直接对其梯度图像设定阈值进行二值化,很难找到合适的阈值.也不便于边缘连接与边缘特征提取等后期处理。因此在对图像梯度图像进行二值化前,必须细化所检测的梯度边缘。细化原理是基于经典Sobel算子定义的:

  

Sobel算子模板中的元素表示算式中相应像素的权重因子。Sobel算子是边缘检测算子,故其处理模板中各因子之和为零。另一方面,由于正因子和负因子之和分别为4和一4,在极端情况下处理结果可能溢出。因此,在实际使用时,Sobel算子通常采用已设定阈值进行二值化,即处理结果得到的是已二值化的边缘图。该结果将导致边缘图中幅值较小的边缘丢失。为了克服这个缺陷,引入一个衰减因子Scale,用它去除计算结果,来消除数据的溢出,而无需二值化处理,而且其结果是无失真的灰阶边缘图,从而保留所有边缘数值同。加入扩展的模板后可得:

因子Scale取4,它也是归一化因子,即两个灰度层的阶跃,交界处的处理结果就是其灰度差值。

灰度图像细化处理步骤如下:①对灰度图像作带衰减因子的Sobel处理,得灰度边缘图。Sobel处理采用式(3);②对所得灰度边缘图再作带衰减因子的Sobel处理;③灰度边缘图减去Sobel处理结果,再将与负值部分对应的边缘点的值改为零,得到细化的边缘图。

3 多项式插值亚像素细分的精定位

运用Sobel细化算子改进的方向模板获取边缘点的梯度方向,可采用已知的边缘点的梯度方向近似代替未知的亚像素点的梯度方向,并在该方向上进行二次多项式插值得到边缘的亚像素位置。

对于灰度图像中任意点的梯度幅值用R表示,设R0为边缘点P0(m,n)的灰度梯度方向的模,R-1,R1分别是在梯度方向上与P0相邻的两像素点P-1,P1的梯度幅值,经推导可得亚像素点的坐标(xe,ye)为:

式中:W为相邻像素点到边缘点距离,θ为梯度方向与x轴正向夹角。

由式(4)可得出,亚像素细分定位边缘的前提条件为:R0>R-1且R0>R1。

采用扩展的Sobel细化算子搜索单像素边缘,在搜索过程中,剔除边缘点梯度方向的非极大值,从而保证亚像像素细分定位的前提条件成立。方向模板与P-1,P1点坐标对应表如表1所示。

4 实验与结果分析

为了验证该算法,提取在线实时采集的微小零件图像进行实验。

(1)可扩展的Sobel细化算子的验证 引入灰阶Sobel算子后,得到的边缘图仍是灰阶图像,此时采用Sobel算子处理,得到边缘的边缘图。在新的边缘图上,原边缘的两侧得到新的边缘,而中间部分却变成背景,且其宽度小于原边缘。利用该特点细化原边缘,即将原边缘减去新边缘图,再将结果中与负的部分对应的边缘变为零,最后得到接近单像素宽的边缘图,从而达到细化边缘的效果,如图2所示。

(2)亚像素细分算法定位经过扩展方向模板的Sobel细化算子后,提取接近单像素的边缘,在其梯度方向上用亚像素细分算法对图像边缘进一步定位。

图3是在原边缘基础上取一段圆弧,对其细分前后的坐标图,可以看出,经过亚像素细分算法定位后得到的像素边缘比较光滑。相对于未细分,其精确度得到提高。

(3)计算标准偏差以单个点的像素坐标值为标准坐标值,将定位后的单点与对应点的坐标差作为算法偏差,计算得到的标准偏差约0.20 pixel。

5 结论

采用的边缘检测算法是通过扩展的4个方向的Sobel算子引入衰减因子而得到无失真的灰阶边缘图,再采用Sobel算子细化,可使较陡边缘部分光滑连续,且接近单点宽的边缘;采用二次多项式插值法在梯度方向插值后得到光滑边缘,定位精度达到0.20 pixel,适于对精度要求较高的视觉系统。

软件要求:ModelSimSE、SynplifyPro、QuartusII

适用人群:初学者

源代码:mux4_to_1.v

工作内容:

1、设计一个多路选择器,利用ModelSimSE做功能仿真;

2、利用SynplifyPro进行综合,生成xxx.vqm文件;

3、利用QuartusII导入xxx.vqm进行自动布局布线,并生成xxx.vo(Verilog

4、利用ModelSimSE做后仿真,看是否满足要求。

注:

1.仿真器(Simulator)是用来仿真电路的波形。

2.综合工具(Synthesizer)的功能是将HDL转换成由电路所组成的Netlist。

3.一般而言,在电路设计的仿真上可分为Pre-Sim和Post-Sim。Pre-Sim是针而Post-Sim则是针对综合过且做完成了AutoPlaceandRoute(APR)的电路进行仿真,以确保所设计的电路实现在FPGA上时,与Pre-Sim的功能一样。

1、前仿真(Pre-Sim)

步骤一:打开ModelSimSE,然后建立一个Project;

※建立Project的方式为点选File→New→Project…;

※设定ProjectName与Projectlocation,按OK即可建立Project。

前仿真

  步骤二:新增设计文档或加入文档。

※新增文档的方式为点选File→New→Source→Verilog,然后对文档进行编辑并储存为xxx.v;

※加入文档的方式为点选File→AddtoProject→File...,然后点选xxx.v;

新增设计文档或加入文档

  步骤三:编译(Compile)。

※编译文档的方式为点选Compile→CompileAll,即可编译所有的文档。

※如果编译时发生错误,在显示错误的地方(红字)点两下,即可跳到错误。

编译文档

  步骤四:新增或加入测试平台(Testbench)。

※当设计完电路后,为了确定所设计的电路是否符合要求,我们会写一个测试平台(Testbench);

※新增或加入测试平台,然后编译它。

  步骤五:仿真(Simulate)。

※仿真的方式为点选Simulate→Simulate…;

※打开Design里面的work,然后点选mux_4_to_1_tb并Add它,最后按Load即可跳到仿真窗口。

仿真的方式

  步骤六:加入信号线。

※在窗口上按右键,然后点选Add→AddtoWave;

加入信号线

  步骤七:看波形。

※在工具列上按Run,然后就会显示波形;

※慢慢看波形吧,没有波形就没有真相!

看波形

以上就是使用ModelSim做Pre-Sim的基本流程,在此要特别强调的是,ModelSim所有的功能并不仅仅于此,如果你想要了解更多的话,一切都要靠自己花时间去问去试,只有努力的人才能有丰富的收获,加油!

2、综合(Synthesis)

  步骤一:打开SynplifyPro,然后建立一个Project。

※先点选File,再点选New;

※选择ProjectFile,并设定FileName与FileLocation;

综合

步骤二:加入设计文件。

※点选欲加入的xxx.v,然后按Add,再按OK后就可以将档案加入。

加入设计文件

  步骤三:选择FPGA的Device与其它相关设定。

※先点选Project,再点选ImplementationOptions。

※在Device的设定如下:Technology为AlteraStratix,Part为EP1S10,Speed为-6,Package为FC780。

※在Options的设定是将FSMCompiler与ResourceSharing打勾。

※在Constraints的设定是将Frequency设定至100Mhz。

※在ImplementationResults的设定是将ResultFileName填入与电路模块相同的名称,而xxx.vgm这个文件会在QuartusII做APR时被使用。然后将下列两个选项打勾(WriteVendorConstraintFile与WriteMappedVerilogNetlist)。

※在TimingReport的设定是将NumberofCriticalPaths与NumberofStart/EndPoints都设为11。

※在Verilog里是将TOPLevelModule填入与电路模块相同的名称,然后将UseVerilog2001打勾。

选择FPGA的Device 与其它相关设定

  步骤四:综合(Synthesis)。

※点选RUN→Synthesize,最后出现Done!就是已经综合完毕。

  步骤五:检查综合后的电路。

※先点选HDLAnalyst,再点选RTL,最后点选HierarchalView,画面会出现综合后的电路Netlist。

综合后的电路

以上就是使用Synplify将HDL程序合成为电路Netlist的基本流程,值得注意的是,当你针对不同要求而设定的Constraints不同时,你就会得到不同的电路Netlist,所要付出的硬件代价也不同,这就需要大家多花点心思来了解其中的奥妙之处。

上一篇: 基于柔性测试技术的汽车传感器测试系统设计 下一篇: 戴尔展开最大规模收购 进军医疗IT服务业

分享 举报