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

Subversion Repositories saturn

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : FRAME_STORE
3
--  DESCRIPTION : 
4
--       Stocke les données applicatives des trames reçues dans une DPRAM
5
--       Si la trame est mauvaise, le pointeur d'écriture dans la DPRAM est 
6
--       ramené à sa position initiale 
7
--       Le MSB (9ème bit de la DPRAM) est à 1 en début de trame
8
 
9
--  FICHIER :        frame_store.vhd 
10
--=============================================================================
11
--  CREATION 
12
--  DATE              AUTEUR    PROJET  REVISION 
13
--  10/04/2014  DRA        SATURN       V1.0 
14
--=============================================================================
15
--  HISTORIQUE  DES  MODIFICATIONS :
16
--  DATE              AUTEUR    PROJET  REVISION 
17
--=============================================================================
18
 
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
LIBRARY UNISIM;
24
USE UNISIM.VComponents.ALL;
25
 
26
entity frame_store is
27
   PORT (
28
      -- Ports système
29
      clk_sys  : IN  STD_LOGIC;                    -- Clock système
30
      rst_n    : IN  STD_LOGIC;                    -- Reset général système
31
 
32
      -- Interfaces vers le le module LAYER2_RX
33
      sof      : IN  STD_LOGIC;                   -- Indique le début d'une trame en réception sur dat_in
34
      eof      : IN  STD_LOGIC;                   -- Indique la fin d'une trame en réception sur dat_in
35
      l2_ok    : IN  STD_LOGIC;                   -- Indique que la trame reçue est correcte d'un point de vue layer 2
36
      dat_in   : IN  STD_LOGIC_VECTOR(7 downto 0);-- Données de la couche applicative (épurée de la couche layer 2)
37
      val_in   : IN  STD_LOGIC;                   -- Validant du bus dat_in
38
 
39
      -- Interfaces vers le module interface PIC
40
      dat_out  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Données utiles de la couche applicative (commande, @, data)
41
      soc_out  : OUT STD_LOGIC;                    -- Indique que l'octet sur dat_out est le 1e d'une commande
42
      rd_datout: IN  STD_LOGIC;                    -- Signal de lecture d'un nouvel octet applicatif
43
      new_frame: OUT STD_LOGIC;                    -- Indique qu'une nouvelle trame est disponible
44
      com_dispo: OUT STD_LOGIC;                    -- Inidque qu'il y'a des données de commande à traiter dans la DPRAM
45
      l7_ok    : OUT STD_LOGIC;                    -- Indique que la nouvelle trame est conforme du point de vue layer 7
46
      overflow : OUT STD_LOGIC                     -- Indique un overflow du buffer de stockage des commandes
47
      );
48
end frame_store;
49
 
50
architecture  rtl of frame_store is
51
   SIGNAL   adread   : STD_LOGIC_VECTOR(9 DOWNTO 0);  -- Signal d'adresse pour la lecture en DPRAM
52
   SIGNAL   cpt_adread: STD_LOGIC_VECTOR(9 DOWNTO 0); -- Compteur d'adresse pour la lecture en DPRAM
53
   SIGNAL   adwrite  : STD_LOGIC_VECTOR(9 DOWNTO 0);  -- Compteur d'adresse dynamique pour l'écriture en DPRAM
54
   SIGNAL   old_adw  : STD_LOGIC_VECTOR(9 DOWNTO 0);  -- Pour mémoriser la première location vide dans la DPRAM
55
   SIGNAL   wea      : STD_LOGIC_VECTOR(0 DOWNTO 0);  -- Pour transformer le signal d'écriture dans la DPRAM en VECTOR
56
   SIGNAL   dpram_dw : STD_LOGIC_VECTOR(8 DOWNTO 0);  -- Pour fabriquer le vecteur d'écriture dans la DPRAM
57
   SIGNAL   dpram_dr : STD_LOGIC_VECTOR(8 DOWNTO 0);  -- Vecteur de lecture dans la DPRAM
58
 
59
   SIGNAL   overflow_buf  : STD_LOGIc;                -- Indique que le buffer de stockage des commandes a débordé
60
 
61
   -- Machine d'état de gestion du module
62
   TYPE layer7_type IS (idle_st, recdat_st, overflow_st);
63
   SIGNAL fsm_layer7      : layer7_type;
64
 
65
   COMPONENT dpram
66
   PORT (
67
      clka     : IN STD_LOGIC;
68
      wea      : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
69
      addra    : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
70
      dina     : IN STD_LOGIC_VECTOR(8 DOWNTO 0);
71
      clkb     : IN STD_LOGIC;
72
      addrb    : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
73
      doutb    : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
74
   );
75
   END COMPONENT;
76
 
77
begin
78
   --------------------------------------------
79
   -- Gestion du comtpeur d'adresse en lecture
80
   --------------------------------------------
81
   cptr : PROCESS(clk_sys, rst_n)
82
   BEGIN
