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

Subversion Repositories saturn

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--===========================================================================================
2
-- filter_dbl_frmae
3
--  DESCRIPTION : 
4
--    Réceptionne les flux 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
--    Si la trmae a déjà été reçue, elle n'est pas gardée en mémoire
7
--       
8
--  FICHIER :        filter_dbl_frmae.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
--    Evolution du module ana_double_frame
18
--    Gestion du signal fsm1_ready pour n'envoyer des données que lorsque 
19
--    ana_double_frame est prêt à recevoir
20
--=============================================================================
21
 
22
--------------------------------------------------------------------------------
23
-- LIBRAIRIES:
24
--------------------------------------------------------------------------------
25
LIBRARY IEEE;
26
USE IEEE.STD_LOGIC_1164.ALL;
27
USE IEEE.STD_LOGIC_ARITH.ALL;
28
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
29
 
30
--------------------------------------------------------------------------------
31
-- ENTITY DECLARATION:
32
--------------------------------------------------------------------------------
33
ENTITY filter_dbl_frame IS
34
   PORT (
35
      -- Ports système
36
      clk_sys        : IN STD_LOGIC;   -- Clock Systeme
37
      rst_n          : IN STD_LOGIC;   -- Reset Systeme
38
      top_cycle      : IN  STD_LOGIC;  -- TOP cycle utilsié pour clearer la mémoire de stockage
39
      ena_filt_dble  : IN  STD_LOGIC;  -- Indique s'il faut ou non appliquer le filtrage
40
 
41
      -- Flux de donnée venant des ports 1 et 2 (avant filtrage)
42
      data_port1           : IN STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Flux de données venant du coté 1
43
      soc_port1            : IN STD_LOGIC;                     -- Indique un début de trame sur le port1
44
      com_dispo1           : IN STD_LOGIC;                     -- Signal indiquant que des data sont pretes cote 1
45
      rd_port1             : OUT STD_LOGIC;                    -- Ordre de lecture vers le cote 1
46
      data_port2           : IN STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Flux de données venant du coté 2
47
      soc_port2            : IN STD_LOGIC;                     -- Indique un début de trame sur le port2
48
      com_dispo2           : IN STD_LOGIC;                     -- Signal indiquant que des data sont pretes cote 2
49
      rd_port2             : OUT STD_LOGIC;                    -- Ordre de lecture vers le cote 2
50
 
51
      -- Flux de donnée port 1 et 2 filtré vers le PIC
52
      data_filt1           : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Flux de données filtré coté 1
53
      soc_filt1            : OUT STD_LOGIC;                    -- Indique un début de trame filtrée sur le port1
54
      frm_dispo_filt1      : OUT STD_LOGIC;                    -- Signal indiquant que des data filtrées sont pretes cote 1
55
      rd_filt1             : IN  STD_LOGIC;                    -- Ordre de lecture de données filtrées du cote 1
56
      data_filt2           : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Flux de données filtré coté 2
57
      soc_filt2            : OUT STD_LOGIC;                    -- Indique un début de trame filtrée sur le port2
58
      frm_dispo_filt2      : OUT STD_LOGIC;                    -- Signal indiquant que des data filtrées sont pretes cote 2
59
      rd_filt2             : IN  STD_LOGIC;                    -- Ordre de lecture de données filtrées du cote 2
60
 
61
      -- Signaux de monitoring de la fonction
62
      dpram_overflow1      : OUT STD_LOGIC;        -- Indique un débordement sur la DPRAM de stockage pour le flux 1
63
      dpram_overflow2      : OUT STD_LOGIC         -- Indique un débordement sur la DPRAM de stockage pour le flux 2
64
      );
65
END filter_dbl_frame;
66
 
67
--------------------------------------------------------------------------------
68
-- ARCHITECTURE:
69
--------------------------------------------------------------------------------
70
ARCHITECTURE rtl of filter_dbl_frame IS
71
   CONSTANT nbbit_add : INTEGER := 12;     -- Nb bit du bus adresse de stockage des données en DPRAM
