【问题标题】:vhdl signed and unsigned type endianessvhdl 有符号和无符号类型字节序
【发布时间】: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


【解决方案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

【讨论】:

    【解决方案2】:

    在 IEEE 标准 VHDL 综合包中:

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

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

    【讨论】:

    • 引用来自 IEEE Std 1076-2008 16.8.5 使用位和标准逻辑值进行算术运算的包,16.8.5.1 General。 8.4 索引名称 “索引名称表示数组的一个元素。” “表达式指定元素的索引值;数组的每个索引位置都应有一个这样的表达式,并且每个表达式应属于相应索引的类型。对于索引名称的评估,前缀和表达式被求值。如果索引值不属于数组对应索引范围的范围,则会出错。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2013-01-04
    • 2011-10-21
    • 1970-01-01
    • 2019-06-10
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多