Vhdl 为什么第56-61行出现错误?
我试图在实验室为状态机设置一个问题,并且在尝试用Quartus编译时不断收到错误 我尝试过使用逗号和else语句,但似乎没有任何效果Vhdl 为什么第56-61行出现错误?,vhdl,Vhdl,我试图在实验室为状态机设置一个问题,并且在尝试用Quartus编译时不断收到错误 我尝试过使用逗号和else语句,但似乎没有任何效果 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.All; ENTITY SM_VHDL IS -- Do not modify this entity statement! PORT(X : IN STD_LOGIC_VECTOR(1 DOWNTO 0); RESETN, CLOCK
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.All;
ENTITY SM_VHDL IS -- Do not modify this entity statement!
PORT(X : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
RESETN,
CLOCK : IN STD_LOGIC;
Z : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(1 DOWNTO 0) );
END SM_VHDL; -- Do not modify this entity statement!
ARCHITECTURE behavior of SM_VHDL IS
TYPE STATE_TYPE IS (A, B, C);
SIGNAL state : STATE_TYPE;
BEGIN
PROCESS(CLOCK, RESETN)
BEGIN
IF RESETN = '0' THEN
state <= A;
ELSIF CLOCK'EVENT AND CLOCK = '1' THEN
CASE state IS
WHEN A =>
CASE X IS
WHEN "00" =>
state <= B;
WHEN "11" =>
state <= C;
WHEN OTHERS =>
state <= A;
END CASE;
WHEN B =>
CASE X IS
WHEN "10" =>
state <= A;
WHEN "11" =>
state <= C;
WHEN OTHERS =>
state <= B;
END CASE;
WHEN C =>
CASE X IS
WHEN "00" =>
state <= B;
WHEN "01" =>
state <= A;
WHEN OTHERS =>
state <= C;
END CASE;
END CASE;
END IF;
END PROCESS;
Z <= '1' WHEN C;
'0' WHEN A;
'0' WHEN B;
Q <= "00" WHEN A;
"01" WHEN B;
"10" WHEN C;
"11" WHEN "-";
END behavior;
IEEE库;
使用IEEE.STD_LOGIC_1164.All;
实体SM_VHDL是--不要修改此实体语句!
端口(X:STD_逻辑_向量中(1到0);
重置,
时钟:标准逻辑;
Z:输出标准逻辑;
Q:输出标准逻辑向量(1到0);
结束SM_VHDL;——不要修改此实体语句!
SM_VHDL的体系结构行为是
类型状态_类型为(A、B、C);
信号状态:状态_型;
开始
进程(时钟,重置)
开始
如果RESETN='0',则
说明分配给Z
和Q
的语法对于多个问题是错误的:
- 在分配之前,缺少状态选择的
。
- 在
之间使用“;”当
零件时,请改用,
- 不能在上次
之后使用“-”
(不在乎)当时,请使用其他
因此,更新代码:
WITH state SELECT Z <=
'1' WHEN C,
'0' WHEN A,
'0' WHEN B;
WITH state SELECT Q <=
"00" WHEN A,
"01" WHEN B,
"10" WHEN C,
"11" WHEN OTHERS;
带状态选择Z时只能与布尔条件一起使用。A/B/C都是状态类型的文字。您需要通过在状态信号上创建比较来创建布尔结果:
Z <= '1' when STATE = C
else '0' when STATE = A -- This state not actually needed as a single ELSE would cover it
else '0';
Z when没有“others”选项,您需要使用else,并且在“when”中没有逗号分隔大小写,您再次使用else。@技巧:原始代码有语法错误,因此很难说是什么结构。我的建议是,根据VHDL-2008标准§9.3.3.1(第480页),添加带有状态选择…
的,从而使分配成为同时选择的信号分配,可以选择其他
。您发布的答案建议使用并发条件信号分配,这也是纠正代码的一种方法,这需要布尔表达式作为条件。请参阅对其他答案的评论,因为当
不总是需要布尔值时,为什么。IEEE Std 1076-2008中有一个条件运算符(见9.2.9)可以在条件信号赋值语句中隐式应用。隐式运算符仅在条件无法提供布尔结果时应用。语法糖的一种形式。使用方法相当直观,适用于条件,而不适用于所选的信号分配选择,如Morten的回答所示,该回答详细阐述了一个过程,并给出了等效的案例陈述(10.5.4、10.9、14.5.5)。有条件的信号分配用于包含if语句的进程*10.5.3、10.8、14.5.5)。@user1155120+1引用9.2.9,但我想知道这是否是个好主意。在我看来,?
上的隐式转换只是一种绕过强类型的惰性方式。这真的打破了语言吗?添加一种新的数据类型(logic
??)更有意义,它可以解释为bit
或boolean
。IIRC,这是为了在PSL条件中允许bit
。@EML调用隐式条件运算符在语义上是干净的。运算符仅应用于要求为布尔类型(语法上为条件)的主表达式,而不是。对于非预定义类型,重载解析用于确定实现条件运算符的函数的可见性。问题在于有一个隐式操作符,道德高地早已失去,有隐式等待语句、延迟模型、默认值和模式。还有更严重的愤怒。@user1155120语义清晰,是的,意思明确。但是请考虑<代码>如果MyLoButs现在是有效的VHDL,但是<代码> MyiBIT和MyAbOOL 不是,没有明确的重载<代码>和< /代码>。有些东西坏了,不管你是否喜欢打字(我不是)。类型实际上是什么已经没有明确的定义了。一个对象的类型意味着用任何理性的语言来描述它的解释和意义。在VHDL中,这种花招意味着它不再使用,因为类型现在由上下文决定。