在Verilog中签名的十六进制值表示

时间:2017-04-06 08:06:55

标签: hex verilog fpga system-verilog

如果这是一个简单的问题,请写道歉,但我试图推断一些代码,我正在努力寻找一些常量的值。以下是使用十六进制值定义常量的相关代码。

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。

1 个答案:

答案 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_100000000000000018'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.02
1311 / 65536 = 0.020004272

但你去了。