案件抛出意外的时候

时间:2013-09-17 09:41:58

标签: case vhdl state-machine fpga xilinx

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

2 个答案:

答案 0 :(得分:2)

ifend 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语句。我的建议是始终编写可读性代码。