闲庭信步使用图像验证平台加速FPGA的开发:第八课——图像数据的行缓存

发布于:2025-07-12 ⋅ 阅读:(18) ⋅ 点赞:(0)

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,关注即送200GB学习资料,链接已置顶!)

前面的分析大家应该都能理解,只要是涉及到算子的图像的操作,不过是插值还是滤波,都需要NxN区域的图像数据进行处理,比如常见的3x3,5x5和7x7等。

对于软件开发人员,数据都是存在数组或者队列中,随便取就可以,想取哪个就取那个。但是对于FPGA的硬件开发来说,事情要远远复杂的多

图像的数据是一个像素点一个像素点产生的,反应在时序上就是在场同步,行同步,数据有效等信号的控制下图像数据有序的进入FPGA,并不是同一个时间点所有的数据都进入了FPGA。而我们又不可能缓存所有的图像数据,原因是图像一秒就是数十帧,以800x480图像为例,一帧图像的大小就是800x480x8,一秒图像数据就是800x480x8x帧率,这个数据量是很大的,而FPGA的缓存又是有限的。

在这种情况下,FPGA就是对图像的数据按行进行流水缓存,对于3x3的因子,缓存相邻的3行数据即可。如下所示,也就先缓存第一行的数据,再缓存第二行的数据,再缓存第三行的数据,再缓存第四行的的数据.....如果使用3x3的因子,那第一个处理的数据应该是第1行的第1个数据,此时需要缓存到第2行的第2列,所以3x3的因子,数据的缓存延时了1行再加上1个像素;同理,5x5的因子,数据的缓存会造成2行加2个像素的延时

其实数据的缓存还有一个问题,对于3x3的因子,处理的第一个数据是第1行的第1个数据,其实第0行的数据根本没有处理,其实不光是第一行,图像的外围一圈的像素点都没有进行处理。而对于5x5的因子,处理的第一个数据是第2行的第2个数据,图像的外围两圈的像素点都没有进行处理。当然我们也可以对外圈的像素点进行特殊的处理,但是非常的麻烦。最简单的方法是在图片的外圈补0,3x3的因子,补一圈0,5x5的因子,补两圈0。如下所示,这样就能保证每个像素可以按照相同的方式就像处理。至于如何补零,需要对缓存ram进行灵活的处理。

缓存RAM可以直接使用Xilinx自带的IP核,但是如果我们使用了Xilinx的IP核,modelsim就要使用Xilinx的仿真库,存在的问题是仿真库比较大,而且每个人的Xilinx版本可能还不一致,就会造成FPGA的仿真可能跑不起来。考虑到通用性,我们直接写一个双口RAM文件bram_sdp2,直接对数组进行操作

有了双口RAM,那我们就可以对图像的数据进行缓存,我们先完成3行数据的缓存,在src文件下新建cache文件夹,新建data_cache.sv文件,例化了3个双口BRAM_SDP2

通过控制RAM的读写可以巧妙的完成补零。

还有一个问题,就是3行数据缓存后,图像的处理要延时了一行,而图像有效信号active无法按行进行延时,所以要在最后一行再新生成一个图像数据有效信号active信号,如下所示。

sel_cnt信号用来指示最新需要缓存数据的行数,而start信号用来指示数据开始处理的行数。

最后根据sel_cnt信号读出行缓存的数据(最新的行直接读输入数据即可)。

行缓存处理除了一行的延时外,还有3个时钟周期的延时,把场同步,行同步,数据有效信号延时3个时钟周期即可。

最后将3x3的因子数据输出即可。

有了data_cache.sv模块,后续3x3因子的处理就变得非常的简单,不用花费精力在图像数据的缓存上,直接对图像的数据进行处理即可,我们下节课就能见识到。


网站公告

今日签到

点亮在社区的每一天
去签到