如何在 Synthesizable Verilog 中对两个定点 64 位变量进行除法?

How to do Division of two fixed point 64 bits variables in Synthesizable Verilog?

我正在 verilog 中以组合方案 (assigns = ...) 实现一个数学方程式,目前综合工具 (Quartus II) 已经能够轻松地对 32 位无符号绝对值进行加法、减法和乘法运算分别使用运算符“+、-和*”来计算数字。

但是,等式的最后一步之一是除以两个 64 位无符号定点变量,之所以有这么大的 64 位容量是因为我指定 16 位用于整数,48 位用于分数(虽然,计算机做的一切都是二进制的,不关心分数,但我最终可以检查数字以将分数与整数分开)。

问题是运算符“/”是无用的,因为它会自动调用一个所谓的 "LPM_divide" 库,该库输出只给我整数,忽略分数,加上错误的位置(不太重要的位)。

例如:

b1000111010000001_000000000000000000000000000000000000000000000000 / b1000111010000001_000000000000000000000000000000000000000000000000

应该是1,它给了我

b0000000000000000_000000000000000000000000000000000000000000000001

那么,我怎样才能为可综合的verilog做这个划分呢?我应该遵循什么方法或算法,我希望它更快,也许是一个完整的组合? 我希望它保留 16 个整数 - 24 个分数用户的观点。提前致谢。

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

类似地,如果将 Sf 小数位的数量除以 Df 小数位的数量,得到的整数可以被视为具有 Sf-Df 小数位的定点数——因此你的示例结果为整数 1。

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