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

Subversion Repositories saturn

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--===========================================================================================
2
-- filter_dbl_frame_sil4
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
--    Les trames sont dupliquées à terme pour êter envoyées à la fois vers PIC1 et PIC2
8
--       
9
--  FICHIER :        filter_dbl_frame_sil4.vhd 
10
--=============================================================================
11
--  CREATION 
12
--  DATE              AUTEUR    PROJET  REVISION 
13
--  20/10/2014  DRA        SATURN       V1.0 
14
--=============================================================================
15
--  HISTORIQUE  DES  MODIFICATIONS :
16
--  DATE              AUTEUR    PROJET  REVISION 
17
--  16/01/2015 DRA      SATURN   V1.1
18
--    Evolution du module ana_double_frame
19
--    Gestion du signal fsm1_ready pour n'envoyer des données que lorsque 
20
--    ana_double_frame est prêt à recevoir
21
--=============================================================================
22
 
23
--------------------------------------------------------------------------------
24
-- LIBRAIRIES:
25
--------------------------------------------------------------------------------
26
LIBRARY IEEE;
27
USE IEEE.STD_LOGIC_1164.ALL;
28
USE IEEE.STD_LOGIC_ARITH.ALL;
29
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
30
 
31
--------------------------------------------------------------------------------
32
-- ENTITY DECLARATION:
33
--------------------------------------------------------------------------------
34
ENTITY filter_dbl_frame_sil4 IS
35
   PORT (
36
      -- Ports système
37
      clk_sys        : IN STD_LOGIC;   -- Clock Systeme
38
      rst_n          : IN STD_LOGIC;   -- Reset Systeme
39
      top_cycle      : IN  STD_LOGIC;  -- TOP cycle utilsié pour clearer la mémoire de stockage
40
      ena_filt_dble  : IN  STD_LOGIC;  -- Indique s'il faut ou non appliquer le filtrage
41
 
42
      -- Flux de donnée venant des ports 1 et 2 (avant filtrage)
43
      data_port1           : IN STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Flux de données venant du coté 1
44
      soc_port1            : IN STD_LOGIC;                     -- Indique un début de trame sur le port1
45
      com_dispo1           : IN STD_LOGIC;                     -- Signal indiquant que des data sont pretes cote 1
46
      rd_port1             : OUT STD_LOGIC;                    -- Ordre de lecture vers le cote 1
47
      data_port2           : IN STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Flux de données venant du coté 2
48
      soc_port2            : IN STD_LOGIC;                     -- Indique un début de trame sur le port2
49
      com_dispo2           : IN STD_LOGIC;                     -- Signal indiquant que des data sont pretes cote 2
50
      rd_port2             : OUT STD_LOGIC;                    -- Ordre de lecture vers le cote 2
51
 
52
      -- Flux de donnée port 1 et 2 filtré vers le PIC1
53
      data_filt1_uc1       : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Flux de données filtré coté 1
54
      soc_filt1_uc1        : OUT STD_LOGIC;                    -- Indique un début de trame filtrée sur le port1
55
      frm_dispo_filt1_uc1  : OUT STD_LOGIC;                    -- Signal indiquant que des data filtrées sont pretes cote 1
56
      rd_filt1_uc1         : IN  STD_LOGIC;                    -- Ordre de lecture de données filtrées du cote 1
57
      data_filt2_uc1       : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Flux de données filtré coté 2
58
      soc_filt2_uc1        : OUT STD_LOGIC;                    -- Indique un début de trame filtrée sur le port2
59
      frm_dispo_filt2_uc1  : OUT STD_LOGIC;                    -- Signal indiquant que des data filtrées sont pretes cote 2
60
      rd_filt2_uc1         : IN  STD_LOGIC;                    -- Ordre de lecture de données filtrées du cote 2
61
 
62
      -- Flux de donnée port 1 et 2 filtré vers le PIC2
63
      data_filt1_uc2       : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Flux de données filtré coté 1
64
      soc_filt1_uc2        : OUT STD_LOGIC;                    -- Indique un début de trame filtrée sur le port1
65
      frm_dispo_filt1_uc2  : OUT STD_LOGIC;                    -- Signal indiquant que des data filtrées sont pretes cote 1
66
      rd_filt1_uc2         : IN  STD_LOGIC;                    -- Ordre de lecture de données filtrées du cote 1
67
      data_filt2_uc2       : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Flux de données filtré coté 2
68
      soc_filt2_uc2        : OUT STD_LOGIC;                    -- Indique un début de trame filtrée sur le port2
69
      frm_dispo_filt2_uc2  : OUT STD_LOGIC;                    -- Signal indiquant que des data filtrées sont pretes cote 2
70
      rd_filt2_uc2         : IN  STD_LOGIC;                    -- Ordre de lecture de données filtrées du cote 2
71
 
72
      -- Signaux de monitoring de la fonction
73
      dpram_overflow1      : OUT STD_LOGIC;        -- Indique un débordement sur la DPRAM de stockage pour le flux 1
74
      dpram_overflow2      : OUT STD_LOGIC         -- Indique un débordement sur la DPRAM de stockage pour le flux 2
75
      );