83
      IF (rst_n = '0') THEN
84
         cpt_adread <= (others => '0');
85
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
86
         IF (rd_datout = '1') THEN
87
         -- Sur chaue ordre de lecture
88
            cpt_adread <= cpt_adread + 1;    -- On incrméente le pointeur de lecture de la DPRAM
89
         END IF;
90
      END IF;
91
   END PROCESS;
92
   -- Le pointeur de lecture en DPRAM est soit le compteur, soit la location suiante
93
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
94
   adread <= cpt_adread WHEN (rd_datout = '0') ELSE cpt_adread+1;
95
   -- Si le pointeur en lecture est différent du pointeur en écriture, on indique qu'il 
96
   -- y'a des données à traiter
97
   com_dispo <= '0' WHEN (cpt_adread = old_adw) ELSE '1';
98
   -- On considère un overflow du buffer de stockage des commandes lorsque le pointeur de write a presque
99
   -- rattrapé le pointeur de read
100
   overflow_buf <= '1' WHEN (adwrite = cpt_adread-4) AND (wea(0) = '1') ELSE '0';
101
   overflow <= overflow_buf;
102
 
103
   --------------------------------------------
104
   -- Machine d'état d'analyse du flux
105
   --------------------------------------------
106
   man_fsm : PROCESS(clk_sys, rst_n)
107
   BEGIN
108
      IF (rst_n = '0') THEN
109
         old_adw <= (others => '0');
110
         adwrite <= (others => '0');
111
         fsm_layer7 <= idle_st;
112
         l7_ok <= '0';
113
         new_frame <= '0';
114
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
115
         CASE fsm_layer7 IS
116
            WHEN idle_st =>
117
               l7_ok <= '0';
118
               new_frame <= '0';
119
               old_adw <= adwrite;     -- On mémorise l'adresse de départ
120
               IF (val_in = '1' AND sof = '1') THEN
121
               -- Si on reçoit la 1ère donnée d'une trame, elle est ne train de s'écrire dans adwrite
122
                  adwrite <= adwrite+1;   -- on prpépare l'adresse suivante pour le prochain octet
123
                  fsm_layer7 <= recdat_st;
124
               END IF;
125
 
126
            WHEN recdat_st =>
127
            -- Etat d'enregistrement des données
128
               IF (eof = '1') THEN
129
               -- Si on reçoit le signalde fin de trame
130
                  new_frame <= '1';       -- On signale une nouvelle trame au module suivant
131
                  l7_ok <= l2_ok;         -- Si le format de la couche 2 est correct, la trame est bonne
132
                  IF (l2_ok = '1') THEN
133
                  -- Si la trame est bonne
134
                     adwrite <= adwrite-2;-- On supprime les 2 derniers octets qui sont le CRC du layer 2
135
                  ELSE
136
                  -- Si la trame es tmauvaise (l2_ok = '0') 
137
                     adwrite <= old_adw;  -- On ramèné le pointeur d'écriture au début et on va ttendre le sof suivant
138
                  END IF;
139
                  fsm_layer7 <= idle_st;
140
               ELSIF (overflow_buf = '1') THEN
141
                  fsm_layer7 <= overflow_st;
142
               ELSIF (val_in = '1') THEN
143
               -- Si ona reçu un octet de plus
144
                  adwrite <= adwrite + 1;    -- on va l'écrire à l'adresse suivante
145
               END IF;
146
 
147
            WHEN overflow_st =>
148
            -- On a eu un overflow
149
               IF (eof = '1') THEN
150
               -- On attend le signal de fin de trame
151
                  new_frame <= NOT(l2_ok);  -- On ne signale une nouvelle trame que si elle est erronnée (pour les stats)
152
                  l7_ok <= '0';             -- Si on signale une trame, c'est qu'elle est erronnée
153
                  adwrite <= old_adw;       -- On ramène le pointeur wr à sa position d'origine
154
                  fsm_layer7 <= idle_st;
155
               END IF;
156
 
157
            WHEN OTHERS =>
158
               fsm_layer7 <= idle_st;
159
         END CASE;
160
      END IF;
161
   END PROCESS;
162
 
163
   wea(0) <= val_in;                -- signal d'écriture dans la DPRAM
164
   dpram_dw <= sof & dat_in;        -- Le vecteur d'écriture contient en MSB le signal de début de trame
165
   dat_out <= dpram_dr(7 DOWNTO 0); -- En lecture de la DPRAM, les 8 MSB sont les données
166
   soc_out <= dpram_dr(8);          -- Le MSB est le signal de début de commande
167
   inst_dpram : dpram
168
   PORT MAP (
169
      clka => clk_sys,
170
      wea => wea,
171
      addra => adwrite,
172
      dina => dpram_dw,
173
      clkb => clk_sys,
174
      addrb => adread,
175
      doutb => dpram_dr
176
   );
177
 
178
end rtl;
179
 

powered by: WebSVN 2.1.0

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