Skip to content
Snippets Groups Projects
loto.vhd 6.07 KiB
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity loto is
    generic (
        n_fast : natural := 15;
        n_slow : natural := 25);
    port (
        I_bouton   : in  std_logic;
        I_bloque   : in  std_logic;
        I_clk_100m : in  std_logic;
        I_rst      : in  std_logic;
        O_aff      : out std_logic_vector(6 downto 0);
        O_rouge    : out std_logic;
        O_vert     : out std_logic;
        O_an       : out std_logic_vector(7 downto 0)
        );
end entity loto;

architecture arch of loto is

    component tirage is
        port (
            I_clk         : in  std_logic;
            I_rst         : in  std_logic;
            I_clk_display : in  std_logic;
            I_bouton      : in  std_logic;
            O_reg0        : out std_logic_vector(5 downto 0);
            O_reg1        : out std_logic_vector(5 downto 0);
            O_reg2        : out std_logic_vector(5 downto 0);
            O_reg3        : out std_logic_vector(5 downto 0);
            O_reg4        : out std_logic_vector(5 downto 0);
            O_reg5        : out std_logic_vector(5 downto 0);
            O_l_rouge     : out std_logic;
            O_l_verte     : out std_logic);
    end component tirage;

    component compteur_modulo6 is
        port (
            I_clk         : in  std_logic;
            I_rst         : in  std_logic;
            I_bloque      : in  std_logic;
            O_CounterMod6 : out std_logic_vector(2 downto 0));
    end component compteur_modulo6;

    component diviseur_freq is
        generic (
            n_fast : natural;
            n_slow : natural);
        port (
            I_clk  : in  std_logic;
            I_rst  : in  std_logic;
            O_FAST : out std_logic;
            O_SLOW : out std_logic
            );
    end component diviseur_freq;

    component transcodeur7s_d_u is
        port (
            I_nombre : in  std_logic_vector(5 downto 0);
            O_uni    : out std_logic_vector (6 downto 0);
            O_diz    : out std_logic_vector (6 downto 0)
            );
    end component transcodeur7s_d_u;

    component mux6_1 is
        port (
            I_0    : in  std_logic_vector(5 downto 0);
            I_1    : in  std_logic_vector(5 downto 0);
            I_2    : in  std_logic_vector(5 downto 0);
            I_3    : in  std_logic_vector(5 downto 0);
            I_4    : in  std_logic_vector(5 downto 0);
            I_5    : in  std_logic_vector(5 downto 0);
            I_sel  : in  std_logic_vector(2 downto 0);
            O_mux6 : out std_logic_vector(5 downto 0)
            );
    end component mux6_1;

    component decodeur_uni is
        port (
            I_E   : in  std_logic_vector(2 downto 0);
            O_uni : out std_logic_vector(6 downto 0)
            );
    end component decodeur_uni;

    component modulo4 is
        port (
            I_clk   : in  std_logic;
            I_rst   : in  std_logic;
            O_Mod4  : out std_logic_vector(1 downto 0);
            O_decod : out std_logic_vector(3 downto 0));
    end component modulo4;

    signal SC_clkDisplay   : std_logic;
    signal SC_clk          : std_logic;
    signal SC_reg0         : std_logic_vector(5 downto 0);
    signal SC_reg1         : std_logic_vector(5 downto 0);
    signal SC_reg2         : std_logic_vector(5 downto 0);
    signal SC_reg3         : std_logic_vector(5 downto 0);
    signal SC_reg4         : std_logic_vector(5 downto 0);
    signal SC_reg5         : std_logic_vector(5 downto 0);
    signal SC_num          : std_logic_vector(2 downto 0);
    signal SC_nombre       : std_logic_vector(5 downto 0);
    signal SC_uni          : std_logic_vector(6 downto 0);
    signal SC_diz          : std_logic_vector(6 downto 0);
    signal SC_minus        : std_logic_vector(6 downto 0);
    signal SC_numTranscode : std_logic_vector(6 downto 0);
    signal SC_affSelect    : std_logic_vector(1 downto 0);

begin

    tirage_1 : entity work.tirage
        port map (
            I_clk         => SC_clk,
            I_rst         => I_rst,
            I_clk_display => SC_clkDisplay,
            I_bouton      => I_bouton,
            O_reg0        => SC_reg0,
            O_reg1        => SC_reg1,
            O_reg2        => SC_reg2,
            O_reg3        => SC_reg3,
            O_reg4        => SC_reg4,
            O_reg5        => SC_reg5,
            O_l_rouge     => O_rouge,
            O_l_verte     => O_vert
            );

    modulo6_1 : entity work.compteur_modulo6
        port map (
            I_clk         => SC_clkDisplay,
            I_rst         => I_rst,
            I_bloque      => I_bloque,
            O_CounterMod6 => SC_num
            );

    diviseur_freq_1 : entity work.diviseur_freq
        generic map (
            n_fast => n_fast,
            n_slow => n_slow)
        port map (
            I_clk  => I_clk_100m,
            I_rst  => I_rst,
            O_FAST => SC_clk,
            O_SLOW => SC_clkDisplay
            );

    mux6_1_1 : entity work.mux6_1
        port map (
            I_0    => SC_reg0,
            I_1    => SC_reg1,
            I_2    => SC_reg2,
            I_3    => SC_reg3,
            I_4    => SC_reg4,
            I_5    => SC_reg5,
            I_sel  => SC_num,
            O_mux6 => SC_nombre
            );

    transcod_1 : entity work.transcodeur7s_d_u(transcod_int)  --(transcod_ARCH)
        port map (
            I_nombre => SC_nombre,
            O_uni    => SC_uni,
            O_diz    => SC_diz
            );

    decodeur_uni_1 : entity work.transcodeur7s_u
        port map (
            E    => SC_num,
            Suni => SC_numTranscode
            );

    modulo4_2 : entity work.modulo4
        port map (
            I_clk   => SC_clk,
            I_rst   => I_rst,
            O_Mod4  => SC_affSelect,
            O_decod => O_an(3 downto 0)
            );

    O_an(4) <= '1';
    O_an(5) <= '1';
    O_an(6) <= '1';
    O_an(7) <= '1';

    SC_minus <= "0111111";

    with SC_affSelect select O_aff <=
        SC_uni          when "00",
        SC_diz          when "01",
        SC_minus        when "10",
        SC_numTranscode when others;

end architecture arch;