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



所以。。。我需要一个输出引脚保持高电平一秒钟,然后切换回低电平。它是由用户按下按钮手动触发的,通过更高速度的时钟改变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;

clock_gen组件只是通过计数器过程将50MHz时钟向下划分为1Hz。代码有点工作,但输出上高的"长度"会不时变化。我想这取决于clock_gen组件中的计数器值。

如何确保每次输出都有相同的"高时间"?使用Altera DE2

您生成一个1 Hz的时钟来重置输出,而与开始时间无关。当然,时间长短会有很大的不同,具体取决于按下按钮的时间。

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

如果clock_gen核心的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;

按下按钮时,这将精确标记您的1秒间隔。如果两个按钮都可以同时按下,则必须为每个按钮都有一个计时计数器(或clock_gen核心的实例(。

相关内容

最新更新