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

Subversion Repositories saturn

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : FRAME_ANA
3
--  DESCRIPTION : 
4
--       Analyse la couche applicative des trames reçues sur dat_in
5
--       Stocke les données utiles à l'exécution de la commande dans une DPRAM
6
--       Si la trame est mauvaise, le pointeur d'écriture dans la DPRAM est 
7
--       ramené à sa position initiale 
8
 
9
--  FICHIER :        frame_ana.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 frame_ana is
32
   PORT (
33
      -- Ports système
34
      clk_sys  : IN  STD_LOGIC;                    -- Clock système
35
      rst_n    : IN  STD_LOGIC;                    -- Reset génrél système
36
      ad_mio   : IN  STD_LOGIC_VECTOR(7 DOWNTO 0); -- Adress logique du MIO
37
      -- Interfaces vers le le module LAYER2_RX
38
 
39
      sof      : IN  STD_LOGIC;                   -- Indique le début d'une trame en réception sur dat_in
40
      eof      : IN  STD_LOGIC;                   -- Indique la fin d'une trame en réception sur dat_in
41
      l2_ok    : IN  STD_LOGIC;                   -- Indique que la trame reçue est correcte d'un point de vue layer 2
42
      dat_in   : IN  STD_LOGIC_VECTOR(7 downto 0);-- Données de la couche applicative (épurée de la couche layer 2)
43
      val_in   : IN  STD_LOGIC;                   -- Validant du bus dat_in
44
 
45
      -- Interfaces vers le module COM_EXEC
46
      dat_out  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Données utiles de la couche applicative (commande, @, data)
47
      soc_out  : OUT STD_LOGIC;                    -- Indique que l'octet sur dat_out est le 1e d'une commande
48
      rd_datout: IN  STD_LOGIC;                    -- Signal de lecture d'un nouvel octet applicatif
49
      new_frame: OUT STD_LOGIC;                    -- Indique qu'une nouvelle trame est disponible
50
      com_dispo: OUT STD_LOGIC;                    -- Inidque qu'il y'a des données de commande à traiter dans la DPRAM
51
      l7_ok    : OUT STD_LOGIC;                    -- Indique que la nouvelle trame est conforme du point de vue layer 7
52
      overflow : OUT STD_LOGIC                     -- Indique un overflow du buffer de stockage des commandes
53
      );
54
end frame_ana;
55
 
56
architecture  rtl of frame_ana is
57
   CONSTANT typ_sec  : STD_LOGIC_VECTOR(1 downto 0) := "00";   -- Définition des codes du champ TYP
58
   CONSTANT typ_nosec: STD_LOGIC_VECTOR(1 downto 0) := "01";
59
   CONSTANT typ_sync : STD_LOGIC_VECTOR(1 downto 0) := "10";
60
   CONSTANT typ_sup  : STD_LOGIC_VECTOR(1 downto 0) := "11";
61
   CONSTANT rep_read : STD_LOGIC_VECTOR(1 downto 0) := "00";   -- Définition des codes du champ COM
62
   CONSTANT com_write: STD_LOGIC_VECTOR(1 downto 0) := "01";
63
   CONSTANT com_read : STD_LOGIC_VECTOR(1 downto 0) := "10";
64
   CONSTANT com_rdwr : STD_LOGIC_VECTOR(1 downto 0) := "11";
65
 
66
   SIGNAL   adread   : STD_LOGIC_VECTOR(9 DOWNTO 0);  -- Signal d'adresse pour la lecture
67
   SIGNAL   cpt_adread: STD_LOGIC_VECTOR(9 DOWNTO 0); -- Compteur d'adresse pour la lecture
68
   SIGNAL   adwrite  : STD_LOGIC_VECTOR(9 DOWNTO 0);  -- Compteur d'adresse dynamique pour l'écriture
69
   SIGNAL   old_adw  : STD_LOGIC_VECTOR(9 DOWNTO 0);  -- Pour mémoriser la première location vide dans la DPRAM
70
   SIGNAL   cpt_byte : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Compteur d'octets en réception 
