VHDL需要引脚保持高电平(精确)一秒钟,然后自动切换到低电平。手动触发(未同步)

VHDL需要引脚保持高电平(精确)一秒钟,然后自动切换到低电平。手动触发(未同步),vhdl,state-machine,intel-fpga,Vhdl,State Machine,Intel Fpga,所以…我需要一个输出引脚保持高电平一秒钟,然后切换回低电平。它是由用户按下一个按钮手动触发的,在一个时钟速度快得多的FSM中改变状态 entity red_green is port( clk : in std_logic; reset : in std_logic; in_red, in_green : in std_logic; out_green, out_red : out std_logic

所以…我需要一个输出引脚保持高电平一秒钟,然后切换回低电平。它是由用户按下一个按钮手动触发的,在一个时钟速度快得多的FSM中改变状态

entity red_green is

    port(
        clk      : in   std_logic;
        reset : in std_logic;
        in_red, in_green : in std_logic;
        out_green, out_red : out std_logic

    );

end entity;

architecture r_g of red_green is
signal i_clk, trigger : std_logic;
signal i_reset : std_logic;

begin

process(in_red, in_green, clk )
begin

    if in_red = '1' then
        out_red <= '1';
    elsif rising_edge(i_clk) then
        out_red <= '0';
    end if;

    if in_green = '1' then
        out_green <= '1';
    elsif rising_edge(i_clk) then
        out_green <= '0';
    end if;

end process;


clock : entity work.clock_gen port map( clk => clk, reset => reset, speed => '0', clk_out => i_clk );

end r_g;
实体为红色\绿色
港口(
clk:标准逻辑中;
复位:在标准逻辑中;
红色,绿色:标准逻辑;
输出绿色,输出红色:输出标准逻辑
);
终端实体;
红绿相间的建筑风格是
信号输入时钟,触发器:标准逻辑;
信号i_复位:标准_逻辑;
开始
过程(红色、绿色、clk)
开始
如果红色=1,则
(红色i__clk);
结束r_g;
时钟发生器组件仅通过计数器过程将50 MHz时钟向下划分为1 Hz。 代码可以正常工作,但输出的高电平的“长度”会不时变化。我想这取决于时钟组件中的计数器值

我如何确保每次都能获得相同的输出“高潮时间”?
使用Altera DE2,您可以生成1 Hz时钟来重置输出,而与启动时间无关。当然,时间的长短会因按下按钮的确切时间而大不相同


您需要一个计数器作为计时器,每当按下按钮时计时器就会启动。

如果来自时钟发生器的1Hz信号未在其他任何地方使用,您可以生成一个重置信号,以精确测量1s间隔

我还建议不要直接使用流程敏感度列表中的按钮。按钮应通过时钟信号以如下方式选通:

process button_hit (clk_in) is
signal btn_old;
begin
    if clk_in'Event and clk_in = '1' then   --use 50MHz clock on DE2 to sample buttons
         btn_old <= btn;
         if btn_old = '1' and btn = '0' then   --this marks the button press 
             reset_sig <= '1';   -- one edge reset signal only to the clock_gen core
         else
             reset_sig <= '0';
         end if;
    end if;
end process;
process按钮点击(clk\U in)无效
信号btn_旧;
开始
如果clk_in'Event和clk_in='1',则使用DE2上的50MHz时钟对按钮进行采样
btn_old