You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DE2开发板的VHDL密码系统初始密码异常问题咨询

问题分析与解决方案

首先,咱们来拆解你遇到的初始密码异常问题——这其实是VHDL综合中常见的意外锁存器和组合反馈回路导致的,你的代码结构在硬件上会产生非预期的行为:

问题根源

  1. 组合逻辑中的反馈与意外锁存器
    你在以SW为敏感列表的组合process里,既用code和SW做比较,又在满足条件时给code赋值。更关键的是:code只在SW=code且KEY(1)='0'的情况下被赋值,其他分支里没有给code赋值。综合器会认为code需要保持原有值,因此生成锁存器。但FPGA里的锁存器初始状态是不确定的,你预设的"01010101"初始值根本没被正确加载,反而被反馈回路影响,最终拉成了SW的初始值(也就是你看到的"01111111")。

  2. 敏感列表不完整
    你的process只监听SW的变化,KEY(1)或code的变化不会触发process执行。这意味着即使你按住KEY(1),只有当SW再次变化时,密码才会被修改,完全不符合你“按住KEY(1)即可修改”的预期。

修正后的代码

咱们把组合逻辑(负责LED显示、匹配判断)和时序逻辑(负责密码更新,避免反馈)分开,同时引入DE2的50MHz时钟做同步:

library IEEE;
use IEEE.std_logic_1164.all;
entity pass_sys is
port(
 CLK : in std_logic; -- 接入DE2的50MHz时钟(比如PIN_E1)
 SW : in std_logic_vector(7 downto 0);
 KEY : in std_logic_vector(3 downto 0);
 LEDR : out std_logic_vector(17 downto 0);
 LEDG : out std_logic_vector(17 downto 0)
 );
end pass_sys;

architecture func of pass_sys is
signal code : std_logic_vector(7 downto 0) := "01010101"; -- 初始密码
begin
-- 组合逻辑:实时处理LED显示和密码匹配判断
comb_logic : process(SW, code, KEY)
begin
 -- 红色LED显示当前密码,其余红LED熄灭
 LEDR(7 downto 0) <= code;
 LEDR(17 downto 8) <= (others => '0');

 if SW = code then
 LEDG(0) <= '1'; -- 密码匹配时点亮绿LED0
 LEDG(1) <= not KEY(1); -- KEY(1)按下时点亮绿LED1
 else
 LEDG(0) <= '0';
 LEDG(1) <= '0';
 end if;
 -- 其余绿LED熄灭
 LEDG(17 downto 2) <= (others => '0');
end process;

-- 时序逻辑:同步更新密码,避免组合反馈
seq_logic : process(CLK)
begin
 if rising_edge(CLK) then
 -- 仅当密码匹配且KEY(1)被按下(低电平)时,更新密码
 if (SW = code) and (KEY(1) = '0') then
 code <= SW;
 end if;
 end if;
end process;
end func;

修正后的逻辑说明

  • 组合逻辑:监听所有相关输入(SW、code、KEY),实时反馈密码匹配状态和LED显示,没有任何反馈回路,行为完全可控。
  • 时序逻辑:在时钟边沿触发密码更新,只有当SW等于当前密码且KEY(1)被按下时,才会把SW的值写入code。这样code是一个寄存器,初始值"01010101"会被FPGA正确加载,上电后直接显示在LEDR上。
  • 符合你的需求:密码匹配时按住KEY(1),就能把当前SW的值设为新密码,松开后密码保持不变。

内容的提问来源于stack exchange,提问作者user235346

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:08:35