如何在Synthesizable Verilog中划分两个定点64位变量?

时间:2016-02-16 13:02:37

标签: math verilog synthesis

我在verilog中实现了一个数学方程式,在一个组合方案(assigns = ...)中,当时的综合工具(Quartus II)已经能够添加,子和多个32位无符号绝对值使用运算符" +, - 和*"分别。

然而,该等式的最后一步是将两个64位无符号定点变量分开,之所以这么大的64位容量是因为我指定16位用于整数,48位用于分数(虽然,计算机以二进制方式完成所有操作并且不关心分数,但我能够检查数字以便最终将分数与整数分开)。

问题在于操作员" /"因为它会自动调用所谓的" LPM_divide"库输出只给出整数,忽略分数,加上错误的位置(不太重要的位)。

例如:

b1000111010000001_000000000000000000000000000000000000000000000000 / b1000111010000001_000000000000000000000000000000000000000000000000

应该是1,它给了我

b0000000000000000_000000000000000000000000000000000000000000000001

那么,我如何才能对可综合的verilog进行这种划分呢?我应该遵循哪些方法或算法,我希望它更快,也许是一个完整的组合? 我希望保持16个整数 - 24个分数用户的观点。提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先假设您乘以两个定点数。 我们将它们称为X和Y,首先包含Xf小数位,然后相应地称为第二Yf小数位。 如果将这些数字乘以整数,则整数结果的LSB Xf + Yf位可被视为结果定点数的小数位(并且仍然将它们乘以整数)。

类似地,如果您将Sf小数位数除以Df小数位数,则可以将得到的整数视为具有Sf-Df小数位的定点数 - 因此您的示例将生成整数1。

因此,如果你需要从16.48数除以另一个16.48数得到48个小数位,用另外48个零小数位加上divident,然后将得到的64 + 48 = 112位数除以另一个64位数字,将两者都视为整数(并使用LPM_divide)。结果的LSB 48位将是您所需要的 - 得到的定点数为48的小数位。