用于寄存器的VHDL代码,用于二进制乘法电路

问题描述 投票:0回答:1

我在二进制乘法电路中为寄存器(制作移位寄存器电路)编写了一段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

但我最终遇到了大多数相同的语法错误。

我很感激有任何帮助来解决这个问题。谢谢。

syntax vhdl cpu-registers binary-logic
1个回答
0
投票

我使用了一个不同的工具来演示错误:

ghdl -a memory.vhdl memory.vhdl:9:9:generate语句必须有标签 memory.vhdl:9:29:预计'生成'而不是'然后' ghdl:编译错误

请注意,分析器抱怨生成语句。这是因为if语句是仅在进程或其他并发语句或子程序中找到的顺序语句。

带有条件方案的生成语句(因此if)是并发进程语句,需要标签。

将if语句放在一个进程中:

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
SOME_PROCESS:
    process (userinput, ab_input, state, sb_input)
    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 process;
end logic;

分析。

注意我将userinputab_inputstatesb_input添加到过程敏感性列表(在任务的右侧显示的所有内容)。

state的存在也提出了另一个观点。 state的新值在当前的模拟周期中不可用。在您的示例中,out_bit的值将是在执行进程之前找到的state的值。

在大多数情况下,if语句条件中的括号是多余的。如果左右评估顺序不足以确定正确的含义(例如混合andor运算符),运算符是函数,函数是表达式,则需要使用括号。

© www.soinside.com 2019 - 2024. All rights reserved.