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

If statement 简单VHDL代码中的IF语法错误,if-statement,syntax,vhdl,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

我对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;
IEEE库;
使用ieee.std_logic_1164.all;
实体报警为
端口(主开关:标准逻辑中;
门传感器:在标准逻辑中;
车轮传感器:标准逻辑;
时钟:标准逻辑;
Z:输出标准逻辑;
J:标准逻辑向量(1到0);
K:标准逻辑向量(1到0);
Q:inout标准逻辑向量(1到0);
Qcomp:inout标准逻辑向量(1到0);
结束报警;
报警的体系结构表现为:
开始
如果时钟=1,那么

J(1)此处的
if
语句必须处于一个过程中,其灵敏度列表中包含
clock
。(您还希望使用
上升沿(时钟)
而不是
时钟='1'
进行正确的合成)

处理模糊的语法错误消息

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之前缺少标签造成的,假定该保留字是生成语句方案

正如Brian所说,作为顺序语句的if语句只能出现在进程或子程序(函数或过程)中

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

架构(architecture)语句部分中的语句是并发语句:

 architecture_statement_part ::=
      { concurrent_statement }
花括号表示允许零个或多个并发语句(架构语句部分可以为空)

block语句以保留字block开头

以保留字processDELATED开头的process语句

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

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

一种并发信号分配语句,以信号名称或关键字开始

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

以上所有并发语句都可以选择性地进行标记,标记在保留字或名称(标识符,可以是选定名称)之前

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表示,或者由保留字for表示

 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
解析器按顺序对这些进行了测试。您可以注意到并发_语句不是一个终端。各种并发语句之一是终端产品。如果没有在非终端上挂起错误消息的能力,所有内容都将在最后一个并发语句选择(generate语句)中被清除

而不是告诉您generate语句有问题:

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'
您使用的解析器告诉您,保留字if周围有错误。虽然只有一个并发语句可以“开始”为if,但没有强制性标签

假设使用了语义谓词(例如,实体名称),VHDL解析器可以在先行一步的情况下运行

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

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

nvc -a alarm.vhdl
** Error: syntax error, unexpected if, expecting process
    File alarm.vhdl, Line 19
    if clock='1' then
    ^^
这决定了在没有标签的情况下,if是不合适的,如果nvc注意到if语句是一个顺序语句,则允许在这种情况下使用process语句

(注意Brian的回答是“这里的
if
语句必须在一个过程中,…”)

请注意,ghdl和nvc都没有超出此错误。ghdl将设计描述的当前部分视为generate语句(无非终端错误消息),而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
                 ^^^^
这里的缺点是,它不会告诉您它正在解析一个generate语句(您也不是工具供应商的解析器)

虽然ghdl变得更具体一些:

ghdl -a alarm.vhdl
alarm.vhdl:20:14: 'generate' is expected instead of 'then'
ghdl: compilation error
这三种解析器的一个共同点是,它们都需要VHDL语言专业知识来解释

在这些情况下,工具供应商可以选择性地提供扩展的叙述来解释消息是如何产生的

例如,Modelsim有一个verror功能,当提供错误号时,它会生成叙述性描述

在您的例子中,您似乎是在直接合成VHDL设计描述。一般来说,合成工具假定对VHDL有一定的了解,