16位定点算术乘法

时间:2015-03-09 12:44:08

标签: verilog multiplication fixed-point 16-bit

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

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

3 个答案:

答案 0 :(得分:2)

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

\frac{A}{2^{14}}\times\frac{B}{2^{14}} = \frac{A \times B}{2^{14}}\times \frac{1}{2^{14}}

因此,如果你直接乘以A和B,你需要将结果乘以2 14 以使其恢复为x / 2 14 这样的形式

Output = (A*B) << 14;

需要一个舍入步骤来获得最接近的值。您可以在Q number format#Math operations找到执行此操作的方法。您可能还想阅读这些

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

答案 1 :(得分:1)

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

0.00537667139546100
-0.0182905843325460

您希望在verilog中对这些数字应用固定点乘法。

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

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

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

有关verilog中乘法的更多信息,请参见herehere

答案 2 :(得分:0)

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

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