首页 > 解决方案 > 在 Vivado + Verilog 中创建多端口块 ram

问题描述

我想在我的 FPGA 中进行卷积。我确实有一个数组,其中存储了图像,然后通过 VGA 将其输出到屏幕上。我想在像素输出的那一刻计算卷积,这样我只需要乘以卷积核的大小。

但是,我不知道如何创建一个块 ram,以便我可以同时访问例如 9 个地址(如果我使用的是 3x3 卷积核)。这在 Vivado 中可行吗?我目前正在使用 Block Ram 生成器。

标签: verilogfpgaconvolutionvivado

解决方案


您可以做的最好的事情是从两个不同的地址读取两个值,为此您必须使用双端口 RAM。

但大多数时候,您需要一个端口来写入视频数据,而第二个端口来读取它。

要阅读 9 个位置,您必须:

  • 拥有9种不同的记忆
  • 确保所有数据都在一个地址中,并使内存宽 9 倍。

但仍有希望。
在视频中,您会一个接一个地获得水平像素。这意味着对于 3x3 卷积,您可以从寄存器构建三个小的 3 级像素管道:

在此处输入图像描述

(是的,我在 Vivado 中放了一些代码,并为此使用了详细的原理图)

现在您一次可以访问 9 个像素的数据。你甚至可以省略一个阶段,但这可能会扰乱你的卷积时间。

最终阻尼器
这看起来很简单,但为此您需要一次访问三个视频行的数据。因此,您现在需要做的“所有”工作就是构建一个系统来记住两行的数据,一旦到达第三行,重新读取前两行的数据,并将它们与第 3 行的数据放在一起系统如上图。因此,您至少需要 2 个独立的双端口内存组,每个内存组可以保存一行视频数据。

我知道这是可行的,因为我上周构建了类似的东西。


推荐阅读