projet-fpga/Compteur_Tempo.vhd

86 lines
2.7 KiB
VHDL

----------------------------------------------------------------------------------
-- Company: SORBONNE UNIVERSITE
-- Designed by: J.DENOULET, Winter 2021
--
-- Module Name: COMPTEUR_TEMPO - Behavioral
-- Project Name: Centrale DCC
-- Target Devices: NEXYS 4 DDR
--
-- Compteur de Temporisation de la Centrale DCC
--
-- Après détection du passage à 1 de la commande Start_Tempo,
-- le module compte 6 ms et positionne à 1 la sortie Fin_Tempo
--
-- Pour être détectée, la commande Start_Tempo doit être mise à 1
-- pendant au moins 1 période de l'horloge 100 MHz
--
-- Quand Fin_Tempo passe à 1, la sortie reste dans cet état tant que
-- Start_Tempo est à 1.
-- Dès la détection du retour à 0 de Start_Tempo,
-- Fin_Tempo repasse à 0.
--
-- De cette manière, la durée minimale de l'impulsion à 1 de
-- Fin_Tempo sera d'un cycle de l'horloge 100 MHz.
-- Cela est a priori suffisant pour sa bonne détection
-- par la MAE de la Centrale DCC.
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity COMPTEUR_TEMPO is
Port ( Clk : in STD_LOGIC; -- Horloge 100 MHz
Reset : in STD_LOGIC; -- Reset Asynchrone
Clk1M : in STD_LOGIC; -- Horloge 1 MHz
Start_Tempo : in STD_LOGIC; -- Commande de Démarrage de la Temporisation
Fin_Tempo : out STD_LOGIC -- Drapeau de Fin de la Temporisation
);
end COMPTEUR_TEMPO;
architecture Behavioral of COMPTEUR_TEMPO is
signal Q : std_logic_vector(1 downto 0); -- Etat Séquenceur
signal Raz_CPt, Inc_Cpt : std_logic; -- Commandes Compteur
signal Fin_Cpt : std_logic; -- Drapeau de Fin de Comptage
-- Compteur de Temporisation
signal Cpt : INTEGER range 0 to 10000; -- Compteur (6000 = 6 ms)
signal En_Tempo : STD_LOGIC; -- Commande d'Incrémentation
begin
-- Séquenceur
process(Clk,Reset)
begin
if Reset='1' then Q <= "00";
elsif rising_edge(Clk) then
Q(1) <= ((not Q(1)) and Q(0) and Fin_Cpt) or (Q(1) and Start_Tempo);
Q(0) <= Start_Tempo or ((not Q(1)) and Q(0));
end if;
end process;
-- Sorties Séquenceur
Raz_Cpt <= Q(1) xnor Q(0);
Inc_Cpt <= (not Q(1)) and Q(0);
Fin_Tempo <= Q(1) and Q(0);
-- Compteur de Temporisation
process (Clk1M, Reset, Raz_Cpt)
begin
-- Reset Asynchrone
if (Reset) = '1' then
Cpt <= 0;
elsif rising_edge (Clk1M) then
if Raz_Cpt = '1' then Cpt <= 0;
elsif Inc_Cpt = '1' then Cpt <= Cpt + 1;
end if;
end if;
end process;
Fin_Cpt <= '1' when (Cpt = 5999) else '0';
end Behavioral;