Types 解析中缀表达式“时出现类型错误”;或;as类型std.STANDARD.BOOLEAN

Types 解析中缀表达式“时出现类型错误”;或;as类型std.STANDARD.BOOLEAN,types,vhdl,Types,Vhdl,我很难理解这个错误。据我所知,大部分问题与数据类型有关。为什么我的一些数据默认为布尔值?当它执行A和B时,它应该返回一个std_逻辑值是否正确?有人能解释一下发生了什么吗 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

我很难理解这个错误。据我所知,大部分问题与数据类型有关。为什么我的一些数据默认为布尔值?当它执行A和B时,它应该返回一个std_逻辑值是否正确?有人能解释一下发生了什么吗

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;
ieee库;
使用ieee.std_logic_1164.all;
实体多数是港口(
A、 B,C:在标准逻辑中;
Y:输出标准(U逻辑);
最终多数;
大多数人的行为是
开始

std_逻辑
操作数被传递给
以及
运算符时,它们返回一个std_逻辑,而不是布尔值(正如我在删除的答案中所想的那样)
-
否则
要求条件为布尔值


因此,如注释中所述,您可以执行
Y
((A和B)或(A和C)或(B和C))
返回逻辑('1','0'X','U')结果,但
需要布尔(真/假)参数时。Try((A和B)或(A和C)或(B和C))='1'(很抱歉说“Try”,但我使用Verilog主要是因为这个失败的原因)@Oldfart-omg。。我不敢相信我忽略了这一点。我刚开始做VHDL,所以我肯定会犯一些错误。不过这很有道理@OmarVazquez VHDL 2008包括??将标准逻辑(和位)转换为布尔值的函数。在某些情况下,例如在if和when条件下,此函数是隐式推断的,因此可以使用std_逻辑代替布尔逻辑,并且您的原始示例在编译时不会出现错误消息中的“Resolve”问题,参考IEEE std 1076-2008 12.5(另请参见4.5子程序重载)。在-2008之前,在BNF in 8.1 Wait语句中,条件被定义为返回True或False的*布尔\表达式。在-2008中,它被更改为仅包含条件运算符(9.2.8)的表达式,该运算符可以隐式应用于某些情况(包括这里,您的VHDL在-2008中有效)。如果没有条件运算符,表达式类型就不是布尔型的。虽然你可以说条件的BNF定义不应该有变化(旧定义是隐式条件运算符的驱动力),但2008年以前的错误是由运算符重载(7.1表达式)引起的表达式的类型仅取决于其操作数的类型和应用的运算符;对于重载操作数或运算符,操作数类型的确定或重载运算符的标识取决于上下文(请参见10.5)。“其中10.5是重载解析的上下文)。在VHDL 2008中,会隐式推断出?函数,因此不需要直接与“1”进行比较。显然,在when-else中也会推断出?函数,认为只有在if-else.IEEE Std 1076-2008 9.2.9条件运算符中“在某些情况下,在条件信号分配语句(见10.5.3)中,在信号分配语句或并发信号分配语句中,条件运算符隐式应用于表达式…-之后“。单数表达式由语法9.1 General、BNF、条件_运算符primary强制执行,其中括号(
((A和B)或(A和C)或(B和C))
)中的表达式可以是primary。
Y'0')
可以将xmap参数默认值为“0”的属性简化为
Y