优化FPGA设计的建议

Suggestions for optimising FPGA design

我需要找出该 FPGA 设计的优化方法。我有一些想法,我想知道它们听起来是否适合我的设计。我也想问问大家有没有其他的想法可以提高我的设计效率

我要优化的设计是一组神经元,我在下面包含了两张图片。

我目前的想法

  1. 在每个神经元和每个加法器之间添加流水线寄存器
  2. 'Register the inputs and outputs' 通过在每个逻辑块之间插入寄存器
  3. 将加法器树转换为加法器链
  4. 使用时分多路复用器在逻辑块之间共享 LUT

我目前提高性能的想法是否有意义?我对 FPGA 知之甚少,所以我不确定我的优化是否会带来很大的改进,或者它们是否有意义。

如有任何帮助,我们将不胜感激。

链接到我的神经元和集成的PDF(图像质量更高): https://francismcnamee.com/pdfs/neuron_ensemble.pdf https://francismcnamee.com/pdfs/single_neuron.pdf

Ensemble of neurons(每个子系统都是一个神经元,每个神经元的设计如下图)

单个神经元

"less area usage and/or faster speed." 开始忘记 :您可以优化面积或速度。两者都不起作用。

Use time division multiplexers to share the LUT's between logic blocks"

多路复用器也是从 LUT 构建的,因此在获得一些区域之前先失去区域。然后 TDM 需要有一个控制器,需要存储和检索中间结果。总而言之,这不是微不足道的,如果您相当擅长逻辑设计,我只会这样做。你可能会增加面积,但你会失去速度。

Convert the adder tree into an adder chain.

不,你不碰加法器树。 FPGA 综合工具将为您 select 优化加法器配置。它将平衡面积与速度,并得出比您自己更好的结果。
事实上,这适用于 design:let 综合工具发挥作用的每个部分。你将无法超越它。

Add pipeline registers between each neuron and each adder
Register the inputs and outputs' by inserting registers in-between each logic block

再次抱歉,但是:不!使用寄存器并不是那么简单。

您需要平衡 寄存器。理想情况下,每个流水线阶段之间的逻辑延迟应该相同。
假设您乘以 ** 10nS。加法器需要 3nS。然后你应该在一组 3 个加法器之后放置一个流水线阶段。延迟约为 20nS。如果在每个加法器之后放置一个流水线级,总延迟将为 ~40nS。

现在您进入加速设计的核心:您是使用 4 个流水线阶段以便在 200 MHz 时 运行 还是在 100MHz 时使用 2 个流水线阶段和 运行?在这两种情况下,吞吐量是相同的。

请注意,每个注册阶段也会花费您的时间:您需要满足注册时间。因此,最快的设计是 没有寄存器 的设计:数据以最大速度传输。但是接下来你可能需要等待很长时间才能呈现下一组数据。

如您所知:平衡寄存器并不容易,而是一门艺术。最好的方法是 运行 通过综合工具进行没有任何寄存器的设计。然后 运行 对其进行时序分析并查看最坏情况下的时序路径。从中尝试找出放置寄存器阶段的位置。但同样,说起来容易做起来难。对我来说,阅读那些时序分析报告很容易,但对于新手来说,它们似乎都是胡言乱语。

对不起,如果我让你挂在这里,但不幸的是在这些情况下没有 "magic trick"。理想情况下,您可以让经验丰富的设计人员使用您的代码玩几个小时,看看他能做什么。

**我用的号码是编的