1

我正在用 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 次。我究竟做错了什么?

4

2 回答 2

2

和不平衡,所以你必须用更多来关闭if,或者用代替。end ififend ifelsifelse if

你写:

if ... then
  ...
else if ... then
  ...
end if;

即使您的缩进显示出这种平衡,但事实并非如此,因为正确的缩进将是:

if ... then
  ...
else 
  if ... then
    ...
  end if;

那么很明显ifend if不平衡。

如果你使用elsif你可以写成:

if ... then
  ...
elsif ... then
  ...
end if;
于 2013-09-17T10:25:22.183 回答
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 then 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'”。IE:

   if FULL then  -- Full Step
      if RIGHT then

或者,您可以将它们连接成一个变量并使用 case 语句。我的建议是始终编写可读性代码。

于 2013-09-17T17:18:27.480 回答