我是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;
答案 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设计的概念。