我有以下声明
signal S: SIGNED(7 downto 0); 信号 N:整数;
N<= TO_INTEGER(S);
问题:TO_INTEGER 函数 a sign 会把 'S' 扩展为 32 位整数吗?
谢谢。
这取决于实现。请参见 VHDL 中的Integer 及其子类型。
VHDL 没有指定整数类型的确切位数.
整数不是基于二进制的类型,因此不需要符号扩展。它只是将基于二进制的符号表示转换为当前工具可以使用的整数。我知道的所有工具实现都使用 32 位整数(参考实现实际上不使用所有 32 位,它涵盖 -2^31+1 到 2^31-1 以允许 1s 补码实现)。 VHDL 2019 要求 64 位整数(但我不知道目前有任何工具支持这个)。
问题: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 位二进制二进制补码整数表示的负值少一个。
整数可以转换为二进制值,但没有可观察的位,标量数值类型没有二进制逻辑运算符。