assign c = 18'sh3_8000; //-0.5 table value (50) times 0.01
assign d = 18'sh0_051E; // 0.02 table value (2) times 0.01
据我所知,它们都是18位带符号的十六进制值。在Binary中表示第二个参数d:
0h51E = 000000010100011110 [对18位二进制补码二进制表示]
当第一位为0时,数字为正数,因此它应该等于:10100011110
转换为十进制数1310.这乘以0.01是13.1,它似乎与提到的'表值'没有对应关系。任何帮助将不胜感激。
干杯,NZBRU。
答案 0 :(得分:2)
我不理解代码中的注释,但十六进制值是有意义的。这些是定点签名号码;在这些示例中,二进制点是从左侧开始的两位(下划线所在的位置)。因此,最左边的位代表2或-2,下一个1和下一个(二进制点的右边)代表0.5,然后是0.25等。
所以,让我们先来看看第一个:
assign c = 18'sh3_8000; //-0.5 table value (50) times 0.01
该表示中的0.5是
18'sb00_1000000000000000
反转所有位并加1(否定两个恭维数的方法)给了我们:
the binary point
|
V
18'sb11_0111111111111111
18'sb00_0000000000000001 +
----------------------------
18'sb11_1000000000000000
因此18'sb11_1000000000000000
或18'h3_8000
代表-0.5。
现在让我们看看另一个数字:
assign d = 18'sh0_051E; // 0.02 table value (2) times 0.01
在二进制文件中,这是18'sb00_0000010100011110
。右侧位(LSB)是2**-16
列。您已将二进制模式10100011110
转换为d'1310
,因此请将其乘以2**-16
:
1310 / 65536 = 0.019989013
与
接近0.021311 / 65536 = 0.020004272
但你去了。