summaryrefslogtreecommitdiff
path: root/pb_logique_seq.srcs/sources_1/imports/new/module_commande.vhd
blob: f3f58334e9b08221dc937906dc0a296eeaf47705 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
--  module_commande.vhd
--  D. Dalle  30 avril 2019, 16 janv 2020, 23 avril 2020
--  module qui permet de réunir toutes les commandes (problematique circuit sequentiels)
--  recues des boutons, avec conditionnement, et des interrupteurs

-- 23 avril 2020 elimination constante mode_seq_bouton: std_logic := '0'

LIBRARY ieee;
USE ieee.std_logic_1164.all;

entity module_commande IS
generic (nbtn : integer := 4;  mode_simulation: std_logic := '0');
    PORT (
          clk              : in  std_logic;
          o_reset          : out  std_logic; 
          i_btn            : in  std_logic_vector (nbtn-1 downto 0); -- signaux directs des boutons
          i_sw             : in  std_logic_vector (3 downto 0);      -- signaux directs des interrupteurs
          o_btn_cd         : out std_logic_vector (nbtn-1 downto 0); -- signaux conditionnés 
          o_selection_fct  :  out std_logic_vector(1 downto 0);
          o_selection_par  :  out std_logic_vector(1 downto 0)
          );
end module_commande;

ARCHITECTURE BEHAVIOR OF module_commande IS
    type sound_effect is (effect_a, effect_b, effect_c, effect_d);
    signal current_distortion_effect : sound_effect;
    signal wanted_distortion_effect : sound_effect;

component conditionne_btn_v7 is
generic (nbtn : integer := nbtn;  mode_simul: std_logic := '0');
    port (
         CLK          : in std_logic;         -- devrait etre de l ordre de 50 Mhz
         i_btn        : in    std_logic_vector (nbtn-1 downto 0);
         --
         o_btn_db     : out    std_logic_vector (nbtn-1 downto 0);
         o_strobe_btn : out    std_logic_vector (nbtn-1 downto 0)
         );
end component;

    signal d_strobe_btn :    std_logic_vector (nbtn-1 downto 0);
    signal d_btn_cd     :    std_logic_vector (nbtn-1 downto 0); 
    signal d_reset      :    std_logic;
   
BEGIN 

                  
 inst_cond_btn:  conditionne_btn_v7
    generic map (nbtn => nbtn, mode_simul => mode_simulation)
    port map(
        clk           => clk,
        i_btn         => i_btn,
        o_btn_db      => d_btn_cd,
        o_strobe_btn  => d_strobe_btn  
         );
 
 process(clk)
 begin
    if(rising_edge(clk)) then
        o_reset <= d_reset;
    end if;
 end process;
 
 reset_manager : process(d_reset, clk)
    begin
        if d_reset = '1' then
            current_distortion_effect <= effect_a;
        elsif rising_edge(clk) then
            -- Wanted sound effect is outputed on every clock edge
            current_distortion_effect <= wanted_distortion_effect;
        end if;
    end process;

state_manager : process(clk, current_distortion_effect, d_strobe_btn, d_reset)
    begin
        if d_reset = '1' then
            wanted_distortion_effect <= effect_a;
            o_selection_fct <= "00";
        else
            if rising_edge(clk) then
                case current_distortion_effect is
                    when effect_a =>
                        o_selection_fct <= "00";
                        case d_strobe_btn(1 downto 0) is
                            when "01" =>
                                wanted_distortion_effect <= effect_b;
                            when "10" =>
                                wanted_distortion_effect <= effect_d;
                            when others =>
                                -- Do nothing. It's not specified.
                        end case;
                    
                    when effect_b =>
                        o_selection_fct <= "01";
                        case d_strobe_btn(1 downto 0) is
                            when "01" =>
                                wanted_distortion_effect <= effect_c;
                            when "10" =>
                                wanted_distortion_effect <= effect_a;
                            when others =>
                                -- Do nothing. It's not specified.
                        end case;
    
                    when effect_c =>
                        o_selection_fct <= "10";
                        case d_strobe_btn(1 downto 0) is
                            when "01" =>
                                wanted_distortion_effect <= effect_d;
                            when "10" =>
                                wanted_distortion_effect <= effect_b;
                            when others =>
                                -- Do nothing. It's not specified.
                        end case;
                    
                    when effect_d =>
                        o_selection_fct <= "11";
                        case d_strobe_btn(1 downto 0) is
                            when "01" =>
                                wanted_distortion_effect <= effect_a;
                            when "10" =>
                                wanted_distortion_effect <= effect_c;
                            when others =>
                                -- Do nothing. It's not specified.
                        end case;
                end case;
            end if;
        end if;
    end process;
 
   o_btn_cd        <= d_btn_cd;
   o_selection_par <= i_sw(1 downto 0); -- mode de selection du parametre par boutons
   d_reset         <= i_btn(3);         -- pas de contionnement particulier sur reset

END BEHAVIOR;