vhdl - 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;
解决方案
(警告:我没有给你答案。我只是在解决你关于“它是如何完成的”的问题)
该语句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 反转状态。
希望这能让您大致了解您的解决方案。
推荐阅读
- ios - XCode:找不到框架
- apache-spark - 将数据集分区与表分区方案对齐
- amazon-web-services - 如何解决找不到匹配的 Route53Zone?
- android - recyclerview中的Android可观察数据对象?
- python - 计算连续超过 2 次出现的次数
- python - Tkinter Python,get() 不保存任何条目文本。我应该如何解决它?
- ripple - XRP 全节点 getTransactions : 错误 - 错误 [ValidationError(instance.options.maxLedgerVersion 不完全是 [subschema 0],[subschema 1])]
- python-3.x - 运行 Matplotlib 的 Python IDE(尤其是无需额外配置)
- javascript - 为什么 Intl.DateTimeFormat 在 IE 浏览器中不起作用
- python - Elasticsearch mtermvectors python API查询