我们是设计基于 FPGA 的卷积神经网络加速器的大四学生。
我们构建了流水线架构。(卷积、池化、卷积和池化),对于架构的这 4 个阶段,我们需要乘以一个特定的窗口和过滤器。我们在第二个卷积层和过滤器中有 (5*5)*6*16 窗口。
到目前为止,我接受这不是一个明确的解释。但是这里的主要问题是我们需要同时访问顺序存储在块 RAM 中的 5*5*6*16 个滤波器系数。但是在每个时钟,我只能到达 ROM 上的一个特定地址。
我们可以采取什么方法?
我们是设计基于 FPGA 的卷积神经网络加速器的大四学生。
我们构建了流水线架构。(卷积、池化、卷积和池化),对于架构的这 4 个阶段,我们需要乘以一个特定的窗口和过滤器。我们在第二个卷积层和过滤器中有 (5*5)*6*16 窗口。
到目前为止,我接受这不是一个明确的解释。但是这里的主要问题是我们需要同时访问顺序存储在块 RAM 中的 5*5*6*16 个滤波器系数。但是在每个时钟,我只能到达 ROM 上的一个特定地址。
我们可以采取什么方法?
为了将来参考,您可以查看 HLS pragma 以帮助使用 FPGA 资源。您可以做的是使用带有循环设置的数组分区编译指示。这使得数组的每个后续元素都存储在不同的子数组中。
例如,因子为 4 时,将从原始数组创建四个较小的数组。每个子数组中的第一个元素分别是arr[0]
, 。arr[1]
arr[2]
这就是您如何在 Block RAM 之间分配一个阵列,以便一次有更多的并行访问。
我们可以采取什么方法?
您不想听到这个,但唯一的解决方案是:
回到起点并更改您的架构/代码。(或跑得很慢)
除非您以主系统时钟频率的 2400 倍运行内存,否则您不能顺序访问 2400 个系数。因此,假设您的主系统必须以 100MHz RAM/ROM 的工作频率运行在 ~42KHz。
这是我在这些论坛上经常遇到的主题。你做了一个错误的决定,现在想要一个解决方案。最好是简单的。抱歉,没有。
我有同样的问题。对于某些层,我们希望访问多个内核以进行并行操作,但是,对于 BRAM 实现,每个周期最多可以有 2 次访问。因此,我对此提出的解决方案是创建一个 ROM 阵列,无论是以 BRAM 风格还是分布式风格实现。与 RAM 阵列不同,您不能简单地实现 ROM 阵列。因此,您需要一个为您的模块生成 RTL 的脚本/软件层。我选择使用分布式方法来实现,但是,我无法估计所需的资源,并且利用率报告给我的结果不清楚。还在调查这件事。