76
END filter_dbl_frame_sil4;
77
 
78
--------------------------------------------------------------------------------
79
-- ARCHITECTURE:
80
--------------------------------------------------------------------------------
81
ARCHITECTURE rtl of filter_dbl_frame_sil4 IS
82
   CONSTANT nbbit_add : INTEGER := 12;     -- Nb bit du bus adresse de stockage des données en DPRAM
83
 
84
   -- Machine d'état de réception des trames port 1 et port 2
85
   TYPE filterfsm_type IS (idle_st, pump_st, wait_eof_st, wait_res_ana_st);
86
   SIGNAL filterfsm1    : filterfsm_type;
87
   SIGNAL filterfsm2    : filterfsm_type;
88
 
89
   SIGNAL addrwr1_uc1    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en ecriture DPRAM coté 1
90
   SIGNAL old_addwr1_uc1 : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur de première adresse vide en DPRAM coté 1
91
   SIGNAL addrwr1_uc2    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en ecriture DPRAM coté 1
92
   SIGNAL old_addwr1_uc2 : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur de première adresse vide en DPRAM coté 1
93
   SIGNAL cpt_adread1_uc1: STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Compteur d'adresse en lecture DPRAM coté 1
94
   SIGNAL adread1_uc1    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en lecture DPRAM coté 1
95
   SIGNAL cpt_adread1_uc2: STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Compteur d'adresse en lecture DPRAM coté 1
96
   SIGNAL adread1_uc2    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en lecture DPRAM coté 1
97
   SIGNAL sof1           : STD_LOGIC;                              -- Pour indiquer au moduel d'analyse le début de la trame
98
   SIGNAL voie1_ready    : STD_LOGIC;                              -- Indique que la voie1 est prête à traiter des données
99
   SIGNAL dont_keep1     : STD_LOGIC;                              -- Indique qu'il ne faut pas garder la trame
100
   SIGNAL end_ana1       : STD_LOGIC;                              -- Indique la fin de la routine d'analyse de double trame
101
   SIGNAL overflow1_uc1  : STD_LOGIC;                              -- Signal de débordement mémoire coté 1
102
   SIGNAL lat_ovrflw1_uc1: STD_LOGIC;                              -- Signal de latch d'un débordement
103
   SIGNAL overflow1_uc2  : STD_LOGIC;                              -- Signal de débordement mémoire coté 1
104
   SIGNAL lat_ovrflw1_uc2: STD_LOGIC;                              -- Signal de latch d'un débordement
105
   SIGNAL rd_port1_buf: STD_LOGIC;                             -- Signal de lecture du flux non filtré sur le port 1
106
   SIGNAL data_wr1   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data d'écriture en DPRAM 1
107
   SIGNAL data_rd1_uc1   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data de lecture en DPRAM 1
108
   SIGNAL data_rd1_uc2   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data de lecture en DPRAM 1
109
   SIGNAL addrwr2_uc1    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en ecriture DPRAM coté 2
110
   SIGNAL old_addwr2_uc1 : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur de première adresse vide en DPRAM coté 2
111
   SIGNAL addrwr2_uc2    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en ecriture DPRAM coté 2
112
   SIGNAL old_addwr2_uc2 : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur de première adresse vide en DPRAM coté 2
