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

Subversion Repositories saturn

[/] [saturn/] [trunk/] [FPGA Concentrateur SIL4/] [fpga_cosil4/] [ana_double_frame_sil4.vhd] - Blame information for rev 11

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : ANA_DOUBLE_FRAME
3
--  DESCRIPTION : 
4
--    Analyse les flux entrant sur port 1 et port 2 en couche 2 et détermine
5
--    si la trame a déjà été reçue ou non
6
--    Une trame est représentée par sa signature qui constituée des N premiers octets
7
--       
8
--  FICHIER :        ana_double_frame.vhd 
9
--=============================================================================
10
--  CREATION 
11
--  DATE              AUTEUR    PROJET  REVISION 
12
--  20/10/2014  DRA        SATURN       V1.0 
13
--=============================================================================
14
--  HISTORIQUE  DES  MODIFICATIONS :
15
--  DATE              AUTEUR    PROJET  REVISION 
16
--  16/01/2015 DRA      SATURN   V1.1
17
--    Ajout du signal fsm1_ready pour indiquer que la FSM1 est prête à traiter
18
--    des données
19
--    Ajout du test ELSIF (fsm_anasig2 = clear_sig_st) THEN dans les machines
20
--    dans les états compsig_st (évite une situation de blocage particulière)
21
--=============================================================================
22
 
23
LIBRARY IEEE;
24
USE IEEE.STD_LOGIC_1164.ALL;
25
USE IEEE.STD_LOGIC_ARITH.ALL;
26
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
27
 
28
ENTITY ana_double_frame IS
29
   PORT (
30
      -- Ports système
31
      clk_sys     : IN  STD_LOGIC;  -- Clock système
32
      rst_n       : IN  STD_LOGIC;  -- Reset général système
33
      top_cycle   : IN  STD_LOGIC;  -- TOP cycle utilsié pour clerer la mémoire de stockage
34
 
35
      -- Interface port 1
36
      sof1        : IN  STD_LOGIC;                   -- Indique le début d'une trame en réception sur dat_in
37
      dat_in1     : IN  STD_LOGIC_VECTOR(7 downto 0);-- Données de la couche applicative (épurée de la couche layer 2)
38
      dont_keep1  : OUT STD_LOGIC;                   -- Signale que la trame en cours de réception a déjà été reçue sur l'autre port
39
      end_ana1    : OUT STD_LOGIC;                   -- Indique que l'analyse est terminée pour la voie 1
40
      fsm1_ready  : OUT STD_LOGIC;                   -- A '1' lorsque la machine d'état 1 est prête à traiter une trame
41
 
42
      -- Interface port 2
43
      sof2        : IN  STD_LOGIC;                   -- Indique le début d'une trame en réception sur dat_in
44
      dat_in2     : IN  STD_LOGIC_VECTOR(7 downto 0);-- Données de la couche applicative (épurée de la couche layer 2)
45
      dont_keep2  : OUT STD_LOGIC;                   -- Signale que la trame en cours de réception a déjà été reçue sur l'autre port
46
      end_ana2    : OUT STD_LOGIC                    -- Indique que l'analyse est terminée pour la voie 2
47
      );
48
END ana_double_frame;
49
 
50
ARCHITECTURE rtl of ana_double_frame is
51
   -- Définition du nombre de ligne utilsiée dans la DPRAM