71
   SIGNAL   wea      : STD_LOGIC_VECTOR(0 DOWNTO 0);  -- Pour transformer le signal d'écriture dans la DPRAM en VECTOR
72
   SIGNAL   dpram_dw : STD_LOGIC_VECTOR(8 DOWNTO 0);  -- Pour fabriquer le vecteur d'écriture dans la DPRAM
73
   SIGNAL   dpram_dr : STD_LOGIC_VECTOR(8 DOWNTO 0);  -- Pour fabriquer le vecteur de lecutre dans la DPRAM
74
 
75
   SIGNAL   soc_wr    : STD_LOGIC;                    -- Indique le 1er octet d'une commande
76
   SIGNAL   type_field: STD_LOGIC_VECTOR(1 downto 0); -- Pour mémoriser le type de la trame
77
   SIGNAL   com_field : STD_LOGIC_VECTOR(1 downto 0); -- Pour mémoriser le champ com
78
   SIGNAL   crc       : STD_LOGIC_VECTOR(15 downto 0);-- Valeur dynamique du crc
79
   SIGNAL   init_crc  : STD_LOGIC;                    -- Initialise le calcul du CRC
80
   SIGNAL   overflow_buf  : STD_LOGIc;                    -- Indique que le buffer de stockage des commandes a débordé
81
 
82
   -- Machine d'état de gestion du module
83
   TYPE layer7_type IS (idle_st, rectyp_st, destination_st, source_st, adrw_st, nrw_st,
84
                        dataw_st, crc1_st, crc2_st, crccheck_st, endok_st, endnok_st, abort_st);
85
   SIGNAL fsm_layer7      : layer7_type;
86
 
87
   -- Module de calcul du CRC16
88
        COMPONENT crc16
89
   GENERIC (
90
      poly : STD_LOGIC_VECTOR(15 downto 0) := x"1021"   -- CCITT16 par défaut
91
      );
92
        PORT(
93
                clk_sys  : IN std_logic;
94
                rst_n    : IN std_logic;
95
                data     : IN std_logic_vector(7 downto 0);
96
                val      : IN std_logic;
97
                init     : IN std_logic;
98
                crc      : OUT std_logic_vector(15 downto 0)
99
                );
100
        END COMPONENT;
101
 
102
   COMPONENT dpram
103
   PORT (
104
      clka     : IN STD_LOGIC;
105
      wea      : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
106
      addra    : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
107
      dina     : IN STD_LOGIC_VECTOR(8 DOWNTO 0);
108
      clkb     : IN STD_LOGIC;
109
      addrb    : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
110
      doutb    : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
111
   );
112
   END COMPONENT;
113
 
114
begin
115
   --------------------------------------------
116
   -- Gestion du comtpeur d'adresse en lecture
117
   --------------------------------------------
118
   cptr : PROCESS(clk_sys, rst_n)
119
   BEGIN
120
      IF (rst_n = '0') THEN
121
         cpt_adread <= (others => '0');
122
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
123
         IF (rd_datout = '1') THEN
124
            cpt_adread <= cpt_adread + 1;
125
         END IF;
126
      END IF;
127
   END PROCESS;
128
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
129
   adread <= cpt_adread WHEN (rd_datout = '0') ELSE cpt_adread+1;
130
   -- Si le pointeur en lecture est différent du pointeur en écriture, on indique qu'il 
131
   -- y'a des données à traiter
132
   com_dispo <= '0' WHEN (adread = old_adw) ELSE '1';
133
   -- On considère un overflow du buffer de stockage des commandes lorsque le pointeur de write a presque
134
   -- rattrapé le pointeur de read
135
   overflow_buf <= '1' WHEN (adwrite = cpt_adread-2) AND (wea(0) = '1') ELSE '0';
136
   overflow <= overflow_buf;
137
 
138
   --------------------------------------------
139
   -- Machine d'état d'analyse du flux
140
   --------------------------------------------
141
   man_fsm : PROCESS(clk_sys, rst_n)
142
   BEGIN
143
      IF (rst_n = '0') THEN
144
         old_adw <= (others => '0');
