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

Subversion Repositories saturn

[/] [saturn/] [trunk/] [IPCommunication/] [switch2.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 octet par octet du port Rx sur le port Tx
6
--        - Gestion du switch entre les sources Tx (recopie du port Rx sur Tx ou tranmission d'une trame)
7
--        - Buffurise les données reçues pendant la transmission                
8
 
9
--  FICHIER :        switch2.vhd 
10
--=============================================================================
11
--  CREATION 
12
--  DATE              AUTEUR    PROJET  REVISION 
13
--  10/04/2014  DRA        SATURN       V1.0 
14
--=============================================================================
15
--  HISTORIQUE  DES  MODIFICATIONS :
16
--  DATE              AUTEUR    PROJET  REVISION 
17
--  18/09/2014 DRA      SATURN   V1.1
18
--       Prise en comtpe du SW_ENA pour détecter l'inter trame
19
--=============================================================================
20
 
21
LIBRARY IEEE;
22
USE IEEE.STD_LOGIC_1164.ALL;
23
USE IEEE.STD_LOGIC_ARITH.ALL;
24
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
25
LIBRARY UNISIM;
26
USE UNISIM.VComponents.ALL;
27
 
28
ENTITY switch IS
29
   GENERIC (
30
      nbbit_div : INTEGER := 10);   -- Nombre de bits pour coder le diviseur d'horloge 
31
   PORT (
32
      -- Ports système
33
      clk_sys  : IN  STD_LOGIC;  -- Clock système
34
      rst_n    : IN  STD_LOGIC;  -- Reset général système
35
      baud_lock: IN  STD_LOGIC;  -- Indique que le baudrate est calé
36
 
37
      -- Interface série
38
      tc_divclk: IN  STD_LOGIC_VECTOR (nbbit_div-1 DOWNTO 0); -- Diviseur de l'horloge système pour le baudrate
39
      rx       : IN  STD_LOGIC;  -- Réception série    
40
      tx       : OUT  STD_LOGIC; -- Transmission série
41
 
42
      -- Interface avec la mémoire de transmission
43
      tx_dat   : IN  STD_LOGIC_VECTOR (7 DOWNTO 0);  -- Prochaine donnée à transmettre
44
      tx_empty : IN  STD_LOGIC;  -- Mémoire de transmission vide
45
      tx_rd    : OUT  STD_LOGIC; -- Lecture de la donnée suivante à transmettre
46
 
47
      -- Interface avec la mémoire de réception
48
      rx_dat   : OUT  STD_LOGIC_VECTOR (7 DOWNTO 0);  -- Octet déserialisé
49
      rx_val   : OUT  STD_LOGIC; -- Signal d'écriture dans la méoire de réception
50
 
51
      -- Gestion de la recopie
52
      sw_ena   : IN  STD_LOGIC;  -- A '1' entre 2 trames sur le port Rx (RFU)
53
      copy_ena : IN  STD_LOGIC;   -- Autorisation de recopie du Rx sur Tx;
54
                etat            : OUT  STD_LOGIC
55
      );
56
END switch;
57
 
58
ARCHITECTURE rtl of switch is
59
   SIGNAL data_deser       : STD_LOGIC_VECTOR(7 downto 0);  -- Donnée reçue déserialisée
60
   SIGNAL rx_wr_buf        : STD_LOGIC;                     -- Pulse d'écriture d'un nouveau caractère reçu
61
   SIGNAL rx_encours       : STD_LOGIC;                     -- Indique qu'une déserialisation est en cours
62
   SIGNAL fifo_cop_wren    : STD_LOGIC;                     -- Signal d'écriture dans la FIFO de recopie
63
   SIGNAL ser_rdy          : STD_LOGIC;                     -- Le sérialisateur est prêt à traiter un nouveau car
64
   SIGNAL sel_par          : STD_LOGIC;                     -- Sélection de la source parallèle pour le sérialisateur (FIFO de copy ou transmission)
65
   SIGNAL datatx_mux_c     : STD_LOGIC_VECTOR(7 downto 0);  -- Source parallèle pour le sérialisateur (FIFO de copy ou transmission)
66
   SIGNAL fifocopy_dout    : STD_LOGIC_VECTOR(7 downto 0);  -- Donnée en sortie de la FIFO de recopie
67
   SIGNAL start_ser_c      : STD_LOGIC;                     -- Déclenche la sérialisation du mot présent sur datatx_mux_c
68
   SIGNAL cop_read_c       : STD_LOGIC;                     -- Lit un car dans la FIFO de recopie
69
   SIGNAL tx_read_c        : STD_LOGIC;                     -- Lit un car dans la mémoire de transmission
70
   SIGNAL cop_empty        : STD_LOGIC;                     -- FIFO de recopie vide
71
   SIGNAL cop_clr          : STD_LOGIC;                     -- Purge de la FIFO de recopie
72
   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
73
   SIGNAL rx_wr_buf_r      : STD_LOGIC;
74
   SIGNAL rx_wr_buf_rr      : STD_LOGIC;
75
   -- Machine d'état de gestion du module
76
   TYPE switch_state IS (copproc_st, txproc_st);
77
   SIGNAL fsm_switch       : switch_state;
78
 
79
   -- Composant de serialisation
80
   COMPONENT serial_tx
81
        GENERIC (
82
      nbbit_div : INTEGER := 10);
83
   PORT(
84
                clk_sys     : IN std_logic;
85
                rst_n       : IN std_logic;
86
                tc_divclk   : IN std_logic_vector(nbbit_div-1 downto 0);
87
                start_ser   : IN std_logic;
88
                tx_dat      : IN std_logic_vector(7 downto 0);
89
                tx          : OUT std_logic;
90
                ser_rdy     : OUT std_logic
91
                );
92
        END COMPONENT;
93
 
94
   -- Composant de déserialisation
95
        COMPONENT serial_rx2
96
        GENERIC (
97
      nbbit_div : INTEGER := 10);
98
        PORT(
99
                clk_sys     : IN std_logic;
100
                rst_n       : IN std_logic;
101
      baud_lock   : IN  STD_LOGIC;
102
                tc_divclk   : IN std_logic_vector(nbbit_div-1 downto 0);
103
                rx          : IN std_logic;
104
                tx          : OUT std_logic;
105
      busy        : OUT STD_LOGIC;
106
                val         : OUT std_logic;
107
                rx_dat      : OUT std_logic_vector(7 downto 0)
108
                );
109
        END COMPONENT;
110
 
111
   -- FIFO de stockage des données reçues
112
   -- La FIFO est en FWFT
113
   COMPONENT fifo_copy
114
   PORT (
115
      clk      : IN STD_LOGIC;
116
      srst     : IN STD_LOGIC;
117
      din      : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
118
      wr_en    : IN STD_LOGIC;
119
      rd_en    : IN STD_LOGIC;
120
      dout     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
121
      full     : OUT STD_LOGIC;
122
      overflow : OUT STD_LOGIC;
123
      empty    : OUT STD_LOGIC
124
      );
125
   END COMPONENT;
126
 
127
BEGIN
128
        etat <= '0' when (fsm_switch = copproc_st) else '1';
129
   --------------------------------------------
130
   -- Déserialisateur des données reçues sur rx 
131
   --------------------------------------------
132
   inst_serial_rx: serial_rx2
133
   GENERIC MAP (
134
      nbbit_div => nbbit_div)
135
   PORT MAP(
136
                clk_sys => clk_sys,
137
                rst_n => rst_n,
138
      baud_lock => baud_lock,
139
                tc_divclk => tc_divclk,
140
                tx => OPEN,
141
                rx => rx,
142
      busy => rx_encours,
143
                val => rx_wr_buf,
144
                rx_dat => data_deser
145
        );
146
   rx_dat <= data_deser;
147
   rx_val <= rx_wr_buf;
148
 
149
   --------------------------------------------
150
   -- Sérialise sur 10 bits une donnée 8 bits en entrée 
151
   --------------------------------------------
152
   inst_serial_tx: serial_tx
153
   GENERIC MAP (
154
      nbbit_div => nbbit_div)
155
   PORT MAP(
156
                clk_sys => clk_sys,
157
                rst_n => rst_n,
158
                tc_divclk => tc_divclk,
159
                tx => tx,
160
                ser_rdy => ser_rdy,
161
                start_ser => start_ser_c,
162
                tx_dat => datatx_mux_c
163
        );
164
 
165
   --------------------------------------------
166
   -- Machine d'état de gestion de la source de tx
167
   --   Soit on recopie des données reçues et stockées dans la FIFO rx
168
   --   Soit on émet une trame (FIFO externe au module)
169
   --------------------------------------------
170
   -- Indique qu'il y'a des données (cop_empty) ou qu'il va y'en avoir (rx_encours et rx_wr_buf et
171
   -- copy_ena) dans la FIFO de recopie
172
   req_cop_c <= NOT(cop_empty) OR ((rx_encours OR rx_wr_buf OR rx_wr_buf_r OR rx_wr_buf_rr) AND copy_ena);
173
   -- Tant que le baudrate n'est pas locké on garde la FIFO de recopie en reset
174
   cop_clr <= NOT(baud_lock);    --NOT(copy_ena) OR NOT(baud_lock);
175
   -- 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
176
   cop_read_c <= ser_rdy AND NOT(cop_empty) WHEN (fsm_switch = copproc_st) ELSE '0';
177
   -- 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
178
   tx_read_c <= ser_rdy AND NOT(tx_empty) WHEN (fsm_switch = txproc_st) ELSE '0';
179
   tx_rd <= tx_read_c;  -- Signal de lecture de la FIFO externe
180
   -- A chaque mot lu dans une des FIFO, on active le sérialisateur
181
   start_ser_c <= cop_read_c OR tx_read_c;
182
   -- L'entrée du sérialisateur dépend du signal de sélection (i.e. recopie ou transmission d'une trame)
183
   datatx_mux_c <= tx_dat WHEN (sel_par = '0') ELSE fifocopy_dout;
184
 
185
   man_fsm : PROCESS(clk_sys, rst_n)
186
   BEGIN
187
      IF (rst_n = '0') THEN
188
         fsm_switch <= copproc_st;
189
         sel_par <= '1';
190
         rx_wr_buf_r <= '0';
191
         rx_wr_buf_rr <= '0';
192
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
193
         rx_wr_buf_r <= rx_wr_buf;
194
         rx_wr_buf_rr <= rx_wr_buf_r;
195
         CASE fsm_switch IS
196
            WHEN copproc_st =>
197
            -- Etat d'émission des données de la FIFO de recopie
198
               IF ((tx_empty = '0') AND (req_cop_c = '0') AND (ser_rdy = '1') AND (sw_ena = '1')) THEN
199
               -- S'il y'a des données à transmettre dans la FIFO externe (tx_empty = 0) et (qu'il n'y a pas de données
200
               -- a trasnmettre dans la FIFO de copie ou qu'il n'y en aura pas bientôt)(req_cop_c = 0), et que le dernier
201
               -- octet est fini d'envoyer (ser_rdy = 1)
202
                  sel_par <= '0';            -- Les données du sérialisateur viennent de la FIFO externe
203
                  fsm_switch <= txproc_st;   -- On va émettre une trame
204
               END IF;
205
 
206
            WHEN txproc_st =>
207
            -- Etat d'émission des données de la FIFO externe
208
               IF (tx_empty = '1') THEN
209
               -- S'il n'y a plus de données à transmettre
210
                  sel_par <= '1';            -- Les données du sérialisateur viennent de la FIFO de recopie
211
                  fsm_switch <= copproc_st;  -- Par défaut on est toujours dans cet état
212
               END IF;
213
 
214
            WHEN OTHERS =>
215
               fsm_switch <= copproc_st;
216
         END CASE;
217
      END IF;
218
   END PROCESS;
219
 
220
   fifo_cop_wren <= rx_wr_buf AND copy_ena;  -- On n'écrit dans la FIFO de copie que si la recopie est autorisée
221
   inst_fifo_copy : fifo_copy
222
   PORT MAP (
223
      clk => clk_sys,
224
      srst => cop_clr,
225
      din => data_deser,
226
      wr_en => fifo_cop_wren,
227
      rd_en => cop_read_c,
228
      dout => fifocopy_dout,
229
      full => OPEN,
230
      overflow => OPEN,
231
      empty => cop_empty
232
   );
233
 
234
END rtl;
235
 

powered by: WebSVN 2.1.0

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