52
   CONSTANT nb_lignedp     : STD_LOGIC_VECTOR(7 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(200, 8);
53
   -- Définition des différents type de trame qu'on peut gérer
54
   CONSTANT no_typfrm      : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"FA";
55
   CONSTANT sync_typfrm    : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"00";
56
   CONSTANT reqnosec_typfrm: STD_LOGIC_VECTOR(7 DOWNTO 0) := x"08";
57
   CONSTANT repnosec_typfrm: STD_LOGIC_VECTOR(7 DOWNTO 0) := x"80";
58
 
59
   -- Machine d'état de récupération des signatures
60
   TYPE fsm_anasig_type IS (idle_st, get_sig_st, compsig_st, wait_dpupdate_st, cherche_dpram_st, clear_sig_st,
61
                            store_sig_st, wait_sync_fsm_st, clear_dpram_st);
62
 
63
   -- Signaux pour analsyer le coté 1
64
   SIGNAL fsm_anasig1   : fsm_anasig_type;
65
   SIGNAL shifter1   : STD_LOGIC_VECTOR(79 DOWNTO 0);-- Registre à décalage pour récupérer les premiers octets de la trame 
66
   SIGNAL signature1 : STD_LOGIC_VECTOR(79 DOWNTO 0);-- Vecteur de sauvegarde de la signature de la trame en cours de Rx
67
   SIGNAL cpt_byt1   : STD_LOGIC_VECTOR(3 DOWNTO 0); -- Compteur d'octets voie 1
68
   SIGNAL first_empty1:STD_LOGIC_VECTOR(7 DOWNTO 0); -- Pour mémoriser la 1ère place libre dans la DPRAM
69
   SIGNAL first_found1:STD_LOGIC;                    -- Indique que le 1er vide a été trouvé
70
   SIGNAL cpt_add1   : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Compteur d'addresse pour parcourir la DPRAM
71
   SIGNAL we_sig1    : STD_LOGIC_VECTOR(0 DOWNTO 0); -- Signal d'écriture dans la DPRAM
72
   SIGNAL sigrd_dp1  : STD_LOGIC_VECTOR(80 DOWNTO 0);-- Pour récupérer les signaures dans la DPRAM
73
   SIGNAL sigwr_dp1  : STD_LOGIC_VECTOR(80 DOWNTO 0);-- Pour farbiquer le vecteur à écrire en DPRAM
74
   SIGNAL clr_sig1   : STD_LOGIC;                    -- Indique que l'on souhaite clearer une entrée de la DPRAM
75
 
76
   -- Signaux pour analyser le coté 2
77
   SIGNAL fsm_anasig2   : fsm_anasig_type;
78
   SIGNAL shifter2   : STD_LOGIC_VECTOR(79 DOWNTO 0);-- Registre à décalage pour récupérer les premiers octets de la trame 
79
   SIGNAL signature2 : STD_LOGIC_VECTOR(79 DOWNTO 0);-- Vecteur de sauvegarde de la signature de la trame en cours de Rx
80
   SIGNAL cpt_byt2   : STD_LOGIC_VECTOR(3 DOWNTO 0); -- Compteur d'octets voie 2
81
   SIGNAL last_empty2:STD_LOGIC_VECTOR(7 DOWNTO 0); -- Pour mémoriser la 1ère place libre dans la DPRAM
82
   SIGNAL cpt_add2   : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Compteur d'addresse pour parcourir la DPRAM
83
   SIGNAL we_sig2    : STD_LOGIC_VECTOR(0 DOWNTO 0); -- Signal d'écriture dans la DPRAM
84
   SIGNAL sigrd_dp2  : STD_LOGIC_VECTOR(80 DOWNTO 0);-- Pour récupérer les signaures dans la DPRAM
85
   SIGNAL sigwr_dp2  : STD_LOGIC_VECTOR(80 DOWNTO 0);-- Pour farbiquer le vecteur à écrire en DPRAM
86
   SIGNAL clr_sig2   : STD_LOGIC;                    -- Indique que l'on souhaite clearer une entrée de la DPRAM
87
 
88
   SIGNAL top_cyc_r  : STD_LOGIC;                    -- Pour détecter le front montant de top_cyc
89
   SIGNAL first_clear: STD_LOGIC;                    -- Pour forcer le clear de la DPRAM au reset
90
 
91
   COMPONENT dpram_dbleframe
92
   PORT (
93
      clka  : IN STD_LOGIC;
94
      wea   : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
95
      addra : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
96
      dina  : IN STD_LOGIC_VECTOR(80 DOWNTO 0);
97
      douta : OUT STD_LOGIC_VECTOR(80 DOWNTO 0);
98
      clkb  : IN STD_LOGIC;
99
      web   : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
100
      addrb : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
101
      dinb  : IN STD_LOGIC_VECTOR(80 DOWNTO 0);
102
      doutb : OUT STD_LOGIC_VECTOR(80 DOWNTO 0)
103
   );
104
   END COMPONENT;
105
BEGIN
106
   --------------------------------------------
107
   -- Registres à décalage pour fabriquer les signatures des trames
108
   --------------------------------------------
109
   reg_dec : PROCESS(clk_sys, rst_n)
110
   BEGIN
111
      IF (rst_n = '0') THEN
112
         shifter1 <= (OTHERS => '0');
113
         shifter2 <= (OTHERS => '0');
114
         top_cyc_r <= '0';
115
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
116
         shifter1 <= shifter1(71 DOWNTO 0) & dat_in1;
117
         shifter2 <= shifter2(71 DOWNTO 0) & dat_in2;
118
         top_cyc_r <= top_cycle;
119
      END IF;
120
   END PROCESS;
121
 
122
   --------------------------------------------
123
   -- Machine d'état d'analyse de la signature coté 1
124
   --------------------------------------------
125
   fsm1_ready <= '1' WHEN (fsm_anasig1 = idle_st) ELSE '0';
126
   anasig1 : PROCESS(clk_sys, rst_n)
127
   BEGIN
128
      IF (rst_n = '0') THEN
129
         fsm_anasig1 <= idle_st;                -- Pour assurer une purge de la RAM au démarrage
130
         cpt_byt1 <= (OTHERS => '0');
131
         first_empty1 <= (OTHERS => '0');
132
         first_found1 <= '0';
133
         cpt_add1 <= (OTHERS => '0');
134
         signature1 <= (OTHERS => '0');
135
         we_sig1 <= "1";
136
         clr_sig1 <= '1';
137
         dont_keep1 <= '0';
138
         end_ana1 <= '0';
139
         first_clear <= '0';                    -- Pour assurer une purge des DPRAM au démarrage
140
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
141
         CASE fsm_anasig1 IS
142
            WHEN idle_st =>
143
            -- Etat d'attente d'un début de trame
144
               cpt_add1 <= (OTHERS => '0');
145
               we_sig1 <= "0";
146
               first_found1 <= '0';
147
               signature1(79 DOWNTO 72) <= no_typfrm;  -- On initialsie la signature avec un type inconnu pour pas être réutilisé
148
               IF ((top_cycle = '1' AND top_cyc_r = '0') OR (first_clear = '0')) THEN
149
               -- Sur front montant de top_cycle
150
                  clr_sig1 <= '1';              -- On va clearer la DPRAM
151
                  we_sig1 <= "1";               -- On écrit tout le temps
152
                  first_clear <= '1';
153
                  fsm_anasig1 <= clear_dpram_st;
154
               ELSIF (sof1 = '1') THEN
155
                  cpt_byt1 <= (OTHERS => '0');
156
                  end_ana1 <= '0';
157
                  fsm_anasig1 <= get_sig_st;
158
               END IF;
159
 
160
            WHEN get_sig_st =>
161
            -- Etat de récupération de la signature en fonction du type de trame. Le type est le premier octet reçu
162
            -- et est donc dans une cellule différente selon le nombre d'octets reçu
163
               cpt_byt1 <= cpt_byt1 + 1;
164
               IF (shifter1(55 DOWNTO 48) = sync_typfrm AND cpt_byt1 = "0110") THEN
165
               -- Si c'est une trame de synchro et qu'on a reçu 7 caractères
166
                  signature1 <= shifter1(55 DOWNTO 0) & x"000000";   -- La signature fait 56 bits calés sur les MSB
167
                  fsm_anasig1 <= compsig_st;
168
               ELSIF ((shifter1(39 DOWNTO 32) = reqnosec_typfrm OR shifter1(39 DOWNTO 32) = repnosec_typfrm) AND cpt_byt1 = "0100") THEN
169
               -- Si c'est une requête ou une réponse non sécuritaire
170
                  signature1 <= shifter1(39 DOWNTO 0) & x"0000000000";-- La signature fait 40 bits calés sur les MSB
171
                  fsm_anasig1 <= compsig_st;
172
               ELSIF (cpt_byt1 = "1001") THEN
173
               -- Pour tous les autre types de trame
174
                  signature1 <= shifter1(79 DOWNTO 0);   -- La signature fait 80 bits calés sur les MSB
175
                  fsm_anasig1 <= compsig_st;
176
               END IF;
177
 
178
            WHEN compsig_st =>
179
            -- Etat de comparaison avec la signature de l'autre voie
180
               IF (signature1 = signature2) THEN
181
               -- Si la signature qu'on vient de recevoir sur port 1 est égale à la signature sur port 2
182
                  IF (fsm_anasig2 = compsig_st) THEN
183
                  -- Si les 2 machines en sont au même point, la voie 1 garde la trame, la voie la jette
184
                     fsm_anasig1 <= idle_st;             -- Pas besoin de toucher à la DPRAM
185
                     end_ana1 <= '1';
186
                     dont_keep1 <= '0';                  -- On garde la voie 1
187
                  ELSIF (fsm_anasig2 = store_sig_st) THEN
188
                  -- Si la machine voie 2 est dans l'état de stockage de la signature
189
                     fsm_anasig1 <= idle_st;             -- Pas besoin de toucher à la DPRAM
190
                     end_ana1 <= '1';
191
                     dont_keep1 <= '1';                  -- On va garder la voie 2
192
                  ELSIF (fsm_anasig2 = clear_sig_st) THEN
193
                  -- Si la machine voie 2 est dans l'état de clear de la signature
194
                  -- Cas très particulier de réception de 2 trames avec la même signature reçues
195
                  -- sur les 2 ports. La 2ème du premier couple peut conduire à un clear dans la DPRAM alors
196
                  -- qu'on reçoit la première du second couple qu'il faut alors stocker
197
                     fsm_anasig1 <= wait_dpupdate_st;    -- On va traiter la trame
198
                  ELSIF (fsm_anasig2 /= idle_st) THEN
199
                  -- Si les 2 machines ne sont pas au même point (c'est que fsm_anasig2 est en avance)
200
                  -- Si elle n'est pas en idle, elle n'a pas encore stocké sa signature dans la DPRAM
201
                     fsm_anasig1 <= wait_sync_fsm_st;    -- On va attendre que fsm2 soit au point d'enregistrement
202
                  ELSE
203
                  -- Cas où fsm_anasig2 est revenu à idle mais n'a pas encore annulé signature2 (dure 1 cycle)
204
                  -- Si la machine 2 est dans idle, elle a déjà stocké sa signature en DPRAM. Pendant un cycle (le temps
205
                  -- que la machine 2 cleare sa signature, on peut être ici)
206
                     fsm_anasig1 <= wait_dpupdate_st;    -- On va donc parcourir la mémoire normalement
207
                  END IF;
208
               ELSE
209
               -- Si les 2 signatures ne sont pas équivalentes
210
                  fsm_anasig1 <= wait_dpupdate_st;       -- On va parcourir la DPRAM pour chercher la signature
211
               END IF;
212
 
213
            WHEN wait_dpupdate_st =>
214
            -- Etat d'attente que l'éventuelle dernière écriture sur le port B soit répercutée sur le port A
215
               cpt_add1 <= cpt_add1 + 1;
216
               fsm_anasig1 <= cherche_dpram_st;
217
 
218
            WHEN cherche_dpram_st =>
219
            -- Etat de parcours de la DPRAM pour chercher la signature
220
            -- en rentrant dans cet état la première fois, la donéne à l'adress x"00" est déjà disponible sur le bus data
221
               IF (sigrd_dp1 = ('1' & signature1)) THEN
222
               -- Si la signature est déjà dans la DPRAM et écrite par la voie 2 (MSB à '1')
223
                  fsm_anasig1 <= clear_sig_st;        -- On va clearer cette entrée
224
               ELSIF (cpt_add1 = nb_lignedp) THEN
225
               -- Si on a atteind la dernière ligne du tableau, c'est qu'on a pas trouvé la signature
226
                  fsm_anasig1 <= store_sig_st;        -- On va la stocker
227
               ELSE
228
                  cpt_add1 <= cpt_add1 + 1;
229
               END IF;
230
               IF (first_found1 = '0' AND sigrd_dp1(79 DOWNTO 72) = no_typfrm) THEN
231
               -- Si on a pas encore récupérer la première case vide et que la case actuelle est vide
232
                  first_found1 <= '1';
233
                  first_empty1 <= cpt_add1 - 1;        -- On mémorise l'adresse de la première case vide (-1 car l'adresse a toujours un coup d'avance)
234
               END IF;
235
 
236
            WHEN clear_sig_st =>
237
            -- Etat de suppression d'une entrée dans la DPRAM (i.e. la trame a déjà été reçue)
238
               dont_keep1 <= '1';               -- On signale de ne pas garder la trame
239
               end_ana1 <= '1';
240
               clr_sig1 <= '1';                 -- On va clearer l'entrée dans la DPRAM
241
               cpt_add1 <= cpt_add1 - 1;        -- On peut aller clearer l'entrée correspondante (-1 car l'adresse a toujours un coup d'avance)
242
               we_sig1 <= "1";
243
               fsm_anasig1 <= idle_st;       -- Que la trame soit bonne ou pas on a fini
244
 
245
            WHEN store_sig_st =>
246
            -- Etat d'enregistrement de la signature
247
               dont_keep1 <= '0';               -- On signale de garder la trame
248
               end_ana1 <= '1';
249
               cpt_add1 <= first_empty1;        -- On va écrire dans la première case libre
250
               clr_sig1 <= '0';                 -- On va écrire la signature
251
               IF (signature1 /= signature2) THEN
252
               -- On est en train d'attendre la fin de la trame.
253
               -- Si en cours de route, on reçoit la même signature sur l'autre voie, il n'y a plus besoin d'écrire dans la DPRAM
254
                  we_sig1 <= "1";
255
               END IF;
256
               fsm_anasig1 <= idle_st;
257
 
258
 
259
            WHEN wait_sync_fsm_st =>
260
            -- Etat d'attente que l'autre machine voit qu'on a la même signature qu'elle
261
            -- On est ici parcequ'on a une signature égale à la signautre sur l'aute voie, mais l'autre voie est ent rain de chercher
262
            -- dans la DPRAM
263
               IF (fsm_anasig2 = store_sig_st) THEN
264
               -- Si l'autre voie s'apprête à stocker
265
                  end_ana1 <= '1';
266
                  dont_keep1 <= '1';         -- On ne garde pas la trame (elle est gardée par l'autre voie)
267
                  fsm_anasig1 <= idle_st;
268
               ELSIF (fsm_anasig2 = clear_sig_st) THEN
269
                  end_ana1 <= '1';
270
                  dont_keep1 <= '0';         -- On garde celle la puisqu'elle est supprimée par l'autre voie
271
                  fsm_anasig1 <= idle_st;
272
                END IF;
273
 
274
            WHEN clear_dpram_st =>
275
              cpt_add1 <= cpt_add1 + 1;
276
              IF (cpt_add1 = nb_lignedp) THEN
277
               -- On cleare toutes les lignes du tableau
278
                  fsm_anasig1 <= idle_st;
279
                  we_sig1 <= "0";
280
               END IF;
281
 
282
            WHEN OTHERS =>
283
               fsm_anasig1 <= idle_st;
284
 
285
         END CASE;
286
      END IF;
287
   END PROCESS;
288
 
289
   --------------------------------------------
290
   -- Machine d'état d'analyse de la signature coté 2
291
   --------------------------------------------
292
   anasig2 : PROCESS(clk_sys, rst_n)
293
   BEGIN
294
      IF (rst_n = '0') THEN
295
         fsm_anasig2 <= idle_st;
296
         cpt_byt2 <= (OTHERS => '0');
297
         last_empty2 <= (OTHERS => '0');
298
         cpt_add2 <= (OTHERS => '0');
299
         signature2 <= (OTHERS => '0');
300
         we_sig2 <= "0";
301
         clr_sig2 <= '0';
302
         dont_keep2 <= '0';
303
         end_ana2 <= '0';
304
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
305
         CASE fsm_anasig2 IS
306
            WHEN idle_st =>
307
            -- Etat d'attente d'un début de trame
308
               cpt_add2 <= (OTHERS => '0');
309
               we_sig2 <= "0";
310
               signature2(79 DOWNTO 72) <= no_typfrm;  -- On initialise la signature avec un type inconnu pour pas être réutilisé
311
               IF (sof2 = '1') THEN
312
                  cpt_byt2 <= (OTHERS => '0');
313
                  end_ana2 <= '0';
314
                  fsm_anasig2 <= get_sig_st;
315
               END IF;
316
 
317
            WHEN get_sig_st =>
318
            -- Etat de récupération de la signature en fonction du type de trame. Le type est le premier octet reçu
319
            -- et est donc dans une cellule différente selon le nombre d'octets reçu
320
               cpt_byt2 <= cpt_byt2 + 1;
321
               IF (shifter2(55 DOWNTO 48) = sync_typfrm AND cpt_byt2 = "0110") THEN
322
               -- Si c'est une trame de synchro et qu'on a reçu 7 caractères
323
                  signature2 <= shifter2(55 DOWNTO 0) & x"000000";   -- La signature fait 56 bits calés sur les MSB
324
                  fsm_anasig2 <= compsig_st;
325
               ELSIF ((shifter2(39 DOWNTO 32) = reqnosec_typfrm OR shifter2(39 DOWNTO 32) = repnosec_typfrm) AND cpt_byt2 = "0100") THEN
326
               -- Si c'est une requête ou une réponse non sécuritaire
327
                  signature2 <= shifter2(39 DOWNTO 0) & x"0000000000";-- La signature fait 40 bits calés sur les MSB
328
                  fsm_anasig2 <= compsig_st;
329
               ELSIF (cpt_byt2 = "1001") THEN
330
               -- Pour tous les autre types de trame
331
                  signature2 <= shifter2(79 DOWNTO 0);   -- La signature fait 80 bits calés sur les MSB
332
                  fsm_anasig2 <= compsig_st;
333
               END IF;
334
 
335
            WHEN compsig_st =>
336
            -- Etat de comparaison avec la signature de l'autre voie
337
               IF (signature1 = signature2) THEN
338
               -- Si la signature qu'on vient de recevoir sur port 2 est égale à la signature sur port 1
339
                  IF (fsm_anasig1 = compsig_st) THEN
340
                  -- Si les 2 machines en sont au même point, la voie 1 garde la trame, la voie 2 la jette
341
                     fsm_anasig2 <= idle_st;             -- Pas besoin de toucher à la DPRAM
342
                     end_ana2 <= '1';
343
                     dont_keep2 <= '1';                  -- On jette la voie 2
344
                  ELSIF (fsm_anasig1 = store_sig_st) THEN
345
                  -- Si la machine voie 1 est dans l'état de stockage de la signature
346
                     fsm_anasig2 <= idle_st;             -- Pas besoin de toucher à la DPRAM
347
                     end_ana2 <= '1';
348
                     dont_keep2 <= '1';                  -- On va garder la voie 1, on jette la voie 2
349
                  ELSIF (fsm_anasig1 = clear_sig_st) THEN
350
                  -- Si la machine voie 1 est dans l'état de clear de la signature
351
                  -- Cas très particulier de réception de 2 trames avec la même signature reçues
352
                  -- sur les 2 ports. La 2ème du premier couple peut conduire à un clear dans la DPRAM alors
353
                  -- qu'on reçoit la première du second couple qu'il faut alors stocker
354
                     fsm_anasig2 <= wait_dpupdate_st;    -- On va traiter la trame
355
                  ELSIF (fsm_anasig1 /= idle_st) THEN
356
                  -- Si les 2 machines ne sont pas au même point (c'est que fsm_anasig1 est en avance)
357
                  -- Si elle n'est pas en idle, elle n'a pas encore stocké sa signature dans la DPRAM
358
                     fsm_anasig2 <= wait_sync_fsm_st;    -- On va attendre que fsm1 soit au point d'enregistrement
359
                  ELSE
360
                  -- Cas où fsm_anasig1 est revenu à idle mais n'a pas encore annulé signature1 (dure 1 cycle)
361
                  -- Si la machine 1 est dans idle, elle a déjà stocké sa signature en DPRAM. Pendant un cycle (le temps
362
                  -- que la machine 1 cleare sa signature, on peut être ici)
363
                     fsm_anasig2 <= wait_dpupdate_st;    -- On va donc parcourir la mémoire normalement
364
                  END IF;
365
               ELSE
366
               -- Si les 2 signatures ne sont pas équivalentes
367
                  fsm_anasig2 <= wait_dpupdate_st;       -- On va parcourir la DPRAM pour chercher la signature
368
               END IF;
369
 
370
            WHEN wait_dpupdate_st =>
371
            -- Etat d'attente que l'éventuelle dernière écriture sur le port A soit répercutée sur le port B
372
               cpt_add2 <= cpt_add2 + 1;
373
               fsm_anasig2 <= cherche_dpram_st;
374
 
375
            WHEN cherche_dpram_st =>
376
            -- Etat de parcours de la DPRAM pour chercher la signature
377
            -- en rentrant dans cet état la première fois, la donéne à l'adress x"00" est déjà disponible sur le bus data
378
               IF (sigrd_dp2 = ('0' & signature2)) THEN
379
               -- Si la signature est déjà dans la DPRAM et écrite par la voie 1 (MSB à '0')
380
                  fsm_anasig2 <= clear_sig_st;        -- On va clearer cette entrée
381
               ELSIF (cpt_add2 = nb_lignedp) THEN
382
               -- Si on a atteind la dernière ligne du tableau, c'est qu'on a pas trouvé la signature
383
                  fsm_anasig2 <= store_sig_st;        -- On va la stocker
384
               ELSE
385
                  cpt_add2 <= cpt_add2 + 1;
386
               END IF;
387
               IF (sigrd_dp2(79 DOWNTO 72) = no_typfrm) THEN
388
               -- Si la case est vide on va la garder en mémoire
389
                  last_empty2 <= cpt_add2 - 1;        -- On mémorise l'adresse de la dernière case vide (-1 car l'adresse a toujours un coup d'avance)
390
               END IF;
391
 
392
            WHEN clear_sig_st =>
393
            -- Etat de suppression d'une entrée dans la DPRAM (i.e. la trame a déjà été reçue)
394
               end_ana2 <= '1';
395
               dont_keep2 <= '1';               -- On signale de ne pas garder la trame
396
               clr_sig2 <= '1';                 -- On va clearer l'entrée dans la DPRAM
397
               cpt_add2 <= cpt_add2 - 1;  -- On peut aller clearer l'entrée correspondante (-1 car l'adresse a toujours un coup d'avance)
398
               we_sig2 <= "1";
399
               fsm_anasig2 <= idle_st;       -- Que la trame soit bonne ou pas on a fini
400
 
401
            WHEN store_sig_st =>
402
            -- Etat d'enregistrement de la signature
403
               end_ana2 <= '1';
404
               dont_keep2 <= '0';               -- On signale de garder la trame
405
               cpt_add2 <= last_empty2;         -- On va écrire dans la première case libre
406
               clr_sig2 <= '0';                 -- On va écrire la signature
407
               IF (signature1 /= signature2) THEN
408
               -- On est en train d'attendre la fin de la trame.
409
               -- Si en cours de route, on reçoit la même signature sur l'autre voie, il n'y a plus besoin d'écrire dans la DPRAM
410
                  we_sig2 <= "1";
411
               END IF;
412
               fsm_anasig2 <= idle_st;
413
 
414
            WHEN wait_sync_fsm_st =>
415
            -- Etat d'attente que l'autre machine voit qu'on a la même signature qu'elle
416
            -- On est ici parcequ'on a une signature égale à la signautre sur l'aute voie, mais l'autre voie est ent rain de chercher
417
            -- dans la DPRAM
418
               IF (fsm_anasig1 = store_sig_st) THEN
419
               -- Si l'autre voie s'apprête à stocker
420
                  end_ana2 <= '1';
421
                  dont_keep2 <= '1';         -- On ne garde pas la trame (elle est gardée par l'autre voie)
422
                  fsm_anasig2 <= idle_st;
423
               ELSIF (fsm_anasig1 = clear_sig_st) THEN
424
                  end_ana2 <= '1';
425
                  dont_keep2 <= '0';         -- On ne garde pas la trame elle est gardée par l'autre voie
426
                  fsm_anasig2 <= idle_st;
427
               END IF;
428
 
429
            WHEN OTHERS =>
430
               fsm_anasig2 <= idle_st;
431
 
432
         END CASE;
433
      END IF;
434
   END PROCESS;
435
 
436
   ----------------------------------------------------------
437
   -- Instanciation de la DPRAM de stockage des signatures
438
   ----------------------------------------------------------
439
   sigwr_dp1(80) <= '0';            -- Le MSB dans la DPRAM indique la voie qui a reçu la trame
440
   sigwr_dp1(79 DOWNTO 72) <= no_typfrm WHEN clr_sig1 = '1' ELSE signature1(79 DOWNTO 72);
441
   sigwr_dp1(71 DOWNTO 0)  <= signature1(71 DOWNTO 0);
442
 
443
   sigwr_dp2(80) <= '1';            -- Le MSB dans la DPRAM indique la voie qui a reçu la trame
444
   sigwr_dp2(79 DOWNTO 72) <= no_typfrm WHEN clr_sig2 = '1' ELSE signature2(79 DOWNTO 72);
445
   sigwr_dp2(71 DOWNTO 0)  <= signature2(71 DOWNTO 0);
446
 
447
   inst_dbledp : dpram_dbleframe
448
   PORT MAP(
449
      clka  => clk_sys,
450
      wea   => we_sig1,
451
      addra => cpt_add1,
452
      dina  => sigwr_dp1,
453
      douta => sigrd_dp1,
454
      clkb  => clk_sys,
455
      web   => we_sig2,
456
      addrb => cpt_add2,
457
      dinb  => sigwr_dp2,
458
      doutb => sigrd_dp2
459
   );
460
 
461
END rtl;
462
 

powered by: WebSVN 2.1.0

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