优化FPGA设计的建议
Suggestions for optimising FPGA design
我需要找出该 FPGA 设计的优化方法。我有一些想法,我想知道它们听起来是否适合我的设计。我也想问问大家有没有其他的想法可以提高我的设计效率
我要优化的设计是一组神经元,我在下面包含了两张图片。
我目前的想法
- 在每个神经元和每个加法器之间添加流水线寄存器
- 'Register the inputs and outputs' 通过在每个逻辑块之间插入寄存器
- 将加法器树转换为加法器链
- 使用时分多路复用器在逻辑块之间共享 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"。理想情况下,您可以让经验丰富的设计人员使用您的代码玩几个小时,看看他能做什么。
**我用的号码是编的
我需要找出该 FPGA 设计的优化方法。我有一些想法,我想知道它们听起来是否适合我的设计。我也想问问大家有没有其他的想法可以提高我的设计效率
我要优化的设计是一组神经元,我在下面包含了两张图片。
我目前的想法
- 在每个神经元和每个加法器之间添加流水线寄存器
- 'Register the inputs and outputs' 通过在每个逻辑块之间插入寄存器
- 将加法器树转换为加法器链
- 使用时分多路复用器在逻辑块之间共享 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"。理想情况下,您可以让经验丰富的设计人员使用您的代码玩几个小时,看看他能做什么。
**我用的号码是编的