145
         adwrite <= (others => '0');
146
         fsm_layer7 <= idle_st;
147
         soc_wr <= '0';
148
         l7_ok <= '0';
149
         new_frame <= '0';
150
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
151
         CASE fsm_layer7 IS
152
            WHEN idle_st =>
153
            -- Etat transitoire d'initialisation de l'algo de traitement
154
               init_crc <= '1';     -- Réinit du calcul du CRC
155
               old_adw <= adwrite;  -- Le pointeur d'écriture dynamique est initialisé avec la première location vide
156
               l7_ok <= '0';
157
               new_frame <= '0';
158
               fsm_layer7 <= rectyp_st;
159
               soc_wr <= '1';       -- Si on est ici, le prochain octet sera le premier de la commande
160
 
161
            WHEN rectyp_st =>
162
            -- Etat d'attente du 1er octet de la couche applicative
163
               init_crc <= '0';
164
               type_field <= dat_in(7 downto 6);   -- Mémorise le type de trame
165
               com_field <= dat_in(5 downto 4);    -- Mémorise la partie com
166
               -- DRA le 17/10/2012 : suppression du code qui provoquait des déclaration de trame erronée 
167
               -- sur réception d'une trame correcte mais non destinée à ce MIO
168
               -- Le code a peut d'intérêt car la condition recevoir un eof avant de recevoir le sof n'est possible qu'en
169
               -- cas de plantage du FPGA
170
--               IF (eof = '1') THEN
171
--               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
172
--                  fsm_layer7 <= abort_st;   
173
--               ELS
174
               IF (overflow_buf = '1') THEN
175
                  fsm_layer7 <= endnok_st;
176
               ELSIF (val_in = '1') THEN
177
               -- Si un octet est prêt à être traité
178
                  IF (sof = '1') THEN
179
                  -- Si c'est bien le 1er octet de la trame
180
                     soc_wr <= '0';                   -- le prochain octet ne devra pas être taggé comme étant le premeir de la commadne
