Necesita un detector de bordes ascendente . Esto se hace generando una entrada retrasada que es 1 ciclo de reloj posterior a la entrada real.
Por ejemplo:
____ ____ ____ ____ ____ ____ ____ ____
CLock ___/ \___/ \___/ \___/ \___/ \___/ \___/ \___/ \
_______________________________
Input ___/ \____________________________________
_______________________________
Input_z ____________/ \___________________________
^ You want to detect this point, where the signals are not the
same. Input has gone high, but because Input_z is delayed, it
isn't high yet
La entrada retrasada se genera de la siguiente manera:
gen_input_z : process(clk,rst)
begin
if (rst = '1') then
Input_z <= '0';
elsif (rising_edge(clk)) then
Input_z <= Input;
end if;
end process
Ahora desea detectar su flanco ascendente:
gen_edge_det : process(clk,rst)
begin
if (rst = '1') then
Edge_detect <= '0';
elsif (rising_edge(clk)) then
if (Input = '1' and Input_z = '0') then
Edge_detect <= '1';
else
Edge_detect <= '0';
end if;
end if;
end process
Pero ahora nuestra detección de bordes es solo un ciclo de reloj:
____ ____ ____ ____ ____ ____ ____ ____
CLock ___/ \___/ \___/ \___/ \___/ \___/ \___/ \___/ \
_______________________________
Input ___/ \____________________________________
_______________________________
Input_z ____________/ \___________________________
________
Edge_det ____________/ \__________________________________________________
Para modificar eso, agregue un contador que solo haga que la detección de bordes caiga después de un cierto número de ciclos de reloj:
-- Port Declarations
signal clk : in std_logic;
signal rst : in std_logic;
signal input : in std_logic;
-- Signal declarations
signal input_z : std_logic;
signal edge_detect : std_logic;
signal counter : unsigned(31 downto 0); -- include numeric_std for this
gen_edge_det : process(clk,rst)
begin
if (rst = '1') then
Edge_detect <= '0';
counter <= '0';
input_z <= '0';
elsif (rising_edge(clk)) then
input_z <= input;
if (Input = '1' and Input_z = '0') then
Edge_detect <= '1';
counter <= (others => '0');
elsif (counter < 2) then -- we want an edge detect of 2 clock cycles
Edge_detect <= '1';
counter <= counter + "1"; -- declare counter as unsigned.
else
Edge_detect <= '0';
end if;
end if;
end process
Ahora está haciendo lo que queremos:
____ ____ ____ ____ ____ ____ ____ ____
CLock ___/ \___/ \___/ \___/ \___/ \___/ \___/ \___/ \
_______________________________
Input ___/ \____________________________________
_______________________________
Input_z ____________/ \___________________________
_____________
Edge_det ____________/ \_____________________________________________