verilog - 在 Vivado + Verilog 中创建多端口块 ram
问题描述
我想在我的 FPGA 中进行卷积。我确实有一个数组,其中存储了图像,然后通过 VGA 将其输出到屏幕上。我想在像素输出的那一刻计算卷积,这样我只需要乘以卷积核的大小。
但是,我不知道如何创建一个块 ram,以便我可以同时访问例如 9 个地址(如果我使用的是 3x3 卷积核)。这在 Vivado 中可行吗?我目前正在使用 Block Ram 生成器。
解决方案
您可以做的最好的事情是从两个不同的地址读取两个值,为此您必须使用双端口 RAM。
但大多数时候,您需要一个端口来写入视频数据,而第二个端口来读取它。
要阅读 9 个位置,您必须:
- 拥有9种不同的记忆
- 确保所有数据都在一个地址中,并使内存宽 9 倍。
但仍有希望。
在视频中,您会一个接一个地获得水平像素。这意味着对于 3x3 卷积,您可以从寄存器构建三个小的 3 级像素管道:
(是的,我在 Vivado 中放了一些代码,并为此使用了详细的原理图)
现在您一次可以访问 9 个像素的数据。你甚至可以省略一个阶段,但这可能会扰乱你的卷积时间。
最终阻尼器
这看起来很简单,但为此您需要一次访问三个视频行的数据。因此,您现在需要做的“所有”工作就是构建一个系统来记住两行的数据,一旦到达第三行,重新读取前两行的数据,并将它们与第 3 行的数据放在一起系统如上图。因此,您至少需要 2 个独立的双端口内存组,每个内存组可以保存一行视频数据。
我知道这是可行的,因为我上周构建了类似的东西。
推荐阅读
- java - 如何从aws弹性beantalk环境中获取堆转储
- node.js - 在离线 AIX 服务器上构建和安装 node.js 包
- vue.js - Vue.js“未捕获的语法错误:意外的令牌 <”
- jquery - css中的进度条不流畅
- javascript - JavaScript 在跳过特定步骤时使用设定数量的步骤循环
- php - preg_match 返回正则表达式匹配的内容,而不是 true 或 false 值
- assembly - 如何加快这种插入排序?(C 中的内联汇编)
- javascript - 在 Angular 6 中初始化 npm Highcharts 7 热图
- ibm-midrange - 使用 SQL,是否可以创建与它所基于的原始文件(PF)具有相同格式级别标识符的全局临时表?
- ios - 停止时如何使滑块处于当前位置