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;
|