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

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

(本系列只需要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因子的处理就变得非常的简单,不用花费精力在图像数据的缓存上,直接对图像的数据进行处理即可,我们下节课就能见识到。

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

相关文章:

  • 基于ASP.NET MVC+SQLite开发的一套(Web)图书管理系统
  • ContextMenu的Item如何绑定命令
  • 手机恢复出厂设置怎么找回数据?Aiseesoft FoneLab for Android数据恢复工具分享
  • 【音视频】HLS拉流抓包分析
  • 【mac】快捷键使用指南
  • Java 深入解析:JVM对象创建与内存机制全景图
  • uni-app获取手机当前连接的WIFI名称
  • 如何将文件从OPPO手机传输到电脑
  • 视频人脸处理——人脸面部动作提取
  • 虹科分享 | 告别实体钥匙!数字钥匙正在重构你的用车体验
  • 计算机毕业设计ssm基于JavaScript的餐厅点餐系统 SSM+Vue智慧餐厅在线点餐管理平台 JavaWeb前后端分离式餐饮点餐与桌台调度系统
  • 【前端】【组件库开发】【原理】【无框架开发】现代网页弹窗开发指南:从基础到优化
  • Python day58
  • rom定制系列------红米note10 5G版camellia原生安卓14批量线刷 miui安卓11修改型号root版
  • php use 命名空间与 spl_autoload_register的关系
  • Microsoft Word 中 .doc 和 .docx 的区别
  • 重构下一代智能电池“神经中枢”:GCKontrol定义高性能BMS系统级设计标杆
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 41(题目+回答)
  • 基于开源AI智能名片链动2+1模式与S2B2C商城小程序的渠道选择策略研究
  • SpringDataRedis入门
  • 慕尚花坊项目笔记
  • ADSP-21489用SigmaStudio+(SS+)来做开发的详解六、T的用法
  • 工业通信升级新选择:耐达讯CCLINKIE转Modbus TCP网关
  • Vue 动态类名实战讲解
  • 生物化学(实验流程) PCR : 植物提取RNA 电泳评估RNA纯度
  • leetcode:377. 组合总和 Ⅳ[完全背包]
  • 在mac m1基于ollama运行deepseek r1
  • 静态POD是啥,如何理解,应用场景
  • 千辛万苦3面却倒在性格测试?这太离谱了吧!
  • 第十五章 STL(stack、queue、list、set、map容器使用)