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;