我正在用VHDL制作一个状态机。我的情况是在出错时抛出意外
case state IS
--state 1 A
WHEN s0=>
--Half step
if(FULL = '0' AND RIGHT = '1') then
state <= s1;
else if (RIGHT = '0') then
state <= s7;
end if;
--Full step
if (FULL = '1' AND RIGHT = '1') then
state <= s2;
else if (RIGHT = '0') then
state <= s6;
end if;
--State 2 A&B
WHEN s1=>
if(RIGHT = '0') then
state <= s0;
else if (RIGHT = '1') then
state <= s2;
end if;
但是,在使用xilinx ISE运行语法检查时,我遇到了
ERROR:HDLParsers:164 Line 72. parse error, unexpected WHEN, expecting END
这总共发生了8次。我做错了什么?
答案 0 :(得分:2)
if
和end if
不均衡,因此您需要关闭if
多一些end if
,或使用elsif
代替{ {1}}。
你写道:
else if
即使通过你的缩进显示这类似平衡,也不是,因为正确的缩进将是:
if ... then
...
else if ... then
...
end if;
然后很明显,if ... then
...
else
if ... then
...
end if;
和if
不平衡。
如果您使用end if
,可以将其写为:
elsif
答案 1 :(得分:0)
完成@MortenZdk建议的修正后,您还需要考虑逻辑。在下文中,您将永远不会进入状态s7,因为为完整步骤完成的分配将始终覆盖它。
WHEN s0=>
--Half step
if(FULL = '0' AND RIGHT = '1') then
state <= s1;
elsif (RIGHT = '0') then
state <= s7;
end if;
--Full step
if (FULL = '1' AND RIGHT = '1') then
state <= s2;
elsif (RIGHT = '0') then
state <= s6;
end if;
对于这个例子,我建议将其重写为嵌套if if else。避免最终的elsif也是一个好习惯。
WHEN s0=>
if (FULL = '1') then -- Full Step
if (RIGHT = '1') then
state <= s2;
else
state <= s6;
end if;
else --Half step
if (RIGHT = '1') then
state <= s1;
else
state <= s7;
end if;
end if;
我喜欢VHDL-2008以来的高效检查,一旦你的综合工具支持它,你就可以省去“='1'”。即:
if FULL then -- Full Step
if RIGHT then
或者,您可以将它们连接成一个变量并使用case语句。我的建议是始终编写可读性代码。