我不明白以下运算
2s – 1
和1 - 2s
在以下表达式中是如何执行的:
R <= (s & '0') - 1;
L <= 1-(s & '0');
考虑到
R
和 L
属于 signed(1 downto 0)
类型,并且 s
属于 std_logic
类型。我从教授笔记中的vhdl
代码片段中提取了它们。
我所理解的(或者至少考虑理解——我推理的前提)
0
文字的串联通过 2
实现乘积(这就是向左移动的作用)。std_logic_vector
(对此不太确定,我从以下 StackOverflow 问题std_logic_vector
对于实现数据总线非常有用,但对于执行算术运算毫无用处”-来源:vhdlwhiz。令我困惑的是:
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
正如你所知,我真的很困惑。我相信在课堂上讨论数据类型时我们只触及了表面,我在解决问题时遇到了很多问题,因为选择了错误的数据类型。
对于我的问题不够清晰,我深表歉意;它们反映了我目前对该主题的理解。谢谢您的耐心等待。
在此实例中,在提供的上下文中,(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
。