问题描述
我正在用充满代数运算的 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'
。