【问题标题】:16-bit fixed point arithmetic multiplication16 位定点算术乘法
【发布时间】:2015-05-10 15:03:50
【问题描述】:

我有 2 个数据值(A = 0.00537667139546100B = -0.0182905843325460),我想通过舍入方法使用 16 位定点算法将它们相乘。

我该怎么做?我应该如何定义这两个数据?是注册的还是签名的? 是像Output = A*B;这样的乘法

【问题讨论】:

  • 那是什么数据?固定点?采用哪种格式?你不能像这样简单地将 2 个值相乘,只要写下数学,你就会看到
  • @LưuVĩnhPhúc,数据是数据 A 和 B,是的,我可能在 Q2.14 中使用定点算术。关于如何将这两个数据相乘的任何想法?
  • 我认为您最好先阅读这些答案stackoverflow.com/a/27765266/97073stackoverflow.com/a/28170918/97073他们可能会回答您的问题或帮助您修改它。欢迎对有用的答案进行投票。
  • @Morgan,感谢您的链接,它很有帮助,但由于 verilog 没有任何固定点格式支持,我如何对系统进行编程以读取传入数据并将其更改为 base 2用 16 位定点(第 16 位 = 有符号位,第 15 位 = 整数,第 14-0 位是小数位)并进行计算?因为现在我要处理数千个输入数据,所以我完全不可能手动将上面的十进制数字 1 逐 1 转换为其各自的固定点。有什么指导或方法吗?
  • 计算机中的所有数字都是二进制、十六进制、十进制和二进制只是显示底层二进制数据的方式。有符号和无符号只是解释该数据的方式。

标签: verilog multiplication fixed-point 16-bit


【解决方案1】:

如果您只使用“*”符号,那么当您进行综合时,您的综合工具将使用它内部决定使用的任何一种乘法器。你不一定会得到你想要的那种舍入行为。你需要自己设计逻辑。

由于至少有一个输入是有符号的,因此您需要对输入 A 和 B 以及输出使用带符号的 reg。

【讨论】:

  • 我认为问题更多是关于如何编码小数信息而不是如何实现整数乘法。
【解决方案2】:

如果我理解问题刺激是由 Matlab 生成的形式(浮点):

0.00537667139546100
-0.0182905843325460

您想在 Verilog 中对这些数字应用定点乘法。

我的第一步是在 Matlab 中对数据进行四舍五入。我有一个名为 roundn2 的函数,我用它来四舍五入到定点精度,使用 -15 表示 15 个小数位。

然后我会在 matlab 中将该数字乘以 2^15 以将其转换为整数。

那么 Verilog 中的问题很简单,就像 a*b 一样,记住要跟踪小数点(二进制),并将数据移回以解释为小数。

更多关于verilog乘法的信息可以在herehere找到。

【讨论】:

    【解决方案3】:

    以 Q2.14 格式存储为 16 位值 x 的二进制模式表示值 x/214,因此如果我们有 A 和 B 那么

    所以如果你直接将模式 A 和 B 相乘,你需要将结果除以 214 以将其恢复为 x/214 这样的形式

    Output = A*B >> 14;
    

    需要一个舍入步骤来获得最接近的值。您可以在Q number format#Math operations 中找到方法。最简单的四舍五入方法就是像这样将最后移出的位(即第一个小数位)加回

    AxB = (int32_t)A*B;
    AxB = (AxB >> 14) + ((AxB >> 13) & 1);
    

    您可能还想阅读这些

    一个重要的注意事项是 16 位定点值只能保存大约 4.8 digits of precision,你不能存储像 0.0182905843325460 这样长的值。最接近的值约为 0.018310546875

    【讨论】:

    • 可以描述我如何为值 0.01829052843325460 定义数据 A 是否已签名?
    • 如果你想存储 17 位十进制数字 + 1 位 int 部分,如 0.01829052843325460 (或 2 位,如你的格式),那么无符号类型至少需要 60 位,对于无符号类型至少需要 61 位签名类型
    • 所以意味着如果我想使用 16 位,那么我必须四舍五入,直到它可以支持 14 位小数位,对吗?但是仍然如上所述在以这种方式获得结果后,我需要将其转换回其原始值,如 16 位,它以二进制显示对吗?
    • 我不知道你所说的“支持”是什么意思。在执行 16x16→32 乘法后,您必须移位并舍入以使其返回 16 位 Q2.14
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多