在 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 次迭代。
- X(000) = 1.000
- X(001) = 1.000 * (2 - (1.000 * 0.6) ) = 1.400
- X(002) = 1.400 * (2 - (1.400 * 0.6) ) = 1.624
- X(003) = 1.624 * (2 - (1.624 * 0.6) ) = 1.6655744
- X(004) = X(003) * (2 - (X (003) * 0.6)) = 1.666665951
- X(005) = X(004) * (2 - (X (004) * 0.6)) = 1.666666668
近似答案,即 1.6666666667。
我包含了这个示例以防引用的 PDF 消失。有关详细信息,请参阅参考 PDF 或查找 Newton-Raphson 算法。
对于乘法和除法,我们可以使用左右移位。
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 次迭代。
- X(000) = 1.000
- X(001) = 1.000 * (2 - (1.000 * 0.6) ) = 1.400
- X(002) = 1.400 * (2 - (1.400 * 0.6) ) = 1.624
- X(003) = 1.624 * (2 - (1.624 * 0.6) ) = 1.6655744
- X(004) = X(003) * (2 - (X (003) * 0.6)) = 1.666665951
- X(005) = X(004) * (2 - (X (004) * 0.6)) = 1.666666668
近似答案,即 1.6666666667。
我包含了这个示例以防引用的 PDF 消失。有关详细信息,请参阅参考 PDF 或查找 Newton-Raphson 算法。