72
 
73
   -- Machine d'état de réception des trames port 1 et port 2
74
   TYPE filterfsm_type IS (idle_st, pump_st, wait_eof_st, wait_res_ana_st);
75
   SIGNAL filterfsm1    : filterfsm_type;
76
   SIGNAL filterfsm2    : filterfsm_type;
77
 
78
   SIGNAL addrwr1    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en ecriture DPRAM coté 1
79
   SIGNAL old_addwr1 : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur de première adresse vide en DPRAM coté 1
80
   SIGNAL cpt_adread1: STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Compteur d'adresse en lecture DPRAM coté 1
81
   SIGNAL adread1    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en lecture DPRAM coté 1
82
   SIGNAL sof1       : STD_LOGIC;                              -- Pour indiquer au moduel d'analyse le début de la trame
83
   SIGNAL voie1_ready: STD_LOGIC;                              -- Indique que la voie1 est prête à traiter des données
84
   SIGNAL dont_keep1 : STD_LOGIC;                              -- Indique qu'il ne faut pas garder la trame
85
   SIGNAL end_ana1   : STD_LOGIC;                              -- Indique la fin de la routine d'analyse de double trame
86
   SIGNAL overflow1  : STD_LOGIC;                              -- Signal de débordement mémoire coté 1
87
   SIGNAL lat_ovrflw1: STD_LOGIC;                              -- Signal de latch d'un débordement
88
   SIGNAL rd_port1_buf: STD_LOGIC;                             -- Signal de lecture du flux non filtré sur le port 1
89
   SIGNAL data_wr1   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data d'écriture en DPRAM 1
90
   SIGNAL data_rd1   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data de lecture en DPRAM 1
91
   SIGNAL addrwr2    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en ecriture DPRAM coté 2
92
   SIGNAL old_addwr2 : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur de première adresse vide en DPRAM coté 2
93
   SIGNAL cpt_adread2: STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Compteur d'adresse en lecture DPRAM coté 1
94
   SIGNAL adread2    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en lecture DPRAM coté 2
95
   SIGNAL sof2       : STD_LOGIC;                              -- Pour indiquer au module d'analyse le début de la trame
96
   SIGNAL dont_keep2 : STD_LOGIC;                              -- Indique qu'il ne faut pas garder la trame
97
   SIGNAL end_ana2   : STD_LOGIC;                              -- Indique la fin de la routine d'analyse de double trame
98
   SIGNAL overflow2  : STD_LOGIC;                              -- Signal de débordement mémoire coté 2
99
   SIGNAL lat_ovrflw2: STD_LOGIC;                              -- Signal de latch d'un débordement
100
   SIGNAL rd_port2_buf: STD_LOGIC;                             -- Signal de lecture du flux non filtré sur le port 2
101
   SIGNAL data_wr2   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data d'écriture en DPRAM 2
102
   SIGNAL data_rd2   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data de lecture en DPRAM 2
103
 
104
   SIGNAL wea        : STD_LOGIC_VECTOR(0 DOWNTO 0);           -- Vecteur d'écriture dans les DPRAM
105
 
106
   COMPONENT ana_double_frame IS
107
   PORT (
108
      clk_sys     : IN  STD_LOGIC;
109
      rst_n       : IN  STD_LOGIC;
110
      top_cycle   : IN  STD_LOGIC;
111
      sof1        : IN  STD_LOGIC;
112
      dat_in1     : IN  STD_LOGIC_VECTOR(7 downto 0);
113
      dont_keep1  : OUT STD_LOGIC;
114
      end_ana1    : OUT STD_LOGIC;
115
      fsm1_ready  : OUT STD_LOGIC;
116
      sof2        : IN  STD_LOGIC;
117
      dat_in2     : IN  STD_LOGIC_VECTOR(7 downto 0);
118
      dont_keep2  : OUT STD_LOGIC;
119
      end_ana2    : OUT STD_LOGIC
120
      );
121
   END COMPONENT;
122
 
