在 Verilog RTL 编码中除以一个不是 2 的幂的数

Divide by a number which is not power of 2 in Verilog RTL coding

对于乘法和除法,我们可以使用左右移位。

x>>2  // it will right shift by 2. ---> 2^2=4. (Multiply by 4 or divide by 4, depends on MSB/LSB)

但是,如果我们要除以一个不是2的幂的数,如何达到目的呢?

通过使用 Booth 的恢复除法算法

Booth 算法是一种加法算法,比乘法算法花费的时间相对更长,例如 in this educational PDF.

中的 Newton-Raphson 算法

每个下一个近似值都是使用上一个近似值计算的。

X(N+1) = X(N)(2 - b * X(N)),其中 x(0)=1

因此,要找到 b 的倒数,即 1/b,其中 b=0.6(误差=e(x)),需要大约 5 次迭代。

  1. X(000) = 1.000
  2. X(001) = 1.000 * (2 - (1.000 * 0.6) ) = 1.400
  3. X(002) = 1.400 * (2 - (1.400 * 0.6) ) = 1.624
  4. X(003) = 1.624 * (2 - (1.624 * 0.6) ) = 1.6655744
  5. X(004) = X(003) * (2 - (X (003) * 0.6)) = 1.666665951
  6. X(005) = X(004) * (2 - (X (004) * 0.6)) = 1.666666668

近似答案,即 1.6666666667。

我包含了这个示例以防引用的 PDF 消失。有关详细信息,请参阅参考 PDF 或查找 Newton-Raphson 算法。