【发布时间】:2020-12-29 22:16:50
【问题描述】:
我正在用 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' 是真还是假?
【问题讨论】:
-
这里
foo3的默认值的数值是十进制的 100,并且 if 语句条件将是 TRUE,而在声明后没有中间赋值。最左边的元素是最重要的。提供算术运算符重载的函数使用从操作数长度派生的降序排列的带有子类型指示的别名,以在内部将最右边的元素指定为 (0)。返回的结果将按降序排列,因此赋值将最左端与最左端关联并需要匹配元素,从而提供隐式子类型转换。 -
您可以通过模拟自己演示问题的答案。例如,包 numeric_std 可以将有符号值转换为整数,例如
report "foo3 = " & integer'image(to_integer(foo3));适用于所有符合 INTEGER 类型最小范围的有符号值。您也可以分配元素并检查结果值。
标签: vhdl endianness signed