有限状态机的IF-ELSE块中的VHDL语法错误

时间:2013-03-29 19:53:09

标签: syntax vhdl

IF (((SW(17) = '0') OR ((SW(17) = '1') AND (SW(16) = '0'))) OR ((SW(17) = 1) AND (SW(16) = 0) AND (SW(14) = 1)) AND (tempCounter = 1)) THEN
           next_state <= STATE1;
           resetTempCounter <= '1';
        ELSE
           next_state <= STATE0;
        END IF;

上面的代码会引发语法错误。我检查了括号,我不认为这是问题所在。我最初打破了长队并认为这是问题,但事实并非如此。我也应该告诉你代码在进程声明中,这不是问题。

错误

错误(10500):Lab4b.vhd(241)处文本“AND”附近的VHDL语法错误;期待“)”或“,”

错误(10500):Lab4b.vhd(244)附近文本“ELSE”的VHDL语法错误;期待“结束”,或“(”或标识符(“else”是保留关键字)或顺序语句

我是VHDL编程的新手,所以请耐心等待,我将非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

假设SW被声明为bit_vectorSTD_LOGIC_VECTOR,您的比较运算符错误:请记住bitSTD_LOGIC是真正枚举的类型,包含模仿“真实”值的值,而不是整数(在这种情况下01将作出有效选择)。

因此,您需要做的就是在这种情况下在01周围添加撇号。检查这是否有效(同时假设tempCounterSTD_LOGICbit类型信号):

(((SW(17) = '0') OR ((SW(17) = '1') AND (SW(16) = '0'))) OR ((SW(17) = '1') AND (SW(16) = '0') AND (SW(14) = '1')) AND (tempCounter = '1'))

答案 1 :(得分:0)

让我以不同的方式撰写您的陈述以表明问题:

A = ((SW(17) = '0') OR ((SW(17) = '1') AND (SW(16) = '0')))
B = ((SW(17) = '1') AND (SW(16) = '0') AND (SW(14) = '1'))
C = (tempCounter = '1')
你现在有了:

if A or B and C then
   ...
通过编写例如:

,可以解决问题
if (A or B) and C then
   ...

if A or (B and C) then
   ...

答案 2 :(得分:0)

重新格式化该行,问题更容易发现...

IF (((SW(17) = '0') OR ((SW(17) = '1') AND (SW(16) = '0'))) 
 OR ((SW(17) = 1) AND (SW(16) = 0) AND (SW(14) = 1))
 AND (tempCounter = 1)) THEN

在一个地方,SW(17) = '0' - 这是std_logic或位值。正确的。
在另一个,SW(17) = 1 - 这是一个整数,......不是那么多。

我相信太多的括号从清晰度中扣除,我会减少

(((SW(17) = '0') OR ((SW(17) = '1') AND (SW(16) = '0'))) 
 ... )

((SW(17) = '0' OR (SW(17) = '1' AND SW(16) = '0')) 
 ... )

减少一点混乱。谁知道,你可能会发现这个简单的拼写错误而不那么混乱?