------------------------------------------------------------------------------- -- Title : anti -rebonds sur poussoir -- Project : ------------------------------------------------------------------------------- -- File : anti_rebonds.vhd -- Author : -- Company : http://vhdl33.free.fr -- Last update: 2008/03/25 -- Platform : ------------------------------------------------------------------------------- -- Description: Le signal du bouton poussoir est filtré -- : et decale de la valeur de la temporisation -- : 5 ms conseillé ------------------------------------------------------------------------------- -- Revisions : -- Date Version Author Description -- 2006/09/13 1.0 nouel Created ------------------------------------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY anti_rebonds IS GENERIC ( simulation : boolean := false); PORT ( raz : IN std_ulogic; -- reset actif '1' h : IN std_ulogic; -- horloge systeme poussoir : IN std_ulogic; -- poussoir avec rebonds poussoir_propre : OUT std_ulogic); -- entree filtree END anti_rebonds; ARCHITECTURE avec_tempo OF anti_rebonds IS -- Duree tempo :5 ms avec une periode de 20 ns (50 MHz) CONSTANT valeur_tempo : natural := 5000000/20; CONSTANT valeur_tempo_simu : natural := 10; -- c'est meme beaucoup!!! TYPE type_etat IS (attente1, test1, attente0, test0); SIGNAL etat : type_etat; SIGNAL init_tempo, fin_tempo : std_ulogic; BEGIN -- avec_tempo -- decompteur avec chargement prioritaire timer: PROCESS VARIABLE decompteur : natural RANGE 0 TO 300000; BEGIN -- PROCESS timer WAIT UNTIL rising_edge(h); IF raz ='1' OR init_tempo = '1' THEN IF simulation THEN decompteur := valeur_tempo_simu; ELSE decompteur := valeur_tempo; END IF; ELSIF decompteur > 0 THEN decompteur := decompteur - 1; END IF; IF decompteur = 0 THEN fin_tempo <= '1'; else fin_tempo <= '0'; END IF; END PROCESS timer; fsm: PROCESS BEGIN -- PROCESS fsm WAIT UNTIL rising_edge(h); IF raz = '1' THEN etat <= attente1; else CASE etat IS WHEN attente1 => IF poussoir = '1' THEN etat <= test1; END IF; WHEN test1 => IF fin_tempo = '1' AND poussoir = '1' THEN etat <= attente0; ELSIF fin_tempo = '1' AND poussoir = '0' THEN etat <= attente1; END IF; WHEN attente0 => IF poussoir = '0' THEN etat <= test0; END IF; WHEN test0 => IF fin_tempo = '1' AND poussoir = '1' THEN etat <= attente0; ELSIF fin_tempo = '1' AND poussoir = '0' THEN etat <= attente1; END IF; WHEN OTHERS => NULL; END CASE; END IF; END PROCESS fsm; -- sorties machine de Moore poussoir_propre <= '1' WHEN etat = attente0 OR etat = test0 ELSE '0'; init_tempo <= '1' WHEN etat = attente1 OR etat = attente0 ELSE '0'; END avec_tempo;