181
                     adwrite <= adwrite + 1;          -- on le garde (i.e on augemente le pointeur d'écriture
182
                     CASE dat_in(7 downto 6) IS
183
                        WHEN typ_sup =>
184
                        -- Si c'est une trame de supervision
185
                           IF (dat_in(5 downto 4) = "00") THEN
186
                           -- Si le champ COM est bien à 00
187
                              fsm_layer7 <= source_st;   -- Le prochain octet sera l'@ source
188
                           ELSE
189
                           -- Si le champ COM n'est pas "00", c'est qu'il y'a une erreur
190
                              fsm_layer7 <= endnok_st;
191
                           END IF;
192
 
193
                        WHEN typ_sec =>
194
                        -- Si c'est une trame de sécurité
195
                           IF (dat_in(5 downto 4) /= rep_read) THEN
196
                           -- Le champ COM ne peut pas être à rep_read
197
                              fsm_layer7 <= destination_st; -- Le prochain octet sera l'@ destination
198
                           ELSE
199
                           -- Si le champ COM est rep_read, c'est qu'il y'a une erreur
200
                              fsm_layer7 <= endnok_st;
201
                           END IF;
202
 
203
                        WHEN typ_nosec =>
204
                        -- Si c'est une trame non sécuritaire
205
                           IF (dat_in(5 downto 4) /= rep_read) THEN
206
                           -- Le champ COM ne peut pas être à rep_read
207
                              fsm_layer7 <= source_st;      -- Le prochain octet sera l'@ source
208
                           ELSE
209
                           -- Si le champ COM est rep_read, c'est qu'il y'a une erreur
210
                              fsm_layer7 <= endnok_st;
211
                           END IF;
212
 
213
                        WHEN typ_sync =>
214
                        -- Si c'est une trame de synchronisation
215
                           IF (dat_in(5 downto 4) = "10") THEN
216
                           -- Si le champ COM est bien à 10
217
                              fsm_layer7 <= source_st;      -- Le prochain octet sera l'@ source
218
                           ELSE
219
                           -- Si le champ COM n'est pas "10", c'est qu'il y'a une erreur
220
                              fsm_layer7 <= endnok_st;
221
                           END IF;
222
 
223
                        WHEN OTHERS =>
224
                           NULL;
225
                     END CASE;
226
                  END IF;
227
               END IF;
228
 
229
            WHEN destination_st =>
230
            -- Etat d'attente de l'octet @ de destination. La destination n'est pas mémorisée dans la DPRAM
231
            -- (i.e le pointeur n'est pas incrémenté)
232
               IF (eof = '1') THEN
233
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
234
                  fsm_layer7 <= abort_st;
235
               ELSIF (overflow_buf = '1') THEN
236
                  fsm_layer7 <= endnok_st;
237
               ELSE
238
                  IF (val_in = '1') THEN
239
                     IF (dat_in = ad_mio) OR (dat_in = x"80") OR (dat_in = x"FF") THEN
240
                     -- Si l'@ destination désigne bien le MIO
241
                        fsm_layer7 <= source_st;   -- Le prochain octet sera l'@ source
242
                     ELSE
243
                     -- Si l'adresse destination ne désigne pas le MIO c'est qu'il y'a un problème 
244
                     -- car la trame a déjà été filtré par le module layer2
245
                        fsm_layer7 <= endnok_st;
246
                     END IF;
247
                  END IF;
248
               END IF;
249
 
250
            WHEN source_st =>
251
            -- Etat d'attente de l'octet @ source.
252
               -- Par défaut le compteur est initialisé à 9 des fois que la trame soit une trame de supervision
253
               cpt_byte <= CONV_STD_LOGIC_VECTOR(9, cpt_byte'length);
254
               IF (eof = '1') THEN
255
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
256
                  fsm_layer7 <= abort_st;
257
               ELSIF (overflow_buf = '1') THEN
258
                  fsm_layer7 <= endnok_st;
259
               ELSE
260
                  IF (val_in = '1') THEN
261
                     adwrite <= adwrite + 1; -- L'adresse source est mémorisée dans la DPRAM
262
                     IF (dat_in = x"81" OR dat_in = x"82") THEN
263
                     -- Si la source est bien un des 2 concentrateurs
264
                        CASE type_field IS
265
                        -- Selon le type de la trame
266
                           WHEN typ_sec | typ_nosec =>
267
                           -- Si c'est une trame de commande (sécuritaire ou non) 
268
                              fsm_layer7 <= adrw_st;   -- Le prochain octet sera une adresse de lecture ou d'écriture
269
                           WHEN typ_sync =>
270
                           -- Si c'est une trame de synchronisation
271
                              fsm_layer7 <= endok_st; -- LA trame doit être finie
272
                           WHEN typ_sup =>
273
                           -- Si c'est une trame de supervision
274
                              fsm_layer7 <= dataw_st; -- On va recevoir les 9 octets correspondant 
275
                           WHEN OTHERS =>
276
                              NULL;
277
                        END CASE;
278
                     ELSE
279
                     -- Si la source n'est pas un des 2 concentrateurs
280
                        fsm_layer7 <= endnok_st;      -- Il y'a un problème
281
                     END IF;
282
                  END IF;
283
               END IF;
284
 
285
            WHEN adrw_st =>
286
            -- Etat d'attente de l'adresse de lecture ou d'écriture de la commande
287
               IF (eof = '1') THEN
288
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
289
                  fsm_layer7 <= abort_st;
290
               ELSIF (overflow_buf = '1') THEN
291
                  fsm_layer7 <= endnok_st;
292
               ELSE
293
                  IF (val_in = '1') THEN
294
                     adwrite <= adwrite + 1; -- Cette adresse est mémorisée dans la DPRAM
295
                     fsm_layer7 <= nrw_st;   -- Le prochain octet sera un champ longeur
296
                  END IF;
297
               END IF;
298
 
299
            WHEN nrw_st =>
300
            -- Etat d'attente du champ qui code la longueur des données
301
               IF (eof = '1') THEN
302
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
303
                  fsm_layer7 <= abort_st;
304
               ELSIF (overflow_buf = '1') THEN
305
                  fsm_layer7 <= endnok_st;
306
               ELSE
307
                  IF (val_in = '1') THEN
308
                     adwrite <= adwrite + 1;    -- Le champ longeur est mémorisé dans la DPRAM
309
                     -- On récupère le nombre de data utiles (ce champ n'est utilisé que pour des trames d'écriture
310
                     cpt_byte <= dat_in;
311
--                     IF (com_field = com_write AND dat_in = x"00") THEN
312
                     IF (dat_in = x"00") THEN
313
                     -- Si le champ actuel est un Nw (ie. un  nombre d'octets à écrire) et que ce champ vaut 0
314
                        fsm_layer7 <= endnok_st;    -- La trame a un mauvais format
315
                     ELSE
316
                        IF (type_field = typ_sec AND com_field = com_read) THEN
317
                        -- Si c'est une commande de lecture dans une trame de sécurité
318
                           fsm_layer7 <= crc1_st;  -- Les champs suivants seront le CRC
319
                        ELSIF (type_field = typ_nosec AND com_field = com_read) THEN
320
                        -- Si c'est une commande de lecture dans une trame non sécuritaire
321
                           fsm_layer7 <= endok_st; -- La trame est finie
322
                        ELSIF (com_field = com_rdwr) THEN
323
                        -- Si c'est une commande en lecture/écriture
324
                           fsm_layer7 <= adrw_st;   -- Le prochain octet sera une adresse d'écriture
325
                           com_field <= com_write;  -- On force le champ COM en écriture pour pas rester dansune boucle infini
326
                        ELSE
327
                        -- Si c'est une commande d'écriture ou de lecture/écriture
328
                           fsm_layer7 <= dataw_st; -- Il y'a d'autres octets à réceptionner
329
                        END IF;
330
                     END IF;
331
                  END IF;
332
               END IF;
333
 
334
            WHEN dataw_st =>
335
            -- Etat de réception des octets d'une trame d'écriture, d'écriture lecture ou d'une trame de supervision
336
            -- de configuration de l'adresse MAC
337
               IF (eof = '1') THEN
338
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
339
                  fsm_layer7 <= abort_st;
340
               ELSIF (overflow_buf = '1') THEN
341
                  fsm_layer7 <= endnok_st;
342
               ELSE
343
                  IF (val_in = '1') THEN
344
                     cpt_byte <= cpt_byte - 1;     -- On décompte chaque octet reçu
345
                     adwrite <= adwrite + 1;       -- chaque octet est mémorisé dans la DPRAM
346
                     IF (cpt_byte = CONV_STD_LOGIC_VECTOR(1, cpt_byte'length)) THEN
347
                     -- A la réception du dernier octet
348
                        IF (type_field = typ_sec OR type_field = typ_sup) THEN
349
                        -- Si c'est une trame de sécurité ou une trame de supervision
350
                           fsm_layer7 <= crc1_st;  -- Il y'a un CRC
351
                        ELSE
352
                        -- Si ce n'est pas une trame de sécurité ou de supervision 
353
                        -- (i.e. une commande non sécuritaire)
354
                           fsm_layer7 <= endok_st; -- la trame est finie
355
                        END IF;
356
                     END IF;
357
                  END IF;
358
               END IF;
359
 
360
            WHEN crc1_st =>
361
            -- Etat d'attente du 1er octet de CRC
362
               IF (eof = '1') THEN
363
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
364
                  fsm_layer7 <= abort_st;
365
               ELSIF (overflow_buf = '1') THEN
366
                  fsm_layer7 <= endnok_st;
367
               ELSE
368
                  IF (val_in = '1') THEN
369
                     fsm_layer7 <= crc2_st;
370
                  END IF;
371
               END IF;
372
 
373
            WHEN crc2_st =>
374
            -- Etat d'attente du 2ème octet de CRC
375
               IF (eof = '1') THEN
376
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
377
                  fsm_layer7 <= abort_st;
378
               ELSIF (overflow_buf = '1') THEN
379
                  fsm_layer7 <= endnok_st;
380
               ELSE
381
                  IF (val_in = '1') THEN
382
                        fsm_layer7 <= crccheck_st;
383
                  END IF;
384
               END IF;
385
 
386
            WHEN crccheck_st =>
387
            -- Etat de vérifciation du CRC (i.e. il est égal au magic number)
388
               IF (eof = '1') THEN
389
               -- Si on reçoit la fin de trame maintenant, c'est qu'il y a un problème
390
                  fsm_layer7 <= abort_st;
391
               ELSIF (overflow_buf = '1') THEN
392
                  fsm_layer7 <= endnok_st;
393
               ELSE
394
                  IF (crc(15 downto 0) = x"E88B") THEN
395
                     fsm_layer7 <= endok_st;
396
                  ELSE
397
                     fsm_layer7 <= endnok_st;
398
                  END IF;
399
               END IF;
400
 
401
            WHEN endok_st =>
402
            -- Le format de la couche applicative est correct
403
               IF (eof = '1') THEN
404
               -- On attend le sigal de fin de trame
405
                  new_frame <= '1';       -- On signale une nouvelle trame
406
                  l7_ok <= l2_ok;         -- Si le format de la couche 2 est également correct, la trma est bonne
407
                  IF (l2_ok = '0') THEN
408
                     adwrite <= old_adw;     -- On ignore tout ce qu'on vient de copier dans la DPRAM en reprenant l'ancien pointeur
409
                  END IF;
410
                  fsm_layer7 <= idle_st;
411
               END IF;
412
 
413
            WHEN endnok_st =>
414
            -- Le format de la couche applicative n'est pas correct
415
               IF (eof = '1') THEN
416
               -- On attend le signal de fin de trame
417
                  new_frame <= '1';       -- On signale une nouvelle trame
418
                  l7_ok <= '0';           -- dont le format n'est pas correct
419
                  adwrite <= old_adw;     -- On ignore tout ce qu'on vient de copier dans la DPRAM en reprenant l'ancien pointeur
420
                  fsm_layer7 <= idle_st;
421
               END IF;
422
 
423
            WHEN abort_st =>
424
            -- On a reçu une fin de trame au mauvais moment.
425
               new_frame <= '1';       -- On signale une nouvelle trame
426
               l7_ok <= '0';           -- dont le format n'est pas correct
427
               adwrite <= old_adw;     -- On ignore tout ce qu'on vient de copier dans la DPRAM en reprenant l'ancien pointeur
428
               fsm_layer7 <= idle_st;
429
 
430
            WHEN OTHERS =>
431
               fsm_layer7 <= idle_st;
432
         END CASE;
433
      END IF;
434
   END PROCESS;
435
 
436
   --------------------------------------------
437
   -- Calcul du crc16
438
   --------------------------------------------
439
        inst_crc16: crc16
440
   GENERIC MAP (
441
      poly => x"90D9"   -- Polynome générateur de x^16 + x^15 + x^12 + x^7 + x^6 + x^4 + x^3 + 1
442
      )
443
   PORT MAP(
444
                clk_sys => clk_sys,
445
                rst_n => rst_n,
446
                data => dat_in,
447
                val => val_in,
448
                init => init_crc,
449
                crc => crc
450
        );
451
 
452
   wea(0) <= val_in;                -- On écrit toutes les données entrantes dans le DPRAM
453
   dpram_dw <= soc_wr & dat_in;     -- Le vecteur d'écriture contient en SMB le signal de début de la commande
454
   dat_out <= dpram_dr(7 DOWNTO 0); -- En lecture de la DPRAM, les 8 MSB sont les données
455
   soc_out <= dpram_dr(8);          -- Le MSB est le signal de début de commande
456
   inst_dpram : dpram
457
   PORT MAP (
458
      clka => clk_sys,
459
      wea => wea,
460
      addra => adwrite,
461
      dina => dpram_dw,
462
      clkb => clk_sys,
463
      addrb => adread,
464
      doutb => dpram_dr
465
   );
466
 
467
end rtl;
468
 

powered by: WebSVN 2.1.0

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