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