应该使用什么除法算法来划分硬件中的小整数?

时间:2013-08-07 18:45:33

标签: algorithm verilog division fpga

我需要将0到1223之间的整数乘以1023,并将结果除以硬件中的1-1023(verilog / fpga实现)。乘法是直接的,因为我可能只需要移位10位(如果需要,我将减去额外的1023)。虽然这个部门有点有趣。面积/功率对我来说并不重要(我在FPGA中,所以资源已经存在)。延迟(在合理范围内)并不是什么大问题,只要我可以管理设计。显然有几种选择有不同的权衡,但我想知道对于这样的情况是否存在“明显的”或“没有脑子”的算法。考虑到操作数的范围有限以及我拥有丰富的资源(bram等),我想知道是否有明显的事情要做。

2 个答案:

答案 0 :(得分:1)

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

  

将结果除以1-1023之间的数字

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

答案 1 :(得分: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个周期内得到答案。我认为。 :)