首页 > 解决方案 > 类型错误将中缀表达式“或”解析为 std.STANDARD.BOOLEAN

问题描述

我无法理解错误。在大多数情况下,我理解问题与数据类型有关。为什么我的一些数据默认为 BOOLEAN?当它执行 A AND B 时,它应该返回一个正确的 std_logic 值吗?有人可以解释发生了什么吗?

library ieee;
use ieee.std_logic_1164.all;

entity Majority is port (
    A, B, C : in std_logic;
    Y: out std_logic);

end Majority;


architecture behavioral of Majority is
    begin
    Y <= '1' when ((A AND B) OR (A AND C) OR (B AND C)) else
         '0';

end architecture behavioral;

标签: typesvhdl

解决方案


andand运算符在将操作数传递给它们or时返回 std_logicstd_logic而不是布尔值(正如我在已删除的答案中所想的那样)。when-else要求条件是布尔值。

因此,如评论中所述,您可以Y <= '1' when ((A AND B) OR (A AND C) OR (B AND C)) = '1' else '0';将返回 a 的表达式转换std_logic为布尔值,以便可以在 when-else 结构中使用它。

然而,这种结构是多余的。你可以去: Y <= (A AND B) OR (A AND C) OR (B AND C);。条件返回 a std_logic,因此您可以直接分配它。

或者另外使用 VHDL 2008 “??” 运营商

VHDL-2008 引入了一个新的运算符,??。它被称为条件运算符,它将 STD_LOGIC 表达式转换为 BOOLEAN 表达式:'1' 和 'H' 被认为是 TRUE,其他一切都是 FALSE。(它还将 BIT 转换为 BOOLEAN 。)

这 ??运算符在 when-else 结构中自动应用,因此使用 VHDL 2008,您的代码应该可以工作。


推荐阅读