113
   SIGNAL cpt_adread2_uc1: STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Compteur d'adresse en lecture DPRAM coté 1
114
   SIGNAL adread2_uc1    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en lecture DPRAM coté 2
115
   SIGNAL cpt_adread2_uc2: STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Compteur d'adresse en lecture DPRAM coté 1
116
   SIGNAL adread2_uc2    : STD_LOGIC_VECTOR(nbbit_add-1 downto 0); -- Pointeur d'adresse en lecture DPRAM coté 2
117
   SIGNAL sof2           : STD_LOGIC;                              -- Pour indiquer au module d'analyse le début de la trame
118
   SIGNAL dont_keep2     : STD_LOGIC;                              -- Indique qu'il ne faut pas garder la trame
119
   SIGNAL end_ana2       : STD_LOGIC;                              -- Indique la fin de la routine d'analyse de double trame
120
   SIGNAL overflow2_uc1  : STD_LOGIC;                              -- Signal de débordement mémoire coté 2
121
   SIGNAL lat_ovrflw2_uc1: STD_LOGIC;                              -- Signal de latch d'un débordement
122
   SIGNAL overflow2_uc2  : STD_LOGIC;                              -- Signal de débordement mémoire coté 2
123
   SIGNAL lat_ovrflw2_uc2: STD_LOGIC;                              -- Signal de latch d'un débordement
124
   SIGNAL rd_port2_buf: STD_LOGIC;                             -- Signal de lecture du flux non filtré sur le port 2
125
   SIGNAL data_wr2   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data d'écriture en DPRAM 2
126
   SIGNAL data_rd2_uc1   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data de lecture en DPRAM 2
127
   SIGNAL data_rd2_uc2   : STD_LOGIC_VECTOR(8 DOWNTO 0);           -- Bus data de lecture en DPRAM 2
128
 
129
   SIGNAL wea        : STD_LOGIC_VECTOR(0 DOWNTO 0);           -- Vecteur d'écriture dans les DPRAM
130
 
131
   COMPONENT ana_double_frame IS
132
   PORT (
133
      clk_sys     : IN  STD_LOGIC;
134
      rst_n       : IN  STD_LOGIC;
135
      top_cycle   : IN  STD_LOGIC;
136
      sof1        : IN  STD_LOGIC;
137
      dat_in1     : IN  STD_LOGIC_VECTOR(7 downto 0);
138
      dont_keep1  : OUT STD_LOGIC;
139
      end_ana1    : OUT STD_LOGIC;
140
      fsm1_ready  : OUT STD_LOGIC;
141
      sof2        : IN  STD_LOGIC;
142
      dat_in2     : IN  STD_LOGIC_VECTOR(7 downto 0);
143
      dont_keep2  : OUT STD_LOGIC;
144
      end_ana2    : OUT STD_LOGIC
145
      );
146
   END COMPONENT;
147
 
148
   COMPONENT dpram_filt
149
   PORT (
150
      clka     : IN STD_LOGIC;
151
      wea      : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
152
      addra    : IN STD_LOGIC_VECTOR(nbbit_add-1 DOWNTO 0);
153
      dina     : IN STD_LOGIC_VECTOR(8 DOWNTO 0);
154
      clkb     : IN STD_LOGIC;
155
      addrb    : IN STD_LOGIC_VECTOR(nbbit_add-1 DOWNTO 0);
156
      doutb    : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
157
      );
158
   END COMPONENT;
159
 
160
 
161
BEGIN
162
   -- Signaux de DEBUG
163
   latchout : PROCESS(clk_sys)
164
   BEGIN
