VHDL 中的 TO_INTEGER 转换函数

问题描述 投票:0回答:3

我有以下声明

signal S: SIGNED(7 downto 0); 信号 N:整数;

N<= TO_INTEGER(S);

问题:TO_INTEGER 函数 a sign 会把 'S' 扩展为 32 位整数吗?

谢谢。

vhdl
3个回答
0
投票

这取决于实现。请参见 VHDL 中的Integer 及其子类型

VHDL 没有指定整数类型的确切位数.


0
投票

整数不是基于二进制的类型,因此不需要符号扩展。它只是将基于二进制的符号表示转换为当前工具可以使用的整数。我知道的所有工具实现都使用 32 位整数(参考实现实际上不使用所有 32 位,它涵盖 -2^31+1 到 2^31-1 以允许 1s 补码实现)。 VHDL 2019 要求 64 位整数(但我不知道目前有任何工具支持这个)。


0
投票

问题:TO_INTEGER 函数 a sign 将'S'扩展为 32 位整数吗?

来自 IEEE Std 1076.3-1997 numeric_std 包:

  -- Id: D.2
  function TO_INTEGER (ARG: SIGNED) return INTEGER is
    variable XARG: SIGNED(ARG'LENGTH-1 downto 0);
  begin
    if (ARG'LENGTH < 1) then
      assert NO_WARNING
          report "NUMERIC_STD.TO_INTEGER: null detected, returning 0"
          severity WARNING;
      return 0;
    end if;
    XARG := TO_01(ARG, 'X');
    if (XARG(XARG'LEFT)='X') then
      assert NO_WARNING
          report "NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0"
          severity WARNING;
      return 0;
    end if;
    if XARG(XARG'LEFT) = '0' then
      return TO_INTEGER(UNSIGNED(XARG));
    else
      return (- (TO_INTEGER(UNSIGNED(- (XARG + 1)))) -1);
    end if;
  end TO_INTEGER;

输入是一个有符号数组类型的值。在最后一个 if 语句中检查输入的最左边的元素(符号)。如果为“0”(正数或零的二进制补码表示),则不会对因将数组值转换为无符号数而返回的整数值进行任何调整。如果为“1”,则返回转换后数组值的无符号二进制补码。测试符号位比与 0 的幅度比较省力。

TO_INTEGER 无符号函数重载:

-- Id: D.1
  function TO_INTEGER (ARG: UNSIGNED) return NATURAL is
    constant ARG_LEFT: INTEGER := ARG'LENGTH-1;
    alias XXARG: UNSIGNED(ARG_LEFT downto 0) is ARG;
    variable XARG: UNSIGNED(ARG_LEFT downto 0);
    variable RESULT: NATURAL := 0;
  begin
    if (ARG'LENGTH < 1) then
      assert NO_WARNING
          report "NUMERIC_STD.TO_INTEGER: null detected, returning 0"
          severity WARNING;
      return 0;
    end if;
    XARG := TO_01(XXARG, 'X');
    if (XARG(XARG'LEFT)='X') then
      assert NO_WARNING
          report "NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0"
          severity WARNING;
      return 0;
    end if;
    for I in XARG'RANGE loop
      RESULT := RESULT+RESULT;
      if XARG(I) = '1' then
        RESULT := RESULT + 1;
      end if;
    end loop;
    return RESULT;
  end TO_INTEGER;

简单地将二进制值转换为自然整数子类型值,而不考虑符号。

没有值范围检查转换后的二进制值是否在实现定义的类型整数值范围内,也没有隐含的底层模拟内核整数实现。

VHDL 不公开由一系列值和一组操作定义的整数类型的底层实现。每个实现都必须满足一个最小范围(-2147483647 到 +2147483647,在 -2019 之前),它比 32 位二进制二进制补码整数表示的负值少一个。

整数可以转换为二进制值,但没有可观察的位,标量数值类型没有二进制逻辑运算符。

© www.soinside.com 2019 - 2024. All rights reserved.