在 Vivado + Verilog 中创建多端口块 ram
Creating multiport block ram in Vivado + Verilog
我想在我的 FPGA 中做卷积。
我确实有一个阵列,图像存储在其中,然后通过 VGA 输出到屏幕上。
我想在像素输出时计算卷积,这样我只需要卷积核大小的乘数。
但是,我不知道如何创建块 ram,以便我可以同时访问例如 9 个地址(如果我使用的是 3x3 卷积核)。这在 Vivado 中可能吗?我目前正在使用 Block Ram 生成器。
您最好的办法是从两个不同的地址读取两个值,为此您必须使用双端口 RAM。
但大多数情况下,您需要一个端口用于写入视频数据,第二个端口用于读取视频数据。
要读取第 9 个位置,您必须:
- 有9种不同的记忆
- 确保所有数据都在一个地址中,并使内存宽度为原来的9倍。
但还是有希望的
在视频中,您会一个接一个地获得水平像素。这意味着对于 3x3 卷积,您可以从寄存器构建三个小型 3 级像素管道:
(是的,我在 Vivado 中放入了一些代码并为此使用了详尽的原理图)
现在您一次可以访问9个像素的数据。您甚至可以省略一个阶段,但这可能会扰乱您的卷积时序。
最后的阻尼器
这看起来很简单,但为此您需要一次访问 三个视频行 的数据。因此 "all" 你现在需要做的是建立一个系统来记住两行的数据,一旦你到达第三行,重新读取前两行的数据并将它们与第三行的数据一起放入上面显示的小系统。因此,您至少需要2个独立的双端口内存库,每个内存库可以容纳一行视频数据。
我知道这是可行的,因为我上周构建了一个类似的东西。
我想在我的 FPGA 中做卷积。 我确实有一个阵列,图像存储在其中,然后通过 VGA 输出到屏幕上。 我想在像素输出时计算卷积,这样我只需要卷积核大小的乘数。
但是,我不知道如何创建块 ram,以便我可以同时访问例如 9 个地址(如果我使用的是 3x3 卷积核)。这在 Vivado 中可能吗?我目前正在使用 Block Ram 生成器。
您最好的办法是从两个不同的地址读取两个值,为此您必须使用双端口 RAM。
但大多数情况下,您需要一个端口用于写入视频数据,第二个端口用于读取视频数据。
要读取第 9 个位置,您必须:
- 有9种不同的记忆
- 确保所有数据都在一个地址中,并使内存宽度为原来的9倍。
但还是有希望的
在视频中,您会一个接一个地获得水平像素。这意味着对于 3x3 卷积,您可以从寄存器构建三个小型 3 级像素管道:
(是的,我在 Vivado 中放入了一些代码并为此使用了详尽的原理图)
现在您一次可以访问9个像素的数据。您甚至可以省略一个阶段,但这可能会扰乱您的卷积时序。
最后的阻尼器
这看起来很简单,但为此您需要一次访问 三个视频行 的数据。因此 "all" 你现在需要做的是建立一个系统来记住两行的数据,一旦你到达第三行,重新读取前两行的数据并将它们与第三行的数据一起放入上面显示的小系统。因此,您至少需要2个独立的双端口内存库,每个内存库可以容纳一行视频数据。
我知道这是可行的,因为我上周构建了一个类似的东西。