【问题标题】:Signed Hexadecimal Value Representation in VerilogVerilog 中的有符号十六进制值表示
【发布时间】:2017-04-06 08:06:55
【问题描述】:

抱歉,如果这是一个简单的问题,但我正在尝试推断一些代码并且我正在努力寻找一些常量的值。下面是用十六进制值定义常量的相关代码。

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 位有符号十六进制值。用二进制表示第二个参数 d:

0h51E = 000000010100011110 [到 18 位二进制补码二进制表示]

由于第一位为 0,因此该数字为正数,因此应等于:10100011110

转换为十进制得到 1310。乘以 0.01 是 13.1,这似乎与提到的“表值”没有对应关系。任何帮助将不胜感激。

干杯,NZBRU。

【问题讨论】:

    标签: hex verilog fpga system-verilog


    【解决方案1】:

    我不理解您代码中的 cmets,但十六进制值是有意义的。这些是定点符号数;在这些示例中,二进制点是左起两位(下划线所在的位置)。因此,最左边的位表示 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
    

    你去吧。

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多