当前位置: 首页 > news >正文

闲庭信步使用图像验证平台加速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硬件仿真处理后的结果)。

http://www.dtcms.com/a/286145.html

相关文章:

  • 28、鸿蒙Harmony Next开发:不依赖UI组件的全局气泡提示 (openPopup)和不依赖UI组件的全局菜单 (openMenu)、Toast
  • 开源Docmost知识库管理工具
  • Win11安装Docker,并使用Docker安装RabbitMQ
  • 智能算法优化储能系统充放电策略
  • 基于R语言piecewiseSEM结构方程模型在生态环境领域实践技术应用
  • 指定阿里镜像原理
  • 创建线程的方式有哪些?相比继承Thread类,实现Runable接口的好处是什么?
  • 线上 CPU 过高怎么排查
  • mac系统安装、启动Jenkins,创建pytest接口自动化任务
  • 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
  • 力扣面试150(33/150)
  • 事务处理与AOP(web后端笔记第四期)
  • linux 脚本解释
  • 数据库防止数组字符串序列化
  • 后端参数校验
  • 20250718-FDU-HDUOJ钉耙编程一
  • 商汤将发布日日新6.5大模型及具身智能平台该咋看?
  • 五大开源OCR开源框架评估01-Tesseract:OCR 领域的远古巨神
  • 前端权限控制:深入理解与实现RBAC模型
  • Maven 配置文件核心配置:本地仓库、镜像与 JDK 版本
  • python学智能算法(二十四)|SVM-最优化几何距离的理解
  • Java并发编程痛点解析:从底层原理到实战解决方案
  • [3-02-03].第03章:编程模式 - 阻塞式编程与响应式编程对比
  • Python爬虫入门到实战(3)-对网页进行操作
  • 用AME获取免费SSL证书
  • 免费PDF文件格式转换工具
  • LeafletJS 与 React:构建现代地图应用
  • leetcode2_135.分发糖果
  • 信息安全性测试:渗透测试、漏洞扫描与代码审计全解析
  • 基于ECDH的隐私求交(PSI)技术发展历程