首页 文章

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

提问于
浏览
0

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

  • 0

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

    ghdl -a memory.vhdl memory.vhdl:9:9:一个generate语句必须有一个标签memory.vhdl:9:29:'generate'是预期的而不是'then'ghdl:编译错误

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

    带有条件方案的generate语句(因此 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 运算符),运算符是函数,函数是表达式,则需要使用括号 .

相关问题