Compilation 请帮助我解决VHDL编译错误 IEEE库; 使用IEEE.std_logic_1164.all; 实体门锁是 端口(复位:在std_逻辑中; 启用:在std_逻辑中; 密码:标准逻辑向量(7到0); 门:输出标准逻辑向量(7到0); 锁定:关断标准逻辑; 报警:输出标准逻辑; 关断:输出标准(U逻辑); 端门锁; --密码为10(十进制编号),即00010000(二进制编号) 门锁的DDL体系结构是 信号错误计数:整数范围0到5:=0; 开始 首先,“请帮帮我”不是一个好问题。最好是类似“Modelsim error”这样的“编译时”无法读取输出

Compilation 请帮助我解决VHDL编译错误 IEEE库; 使用IEEE.std_logic_1164.all; 实体门锁是 端口(复位:在std_逻辑中; 启用:在std_逻辑中; 密码:标准逻辑向量(7到0); 门:输出标准逻辑向量(7到0); 锁定:关断标准逻辑; 报警:输出标准逻辑; 关断:输出标准(U逻辑); 端门锁; --密码为10(十进制编号),即00010000(二进制编号) 门锁的DDL体系结构是 信号错误计数:整数范围0到5:=0; 开始 首先,“请帮帮我”不是一个好问题。最好是类似“Modelsim error”这样的“编译时”无法读取输出,compilation,vhdl,Compilation,Vhdl,第二点:这个错误非常具有描述性。无法读取输出“报警”报警声明为 lock <= '1' when (door = "11111111" and turnoff = '0' and alarm = '0'); 因此,它是一个输出端口。在2008年以前的VHDL中,不允许读取输出端口。接下来,编译器将提示如何修复它: “VHDL 2008允许读取输出。此功能通过使用-2008编译启用。” 那就这么做吧! 在modelsim编译窗口中,选择“默认选项” 然后设置为VHDL-2008 或者,

第二点:这个错误非常具有描述性。无法读取输出“报警”<代码>报警声明为

lock <= '1' when (door = "11111111" and turnoff = '0' and alarm = '0');
因此,它是一个输出端口。在2008年以前的VHDL中,不允许读取输出端口。接下来,编译器将提示如何修复它:

“VHDL 2008允许读取输出。此功能通过使用-2008编译启用。”

那就这么做吧! 在modelsim编译窗口中,选择“默认选项”

然后设置为VHDL-2008

或者,您可以实际执行命令行中描述的操作(添加
-2008
):

vcom-报告进度300-工作-2008 doorlock.vhd

瞧。完了!不是吗


不,等等,还是不行! 您有多个驱动程序错误。第23行指出:

alarm : out std_logic;
因为将
'0'
连接到
'1'
相当于短路

让我们来看看正确的设计。您现在在更改
密码时触发。不太好,但这是可能的。我会使用另一个触发器,比如未使用的
enable
信号。但无论如何:我们引入了一个额外的信号来检测更改
密码\u延迟
。但更重要的是,我们引入了一个时钟。在数字硬件中,大多数系统使用时钟。最后,我们使用新的VHDL-2008语句
case?
来解码“不在乎”

VHDL-2008代码一起变成:

resolve("00000000", "00000001") = "0000000X"
IEEE库;
使用IEEE.std_logic_1164.all;
实体门锁是
港口(
clk:标准逻辑中;
复位:在标准逻辑中;
启用:在std_逻辑中;
密码:标准逻辑向量(7到0);
门:输出标准逻辑向量(7到0);
锁定:关断标准逻辑;
报警:输出标准逻辑;
关断:输出标准逻辑
);
端门锁;
--密码为10(十进制编号),即00010000(二进制编号)
门锁的DDL体系结构是
信号密码延迟:标准逻辑向量(密码范围):=密码;
使用ieee.numeric\u std\u unsigned.all;
信号错误计数:整数范围0到5:=0;
开始
clk_进程:进程(clk)开始
如果上升沿(clk),则
如果重置='0',则
门“0”);

锁定错误消息说明了整个情况:输出端口超出模块,无法读取。您只能读取输入端口和信号。您可以为
报警
关闭
定义内部信号并将它们分配给输出端口,或者使用VHDL-2008,它允许读取输出端口。将编译器设置为VHDL-2008模式,或者开始使用中间信号。P.s。如果你要使用VHDL—2008,考虑使用<代码>外壳> <代码>语句,而不是这个IF-ELSIF ELSIF等结构。请考虑使用一个时钟并把所有的作业放在一个过程中。@ JHBonarius,你在评论中只写了完整的答案。你为什么不给他们写一个答案呢?非常感谢,但我能再问你一个问题吗?我编写了完全相同的代码并模拟了它,但输出并没有随着输入的改变而改变。在我的课堂上,30分钟关于vhdl的讲座不足以解决这个问题;(@JinHoyong学习要比30分钟的讲座多得多(顺便说一句,30分钟很短)当前位置阅读书籍、做练习等。使用别人的代码不是学习。我是一所大学的家庭教师,如果我看到某人的家庭作业包含该人还不知道的代码,我会让该学生来解释代码。如果他/她不能,我会让他/她在课程中不及格。所以不要使用你无法解释的代码....
door <= "00000000" when (reset = '0');
process(reset) begin
    if reset = '0' then
        door <= "00000000";
    end if;
end process;
resolve("00000000", "00000001") = "0000000X"
library IEEE;
use IEEE.std_logic_1164.all;

entity doorlock is
    port(
        clk : in std_logic;
        reset : in std_logic;
        enable : in std_logic;
        password : in std_logic_vector (7 downto 0);
        door : out std_logic_vector (7 downto 0);
        lock : out std_logic;
        alarm : out std_logic;
        turnoff : out std_logic
        );
end doorlock;

--password is 10(decimal no.) which is 00010000(binary no.)

architecture DDL of doorlock is
    signal password_delay : std_logic_vector(password'range) := password;
    use ieee.numeric_std_unsigned.all;
    signal err_count : integer range 0 to 5 := 0;
begin
    clk_proc : process(clk) begin
        if rising_edge(clk) then
            if reset = '0' then
                door <= (others => '0');
                lock <= '0';
                alarm <= '0';
                turnoff <= '0';
                err_count <= 0;
            else -- no reset :)
                if password /= password_delay then
                    case? password is
                        when "-------1" => door <= "00000000";
                        when "------10" => door <= "00000001";
                        when "-----100" => door <= "00000011";
                        when "----1000" => door <= "00000111";
                        when "---00000" => door <= "00001111";
                        when "--110000" => door <= "00011111";
                        when "-1010000" => door <= "00111111";
                        when "10010000" => door <= "01111111";
                        when "00010000" => door <= "11111111";
                        when others => null;
                    end case?;
                    err_count <= err_count + 1;
                end if;
                case err_count is
                    when 3 => alarm <= '1';
                    when 5 => turnoff <= '1';
                    when others => null;
                end case;
                if door = "11111111" and turnoff = '0' and alarm = '0' then
                    lock <= '1';
                end if;
            end if;
            password_delay <= password;
        end if;
    end process;
end DDL;