在Vivado + Verilog中创建多端口块ram

问题描述 投票:0回答:1

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

但是,我不知道如何创建一个块ram,这样我就可以同时访问9个地址(如果我使用的是3x3卷积内核)。在Vivado中有可能吗?我当前正在使用Block Ram Generator。

verilog fpga convolution vivado
1个回答
0
投票

最好的办法是从两个不同的地址读取两个值,因此必须使用双端口RAM。

但是在大多数情况下,您需要一个端口用于写入视频数据,而第二个端口用于读取视频数据。

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

  • 有9个不同的记忆
  • 确保所有数据都在一个地址中,并使存储器的宽度变成9倍。

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

enter image description here

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

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

最终阻尼器这看起来很简单,但是为此您需要一次访问3条视频线的数据。因此,您现在需要做的“所有”工作是构建一个系统,该系统可以记住两行的数据,一旦进入第三行,请重新读取前两行的数据,并将它们与第三行的数据放在一起。上面显示的系统。因此,您至少需要2个独立的双端口存储库,每个存储库可以容纳一行视频数据。

我知道这行得通,因为我上周制作了类似的东西。

© www.soinside.com 2019 - 2024. All rights reserved.