首页 > 解决方案 > VHDL 按钮和 LED

问题描述

VHDL 新手,熟悉一切。

当按下按钮时,我让我的 FPGA 打开 LED(下面的代码),但必须按住按钮才能使 LED 保持亮起。我希望 LED 在按下和释放按钮时打开并保持亮起(再次按下时关闭),但我对这是如何完成的感到困惑。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 entity ButtonLED is Port (BUTTON: in  STD_LOGIC:='1';
                                    LED : out  STD_LOGIC:='0');
end ButtonLED;

architecture Behavioral of ButtonLED is
begin

LED <= not BUTTON;

end Behavioral;

标签: vhdlfpga

解决方案


警告:我没有给你答案。我只是在解决你关于“它是如何完成的”的问题)

该语句LED <= not BUTTON定义通过反相元件LED直接连接到。BUTTON因此,您的 LED 将始终遵循相反的当前状态BUTTON。如果BUTTON处于高逻辑电平,LED则将设置为低逻辑电平,反之亦然。

我希望 LED 在按下和释放按钮时打开并保持亮起(再次按下时关闭),但我对这是如何完成的感到困惑。

要实现此功能,您必须能够 (1) 检测何时按下和释放按钮,以及 (2) “保存” LED 的当前状态。检测按钮“移动”只是检测状态从高到低、从低到高的变化。正如评论中提到的,在边缘检测器和按钮之间插入去抖动机制也很重要。由于 FPGA 按钮非常敏感,去抖动器将确保您不会将故障/噪音解释为实际按下。我建议你自己检查一下,实施一个有和没有去弹跳器的版本。根据您按下按钮的方式,当您的硬件未过滤输入时,您可能会看到 LED 多次切换。

一旦您知道如何检测按钮何时被按下和释放,您就必须简单地添加一个记忆元素,该元素会在每次满足您的条件时切换。现在,LED <= not BUTTON您将拥有一个控制LED行为的内部变量(即LED <= led_state),而不是使用 。这个内部变量可以通过process对您的边缘检测“模块”敏感的来控制。此外,此变量将确保您的LED状态仅在满足您的条件(即按下并释放按钮)时才发生变化,而不是遵循 BUTTON 反转状态。

希望这能让您大致了解您的解决方案。


推荐阅读