OpenCores
URL https://opencores.org/ocsvn/saturn/saturn/trunk

Subversion Repositories saturn

[/] [saturn/] [trunk/] [IPCommunication/] [switch.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : SWITCH
3
--  DESCRIPTION : 
4
--        - Gère la réception et la transmission d'une ligne série
5
--                       - Copie du port Rx sur le port Tx avec remise en forme du signal
6
--        - Gestion du switch entre les sources Tx
7
--        - Buffurise les données reçues pendant la transmission                
8
 
9
--  FICHIER :        switch.vhd 
10
--=============================================================================
11
--  CREATION 
12
--  DATE        AUTEUR  PROJET  REVISION 
13
--  29/02/2012  DRA     CONCERTO        V1.0 
14
--=============================================================================
15
--  HISTORIQUE  DES  MODIFICATIONS :
16
--  DATE        AUTEUR  PROJET  REVISION 
17
--=============================================================================
18
 
19
LIBRARY IEEE;
20
USE IEEE.STD_LOGIC_1164.ALL;
21
USE IEEE.STD_LOGIC_ARITH.ALL;
22
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
23
 
24
 
25
 
26
-- Uncomment the following library declaration if instantiating
27
-- any Xilinx primitives in this code.
28
--library UNISIM;
29
--use UNISIM.VComponents.all;
30
 
31
ENTITY switch IS
32
   GENERIC (
33
      nbbit_div : INTEGER := 10);   -- Nombre de bits pour coder le diviseur d'horloge 
34
   PORT (
35
      -- Ports système
36
      clk_sys  : IN  STD_LOGIC;  -- Clock système
37
      rst_n    : IN  STD_LOGIC;  -- Reset génrél système
38
      baud_lock: IN  STD_LOGIC;  -- Indique que le baudrate est calé
39
 
40
      -- Interface série
41
      tc_divclk: IN  STD_LOGIC_VECTOR (nbbit_div-1 DOWNTO 0); -- Diviseur de l'horloge système pour le baudrate
42
      rx       : IN  STD_LOGIC;  -- Réception série    
43
      tx       : OUT  STD_LOGIC; -- Transmission série
44
 
45
      -- Interface avec la mémoire de transmission
46
      tx_dat   : IN  STD_LOGIC_VECTOR (7 DOWNTO 0);  -- Prochaine donnée à transmettre
47
      tx_empty : IN  STD_LOGIC;  -- Mémoire de transmission vide
48
      tx_rd    : OUT  STD_LOGIC; -- Lecture de la donnée suivante à transmettre
49
 
50
      -- Interface avec la mémoire de réception
51
      rx_dat   : OUT  STD_LOGIC_VECTOR (7 DOWNTO 0);  -- Donnée en cours de réception
52
      rx_val   : OUT  STD_LOGIC; -- Signal d'écriture dans la méoire de réception
53
 
54
      -- Gestion de la recopie
55
      sw_ena   : IN  STD_LOGIC;  -- Autorisation du changement d'émetteur
56
      copy_ena : IN  STD_LOGIC  -- Autorisation de recopie d'un port sur l'autre
57
      );
58
END switch;
59
 
60
ARCHITECTURE rtl of switch is
61
   SIGNAL data_deser       : STD_LOGIC_VECTOR(7 downto 0);  -- Donnée reçue déserialisée
62
   SIGNAL tx_copy          : STD_LOGIC;                     -- Valeur d'un bit à retransmettre pour la recopie
63
   SIGNAL rx_wr_buf        : STD_LOGIC;                     -- Pulse d'écriture d'un nouveau caractère reçu
64
   SIGNAL rx_encours       : STD_LOGIC;                     -- Indique qu'une réception est en cours
65
 
66
   SIGNAL ser_rdy          : STD_LOGIC;                     -- Le sérialisateur est prêt à traiter un nouveau car
67
   SIGNAL tx_ser           : STD_LOGIC;                     -- Sortie du sérialisateur
68
 
69
   SIGNAL sel_ser          : STD_LOGIC;                     -- Sélection de la source série pour le Tx (recopie ou sérialisateur)
70
   SIGNAL sel_par          : STD_LOGIC;                     -- Sélection de la source parallèle pour le sérialisateur (FIFO de copy ou transmission)
71
   SIGNAL datatx_mux_c     : STD_LOGIC_VECTOR(7 downto 0);  -- Source parallèle pour le sérialisateur (FIFO de copy ou transmission)
72
   SIGNAL fifocopy_dout    : STD_LOGIC_VECTOR(7 downto 0);  -- Donnée en sortie de la FIFO de recopie
73
   SIGNAL start_ser_c      : STD_LOGIC;                     -- Déclenche la sérialisation du mot présent sur datatx_mux_c
74
   SIGNAL cop_read_c       : STD_LOGIC;                     -- Lit un car dans la FIFO de recopie
75
   SIGNAL tx_read_c        : STD_LOGIC;                     -- Lit un car dans la mémoire de transmission
76
   SIGNAL cop_empty        : STD_LOGIC;                     -- FIFO de recopie vide
77
   SIGNAL cop_clr          : STD_LOGIC;                     -- Purge de la FIFO de recopie
78
   SIGNAL req_cop_c        : STD_LOGIC;                     -- Indique qu'il y'a ou qu'il va y'avoir un caractère dans la FIFO de recopie
79
   SIGNAL tempo            : STD_LOGIC_VECTOR(nbbit_div-1 downto 0); -- Tempo de 1 bit
80
 
81
   -- Machine d'état de gestion du module
82
   TYPE switch_state IS (idle_st, txreq_st, wait1bit_st, txproc_st, copproc_st);
83
   SIGNAL fsm_switch       : switch_state;
84
 
85
   -- Composant de serialisation
86
   COMPONENT serial_tx
87
        GENERIC (
88
      nbbit_div : INTEGER := 10);
89
   PORT(
90
                clk_sys     : IN std_logic;
91
                rst_n       : IN std_logic;
92
                tc_divclk   : IN std_logic_vector(nbbit_div-1 downto 0);
93
                start_ser   : IN std_logic;
94
                tx_dat      : IN std_logic_vector(7 downto 0);
95
                tx          : OUT std_logic;
96
                ser_rdy     : OUT std_logic
97
                );
98
        END COMPONENT;
99
 
100
   -- Composant de déserialisation
101
        COMPONENT serial_rx
102
        GENERIC (
103
      nbbit_div : INTEGER := 10);
104
        PORT(
105
                clk_sys     : IN std_logic;
106
                rst_n       : IN std_logic;
107
      baud_lock   : IN  STD_LOGIC;
108
                tc_divclk   : IN std_logic_vector(nbbit_div-1 downto 0);
109
                rx          : IN std_logic;
110
                tx          : OUT std_logic;
111
      busy        : OUT STD_LOGIC;
112
                val         : OUT std_logic;
113
                rx_dat      : OUT std_logic_vector(7 downto 0)
114
                );
115
        END COMPONENT;
116
 
117
   -- FIFO de stockage des données reçues qui ne peuvent pas être recopiées
118
   -- La FIFO est en FWFT
119
   COMPONENT fifo_copy
120
   PORT (
121
      clk      : IN STD_LOGIC;
122
      srst     : IN STD_LOGIC;
123
      din      : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
124
      wr_en    : IN STD_LOGIC;
125
      rd_en    : IN STD_LOGIC;
126
      dout     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
127
      full     : OUT STD_LOGIC;
128
      overflow : OUT STD_LOGIC;
129
      empty    : OUT STD_LOGIC
130
      );
131
   END COMPONENT;
132
 
133
BEGIN
134
   --------------------------------------------
135
   -- Déserialisateur des données reçues sur rx 
136
   -- et remise en forme (retaillage des durée de bit) pour la recopie
137
   --------------------------------------------
138
   inst_serial_rx: serial_rx
139
   GENERIC MAP (
140
      nbbit_div => nbbit_div)
141
   PORT MAP(
142
                clk_sys => clk_sys,
143
                rst_n => rst_n,
144
      baud_lock => baud_lock,
145
                tc_divclk => tc_divclk,
146
                tx => tx_copy,
147
                rx => rx,
148
      busy => rx_encours,
149
                val => rx_wr_buf,
150
                rx_dat => data_deser
151
        );
152
   rx_dat <= data_deser;
153
   rx_val <= rx_wr_buf;
154
 
155
   --------------------------------------------
156
   -- Sérialise sur 10 bits une donnée 8 bits en entrée 
157
   --------------------------------------------
158
   inst_serial_tx: serial_tx
159
   GENERIC MAP (
160
      nbbit_div => nbbit_div)
161
   PORT MAP(
162
                clk_sys => clk_sys,
163
                rst_n => rst_n,
164
                tc_divclk => tc_divclk,
165
                tx => tx_ser,
166
                ser_rdy => ser_rdy,
167
                start_ser => start_ser_c,
168
                tx_dat => datatx_mux_c
169
        );
170
 
171
   --------------------------------------------
172
   -- Machine d'état de gestion de la source de tx
173
   --   Soit on recopie le rx
174
   --   Soit on émet des données reçues et stockées dans la FIFO rx
175
   --   Soit on émet une trame (FIFO externe au module)
176
   --------------------------------------------
177
   -- Indique qu'il y'a des données (cop_empty) ou qu'il va y'en avoir (rx_encours et rx_wr_buf et
178
   -- copy_ena) dans la FIFO de recopie
179
   req_cop_c <= NOT(cop_empty) OR ((rx_encours OR rx_wr_buf) AND copy_ena);
180
   man_fsm : PROCESS(clk_sys, rst_n)
181
   BEGIN
182
      IF (rst_n = '0') THEN
183
         fsm_switch <= idle_st;
184
         sel_ser <= '0';
185
         sel_par <= '1';
186
         cop_clr <= '1';
187
         tempo   <= (OTHERS => '0');
188
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
189
         CASE fsm_switch IS
190
            WHEN idle_st =>
191
            -- Dans cet état, la FIO Tx et la FIFO copy sont forcément vides
192
                              IF (rx_encours = '0') THEN -- Le nouvel état de copy_ena n'est pris en compte que sur une frontière octet
193
                  sel_ser <= copy_ena;    -- Si la copie n'est pas autorisée, tx est de base sur le sérialisateur
194
               END IF;
195
               sel_par <= '1';
196
               cop_clr <= '1';         -- Par défaut, la FIFO de recopie doit être vide
197
               IF (tx_empty = '0') THEN
198
               -- S'il y'a des données à transmettre dans la FIFO externe
199
                  fsm_switch <= txreq_st;
200
               END IF;
201
 
202
            WHEN txreq_st =>
203
            -- Etat d'attente que les conditions soient favorables pour changer la source du tx
204
               IF ((sw_ena = '1' AND rx_encours = '0') OR
205
                    (copy_ena = '0')) THEN
206
               -- Si la recopie est interdite, on change quand on veut
207
               -- Sinon, il faut attendre d'être entre 2 trames (sw_ena) et qu'on est pas déjà en train de recopier le car suivant
208
                  sel_ser <= '0';            -- Le tx est sur le sérialisateur
209
                  sel_par <= '0';            -- Les données du sérialisateur viennent de la FIFO externe
210
                  cop_clr <= not(copy_ena);  -- Si la recopie est interdite on purge la FIFO de recopie
211
                  tempo   <= (OTHERS => '0');
212
                  fsm_switch <= wait1bit_st;
213
               END IF;
214
 
215
            WHEN wait1bit_st =>
216
            -- Etat d'attente de 1 bit pour assurer que le STOP bit recopié fait au moins un bit
217
               IF (tempo = tc_divclk) THEN
218
                  fsm_switch <= txproc_st;
219
               ELSE
220
                  tempo <= tempo + 1;
221
               END IF;
222
 
223
            WHEN txproc_st =>
224
            -- Etat d'émission des données de la FIFO externe
225
               IF ((tx_empty = '1') AND (req_cop_c = '1')) THEN
226
               -- S'il n'y a plus rien à émettre dans la FIFO externe et qu'il y'a des données dans la FIFO de recopie
227
                  sel_ser <= '0';            -- Le tx est sur le sérialisateur
228
                  sel_par <= '1';            -- Les données du sérialisateur viennent de la FIFO de recopie
229
                  cop_clr <= not(copy_ena);
230
                  fsm_switch <= copproc_st;
231
               ELSIF ((tx_empty = '1') AND (ser_rdy = '1') AND (req_cop_c = '0')) THEN
232
               -- Si n'y a plus rien à émettre dans aucune FIFO et que l'émission du dernier car est finie
233
                  sel_ser <= copy_ena;       -- Le tx est branché sur le rx si la recopie est autorisée
234
                  sel_par <= '1';
235
                  cop_clr <= '1';
236
                  fsm_switch <= idle_st;
237
               END IF;
238
 
239
            WHEN copproc_st =>
240
            -- Etat d'émission des données de la FIFO de recopie
241
               IF ((tx_empty = '0') AND (req_cop_c = '0')) THEN
242
               -- S'il n'y a plus rien à émettre dans la FIFO de recopie et qu'il y'a des données dans la FIFO externe
243
                  sel_ser <= '0';            -- Le tx est sur le sérialisateur
244
                  sel_par <= '0';            -- Les données du sérialisateur viennent de la FIFO externe
245
                  cop_clr <= not(copy_ena);
246
                  fsm_switch <= txproc_st;
247
               ELSIF ((tx_empty = '1') AND (ser_rdy = '1') AND (req_cop_c = '0') AND
248
                      (sw_ena = '1' OR copy_ena = '0')) THEN
249
               -- Si n'y a plus rien à émettre dans aucune FIFO et que l'émission du dernier car est finie
250
               -- et que soit on est pas au milieu d'une trame (sw_ena = 1) ou bien que la copy n'est pas 
251
               -- autorisé (dans ce cas on peut switcher quand on veut)
252
                  sel_ser <= copy_ena;       -- Le tx est branché sur le rx si la recopie est autorisée
253
                  sel_par <= '1';
254
                  cop_clr <= '1';
255
                  fsm_switch <= idle_st;
256
               END IF;
257
 
258
            WHEN OTHERS =>
259
               fsm_switch <= idle_st;
260
         END CASE;
261
      END IF;
262
   END PROCESS;
263
 
264
   -- On lit un mot dans la FIFO de recopie chaque fois que le sérialisateur est prêt et qu'on est dans le bon état
265
   cop_read_c <= ser_rdy AND NOT(cop_empty) WHEN (fsm_switch = copproc_st) ELSE '0';
266
   -- On lit un mot dans la FIFO externe chaque fois que le sérialisateur est prêt et qu'on est dans le bon état
267
   tx_read_c <= ser_rdy AND NOT(tx_empty) WHEN (fsm_switch = txproc_st) ELSE '0';
268
   tx_rd <= tx_read_c;
269
   -- A cahque mot lu dans une des FIFO, on active le sérialisateur
270
   start_ser_c <= cop_read_c OR tx_read_c;
271
   -- L'entrée du sérialisateur dépend du signal de sélection
272
   datatx_mux_c <= tx_dat WHEN (sel_par = '0') ELSE fifocopy_dout;
273
   -- La sortie tx dépend du signal de sélection. Il n'y a pas de problème de glitch car sel_ser ne 
274
   -- change qu'entre 2 caractère et donc la ligne est IDLE à ce moment là
275
   tx <= tx_ser WHEN (sel_ser = '0') ELSE tx_copy;
276
 
277
   inst_fifo_copy : fifo_copy
278
   PORT MAP (
279
      clk => clk_sys,
280
      srst => cop_clr,
281
      din => data_deser,
282
      wr_en => rx_wr_buf,
283
      rd_en => cop_read_c,
284
      dout => fifocopy_dout,
285
      full => OPEN,
286
      overflow => OPEN,
287
      empty => cop_empty
288
   );
289
 
290
END rtl;
291
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.