Button 使用按钮实现不同速度的VHDL时钟发生器

Button 使用按钮实现不同速度的VHDL时钟发生器,button,vhdl,debouncing,Button,Vhdl,Debouncing,我是VHDL新手,目前正在开发一个时钟生成器,它可以生成两种不同的时钟速度。 除了在慢速和快速状态之间切换外,所有功能都正常工作。 “速度按钮”似乎有问题,因为有时我必须多次按下它才能更改当前设置的速度。“重置按钮”始终按预期工作。我的VHDL代码是否有问题,或者我是否需要添加某种软件去抖动?如果是,为什么重置按钮工作? 你能给我一些建议,我可以改进时钟发生器的哪些部分(代码/逻辑) 实体clk\u gen为 端口(时钟输入:标准逻辑中; clk_btn_in:in标准逻辑向量(3到0); 时钟

我是VHDL新手,目前正在开发一个时钟生成器,它可以生成两种不同的时钟速度。 除了在慢速和快速状态之间切换外,所有功能都正常工作。 “速度按钮”似乎有问题,因为有时我必须多次按下它才能更改当前设置的速度。“重置按钮”始终按预期工作。我的VHDL代码是否有问题,或者我是否需要添加某种软件去抖动?如果是,为什么重置按钮工作? 你能给我一些建议,我可以改进时钟发生器的哪些部分(代码/逻辑)

实体clk\u gen为
端口(时钟输入:标准逻辑中;
clk_btn_in:in标准逻辑向量(3到0);
时钟输出:输出标准逻辑);
完九龙根;;
clk_gen的架构是
信号温度:标准逻辑:='0';
开始
时钟:进程(时钟输入,时钟输入)
变量计数器:整数范围0到49999999:=0;
恒频慢:整数:=499999;
恒定频率:整数:=499999;
类型速度为(慢、快);
变速_状态:速度:=慢速;
开始
如果上升沿(clk_in),则
--按下复位按钮
如果(clk_btn_in=“1000”),则

temp看起来,只要按钮处于“按下”状态,您的速度模式就会切换。除非您能保证您的按钮仅“按下”一个时钟周期,否则该状态可能会切换多次,使您按下按钮后的状态基本上是随机的(取决于按下按钮的确切时间)

首先,在按钮上需要一个去抖动电路。这可以在外部实现,也可以在FPGA内部实现。我不会在这里详细讨论交换机去抖动,但您可以在其他地方轻松找到有关这方面的信息。其次,您需要将按钮转换为同步信号,即与时钟有固定关系的信号。您的示例中的同步器示例如下:

signal button_reg1 : std_logic_vector(3 downto 0) := (others => '0');
signal button_reg2 : std_logic_vector(3 downto 0) := (others => '0');

过程(时钟输入)
开始
如果(上升沿(clk in)),则
速度按钮
signal button_reg1 : std_logic_vector(3 downto 0) := (others => '0');
signal button_reg2 : std_logic_vector(3 downto 0) := (others => '0');
process (clk_in)    
begin
    if (rising_edge(clk_in)) then
        button_reg2 <= button_reg1;
        button_reg1 <= clk_btn_in;
    end if;
end process;
signal speed_button_reg : std_logic := '0';
signal speed_button_pressed : std_logic := '0';
process (clk_in)    
begin
    if (rising_edge(clk_in)) then
        speed_button_reg <= button_reg2(2);
        if (speed_button_reg = '0' and button_reg2(2) = '1') then
            -- The button has just been pressed (gone from low to high)
            -- Do things here, or set another signal e.g.
            speed_button_pressed <= '1';
        else
            speed_button_pressed <= '0';
        end if;
    end if;
end process;