2

我需要将 0-1023 范围内的整数乘以 1023,然后将结果除以硬件中 1-1023 范围内的数字(verilog/fpga 实现)。乘法是直截了当的,因为我可能只需要移动 10 位就可以逃脱(如果需要,我会减去一个额外的 1023)。不过这个分区有点意思。面积/功率对我来说并不是很重要(我在 FPGA 中,所以资源已经在那里)。只要我可以管道设计,延迟(在合理范围内)并不是什么大问题。显然有几种不同的权衡选择,但我想知道对于这种情况是否有“明显”或“无脑”的算法。鉴于操作数的有限范围和我拥有的丰富资源(布拉姆等),我想知道是否有'

4

2 回答 2

1

如果您可以使用定点精度而不是整数,则可以更改:

将结果除以 1-1023 范围内的数字

乘以 1 - 1/1023 范围内的数字,即预先计算除法并将其存储为乘法的系数。

于 2013-08-07T20:36:23.753 回答
1

如果您可以预先计算所有内容,并且您有一个备用的 20x20 乘数,以及一些存储您预先计算的数字的方法,那么请采纳 Morgan 的建议。您需要预先计算一个 20 位被乘数(10b 商,10b 余数),然后乘以您的第一个 10b 数,然后取 40b 结果的底部 30b。

否则,不费吹灰之力就是不恢复除法,因为您说延迟并不重要(网络上有很多东西,其中大部分是不可理解的)。你有一个 20 位的分子(你的 (1023 x ) 乘法的结果)和一个 10 位的分母。这给出了 20b 的商和 10b 的余数(即 20 位用于答案的整数部分,10 位用于小数部分,给出 30b 的答案)。

实际的硬件非常简单:一个 11b 加法器/减法器、一个 31b 移位寄存器和一个 10b 或 11b 寄存器来存储除数。您还需要一个小型 FSM 来控制它 (2b)。您必须在每个时钟周期内进行比较、加减和移位,然后在 21 个周期内得出答案。我认为。:)

于 2013-08-08T08:29:34.547 回答