16 位定点算术乘法

16-bit fixed point arithmetic multiplication

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

我应该怎么做?我应该如何定义这两个数据?是reg还是signed? 乘法是不是像Output = A*B;

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

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

如果我理解问题刺激正在由 Matlab 生成,形式为(浮点数):

0.00537667139546100
-0.0182905843325460

您想在 verilog 中对这些数字应用定点乘法的位置。

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

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

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

可以找到有关 verilog 中乘法的更多信息 and

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

所以如果你直接将模式A和B相乘,你需要将结果除以214才能得到x/2[=31的形式=]14 像这样

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