请帮助我解决VHDL编译错误[重复]

2023-12-19

library IEEE;
use IEEE.std_logic_1164.all;

entity doorlock is
port(   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 err_count : integer range 0 to 5 := 0;

begin
lock <= '0' when (reset = '0');
alarm <= '0' when (reset = '0');
turnoff <= '0' when (reset = '0');
door <= "00000000" when (reset = '0');
lock <= '0' when (enable <= '0');

process(password)
begin
    if (password = "-------1") then
    door <= "00000000";
    elsif (password = "------10") then
    door <= "00000001";
    elsif (password = "-----100") then
    door <= "00000011";
    elsif (password = "----1000") then
    door <= "00000111";
    elsif (password = "---00000") then
    door <= "00001111";
    elsif (password = "--110000") then
    door <= "00011111";
    elsif (password = "-1010000") then
    door <= "00111111";
    elsif (password = "10010000") then
    door <= "01111111";
    elsif (password = "00010000") then
    door <= "11111111";
    end if;

    err_count <= err_count + 1;
end process;

alarm <= '1' when (err_count = 3);
turnoff <= '1' when (err_count = 5);
lock <= '1' when (door = "11111111" and turnoff = '0' and alarm = '0');

end DDL;

我为制作数字门锁的作业编写了这段代码。 当我编译它时,这一行有错误。

lock <= '1' when (door = "11111111" and turnoff = '0' and alarm = '0');

错误是这样的下面

** 错误:D:\modelsim\Door.vhd(53):无法读取输出“警报”。

VHDL 2008 允许读取输出。 该功能通过使用 -2008 进行编译来启用。

** 错误:D:\modelsim\Door.vhd(53):无法读取输出“门”。

VHDL 2008 允许读取输出。 该功能通过使用 -2008 进行编译来启用。

** 错误:D:\modelsim\Door.vhd(53):无法读取输出“关闭”。

VHDL 2008 允许读取输出。 该功能通过使用 -2008 进行编译来启用。

** 错误:D:\modelsim\Door.vhd(55):VHDL 编译器退出

我不知道为什么会这样,请帮助我


首先:“请帮助我”不是一个好问题。更好的是“编译时 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请帮助我解决VHDL编译错误[重复] 的相关文章

随机推荐

  • .NET Core 2 - 带有实例名称和端口号的连接字符串

    在我的应用程序中 我的配置中有一个连接字符串 该应用程序使用 NET core 2 11 和 SQL Server 创建 这是连接字符串 Data Source servername instancename portnumber Init
  • 制作一个seaborn线图,为每个点指定标准差/置信区间

    我正在尝试制作一个具有平滑的置信区间的线图 看起来像这样的东西 source pydata org https seaborn pydata org images seaborn lineplot 1 png 目前 我所做的是使用误差线来显
  • aspnet5 vNext (rc1) iis 8 - 错误网关 502.3

    我意识到存在这样的帖子 我已经阅读 重新阅读但仍然遇到问题 大多数都是旧的或不直接相关的 所以我想我应该重新发布当前的示例 尝试在 Windows Server 2012 R2 上的 IIS 8 5 中运行基本站点 此时我陷入了 502 3
  • 垂直分屏自定义形状

    I want to make a vertical split screen with a custom shape like in my attached image But it must be cross browser suppor
  • JavaScriptSerializer 将对象“集合”反序列化为对象失败的属性

    我有一个 js 对象 结构如下 object property1 some string object property2 some string object property3 property1 some string object
  • 复制整个目录但排除一些文件 php

    试图找到一种复制整个目录但排除某些文件的方法 在这种情况下只需要排除一个始终只包含 1 个 png 文件的目录 我想可以使用类似于此代码的内容 但绝对没有任何线索如何仅排除一个文件 function xcopy source dest pe
  • 堆地址范围内全局变量的地址

    我正在调试MPlayer 1 3 0源代码 我看到一个全局变量 其地址 由GDB甚至简单的打印 都在堆分配的范围内 而不是数据部分 我使用检查了堆范围procfs 555555554000 555555834000 r xp 0000000
  • Firefox VIEW SOURCE 显示登录页面

    我在 Arch Linux 上运行 Firefox 61 0 查看页面源代码时 当我浏览需要登录的网站时 我经常 但并非总是如此 估计有 20 的时间 会看到登录页面的源代码 当我浏览本地主机 每个页面的源代码都是在服务器上生成的 这不是操
  • 你能在 Python 中的核心类型上猴子修补方法吗?

    Ruby 可以向 Number 类和其他核心类型添加方法以获得如下效果 1 should equal 1 但Python似乎无法做到这一点 这是真的 如果是这样 为什么 这是否与以下事实有关 type不能修改吗 我不想讨论猴子修补的不同定义
  • 如何在 obj-c 中打印格式化的浮点数?

    如何打印float在 Objective C 中 例如 3 45代替3 45555555555 尝试像这样格式化浮动 NSLog 2f myFloat The 符号表示这将被下面的相应参数替换 myFloat The 2表示小数点后 2 位
  • 是否可以在 Artifactory 中重命名存储库?

    我们想引入一种命名约定 因为我们有大量的内部和外部存储库 因此我们希望让人们清楚什么是什么 添加这些存储库时 没有人预计事情会增长这么多 我想知道是否可以重命名存储库 我知道我可以创建新的并复制 移动其中的工件 但这看起来比我想要的要付出更
  • Automake:构建不被安装的共享模块

    如何告诉Automake构建一个不被安装的动态模块 pkglib LTLIBRARIES mywrapper la mywrapper la LDFLAGS no undefined module avoid version 导致 mywr
  • 如何在 C# 中保存随机生成器的状态? [复制]

    这个问题在这里已经有答案了 出于测试目的 我使用给定的种子创建随机数 即不基于当前时间 因此整个程序是确定性的 如果发生什么事情 我希望能够快速恢复到事件发生 不久之前 的点 因此我需要能够恢复System Random到之前的状态 有没有
  • Babel 对 Object.entries 的支持

    我正在看Object values Object entries 的第 3 阶段提案 https github com tc39 proposal object values entries我真的很想在我当前的 JavaScript 项目中
  • 过桥拼图

    晚上必须有四个人过桥 任何人过桥 无论是一个人还是两个人 都必须随身携带手电筒 必须用手电筒来回走动 每个人行走的速度不同 一个需要 1 分钟 另一个需要 2 分钟 另一个需要 5 分钟 最后 10 分钟 如果两个人一起穿过 他们必须以较慢
  • 将列表中连续出现的相同重复项目分组

    例如 我们有一个这样的列表 L item1 item2 item3 item3 item3 item1 item2 item4 item4 item4 我想将它们打包到以下形式的元组列表中 item1 1 item2 1 item3 3 i
  • 如何过期或重置地理位置

    当用户访问我的网站时 我会检查是否在 PHP 中设置了位置会话 如果没有设置与用户位置的会话 我将它们重定向到 www domain net location 在此页面上有许多选项供用户选择位置 如果浏览器允许 选项之一是使用浏览器进行设置
  • 为什么 `instance_of_object.foo is instance_of_object.foo` 的计算结果为 False? [复制]

    这个问题在这里已经有答案了 如果我有一个 class A def foo self pass 这评估为True getattr A foo is A foo 但这评估为False a A getattr a foo is a foo as
  • Android 自定义轮盘或老虎机实现

    我需要实现如图所示的类似轮子的控件 老虎机 但每个项目的边缘 项目之间的位置 需要平滑 以便它看起来像地球一样的球体 这是从 iPhone 库中获得的 iPhone 应用程序的屏幕截图 我想要安卓版的 我检查了 kankan 轮 Andro
  • 请帮助我解决VHDL编译错误[重复]

    这个问题在这里已经有答案了 library IEEE use IEEE std logic 1164 all entity doorlock is port reset in std logic enable in std logic pa