165
      IF (clk_sys'EVENT and clk_sys = '1') THEN
166
         dpram_overflow1 <= overflow1_uc1 OR overflow1_uc2;
167
         dpram_overflow2 <= overflow2_uc1 OR overflow2_uc2;
168
      END IF;
169
   END PROCESS;
170
 
171
   ------------------------------------------------
172
   -- Lecture du flux coté 1
173
   ------------------------------------------------
174
   -- 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
175
   rd_port1 <= (rd_port1_buf AND com_dispo1 AND NOT(soc_port1)) WHEN (filterfsm1 = wait_eof_st) ELSE
176
                rd_port1_buf;
177
 
178
   fsm1: PROCESS (clk_sys, rst_n)
179
   BEGIN
180
      IF(rst_n = '0') THEN
181
         filterfsm1 <= idle_st;
182
         rd_port1_buf <= '0';
183
         addrwr1_uc1 <= (OTHERS => '0');
184
         old_addwr1_uc1 <= (OTHERS => '0');
185
         addrwr1_uc2 <= (OTHERS => '0');
186
         old_addwr1_uc2 <= (OTHERS => '0');
187
         sof1 <= '0';
188
         lat_ovrflw1_uc1 <= '0';
189
         lat_ovrflw1_uc2 <= '0';
190
      ELSIF clk_sys'EVENT and clk_sys ='1' THEN
191
         CASE filterfsm1 IS
192
            WHEN idle_st =>
193
            -- Etat d'attente d'une trame valide à traiter coté1
194
               addrwr1_uc1 <= old_addwr1_uc1;
195
               addrwr1_uc2 <= old_addwr1_uc2;
196
               IF (soc_port1 = '1' AND com_dispo1 = '1' AND voie1_ready = '1') THEN
197
               -- Si on a une trame valide sur le coté 1 et que la machine d'état du module d'analyse est disponible
198
                  rd_port1_buf <= '1';             -- On active la lecture sur le coté 1
199
                  lat_ovrflw1_uc1 <= '0';
200
                  lat_ovrflw1_uc2 <= '0';
201
                  sof1 <= '1';                     -- On indique au module de filtrage un début de trame
202
                  filterfsm1 <= pump_st;
203
               END IF;
204
 
205
            WHEN pump_st =>
206
            -- Etat d'attente le temps d'amorcer le RD
207
               addrwr1_uc1 <= addrwr1_uc1 + 1;       -- On garde la première donnée
208
               addrwr1_uc2 <= addrwr1_uc2 + 1;       -- On garde la première donnée
209
               filterfsm1 <= wait_eof_st;    -- On va attendre la fin de la trame
210
 
211
            WHEN wait_eof_st =>
212
            -- Etat d'attente de la fin de trame
213
               IF (lat_ovrflw1_uc1 = '0') THEN
214
               -- Tant qu'on a pas d'overflow
215
                  addrwr1_uc1 <= addrwr1_uc1 + 1;    -- On continue de garder les données entrantes
216
               END IF;
217
               IF (lat_ovrflw1_uc2 = '0') THEN
218
               -- Tant qu'on a pas d'overflow
219
                  addrwr1_uc2 <= addrwr1_uc2 + 1;    -- On continue de garder les données entrantes
220
               END IF;
221
               sof1 <= '0';
222
               IF (soc_port1 = '1' OR com_dispo1 = '0') THEN
223
               -- Si on a un nouveau début de trame ou bien qu'il n'y a plus de données
224
                  rd_port1_buf <= '0';           -- On arrête de lire
225
                  filterfsm1 <= wait_res_ana_st;
226
               END IF;
227
               IF (overflow1_uc1 = '1') THEN
228
                  lat_ovrflw1_uc1 <= '1';
229
               END IF;
230
               IF (overflow1_uc2 = '1') THEN
231
                  lat_ovrflw1_uc2 <= '1';
232
               END IF;
233
 
234
            WHEN wait_res_ana_st =>
235
               IF (end_ana1 = '1') THEN
236
               -- On attend la fin de l'analyse de la trame pour savoir ce qu'on en fait
237
                  IF (dont_keep1 = '0' OR ena_filt_dble = '0') THEN
238
                  -- Si on doit garder la trame 
239
                     IF (lat_ovrflw1_uc1 = '0') THEN
240
                     -- et qu'on a pas eu de condition d'overflow en cours de route
241
                        old_addwr1_uc1 <= addrwr1_uc1 - 1; -- On garde la case précédente car le pointeur a incrémenté un coup de trop
242
                     END IF;
243
                     IF (lat_ovrflw1_uc2 = '0') THEN
244
                     -- et qu'on a pas eu de condition d'overflow en cours de route
245
                        old_addwr1_uc2 <= addrwr1_uc2 - 1; -- On garde la case précédente car le pointeur a incrémenté un coup de trop
246
                     END IF;
247
                  END IF;
248
                  filterfsm1 <= idle_st;
249
               END IF;
250
 
251
            WHEN OTHERS =>
252
               NULL;
253
 
254
         END CASE;
255
      END IF;
256
   END PROCESS;
257
 
258
   ------------------------------------------------
259
   -- Lecture du flux coté 2
260
   ------------------------------------------------
261
   -- 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
262
   rd_port2 <= (rd_port2_buf AND com_dispo2 AND NOT(soc_port2)) WHEN (filterfsm2 = wait_eof_st) ELSE
263
                rd_port2_buf;
264
 
265
 
266
   fsm2 : PROCESS (clk_sys, rst_n)
267
   BEGIN
268
      IF(rst_n = '0') THEN
269
         filterfsm2 <= idle_st;
270
         rd_port2_buf <= '0';
271
         addrwr2_uc1 <= (OTHERS => '0');
272
         old_addwr2_uc1 <= (OTHERS => '0');
273
         addrwr2_uc2 <= (OTHERS => '0');
274
         old_addwr2_uc2 <= (OTHERS => '0');
275
         sof2 <= '0';
276
         lat_ovrflw2_uc1 <= '0';
277
         lat_ovrflw2_uc2 <= '0';
278
      ELSIF clk_sys'EVENT and clk_sys ='1' THEN
279
         CASE filterfsm2 IS
280
            WHEN idle_st =>
281
            -- Etat d'attente d'une trame valide à traiter coté2 et que la machine d'état du module d'analyse est disponible
282
               addrwr2_uc1 <= old_addwr2_uc1;
283
               addrwr2_uc2 <= old_addwr2_uc2;
284
               IF (soc_port2 = '1' AND com_dispo2 = '1' AND voie1_ready = '1') THEN
285
               -- Si on a une trame valide sur le coté 2
286
                  rd_port2_buf <= '1';            -- On active les lectures sur le coté 2
287
                  lat_ovrflw2_uc1 <= '0';
288
                  lat_ovrflw2_uc2 <= '0';
289
                  sof2 <= '1';                     -- On indique au module de filtrage un début de trame
290
                  filterfsm2 <= pump_st;
291
               END IF;
292
 
293
            WHEN pump_st =>
294
            -- Etat d'attente le temps d'amorcer le RD
295
               addrwr2_uc1 <= addrwr2_uc1 + 1;       -- On garde la première donnée
296
               addrwr2_uc2 <= addrwr2_uc2 + 1;       -- On garde la première donnée
297
               filterfsm2 <= wait_eof_st;    -- On va attendre la fin de la trame
298
 
299
            WHEN wait_eof_st =>
300
            -- Etat d'attente de la fin de trame
301
               IF (lat_ovrflw2_uc1 = '0') THEN
302
               -- Tant qu'on a pas d'overflow
303
                  addrwr2_uc1 <= addrwr2_uc1 + 1;    -- On continue de garder les données entrantes
304
               END IF;
305
               IF (lat_ovrflw2_uc2 = '0') THEN
306
               -- Tant qu'on a pas d'overflow
307
                  addrwr2_uc2 <= addrwr2_uc2 + 1;    -- On continue de garder les données entrantes
308
               END IF;
309
               sof2 <= '0';
310
               IF (soc_port2 = '1' OR com_dispo2 = '0') THEN
311
               -- Si on a un nouveau début de trame ou bien qu'il n'y a plus de données
312
                  rd_port2_buf <= '0';
313
                  filterfsm2 <= wait_res_ana_st;
314
               END IF;
315
               IF (overflow2_uc1 = '1') THEN
316
                  lat_ovrflw2_uc1 <= '1';
317
               END IF;
318
               IF (overflow2_uc2 = '1') THEN
319
                  lat_ovrflw2_uc2 <= '1';
320
               END IF;
321
 
322
            WHEN wait_res_ana_st =>
323
               IF (end_ana2 = '1') THEN
324
               -- On attend la fin de l'analyse de la trame pour savoir ce qu'on en fait
325
                  IF (dont_keep2 = '0' OR ena_filt_dble = '0') THEN
326
                  -- Si on doit garder la trame                   
327
                     IF (lat_ovrflw2_uc1 = '0') THEN
328
                     -- et qu'on a pas eu de condition d'overflow en cours de route
329
                        old_addwr2_uc1 <= addrwr2_uc1 - 1; -- On garde la case précédente car le pointeur a incrémenté un coup de trop
330
                     END IF;
331
                     IF (lat_ovrflw2_uc2 = '0') THEN
332
                     -- et qu'on a pas eu de condition d'overflow en cours de route
333
                        old_addwr2_uc2 <= addrwr2_uc2 - 1; -- On garde la case précédente car le pointeur a incrémenté un coup de trop
334
                     END IF;
335
                  END IF;
336
                  filterfsm2 <= idle_st;
337
               END IF;
338
 
339
            WHEN OTHERS =>
340
               NULL;
341
 
342
         END CASE;
343
      END IF;
344
   END PROCESS;
345
 
346
 
347
   --------------------------------------------
348
   -- Gestion du compteur d'adresse en lecture pour les cotés 1 et 2
349
   --------------------------------------------
350
   cptr12 : PROCESS(clk_sys, rst_n)
351
   BEGIN
352
     IF (rst_n = '0') THEN
353
       cpt_adread1_uc1 <= (others => '0');
354
       cpt_adread2_uc1 <= (others => '0');
355
       cpt_adread1_uc2 <= (others => '0');
356
       cpt_adread2_uc2 <= (others => '0');
357
     ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
358
       IF (rd_filt1_uc1 = '1') THEN
359
         cpt_adread1_uc1 <= cpt_adread1_uc1 + 1;
360
       END IF;
361
       IF (rd_filt2_uc1 = '1') THEN
362
         cpt_adread2_uc1 <= cpt_adread2_uc1 + 1;
363
       END IF;
364
       IF (rd_filt1_uc2 = '1') THEN
365
         cpt_adread1_uc2 <= cpt_adread1_uc2 + 1;
366
       END IF;
367
       IF (rd_filt2_uc2 = '1') THEN
368
         cpt_adread2_uc2 <= cpt_adread2_uc2 + 1;
369
       END IF;
370
     END IF;
371
   END PROCESS;
372
   -- On a des conditions d'overflow si les pointeurs d'criture rattrapent les pointeurs de lecture
373
  -- overflow1 <= '1' WHEN (addrwr1 = cpt_adread1_uc1-5) OR (addrwr1 = cpt_adread1_uc2-5) ELSE '0';
374
  -- overflow2 <= '1' WHEN (addrwr2 = cpt_adread2_uc1-5) OR (addrwr2 = cpt_adread2_uc2-5) ELSE '0';
375
   overflow1_uc1 <= '1' WHEN (addrwr1_uc1 = cpt_adread1_uc1-5)  ELSE '0';
376
   overflow1_uc2 <= '1' WHEN (addrwr1_uc2 = cpt_adread1_uc2-5)  ELSE '0';
377
   overflow2_uc1 <= '1' WHEN (addrwr2_uc1 = cpt_adread2_uc1-5)  ELSE '0';
378
   overflow2_uc2 <= '1' WHEN (addrwr2_uc2 = cpt_adread2_uc2-5)  ELSE '0';
379
 
380
   inst_id_frame: ana_double_frame
381
   PORT MAP(
382
      clk_sys     => clk_sys,
383
      rst_n       => rst_n,
384
      top_cycle   => top_cycle,
385
      dat_in1     => data_port1(7 DOWNTO 0),
386
      sof1        => sof1,
387
      dont_keep1  => dont_keep1,
388
      end_ana1    => end_ana1,
389
      fsm1_ready  => voie1_ready,
390
      dat_in2     => data_port2(7 DOWNTO 0),
391
      sof2        => sof2,
392
      dont_keep2  => dont_keep2,
393
      end_ana2    => end_ana2
394
   );
395
 
396
   ----------------------------------------
397
   -- Gestion des DPRAM de stockage en attendant le filtrage
398
   ----------------------------------------
399
   wea(0) <= '1';
400
 
401
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
402
   adread1_uc1 <= cpt_adread1_uc1 WHEN (rd_filt1_uc1 = '0') ELSE cpt_adread1_uc1 + 1;
403
   adread1_uc2 <= cpt_adread1_uc2 WHEN (rd_filt1_uc2 = '0') ELSE cpt_adread1_uc2 + 1;
404
   data_wr1 <= soc_port1 & data_port1;    -- Vecteur à écrire dans la DPRAM
405
   data_filt1_uc1 <= data_rd1_uc1(7 DOWNTO 0);    -- Dégroupage du vecteur lue dans la DPRAM
406
   soc_filt1_uc1  <= data_rd1_uc1(8);
407
   data_filt1_uc2 <= data_rd1_uc2(7 DOWNTO 0);    -- Dégroupage du vecteur lue dans la DPRAM
408
   soc_filt1_uc2  <= data_rd1_uc2(8);
409
   inst_dpram_port1_uc1 : dpram_filt
410
      PORT MAP (
411
      clka  => clk_sys,
412
      wea   => wea,
413
      addra => addrwr1_uc1,
414
      dina  => data_wr1,
415
      clkb  => clk_sys,
416
      addrb => adread1_uc1,
417
      doutb => data_rd1_uc1
418
   );
419
   -- On indique une trame dispo dans la DPRAM si le pointeur de lecture n'est pas au niveau de la première case libre
420
   frm_dispo_filt1_uc1 <= '0' WHEN (cpt_adread1_uc1 = old_addwr1_uc1) ELSE '1';
421
 
422
   inst_dpram_port1_uc2 : dpram_filt
423
      PORT MAP (
424
      clka  => clk_sys,
425
      wea   => wea,
426
      addra => addrwr1_uc2,
427
      dina  => data_wr1,
428
      clkb  => clk_sys,
429
      addrb => adread1_uc2,
430
      doutb => data_rd1_uc2
431
   );
432
   -- On indique une trame dispo dans la DPRAM si le pointeur de lecture n'est pas au niveau de la première case libre
433
   frm_dispo_filt1_uc2 <= '0' WHEN (cpt_adread1_uc2 = old_addwr1_uc2) ELSE '1';
434
 
435
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
436
   adread2_uc1 <= cpt_adread2_uc1 WHEN (rd_filt2_uc1 = '0') ELSE cpt_adread2_uc1 + 1;
437
   adread2_uc2 <= cpt_adread2_uc2 WHEN (rd_filt2_uc2 = '0') ELSE cpt_adread2_uc2 + 1;
438
   data_wr2 <= soc_port2 & data_port2;    -- Vecteur à écrire dans la DPRAM
439
   data_filt2_uc1 <= data_rd2_uc1(7 DOWNTO 0);    -- Dégroupage du vecteur lue dans la DPRAM
440
   soc_filt2_uc1  <= data_rd2_uc1(8);
441
   data_filt2_uc2 <= data_rd2_uc2(7 DOWNTO 0);    -- Dégroupage du vecteur lue dans la DPRAM
442
   soc_filt2_uc2  <= data_rd2_uc2(8);
443
   inst_dpram_port2_uc1 : dpram_filt
444
      PORT MAP (
445
      clka     => clk_sys,
446
      wea      => wea,
447
      addra    => addrwr2_uc1,
448
      dina     => data_wr2,
449
      clkb     => clk_sys,
450
      addrb    => adread2_uc1,
451
      doutb    => data_rd2_uc1
452
   );
453
   -- On indique une trame dispo dans la DPRAM si le pointeur de lecture n'est pas au niveau de la première case libre
454
   frm_dispo_filt2_uc1 <= '0' WHEN (cpt_adread2_uc1 = old_addwr2_uc1) ELSE '1';
455
 
456
   inst_dpram_port2_uc2 : dpram_filt
457
      PORT MAP (
458
      clka     => clk_sys,
459
      wea      => wea,
460
      addra    => addrwr2_uc2,
461
      dina     => data_wr2,
462
      clkb     => clk_sys,
463
      addrb    => adread2_uc2,
464
      doutb    => data_rd2_uc2
465
   );
466
   -- On indique une trame dispo dans la DPRAM si le pointeur de lecture n'est pas au niveau de la première case libre
467
   frm_dispo_filt2_uc2 <= '0' WHEN (cpt_adread2_uc2 = old_addwr2_uc2) ELSE '1';
468
 
469
END rtl;
470
 
471
 

powered by: WebSVN 2.1.0

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