欢迎大家来到IT世界,在知识的湖畔探索吧!
昨天的文章中,我们聊了FPGA的基本结构、原理和开发流程。今天我们以图像处理中常用的3×3窗处理为例,给出RTL设计过程和modelsim功能验证waveform。
FPGA在图像处理算法中的优势
图像处理算法中有大量的数值运算,比如乘加运算、累加运算等。这些运算都可以用并行运算法进行处理。但普通的计算机都是基于串行的,用普通计算机进行图像算法处理不能利用图像处理具有并行性的特点,无法提高运算速度。
FPGA本身具有并行性,可以最大限度的利用图像处理的并行性特点,提高运算速度。所以在处理图像算法中占有先天的优势。
数字图像处理中的窗口概念
在数字图像处理中,很多算法都是基于滑动窗的。窗是一个点周围的特定长度或形状的邻域,它可以用来计算算法的输出,例如可以求出窗内算有像素的最大值、最小值、中值以及均值等。
图像开窗处理主要作用是根据通信模块反馈的目标区域的坐标和数据是否有效,对图像进行窗口化处理。把待识别的目标区域框定在一个特定的窗口内可以减小目标区域以外的背景区域对图像预处理的干扰。
开窗操作可以减小非目标区域对图像预处理的干扰,提高图像预处理的效果和速度。
基于窗来实现图像的一些算法,窗可大可小,但一般选用奇数大小的滑动窗,一般有3×3、5×5、7×7等,本文选用3×3的窗,如果窗选的比较大,会占用较多的FPGA资源,降低工作频率。3×3滑动窗如下图所示。
3×3开窗的FPGA实现分析
下面以3×3,介绍怎样实现图像的开窗处理。实现框图如下图所示。
硬件实现图像算法时数据是以数据流的方式传递的,一个时钟周期只能传递一个数据。本文中设计的3×3的窗口,就是为了实现将窗中的九个数据同时输出,然后对输出的数据进行运算。
本文采用行缓存的方式来实现,比如将九个数据分别放入三行内,然后让三行的数据同时输出。但一般情况下,数据流是以光栅扫描的顺序(从左到右,从上到下)输入,所以三行数据是不会同时输出的,因此需要用行缓存的方式来实现三行的同时输出。即先把前两行的数据缓存,等第三行数据到来时,再把前两行缓存的数据读出来,这样就保证了三行数据的同时输出。
本文采用简单双端口RAM来实现前两行的缓存(这里也可以使用单口SRAM实现,设计过程相同),第三行直接使用线上数据,完成三行数据的积累。双端口RAM具有两套独立的数据线、地址线和数据控制线,各端口的输出可以互不影响。
行缓存是使三行数据能在时间上对齐,在同一个时钟内可以获得三行的数据;列延时可以使从三行获得的数据在列对齐之后再同时输出。输出使能信号dout_en,是控制数据输出有效性的,当dout_en为高电平时,输出数据有效,dout_en为低电平时,输出数据无效。
双端口SRAM操作介绍
简单双端口有两个独立的地址线,一个写端口和一个读端口,同一个使能信号。读端口按正常的顺序进行数据的读出,写数据延时一个时钟把数据写入,然后在从写端口把数据读出,这样就保证了读写时钟能够同时读出数据。
在进行3×3行缓存时使用两个简单双端口RAM,把其中一个简单双端口RAM(RAM1)的输出接到另一个简单双端口RAM(RAM2)的输入中。然后把RAM1输出的两个数据存入寄存器中进行缓存,等到RAM2的数据输出时,再同时把寄存器中的数据输出。这样就达到了三行数据同时输出的目的。
3×3开窗操作的功能验证
用modelsim对3×3窗口进行验证,采用32行x32列的二维数组作为测试输入的数据,二维数组以串行方式,从第一行的第一个数据输入给输入端(din_data),同时产生有效输入信号hsync。二维数组如下图所示。
modelsim中的waveform如下图所示:
仿真波形中dout_hsync为低电平时表示输出数据无效,在进行行列对齐,当dout_hsync为高电平时,输出数据有效。在dout_hsync输出为高电平时,输出数据a1-c3分别为:135、100、255、135、100、72、135、100、72,这与二维测试数组中,前三行前三列的数据相对应。并且后面每个时钟上升沿数据输出情况都如此,验证了3×3模块的正确性。
小结
今天的内容,我们介绍了一个在数字图像处理里面非常常用的开窗操作,相信如果从事过和图像处理相关的工作的人,都很清楚窗处理的重要性和使用广泛性。
另外,例子中是用双口SRAM来实现,也可以用单端口SRAM进行设计,思路相同,只是SRAM的读写方式不同。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/35324.html