If statement 简单VHDL代码中的IF语法错误
我对vhdl非常陌生,我似乎无法在我的代码中找到错误,我一直收到这些错误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
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开头
以保留字process或DELATED开头的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有一定的了解,