首先:“请帮助我”不是一个好问题。更好的是“编译时 Modelsim 错误“无法读取输出””
第二点:该错误非常具有描述性。 “无法读取输出“警报””。alarm
被声明为
alarm : out std_logic;
因此它是一个output港口。在 2008 年之前的 VHDL 中,不允许读取输出端口。接下来,编译器提示如何修复它:
“VHDL 2008 允许读取输出。该功能通过使用 -2008 进行编译来启用。”
所以就这样做吧!
在 modelsim 编译窗口中选择“默认选项”
然后设置为VHDL-2008
或者,您实际上可以执行所描述的操作(添加-2008
)在命令行上:
vcom -reportprogress 300 -work work -2008门锁.vhdl
瞧。完成的!不是?
不等了,还是不行!
您有多个驱动程序错误。第 23 行指出:
door <= "00000000" when (reset = '0');
这充当锁存器,实际上与
process(reset) begin
if reset = '0' then
door <= "00000000";
end if;
end process;
就这样一次reset='0'
已经发生,该过程将驱动door
到一个固定值。在里面password
- 触发你再次驾驶的过程door
!这会解决得很糟糕。例如。如果(password = "------10")
, then door <= "00000001"
。这将解决:
resolve("00000000", "00000001") = "0000000X"
因为连接'0'
to '1'
相当于短路。
那么让我们看看正确的设计。您现在正在触发以下更改password
。不太好,但这是可能的。我会使用另一个触发器,比如enable
未使用的信号。但无论如何:我们引入了一个额外的信号来检测变化password_delay
。但更重要的是我们介绍一个时钟。在数字硬件中,大多数系统都使用时钟。最后我们使用新的VHDL-2008语句case?
解码不在乎。
VHDL-2008 代码一起变为:
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;
那是不同的东西,是吗?抱歉,我没有时间为您编写测试平台。
注意:该代码给出了编译器警告
警告:C:/HDL/doorlock/doorlock.vhd(20): (vcom-1013)“password_delay”的初始值取决于信号“password”的值。
忽略这个。这是模拟所必需的,否则未定义初始值password_delay
将导致触发password /= password_delay
.