大概clk
是一个 std_logic 类型的信号。
在没有看到您的实际错误消息的情况下,有问题的行是:
a <= clk and clk'event;
该'event
属性返回一个 BOOLEAN 类型。 clk
似乎符合隐式条件运算符 ( ??
),IEEE Std 1076-2008) 的条件,该运算符也返回 BOOLEAN 类型。
不幸的a
是,对 std_logic (std_ulogic) 的基本类型的隐式声明的信号赋值是一个基本操作,并且要求输入类型与目标类型匹配。
VHDL 是强类型的,如果没有类型转换,就不能将 BOOLEAN 分配给 std_logic。
此外,分配给a
将是一个增量周期长,实际上是一个毛刺或脉冲。
目前尚不清楚它在综合中是否有任何有用的意义。
输出o
将在s1
期间a = '1'
,否则s2
,除了不包括 的敏感度列表a
。
您可以通过使用不同的分配类型(例如条件信号分配)在仿真中演示单增量周期长脉冲:
a <= '1' when clk = '1' and clk'event else
'0';
其中作为并发条件赋值,条件产生一个 BOOLEAN,目标是当条件为 TRUE 时与 std_logic 兼容的“1”枚举文字,或当 FALSE 时为“0”枚举文字。
因为a
它不在过程的敏感度列表中,因为顺序条件信号分配o
始终是s2
.
如果您使用符合旧标准的 VHDL 工具,则条件信号分配语句在此过程中将不起作用。
您可以使两个赋值语句同时进行信号赋值,它们最终将作为具有适当敏感性列表等效项的单独等效进程(等待语句作为每个语句的最后一个语句)。