【问题标题】:How to do Division of two fixed point 64 bits variables in Synthesizable Verilog?如何在 Synthesizable Verilog 中对两个定点 64 位变量进行除法?
【发布时间】:2016-02-16 13:02:36
【问题描述】:

我在 Verilog 中实现一个数学方程,在一个组合方案(赋值 = ...)中,合成工具 (Quartus II) 已经能够通过以下方式对 32 位无符号绝对数进行加、减和乘除分别使用运算符“+、- 和 *”。

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

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

例如:

b1000111010000001_00000000000000000000000000000000000 / b1000111010000001_0000000000000000000000000000000000000000000000000000000000

应该是1,它给了我

b00000000000000000_000000000000000000000000000000000000000000000001

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

【问题讨论】:

    标签: math verilog synthesis


    【解决方案1】:

    首先假设您将两个定点数相乘。 我们称它们为 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 小数位。

    【讨论】:

    • 所以你的示例变换应用到1000111010000001_000000000000000000000000000000000000000000000000_000000000000000000000000000000000000000000000000 / b1000111010000001_000000000000000000000000000000000000000000000000 = 0000000000000001_000000000000000000000000000000000000000000000000 跨度>
    • 感谢 lvd,它工作得很好,虽然因为 LPM_divide 不接受 +64 操作数,而不是添加到 112 位,我决定将分母截断为 32 位(而分子仍然是 64)所以它可以填入LPM_divide,结果有足够好的精度。我想更详细地了解 LPM_divide 在其算法中的作用,你教我它是如何工作的,但是为了学习更多(我是 verilog 的新手)我想研究 LPM_divide 是如何做到这一点的,我应该如何在互联网上查看它?它有特定的算法名称吗?
    • 我建议您在 HDL 中实现自己的除法算法,因为 LPM_divide 的内部结构几乎不可能进行逆向工程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2014-08-25
    相关资源
    最近更新 更多