123
   COMPONENT dpram_filt
124
   PORT (
125
      clka     : IN STD_LOGIC;
126
      wea      : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
127
      addra    : IN STD_LOGIC_VECTOR(nbbit_add-1 DOWNTO 0);
128
      dina     : IN STD_LOGIC_VECTOR(8 DOWNTO 0);
129
      clkb     : IN STD_LOGIC;
130
      addrb    : IN STD_LOGIC_VECTOR(nbbit_add-1 DOWNTO 0);
131
      doutb    : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
132
      );
133
   END COMPONENT;
134
 
135
 
136
BEGIN
137
   -- Signaux de DEBUG
138
   latchout : PROCESS(clk_sys)
139
   BEGIN
140
      IF (clk_sys'EVENT and clk_sys = '1') THEN
141
         dpram_overflow1 <= overflow1;
142
         dpram_overflow2 <= overflow2;
143
      END IF;
144
   END PROCESS;
145
 
146
   ------------------------------------------------
147
   -- Lecture du flux coté 1
148
   ------------------------------------------------
149
   -- Le signal de read doit être annulé sur le début de la trmae suivante (SOC = '1') ou bien si la mémoire est vide
150
   rd_port1 <= (rd_port1_buf AND com_dispo1 AND NOT(soc_port1)) WHEN (filterfsm1 = wait_eof_st) ELSE
151
                rd_port1_buf;
152
 
153
   fsm1: PROCESS (clk_sys, rst_n)
154
   BEGIN
155
      IF(rst_n = '0') THEN
156
         filterfsm1 <= idle_st;
157
         rd_port1_buf <= '0';
158
         addrwr1 <= (OTHERS => '0');
159
         old_addwr1 <= (OTHERS => '0');
160
         sof1 <= '0';
161
         lat_ovrflw1 <= '0';
162
      ELSIF clk_sys'EVENT and clk_sys ='1' THEN
163
         CASE filterfsm1 IS
164
            WHEN idle_st =>
165
            -- Etat d'attente d'une trame valide à traiter coté1
166
               addrwr1 <= old_addwr1;
167
               IF (soc_port1 = '1' AND com_dispo1 = '1' AND voie1_ready = '1') THEN
168
               -- Si on a une trame valide sur le coté 1 et que la machine d'état du module d'analyse est disponible
169
                  rd_port1_buf <= '1';             -- On active la lecture sur le coté 1
170
                  lat_ovrflw1 <= '0';
171
                  sof1 <= '1';                     -- On indique au module de filtrage un début de trame
172
                  filterfsm1 <= pump_st;
173
               END IF;
174
 
175
            WHEN pump_st =>
176
            -- Etat d'attente le temps d'amorcer le RD
177
               addrwr1 <= addrwr1 + 1;       -- On garde la première donnée
178
               filterfsm1 <= wait_eof_st;    -- On va attendre la fin de la trame
179
 
180
            WHEN wait_eof_st =>
181
            -- Etat d'attente de la fin de trame
182
               IF (lat_ovrflw1 = '0') THEN
183
               -- Tant qu'on a pas d'overflow
184
                  addrwr1 <= addrwr1 + 1;    -- On continue de garder les données entrantes
185
               END IF;
186
               sof1 <= '0';
187
               IF (soc_port1 = '1' OR com_dispo1 = '0') THEN
188
               -- Si on a un nouveau début de trame ou bien qu'il n'y a plus de données
189
                  rd_port1_buf <= '0';           -- On arrête de lire
190
                  filterfsm1 <= wait_res_ana_st;
191
               END IF;
192
               IF (overflow1 = '1') THEN
193
                  lat_ovrflw1 <= '1';
194
               END IF;
195
 
196
            WHEN wait_res_ana_st =>
197
               IF (end_ana1 = '1') THEN
198
               -- On attend la fin de l'analyse de la trame pour savoir ce qu'on en fait
199
                  IF ((dont_keep1 = '0' OR ena_filt_dble = '0') AND lat_ovrflw1 = '0') THEN
200
                  -- Si on doit garder la trame et qu'on a pas eu de condition d'overflow en cours de route
201
                     old_addwr1 <= addrwr1 - 1; -- On garde la case précédente car le pointeur a incrémenté un coup de trop
202
                  END IF;
203
                  filterfsm1 <= idle_st;
204
               END IF;
205
 
206
            WHEN OTHERS =>
207
               NULL;
208
 
209
         END CASE;
210
      END IF;
211
   END PROCESS;
212
 
213
   ------------------------------------------------
214
   -- Lecture du flux coté 2
215
   ------------------------------------------------
216
   -- Le signal de read doit être annulé sur le début de la trmae suivante (SOC = '1') ou bien si la mémoire est vide
217
   rd_port2 <= (rd_port2_buf AND com_dispo2 AND NOT(soc_port2)) WHEN (filterfsm2 = wait_eof_st) ELSE
218
                rd_port2_buf;
219
 
220
 
221
   fsm2 : PROCESS (clk_sys, rst_n)
222
   BEGIN
223
      IF(rst_n = '0') THEN
224
         filterfsm2 <= idle_st;
225
         rd_port2_buf <= '0';
226
         addrwr2 <= (OTHERS => '0');
227
         old_addwr2 <= (OTHERS => '0');
228
         sof2 <= '0';
229
         lat_ovrflw2 <= '0';
230
      ELSIF clk_sys'EVENT and clk_sys ='1' THEN
231
         CASE filterfsm2 IS
232
            WHEN idle_st =>
233
            -- Etat d'attente d'une trame valide à traiter coté2 et que la machine d'état du module d'analyse est disponible
234
               addrwr2 <= old_addwr2;
235
               IF (soc_port2 = '1' AND com_dispo2 = '1' AND voie1_ready = '1') THEN
236
               -- Si on a une trame valide sur le coté 2
237
                  rd_port2_buf <= '1';            -- On active les lectures sur le coté 2
238
                  lat_ovrflw2 <= '0';
239
                  sof2 <= '1';                     -- On indique au module de filtrage un début de trame
240
                  filterfsm2 <= pump_st;
241
               END IF;
242
 
243
            WHEN pump_st =>
244
            -- Etat d'attente le temps d'amorcer le RD
245
               addrwr2 <= addrwr2 + 1;       -- On garde la première donnée
246
               filterfsm2 <= wait_eof_st;    -- On va attendre la fin de la trame
247
 
248
            WHEN wait_eof_st =>
249
            -- Etat d'attente de la fin de trame
250
               IF (lat_ovrflw2 = '0') THEN
251
               -- Tant qu'on a pas d'overflow
252
                  addrwr2 <= addrwr2 + 1;    -- On continue de garder les données entrantes
253
               END IF;
254
               sof2 <= '0';
255
               IF (soc_port2 = '1' OR com_dispo2 = '0') THEN
256
               -- Si on a un nouveau début de trame ou bien qu'il n'y a plus de données
257
                  rd_port2_buf <= '0';
258
                  filterfsm2 <= wait_res_ana_st;
259
               END IF;
260
               IF (overflow2 = '1') THEN
261
                  lat_ovrflw2 <= '1';
262
               END IF;
263
 
264
            WHEN wait_res_ana_st =>
265
               IF (end_ana2 = '1') THEN
266
               -- On attend la fin de l'analyse de la trame pour savoir ce qu'on en fait
267
                  IF ((dont_keep2 = '0' OR ena_filt_dble = '0') AND lat_ovrflw2 = '0') THEN
268
                  -- Si on doit garder la trame et qu'on a pas eu de condition d'overflow en cours de route
269
                     old_addwr2 <= addrwr2 - 1; -- On garde la case précédente car le pointeur a incrémenté un coup de trop
270
                  END IF;
271
                  filterfsm2 <= idle_st;
272
               END IF;
273
 
274
            WHEN OTHERS =>
275
               NULL;
276
 
277
         END CASE;
278
      END IF;
279
   END PROCESS;
280
 
281
 
282
   --------------------------------------------
283
   -- Gestion du compteur d'adresse en lecture pour les cotés 1 et 2
284
   --------------------------------------------
285
   cptr12 : PROCESS(clk_sys, rst_n)
286
   BEGIN
287
     IF (rst_n = '0') THEN
288
       cpt_adread1 <= (others => '0');
289
       cpt_adread2 <= (others => '0');
290
     ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
291
       IF (rd_filt1 = '1') THEN
292
         cpt_adread1 <= cpt_adread1 + 1;
293
       END IF;
294
       IF (rd_filt2 = '1') THEN
295
         cpt_adread2 <= cpt_adread2 + 1;
296
       END IF;
297
     END IF;
298
   END PROCESS;
299
   -- On a des conditions d'overflow si les pointeurs d'criture rattrapent les pointeurs de lecture
300
   overflow1 <= '1' WHEN (addrwr1 = cpt_adread1-5) ELSE '0';
301
   overflow2 <= '1' WHEN (addrwr2 = cpt_adread2-5) ELSE '0';
302
 
303
   inst_id_frame: ana_double_frame
304
   PORT MAP(
305
      clk_sys     => clk_sys,
306
      rst_n       => rst_n,
307
      top_cycle   => top_cycle,
308
      dat_in1     => data_port1(7 DOWNTO 0),
309
      sof1        => sof1,
310
      dont_keep1  => dont_keep1,
311
      end_ana1    => end_ana1,
312
      fsm1_ready  => voie1_ready,
313
      dat_in2     => data_port2(7 DOWNTO 0),
314
      sof2        => sof2,
315
      dont_keep2  => dont_keep2,
316
      end_ana2    => end_ana2
317
   );
318
 
319
   ----------------------------------------
320
   -- Gestion des DPRAM de stockage en attendant le filtrage
321
   ----------------------------------------
322
   wea(0) <= '1';
323
 
324
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
325
   adread1 <= cpt_adread1 WHEN (rd_filt1 = '0') ELSE cpt_adread1 + 1;
326
   data_wr1 <= soc_port1 & data_port1;    -- Vecteur à écrire dans la DPRAM
327
   data_filt1 <= data_rd1(7 DOWNTO 0);    -- Dégroupage du vecteur lue dans la DPRAM
328
   soc_filt1  <= data_rd1(8);
329
   inst_dpram_port1 : dpram_filt
330
      PORT MAP (
331
      clka  => clk_sys,
332
      wea   => wea,
333
      addra => addrwr1,
334
      dina  => data_wr1,
335
      clkb  => clk_sys,
336
      addrb => adread1,
337
      doutb => data_rd1
338
   );
339
   -- On indique une trame dispo dans la DPRAM si le pointeur de lecture n'est pas au niveau de la première case libre
340
   frm_dispo_filt1 <= '0' WHEN (cpt_adread1 = old_addwr1) ELSE '1';
341
 
342
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
343
   adread2 <= cpt_adread2 WHEN (rd_filt2 = '0') ELSE cpt_adread2 + 1;
344
   data_wr2 <= soc_port2 & data_port2;    -- Vecteur à écrire dans la DPRAM
345
   data_filt2 <= data_rd2(7 DOWNTO 0);    -- Dégroupage du vecteur lue dans la DPRAM
346
   soc_filt2  <= data_rd2(8);
347
   inst_dpram_port2 : dpram_filt
348
      PORT MAP (
349
      clka     => clk_sys,
350
      wea      => wea,
351
      addra    => addrwr2,
352
      dina     => data_wr2,
353
      clkb     => clk_sys,
354
      addrb    => adread2,
355
      doutb    => data_rd2
356
   );
357
   -- On indique une trame dispo dans la DPRAM si le pointeur de lecture n'est pas au niveau de la première case libre
358
   frm_dispo_filt2 <= '0' WHEN (cpt_adread2 = old_addwr2) ELSE '1';
359
 
360
END rtl;
361
 
362
 

powered by: WebSVN 2.1.0

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