------------------------------------------------------------------------------- -- Title : Bouton poussoir -- Project : ------------------------------------------------------------------------------- -- File :bouton_poussoir.vhd -- Author : Patrice -- Company : -- Created : 2008-03-21 -- Last update: 2008/03/25 -- Platform : -- Standard : VHDL'93 ------------------------------------------------------------------------------- -- Description: L'appui sur un bouton poussoir crée une impulsion -- : de largeur une periode d'horloge -- : Les rebonds du poussoir sont filtrés par une tempo de 5 ms -- : L'impulsion de sortie est decalee de 5 ms ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- -- Copyright (c) 2008 http://vhdl33.free.fr ------------------------------------------------------------------------------- -- Revisions : -- Date Version Author Description -- 2008-03-21 1.0 patrice Created ------------------------------------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY bouton_poussoir IS GENERIC ( simulation : boolean := false); PORT ( clock : IN std_ulogic; -- horloge systeme poussoir : IN std_ulogic; -- bouton poussoir appui : OUT std_ulogic); -- impulsion de largeur une periode END bouton_poussoir; ARCHITECTURE avec_tempo OF bouton_poussoir IS -- Duree tempo :5 ms avec une periode de 20 ns (50 MHz) CONSTANT valeur_tempo : natural := 5000000/20; CONSTANT valeur_tempo_simu : natural := 3; -- c'est meme beaucoup!!! TYPE type_etat IS (attente1, confirme1, valide1, attente0); 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(clock); IF 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(clock); CASE etat IS WHEN attente1 => IF poussoir = '1' THEN etat <= confirme1; END IF; WHEN confirme1 => IF fin_tempo = '1' AND poussoir = '1' THEN etat <= valide1; ELSIF fin_tempo = '1' AND poussoir = '0' THEN etat <= attente1; END IF; WHEN valide1 => etat <= attente0; WHEN attente0 => IF poussoir = '0' THEN etat <= attente1; END IF; WHEN OTHERS => NULL; END CASE; END PROCESS fsm; init_tempo <= '1' WHEN etat = attente1 ELSE '0'; appui <= '1' WHEN etat = valide1 ELSE '0'; END avec_tempo;