需要澄清涉及 std_logic_vector、无符号和文字的 VHDL 表达式,不确定编译器解释

问题描述 投票:0回答:1

我不明白以下运算

2s – 1
1 - 2s
在以下表达式中是如何执行的:


R <= (s & '0') - 1;

L <= 1-(s & '0');

考虑到

R
L
属于
signed(1 downto 0)
类型,并且
s
属于
std_logic
类型。我从教授笔记中的
vhdl
代码片段中提取了它们。

我所理解的(或者至少考虑理解——我推理的前提)

  1. 0
    文字的串联通过
    2
    实现乘积(这就是向左移动的作用)。
  2. 串联还实现了 2 位的
    std_logic_vector
    (对此不太确定,我从以下 StackOverflow 问题
  3. 中的评论中推断出这一点)
  4. std_logic_vector
    对于实现数据总线非常有用,但对于执行算术运算毫无用处”-来源:vhdlwhiz

令我困惑的是:

  1. 编译器解释
    1
    文字是什么类型?
    • 整数?如果是这样,是否可以在不使用
      integer
      的算术表达式中进行转换的情况下使用
      std_logic_vector
      ?这个选项对我来说似乎不太合理......
    • 假设
      (s & '0')
      确实被解释为
      std_logic_vector
      (第二个前提),我还想到编译器基于表达式中其他操作数的类型(即
      (s & '0')
      )的可能性),推断
      1
      也是
      std_logic_vector
      类型。然而,即使
      (s & '0')
      1
      都被解释为
      std_logic_vector
      ,根据我的第三个前提,它们的行为不应该正确。
      • 为了证明两个操作数都是

        std_logic_vector
        类型的可能性,我想到的一个想法是,
        (s & '0')
        1
        都被编译器隐式转换为
        signed
        ,因为它承认以下事实:存储结果的信号的类型为
        signed
        。这对我来说似乎没有意义(假设
        s
        等于
        1
        ):
        R <= (s & '0') - 1;

        两个操作数都转换为

        std_logic_vectors(1 downto 0)
        R <= "10" - "01"

        现在,如果 std_logic_vectors 的内容被解释为

        signed
        ,则减法的结果将是
        R <= (-2) - (1) = -3

正如你所知,我真的很困惑。我相信在课堂上讨论数据类型时我们只触及了表面,我在解决问题时遇到了很多问题,因为选择了错误的数据类型。

对于我的问题不够清晰,我深表歉意;它们反映了我目前对该主题的理解。谢谢您的耐心等待。

math types vhdl unsigned ieee
1个回答
0
投票

在此实例中,在提供的上下文中,(s & '0') 不会创建 std_logic_vector,而是创建

signed
。 VHDL 是一种上下文驱动语言。因为
std_logic_vector
上没有可用的算术,并且
L
R
的类型有符号,所以算术必须是签名的(来自 ieee.numeric_std):

function "-" (L: NATURAL; R: SIGNED) return SIGNED;
function "-" (L: SIGNED;  R: NATURAL) return SIGNED;

numeric_std 包提供了上述有符号类型和整数类型之间的算术函数,因此

1
值在
"-"
函数内部转换为与其他操作数相同,在本例中为 2 位的
signed

© www.soinside.com 2019 - 2024. All rights reserved.