闲庭信步使用图像验证平台加速FPGA的开发:第二十二课——图像直方图统计的FPGA实现

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

图像的直方图统计在上个系列有详细的讲解,本课主要完成直方图统计的FPGA实现。

图像的直方图统计就是对一副图像中0-255这256个像素点出现的次数,在FPGA中,就要用RAM将各个像素点出现的次数存储起来,每来一个新的像素点,就以这个像素点的值为地址从RAM从取出对应的值,加一后再写回到这个地址中去。

按照上面的分析,使用RAM进行直方图统计还有有些麻烦的,因为读RAM需要一个时钟周期,写RAM也需要一个时钟周期,而像素点数据是一个时钟来一个,这就要求每个时钟都要同时读写RAM,虽然读写的地址不同。其实Xilinx的双口RAM是不支持同时读写的,因为wea就是读写使能信号,要不是读,要不是写,不能同时读写。

其实这个问题很好解决,有时候用简单的方式更容易实现,这儿我们可以使用数组来存储,对于数组的操作,一个时钟周期就可以完成读写操作

还有一个问题,在视频处理中,图像是一帧帧流水处理的,我们要统计每幅图像的直方图,完成一幅图像的直方图统计后就要把直方图的数据传输出去并把数组的内容清零,为下一副图像的直方图统计做准备。而通过场同步信号可以判断一幅图像是否处理完成,来对存储直方图的数组读走和清空操作

在\src\hist文件夹下新建hist_statistics.sv文件,使用数组hist_ram来存储图像的直方图统计的信息。

有了数组,图像直方图统计的功能实现非常的简单,直接以输入的数据为索引读写数组即可;而且在直方图的数据被读取完毕后直接清空即可。

根据场同步信号,新建rd_result_domain信号,在该信号有效时间内根据wr_cnt将数组中的数据全部读走。

最后图像直方图的数据dout通过dout_en的标示输出出去,同时生成dout_done信号,用来表示直方图的数据被读完成。

到这儿还有一个问题,那就是可能有些像素点统计的值非常大,而有些像素点统计的值又非常的小,就是直方图的数据很难直观的反应出图像的信息,这时候我们就对图像进行归一化都一定的范围,以便直观的观察。

在\src\hist文件夹下新建hist_norm.sv文件,用来将直方图的数据归一化到0——NORM之间,这个避免除法的操作,直接将直方图数据和FACTOR相乘即可。由于数据扩大了1024*1240倍,最终的结果应该直接舍弃低20位,但是这样的话直方图的数据整体水平都会很小(因图像而异),所以这儿只是舍弃了低13位,让直方图的数据基本在0-255区间内。

top文件例化了rgb2ycbcr,hist_statistics和hist_norm这三个模块。

在img_process_pkt包中也新建hist_fpgatask,方便图像测试平台和FPGA仿真数据的比对。

在tb_image_sim文件中的第二个initial块中,将图像测试平台和FPGA硬件仿真的结果保存并比对。

双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。

可以看到在modelsim的Transcript有如下的打印信息,图像测试平台和FPGA硬件仿真的结果一致。

打开img文件夹,也可以看到图像测试平台和FPGA硬件仿真的结果是一致的(no_seq*是图像测试平台处理后的图片,seq*是FPGA硬件仿真处理后的结果)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值