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;
1 回答
( Warning :我没有给你答案 . 我只是在"how it is done"处理你的问题)
语句
LED <= not BUTTON
定义LED
是 directly 通过反转元素连接到BUTTON
. 因此,您的LED将始终遵循BUTTON
的相反当前状态 . 如果BUTTON
处于高逻辑电平,则LED
将被设置为低逻辑电平,反之亦然 .要实现此功能,您必须能够(1)在按下和释放按钮时进行检测,以及(2)“保存”LED的当前状态 . 检测按钮“移动”只是检测状态从高到低,从低到高的变化 . 如评论中所述,在边缘检测器和按钮之间插入去抖动机制也很重要 . 由于FPGA按钮非常灵敏,因此除颤器将确保您不会将毛刺/噪声解释为实际印刷机 . 我建议你自己检查一下,实现一个带有和不带去保护器的版本 . 根据您按下按钮的方式,当硬件不过滤输入时,您可能会看到LED多次切换 .
一旦您知道如何检测按钮被按下和释放的时间,您只需添加一个内存元素,以便在每次满足条件时切换 . 现在,您将拥有一个内部变量来控制
LED
行为(即LED <= led_state
),而不是使用LED <= not BUTTON
. 可以通过对边缘检测敏感的process
来控制此内部变量"module" . 此外,此变量将确保您的状态仅在满足条件时(即按下并释放按钮)发生更改,而不是遵循BUTTON反转状态 .希望这能为您提供解决方案的概述 .