我有2个数据值(A = 0.00537667139546100
和B = -0.0182905843325460
),我想通过使用舍入方法使用16位定点算术将它们相乘。
我该怎么做?我该如何定义这两个数据?是注册还是签名?
乘法是Output = A*B;
答案 0 :(得分:2)
以Q2.14格式存储为16位值x的二进制模式表示值x / 2 14 ,因此如果我们有A和B则
因此,如果你直接乘以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
,记住跟踪十进制(二进制)点,并将数据移回到解释为小数。
答案 2 :(得分:0)
如果您只是使用&#34; *&#34;符号,当你合成时,你的综合工具将使用它内部决定使用的任何一种乘法器。你不一定会得到你想要的那种四舍五入的行为。您需要自己设计逻辑。
由于您的至少一个输入已签名,因此您需要对输入A和B以及输出使用带符号的reg。