VHDL - 注册按钮

VHDL - Register for Push Button

我正在尝试在 VHDL 中创建一个简单的按钮,该按钮在输入开关或 pb 使用时钟和进程从 0 变为 1 再变为 0 后打开。但是,我的代码似乎给了我未定义的输出。这是我目前所拥有的。

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

Entity captureInput is port
(
    CLK          : in  std_logic := '0';
     RESET_n      : in  std_logic := '0';
     buttonState  : in  std_logic := '0';
     buttonOut    : out std_logic := '0'
);
end Entity;

   ARCHITECTURE one of captureInput is
    
    signal lastButtonState: std_logic := '0';
    signal btnState      : std_logic := '0'; 
    
BEGIN

process (CLK, RESET_n) is

begin
   if (RESET_n = '0') then
        lastButtonState <= '0';
         
    elsif (rising_edge(CLK)) then
        if (buttonState ='0' and lastButtonState = '1') then
             btnState <= '1';
    end if;
     lastButtonState <= buttonState;
    end if; 
end process;

buttonOut <= btnState

end;

尝试在寄存器的重置分支中初始化 btnState,并在某些情况下使用 else 语句将 btnState 设置回 0。我敢打赌,您未定义的输出来自这样一个事实,即您没有在 if 条件之外的任何其他地方定义 btnState 。最好不要依赖声明的初始值:综合工具会忽略它,一些模拟器也会忽略它。另外,请记住,if 的时钟主体将为每个在其中分配一个值的信号生成一个寄存器,并且该信号将在进程中保留最后分配给它们的值。

您还缺少顶部的 Library ieee; 语句和 buttonOut <= btnState 后的分号。

读取按钮确实需要去抖动器。

请看: VHDLWhiz generate statement

VHDLWhiz How to read a button in VHDL