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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
|
---------------------------------------------------------------------------------------------
-- circuit_tr_signal.vhd
---------------------------------------------------------------------------------------------
-- Circuit de base pour la problématique sur la carte ZYBO avec codec SSM2603
---------------------------------------------------------------------------------------------
-- Université de Sherbrooke - Département de GEGI
--
-- Version : 5.0
-- Nomenclature : inspiree de la nomenclature 0.2 GRAMS
-- Date : rev 10 janvier 2020, 4 mai 2020, 5 janvier 2022
-- Auteur(s) : Daniel Dalle, Sébastien Roy, Réjean Fontaine, Julien Rossignol
-- Technologie : ZYNQ 7000 Zybo Z7-10 (xc7z010clg400-1)
-- Outils : vivado 2020.2
--
---------------------------------------------------------------------------------------------
-- Description (sur une carte Zybo)
-- Circuit de fondation pour la problématique, voir la documentation de l'APP et
-- en particulier l'annexe.
--
-- Modification 5 janvier 2022 conversion vers block design
-- Modification 7 janvier 2020 documentation
-- Modification 6 mai 2019 introduction de decodeur_i2s_v1b
-- Developpement initial 2 février 2019
--
---------------------------------------------------------------------------------------------
-- ref documents problématique
-- ref manual Zybo
-- https://reference.digilentinc.com/reference/programmable-logic/zybo-z7/reference-manual
-- ref schematic (public)
-- https://reference.digilentinc.com/_media/reference/programmable-logic/zybo-z7/zybo_z7_sch-public.pdf
-- ref Analog Devices SSM2603 Audio Codec
-- https://www.analog.com/media/en/technical-documentation/data-sheets/ssm2603.pdf
--
-- carte ZYBO Z7-10 (voir les notes de projet)
-- sur PmodA double cable vers PmodSSD (version preliminaire)
-- sur PmodB vide PmodB n'existe pas sur Zybo-Z7-10
-- sur PmodC ver Pmod8LD
-- sur PmodD signaux de tests
-- sur PmodE signaux de tests
--
---------------------------------------------------------------------------------------------
-- À FAIRE:
-- voir documents problématique
---------------------------------------------------------------------------------------------
--
---------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
----------------------------------------------------------------------------------
--
----------------------------------------------------------------------------------
entity circuit_tr_signal is
generic ( mode_simulation: std_logic := '0');
Port (
o_ac_bclk : out STD_LOGIC; -- bit clock ... I2S digital audio clk ~ mclk /4
o_ac_mclk : out STD_LOGIC; -- SSM2603 Master Clock horloge ~ 12.288 MHz
o_ac_muten : out STD_LOGIC; -- DAC Output Mute, Active Low
o_ac_pbdat : out STD_LOGIC; -- I²S (Playback Data)
o_ac_pblrc : out STD_LOGIC; -- I²S (Playback Channel Clock) ~ 48. KHz (~ 20.8 us)
i_ac_recdat : in STD_LOGIC; -- I²S (Record Data)
o_ac_reclrc : out STD_LOGIC; -- I²S (Record Channel Clock) ~ 48. KHz (~ 20.8 us)
io_ac_scl : inout STD_LOGIC; -- horloge I2C SPI
io_ac_sda : inout STD_LOGIC; -- I2C 2-Wire Control Interface Data Input/Output.
--
i_btn : in std_logic_vector (3 downto 0);
i_sw : in std_logic_vector (3 downto 0);
sysclk : in std_logic;
o_pmodssd : out std_logic_vector (7 downto 0);
o_led : out std_logic_vector (3 downto 0);
o_pmodled : out std_logic_vector (7 downto 0);
o_led6_r : out std_logic;
o_led6_g : out std_logic
--
-- ; -- DIO pour tests avec analyseur logique
-- DIO : out std_logic_vector (15 downto 0) -- Signaux test pour analyseur logique
-- -- (connecteurs JD et JE)
-- -- voir avec fichier contraintes
);
end circuit_tr_signal;
architecture STRUCTURE of circuit_tr_signal is
constant freq_sys_Hz: integer := 125_000_000; -- Hz
component init_codec_v2
Port (
i_reset : in std_logic;
o_cfg_done : out STD_LOGIC;
o_cfg_busy : out STD_LOGIC;
o_ena : out STD_LOGIC; -- pour tests
-- pour interface avec partie I2C du codec
i_lrc : in STD_LOGIC; -- I²S (Record Channel Clock) ~ 48. KHz (~ 20.8 us)
io_scl : inout STD_LOGIC; -- horloge I2C SPI
io_sda : inout STD_LOGIC; -- I2C 2-Wire Control Interface Data Input/Output.
--
i_strobe_1000Hz : in std_logic;
clk_p : in std_logic
);
end component;
component synchro_codec_v1 is
generic (cst_CLK_syst_Hz: integer := 100_000_000); -- valeur par defaut de fréquence de clkm
Port (
sysclk : in STD_LOGIC; -- Entrée horloge systeme (typique 125 MHz (1/8 ns) ou 100 ( 1/10 ns))
o_clk_0 : out STD_LOGIC; -- horloge via bufg 50. MHz (20 ns)
o_mclk : out STD_LOGIC; -- horloge via bufg 12.389 MHz (80,714 ns)
o_stb_1000Hz : out STD_LOGIC; -- strobe durée 1/o_clk_0 sync sur 1000Hz
o_stb_1Hz : out STD_LOGIC; -- strobe durée 1/o_clk_0 sync sur 1Hz
o_S_1Hz : out STD_LOGIC; -- Signal temoin 1 Hz
o_bclk : out STD_LOGIC; -- horloge bit clk (defaut 12.289 MHz / 4 soit 3,07225 MHz (325.49 ns) )
o_reclrc : out STD_LOGIC -- horloge record, play back, sampling rate clock, left right channel (defaut 48 KHz (20,83 us))
);
end component;
component attenuateur_pwm
generic (c_val_seuil: std_logic_vector(7 downto 0) := "00001111");
port (
CLK : in STD_LOGIC; -- Entrée horloge
i_signal : in STD_LOGIC; -- entree
o_signal : out STD_LOGIC -- sortie
);
end component;
component design_1 is
port (
i_recdat : in STD_LOGIC;
i_lrc : in STD_LOGIC;
i_btn : in STD_LOGIC_VECTOR ( 3 downto 0 );
i_sw : in STD_LOGIC_VECTOR ( 3 downto 0 );
clk_100MHz : in STD_LOGIC;
o_pbdat : out STD_LOGIC_VECTOR ( 0 to 0 );
JPmod : out STD_LOGIC_VECTOR ( 7 downto 0 );
o_param : out STD_LOGIC_VECTOR ( 7 downto 0 );
o_sel_fct : out STD_LOGIC_VECTOR ( 1 downto 0 );
o_sel_par : out STD_LOGIC_VECTOR ( 1 downto 0 )
);
end component design_1;
---------------------------------------------------------------------------------
-- Signaux
----------------------------------------------------------------------------------
signal clk_p : std_logic; -- horloge de synchro principale
signal d_strobe_1000Hz : std_logic;
signal d_strobe_cfg : std_logic;
signal d_strobe_1Hz : std_logic := '0';
signal d_T1Hz : std_logic;
signal reset : std_logic;
--
signal d_sw : std_logic_vector (3 downto 0); -- 4 bits sur Zybo
signal d_btn : std_logic_vector (3 downto 0);
signal d_btn_db : std_logic_vector (3 downto 0);
-- signal d_str_btn : std_logic_vector (3 downto 0);
signal d_ac_bclk : std_logic; --out STD_LOGIC; -- horloge I2S digital audio sera mclk/4
signal d_ac_mclk : std_logic; --out STD_LOGIC; -- Master Clock horloge ~ 12.288 MHz
signal d_ac_muten : std_logic; --out STD_LOGIC; -- DAC Output Mute, Active Low
signal d_ac_pbdat : std_logic; --out STD_LOGIC; -- I²S (Playback Data)
signal d_ac_pblrc : std_logic; --out STD_LOGIC; -- I²S (Playback Channel Clock)
signal d_ac_recdat : std_logic; --in STD_LOGIC; -- I²S (Record Data)
signal d_ac_reclrc : std_logic; --out STD_LOGIC; -- I²S (Record Channel Clock)
signal d_ac_scl : std_logic; --out STD_LOGIC; -- I2C SCLK active ou non
signal d_cfg_busy : std_logic;
signal d_ena : std_logic;
signal d_cfg_done : std_logic;
signal d_param : std_logic_vector (7 downto 0);
signal d_statut : std_logic_vector (3 downto 0);
---------------------------------------------------------------------------------------------
-- Description (sur une carte Zybo)
---------------------------------------------------------------------------------------------
begin
inst_synchro : synchro_codec_v1
generic map (cst_CLK_syst_Hz => freq_sys_Hz)
port map (
sysclk => sysclk,
o_clk_0 => clk_p, -- 50 MHz
o_mclk => d_ac_mclk, -- 12.288 MHz approx
o_stb_1000Hz => d_strobe_1000Hz,
o_stb_1Hz => d_strobe_1Hz,
o_S_1Hz => d_T1Hz,
o_bclk => d_ac_bclk, -- freq mclk / 4
o_reclrc => d_ac_reclrc
);
inst_init_codec: init_codec_v2
--generic ( mode_simulation: std_logic := '0');
Port map (
i_reset => reset,
o_cfg_done => d_cfg_done,
o_cfg_busy => d_cfg_busy,
o_ena => d_ena,
--
i_lrc => d_ac_reclrc,
io_scl => io_ac_scl,
io_sda => io_ac_sda,
--
i_strobe_1000Hz => d_strobe_cfg,
clk_p => clk_p -- 50 MHz
);
d_strobe_cfg <= d_strobe_1000Hz;
design_1_i: component design_1 port map (
JPmod(7 downto 0) => o_pmodssd(7 downto 0),
clk_100MHz => d_ac_bclk,
i_btn(3 downto 0) => i_btn(3 downto 0),
i_recdat => d_ac_recdat,
i_lrc => d_ac_reclrc,
i_sw(3 downto 0) => i_sw(3 downto 0),
o_pbdat(0) => d_ac_pbdat,
o_param => d_param,
o_sel_fct => d_statut(3 downto 2),
o_sel_par => d_statut(1 downto 0)
);
-- signaux d entree boutons et sw
d_btn <= i_btn;
d_sw <= i_sw;
d_ac_muten <= '1'; -- DAC Output Mute, Active Low (Codec actif) ref SSM2603
o_led6_r <= d_T1Hz; -- signe de vie sur DEL rouge o_led6_r
o_pmodled <= d_param;
o_led <= d_statut;
-- attenuateur pour modérer l'éclat de la led verte o_led6_g
inst_att: attenuateur_pwm
generic map (c_val_seuil => "00001111")
Port map
(
CLK => clk_p,
i_signal => d_cfg_done, -- signal a afficher
o_signal => o_led6_g -- port led verte
);
-- signaux d entree / sortie du codec
o_ac_bclk <= d_ac_bclk; --out STD_LOGIC; -- horloge I2S digital audio mclk/4
o_ac_mclk <= d_ac_mclk; --out STD_LOGIC; -- Master Clock horloge 12.288 MHz clk_12_288MHz
o_ac_muten <= d_ac_muten; --out STD_LOGIC; -- DAC Output Mute, Active Low
d_ac_recdat <= i_ac_recdat; --in STD_LOGIC; -- I²S (Record Data) provenant du codec
--signaux vers le codec (avec OBUF)
OBUF_o_pblrc : OBUF
port map (
O => o_ac_pblrc, -- Buffer output
I => d_ac_pblrc -- Buffer input
);
OBUF_o_reclrc : OBUF
port map (
O => o_ac_reclrc, -- Buffer output
I => d_ac_reclrc -- Buffer input
);
OBUF_o_pbdat : OBUF
port map (
O => o_ac_pbdat, -- Buffer output
I => d_ac_pbdat -- Buffer input
);
d_ac_pblrc <= d_ac_reclrc; -- I²S (Record et Playback Channel Clock) communs
end STRUCTURE;
|