简单VHDL代码中的IF语法错误

时间:2014-05-25 20:23:05

标签: if-statement syntax vhdl

我是vhdl的新手,我似乎无法在我的代码中找到错误,我不断收到这些错误。

alarm.vhdl (line 19, col 5):  (E10) Syntax error at/before reserved symbol 'if'.
Error occurred within 'ARCHITECTURE' at line 16, column 28 in alarm.vhdl.
alarm.vhdl (line 31, col 9):  (E56) Expected ;, but got IF
alarm.vhdl (line 31, col 9):  (E10) Syntax error at/before reserved symbol 'if'.
alarm.vhdl (line 33, col 4):  (E10) Syntax error at/before reserved symbol 'end'.

我的if语句有问题吗?

library IEEE;
use ieee.std_logic_1164.all;

entity alarm is
  port( master_switch:       in    std_logic;       
        door_sensor:         in    std_logic;
        wheel_sensor:        in    std_logic;
        clock:               in    std_logic;
        Z :                  out   std_logic;
        J :                  in    std_logic_vector(1 downto 0);
        K :                  in    std_logic_vector(1 downto 0);
        Q :                  inout std_logic_vector(1 downto 0);
       Qcomp :               inout std_logic_vector(1 downto 0) );
end alarm;

architecture behav of alarm is

begin
if clock='1' then

J(1) <= Qcomp(1) AND Q(0) AND master_switch AND door_sensor;
K(1) <= Q(0) OR Q(1);

J(0) <= Qcomp(0);
K(0) <= Qcomp(1) OR (Q(0) AND Q(1));

Q(1) <= ((NOT K(1)) AND Q(1)) OR (J(1) AND Qcomp(1));
Q(0) <= ((NOT K(0)) AND Q(0)) OR (J(0) AND Qcomp(0));

Z <= Q(1) AND Qcomp(0);
 end if;
end;
end behav;

2 个答案:

答案 0 :(得分:1)

此处的if语句必须位于一个进程中,其敏感列表中包含clock。 (您也希望使用rising_edge(clock)而不是clock = '1'进行正确的合成)

答案 1 :(得分:0)

关于模糊语法错误消息

alarm.vhdl (line 19, col 5):  (E10) Syntax error at/before reserved symbol 'if'.
Error occurred within 'ARCHITECTURE' at line 16, column 28 in alarm.vhdl.

这是由于保留字之前缺少标签,如果,则认为是生成语句方案。

正如布莱恩所说的那样,if语句是一个顺序语句只能出现在进程或子程序(函数或过程)中。

错误消息的明显质量差来自于如何在解析器中检测到错误。

在架构声明部分中找到的语句是并发语句:

 architecture_statement_part ::=
      { concurrent_statement }

允许零括号或更多并发语句的大括号(架构语句部分可以为空)。

 concurrent_statement ::=
       block_statement
     | process_statement
     | concurrent_procedure_call_statement
     | concurrent_assertion_statement
     | concurrent_signal_assignment_statement
     | component_instantiation_statement
     | generate_statement

块语句以保留字开头。

以保留字流程推迟开头的流程声明。

以过程名称或保留字推迟开头的并发过程调用语句。

以保留字断言开头的并发断言语句。

以信号名称或关键字推迟开头的并发信号分配语句。

以保留字组件开头的组件实例化语句,或保留字实体,或保留字配置或名称一个实体。

所有上述并发语句都可以选择标记,标签位于保留字或名称之前(标识符,可以是选定的名称)。

generate语句的最后一个选项需要一个标签,如果,可以使用保留字

 generate_statement ::=
     generate_label :
         generation_scheme generate
             [ { block_declarative_item }
         begin ]
             { concurrent_statement }
         end generate [ generate_label ] ;

 generation_scheme ::=
      for generate_parameter_specification
   | if condition

 label ::=  identifier

我们发现在强制性标签之后,我们希望看到生成方案,或者由保留字 if 或保留字表示

解析器按顺序测试了这些。您可以注意到concurrent_statement不是终端。各种并发声明之一将是终端制作。如果没有能力在非终端上挂起错误消息,所有内容都将在最后一个并发语句选择(生成语句)中被清除。

而不是告诉你生成语句有什么问题:

ghdl -a alarm.vhdl
alarm.vhdl:19:1: a generate statement must have a label
alarm.vhdl:19:14: 'generate' is expected instead of 'then'

你使用的解析器告诉那里保留字如果那么简单。虽然只有一个并发声明可以启动&#39;如果 if ,则缺少强制性标签。

如果使用语义谓词(例如 entity _name),VHDL解析器可以先行一个进行操作。

有时候可以使用更大的前瞻以避免回溯(这在最后一个并发语句选择中没有意义)。有一个表达式,后跟保留字 then ,它将当前并发语句取消作为生成语句。

可以产生更好的错误消息:

nvc -a alarm.vhdl
** Error: syntax error, unexpected if, expecting process
    File alarm.vhdl, Line 19
    if clock='1' then
    ^^

这确定 if 是不合适的,而不是在标签之前,并且在nvc注意到if语句是顺序语句的情况下,在这种情况下允许使用进程语句。< / p>

(注意Brian的回答说&#34;这里的if声明必须在一个过程中,...&#34;)。

请注意,ghdl和nvc都不会超出此错误。 ghdl将设计描述的当前部分视为生成语句(没有非终端错误消息),而nvc能够处理非终端错误消息(在这种情况下不使用bison构造)。您的工具供应商的解析器会更快地抛出它的手,但会尝试一个糟糕的非终端错误消息。

但是,没有任何借口或需要进一步采取行动:

alarm.vhdl (line 31, col 9):  (E56) Expected ;, but got IF
alarm.vhdl (line 31, col 9):  (E10) Syntax error at/before reserved symbol 'if'.
alarm.vhdl (line 33, col 4):  (E10) Syntax error at/before reserved symbol 'end'.

为什么在解析中的任何错误足以使输出无效时,会尝试使用未知的并发语句?尝试提供更多上下文,但引用行和列以及保留字可能不是这样做的。

你还可以注意到nvc的错误信息可能有缺点。标记if语句,然后得到:

nvc -a alarm.vhdl
** Error: syntax error, unexpected then
    File alarm.vhdl, Line 20
    if clock='1' then
                 ^^^^

这里的缺点是,它并没有告诉你它正在解析生成语句(你也不是工具供应商的解析器)。

虽然ghdl更具体一点:

ghdl -a alarm.vhdl
alarm.vhdl:20:14: 'generate' is expected instead of 'then'
ghdl: compilation error

这三个解析器的共同点之一就是它们都需要VHDL语言专业知识才能解释。

在这些情况下,工具供应商可以提供扩展的叙述,以解释消息的生成方式。

例如,Modelsim有一个错误工具,当提供错误编号时会产生叙述性描述。

在您的情况下,您似乎直接合成了VHDL设计描述。一般来说,综合工具假定您对VHDL有一定的了解,这可能表明您最好首先模拟设计,或者使用不同的分析器根据复杂性来解决语法错误。

您的错误消息似乎来自赛普拉斯的WARP,Reference Manual(1996,PDF,1.4 MB)告诉我们:

  

E10:保留符号'%s'之前/之前的语法错误。
  您以非法方式使用保留字,例如,作为信号或变量名称。

你可以看到这个消息有点不太有帮助。

WARP被认为是过时的,旨在支持已停产的CPLD产品线,并在2012年停产,否则缺乏支持。它强化了使用其他工具分析VHDL设计的概念。