vhdl 有符号和无符号类型字节序

问题描述

我正在用充满代数运算的 vhdl 编写代码,并声明了一些有符号变量(我知道有更好的类型,但我需要减少使用的位数)。我想知道是否更好地将它们声明为

variable foo1 := signed (7 downto 0);

variable foo2 := signed (0 to 7);

我知道它与字节序有关,但我很困惑。例如,如果我声明

variable foo3 := signed (0 to 7) := "01100100";

它会被解释为十进制的 100 还是 38?如果我在 foo3 as

上有条件
if (foo3(1) = '1') then
-- whatever you want
endif;

foo3(1) = '1' 是对还是错?

解决方法

为了使 VHDL 的数学包保持一致,最好使用 downto。

variable foo1 : signed (7 downto 0);

这与 numeric_std 包无关。与 numeric_std 包一样,最左边的元素始终是最重要的元素,与您使用 downto 还是 to 无关。对于 numeric_std 也很有趣,该值绝不依赖于索引 - 因此 (15 downto 8) 与 (7 downto 0) 的作用相同。

另一方面,对于 VHDL-2008 的定点和浮点包,唯一支持的方向是向下。实际范围是有意义的。对于固定点,指数具有权重。负指数是小数部分。

variable foo4 : sfixed(7 downto -2) ; -- 8 bits of integer,2 bits of fraction
variable foo5 : sfixed(7 downto 1) ; -- even numbers only.   

有关定点和浮点的更多信息,请参阅: https://synthworks.com/papers/vhdl_fixedfloat_lewis_bishop_date_2007.pdf

有关未签名/已签名的更多信息,请参阅:
https://synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf

,

在 IEEE 标准 VHDL 综合包中:

UNSIGNED 类型代表一个无符号二进制整数 左边的有效位,而类型 SIGNED 代表一个 最高有效位的二进制补码二进制整数 离开。特别地,一个单元素 SIGNED 向量表示 整数值 –1 和 0。

因此无论范围方向如何,数字都将被解释为 100。但是,访问或分配单个元素将与 to 范围匹配,即 foo3(1) = '1'