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

vhdl signed and unsigned type endianess

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

是否更好
variable foo1 := signed (7 downto 0);

variable foo2 := signed (0 to 7);

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

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

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

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 到 8)与(7 到 0)的工作方式相同。

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

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 综合包中:

The type UNSIGNED represents an unsigned binary integer with the most significant bit on the left, while the type SIGNED represents a two’s-complement binary integer with the most significant bit on the left. In particular, a one-element SIGNED vector represents the integer values –1 and 0.

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