我在二进制乘法电路中为寄存器(制作移位寄存器电路)编写了一段VHDL代码 . 一旦我在Quartus II中对它进行了分析,就会显示几个语法错误 .
这是我的代码:
ENTITY memory IS
PORT (can_load, can_shift, can_ad, sb_input, ab_input, UserInput : IN BIT;
Out_Bit, Z : OUT BIT);
END memory;
ARCHITECTURE logic OF memory IS
SIGNAL State: BIT := '0';
BEGIN
IF (can_load = '1') THEN
State <= UserInput;
ELSE
IF (can_ad = '1') THEN
Z <= State; --Z is the output that goes to the 4 bit adder
State <= ab_input;
END IF;
IF (can_shift = '1') THEN
Out_Bit <= State;
State <= sb_input;
END IF;
END IF;
END logic;
这是错误消息:
信息:************************************************ *******************
信息:运行Quartus II 64位分析和综合信息:版本14.0.0 Build 200 06/17/2014 SJ Web Edition信息:处理已开始:Sun Oct 19 16:28:22 2014 Info:Version 14.0.0 Build 200 06 / 17/2014 SJ网络版信息:处理开始:2014年10月19日星期日16:28:22
信息:命令:quartus_map --read_settings_files = on --write_settings_files = off memory -c memory
警告(20028):并行编译未获得许可并已被禁用
错误(10500):在文本“IF”附近的memory.vhd(9)处的VHDL语法错误;期望“结束”,或“(”或标识符(“if”是保留关键字)或并发语句
错误(10500):在文本“THEN”附近的memory.vhd(9)处出现VHDL语法错误;期待“<=”
错误(10500):在文本“ELSE”附近的memory.vhd(11)处出现VHDL语法错误;期望“结束”,或“(”或标识符(“else”是保留关键字)或并发语句
错误(10500):在memory.vhd(12)附近文本“THEN”的VHDL语法错误;期待“<=”
错误(10500):在文本“IF”附近的memory.vhd(15)处的VHDL语法错误;期待“;”或标识符(“if”是保留关键字)或“架构”
错误(10500):在文本“THEN”附近的memory.vhd(16)处出现VHDL语法错误;期待“<=”
错误(10500):在文本“IF”附近的memory.vhd(19)处的VHDL语法错误;期待“;”或标识符(“if”是保留关键字)或“架构”
信息(12021):在源文件memory.vhd中找到0个设计单元,包括0个实体
我已经检查了几本书的正确语法和代码示例,但我找不到我的错误 .
我也尝试在这样的部分中删除括号:
IF (can_load = '1') THEN
有这样的事情:
IF can_load = '1' THEN
但我最终遇到了大多数相同的语法错误 .
我很感激有任何帮助来解决这个问题 . 谢谢 .
1 回答
我使用了一个不同的工具来演示错误:
请注意,分析器抱怨生成语句 . 这是因为if语句是仅在进程或其他并发语句或子程序中找到的顺序语句 .
带有条件方案的generate语句(因此
if
)是并发进程语句,需要标签 .将if语句放在一个进程中:
分析 .
注意我将
userinput
,ab_input
,state
和sb_input
添加到过程敏感性列表(在任务右侧显示的所有内容) .state
的存在也提出了另一点 .state
的新值在当前模拟循环中不可用 . 在您的示例中,out_bit
的值将是在执行进程之前找到的state
的值 .在大多数情况下,if语句条件中的括号是多余的 . 如果左右评估顺序不足以确定正确的含义(例如,混合
and
和or
运算符),运算符是函数,函数是表达式,则需要使用括号 .