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

Subversion Repositories saturn

[/] [saturn/] [trunk/] [FPGA Concentrateur SIL2/] [fpga_cosil2/] [store_framerxdma.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : STORE_FRAMERXDMA
3
--  DESCRIPTION : 
4
--        Stocke une trame incidente dans un buffer tournant
5
--         Si le CRC est bon à l'issue de la trame, on écrit le nombre d 'octets
6
--         au début de la zone et on update le pointeur d'écriture 
7
--         Si le CRC est mauvais, on fait rien
8
--  FICHIER :        store_framerxdma.vhd 
9
--=============================================================================
10
--  CREATION 
11
--  DATE              AUTEUR    PROJET  REVISION 
12
--  10/04/2014  DRA        SATURN       V1.0 
13
--=============================================================================
14
--  HISTORIQUE  DES  MODIFICATIONS :
15
--  DATE              AUTEUR    PROJET  REVISION 
16
--=============================================================================
17
 
18
LIBRARY IEEE;
19
USE IEEE.STD_LOGIC_1164.ALL;
20
USE IEEE.STD_LOGIC_ARITH.ALL;
21
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
22
 
23
LIBRARY work;
24
USE work.package_saturn.ALL;
25
 
26
ENTITY store_framerxdma IS
27
   PORT (
28
      clk_sys        : IN  STD_LOGIC;                    -- Horloge système
29
      rst_n          : IN  STD_LOGIC;                    -- Reset général système
30
      store_enable   : IN  STD_LOGIC;                    -- Autorise le stockage des trames incidentes
31
      -- Interface de réception des trames Rx
32
      data_store     : IN  STD_LOGIC_VECTOR(7 DOWNTO 0); -- Données à stocker.  
33
      val_store      : IN  STD_LOGIC;                    -- Validant du bus data_store(signal write)
34
      sof_store      : IN  STD_LOGIC;                    -- Indique und début de trame (nouvelle trame). Synchrone du 1er octet envoyé
35
      eof_store      : IN  STD_LOGIC;                    -- Indique que la trame est finie (plus de données à envoyer)
36
      crcok_store    : IN  STD_LOGIC;                    -- Indique que le CRC est bon ou pas
37
 
38
      -- Interface de restitution des trames enregistrées
39
      frame_dispo    : OUT STD_LOGIC;                    -- Indique qu'il y'a au moins une trame dispo à émettre
40
      frame_data     : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);-- Données à émettre (lue comme une FIFO en FWFT)
41
      frame_rd       : IN  STD_LOGIC;                    -- Signal de lecture d'une donnée
42
      overflow       : OUT STD_LOGIC;                    -- Indique que le pointeur d'écriture a rattraper celui de lecture
43
      bad_format     : OUT STD_LOGIC;                    -- Indique la réception d'une trame avec un CRC faux
44
      timestamp      : IN  STD_LOGIC_VECTOR(7 DOWNTO 0)  -- Pour timestamper la récetion des trames 
45
   );
46
END store_framerxdma;
47
 
48
ARCHITECTURE rtl of store_framerxdma is
49
   CONSTANT nbbit_add8 : integer := 12;                  -- Nombre de bit du bus d'adresse du buffer
50
   CONSTANT vecnull    : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00000000";
51
 
52
   SIGNAL cpt_adwr : STD_LOGIC_VECTOR(nbbit_add8-1 DOWNTO 0);  -- Compteur et pointeur d'écriture
53
   SIGNAL cpt_adrd : STD_LOGIC_VECTOR(nbbit_add8-2-1 DOWNTO 0);-- Compteur de lecture
54
   SIGNAL old_adwr : STD_LOGIC_VECTOR(nbbit_add8-2-1 DOWNTO 0);-- 1er empalcement libre dans la mémoire
55
   SIGNAL adread   : STD_LOGIC_VECTOR(nbbit_add8-2-1 DOWNTO 0);-- Pointeur de lecture
56
   SIGNAL cpt_byte : STD_LOGIC_VECTOR(7 DOWNTO 0);             -- Compteur d'octet dans une trame
57
   SIGNAL data_wr  : STD_LOGIC_VECTOR(7 DOWNTO 0);             -- Donnée à écrire dans la DPRAM
58
   SIGNAL wr_dpram : STD_LOGIC;                                -- Signal d'écriture dans la DPRAM
59
   SIGNAL wea      : STD_LOGIC_VECTOR(0 DOWNTO 0);             -- Pour vectoriser le signal d'écriture
60
 
61
   TYPE fsm_write_type IS (idlewr_st, write_payload_st, clr_msbsize_st, gest_over_st); -- Machine d'état d'écriture d'une trame
62
   SIGNAL fsm_write : fsm_write_type;
63
 
64
   -- DPRAM de stockage
65
   COMPONENT dpram_storerx
66
      PORT (
67
         clka  : IN STD_LOGIC;
68
         wea   : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
69
         addra : IN STD_LOGIC_VECTOR(nbbit_add8-1 DOWNTO 0);
70
         dina  : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
71
         douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
72
         clkb  : IN STD_LOGIC;
73
         web   : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
74
         addrb : IN STD_LOGIC_VECTOR(nbbit_add8-2-1 DOWNTO 0);
75
         dinb  : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
76
         doutb : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
77
      );
78
   END COMPONENT;
79
 
80
BEGIN
81
 
82
   --------------------------------------------
83
   -- Gestion du compteur d'adresse de la DPRAM en lecture
84
   --------------------------------------------
85
   cptr : PROCESS(clk_sys, rst_n)
86
   BEGIN
87
      IF (rst_n = '0') THEN
88
         cpt_adrd <= (others => '0');
89
         frame_dispo <= '0';
90
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
91
         IF (frame_rd = '1') THEN
92
         -- A chaque donnée lue
93
            cpt_adrd <= cpt_adrd + 1;
94
         END IF;
95
         IF (cpt_adrd /= old_adwr) THEN
96
         -- Si le pointeur en lecture est différent du pointeur en écriture, on indique qu'il 
97
         -- y'a des données à traiter
98
            frame_dispo <= '1';
99
         ELSE
100
            frame_dispo <= '0';
101
         END IF;
102
      END IF;
103
   END PROCESS;
104
   -- Permet d'avoir un fonctionnement style FWFT avec un seul cycle entre le rd et la donnée
105
   adread <= cpt_adrd WHEN (frame_rd = '0') ELSE cpt_adrd+1;
106
 
107
   --------------------------------------------
108
   -- Machine d'état d'écriture du flux
109
   --------------------------------------------
110
   wr_fsm : PROCESS(clk_sys, rst_n)
111
      VARIABLE temp : STD_LOGIC_VECTOR(nbbit_add8-1 DOWNTO 0);
112
   BEGIN
113
      IF (rst_n = '0') THEN
114
         fsm_write <= idlewr_st;
115
         cpt_adwr <= (others => '0');
116
         old_adwr <= (others => '0');
117
         cpt_byte <= (others => '0');
118
         overflow <= '0';
119
         wr_dpram <= '0';
120
         bad_format <= '0';
121
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
122
         CASE fsm_write IS
123
            WHEN idlewr_st =>
124
            -- Etat d'attente d'un SOF
125
               overflow <= '0';
126
               bad_format <= '0';
127
               IF (val_store = '1' AND sof_store = '1' AND store_enable = '1') THEN
128
               -- Sur SOF et que le store est autorisé
129
                  cpt_adwr <= (old_adwr + 1) & "00";  -- On réserve un espace pour stocker la longueur
130
                  data_wr <= data_store;              -- On va écrire la première donnée
131
                  wr_dpram <= '1';                    -- On va écrire
132
                  cpt_byte <= x"01";                  -- On a 1 octet utile
133
                  fsm_write <= write_payload_st;
134
               ELSE
135
                  wr_dpram <= '0';
136
               END IF;
137
 
138
            WHEN write_payload_st =>
139
            -- Etat d'attente du EOF
140
               IF (wr_dpram = '1') AND ((cpt_adwr(nbbit_add8-1 DOWNTO 2) = cpt_adrd-4) OR
141
                                        (cpt_adwr(nbbit_add8-1 DOWNTO 2) = cpt_adrd-3)) THEN
142
               -- On a un overflow si on écrit et que le pointeur wr a rattrapé le pointeur rd
143
               -- On teste par rapprot à 2 valeurs du pointeurs de lecture car sinon, le fonctionnement
144
               -- en FWFT peut faire qu'on loupe une valeur
145
                  overflow <= '1';
146
                  wr_dpram <= '0';
147
                  IF (eof_store = '1') THEN
148
                  -- Si c'est également le dernier mot de la trame
149
                     fsm_write <= idlewr_st;
150
                  ELSE
151
                  -- Si c'est pas le derneir, on va attendre la fin de la trame
152
                     fsm_write <= gest_over_st;
153
                  END IF;
154
               ELSE
155
                  IF (eof_store = '1') THEN
156
                  -- Si on a reçu la trame en entier
157
                     IF (crcok_store = '1') THEN
158
                     -- Si le CRC est bon
159
                        cpt_adwr <= old_adwr & "00";     -- On va stocker le nombre d'octets utiles dans les LSB du au début
160
                        data_wr <= cpt_byte-2;           -- -2 car on stocke pas le CRC de la couche Transport
161
                        temp := cpt_adwr - 2;            -- Le pointeur de fin est remonté de 2
162
                        old_adwr <= temp(nbbit_add8-1 DOWNTO 2) + 1; -- On arrondi à l'adresse multiple de 4 immédiatement supérieure
163
                        wr_dpram <= '1';                 -- On va écrire le nombre do'ctets de la trame
164
                        fsm_write<= clr_msbsize_st;
165
                     ELSE
166
                     -- Si le CRC est mauvais
167
                        fsm_write <= idlewr_st;          -- On fait rien, les données écrites seront écrasées par la prochaine trame
168
                        bad_format <= '1';               -- On indqiue une mauvaise trame
169
                     END IF;
170
 
171
                  ELSIF (val_store = '1') THEN
172
                  -- Donéne normale de la trame
173
                     cpt_adwr <= cpt_adwr + 1;           -- On va écrire à l'adresse suivante
174
                     cpt_byte <= cpt_byte + 1;           -- On compte un octet de plus
175
                     data_wr <= data_store;              -- On stocke la donnée telle quelle
176
                     wr_dpram <= '1';
177
                  ELSE
178
                     wr_dpram <= '0';
179
                  END IF;
180
               END IF;
181
 
182
            WHEN clr_msbsize_st =>
183
            -- Etat de fabrication des MSB du 1er mot de 32 bits
184
            -- La première zone mémoire du bloc contient:
185
            -- LSB : Taille du bloc
186
            -- LSB+1 : 0
187
            -- LSB+2 : 0
188
            -- MSB : Timestamp
189
               cpt_adwr(1 DOWNTO 0) <= cpt_adwr(1 DOWNTO 0) + 1;
190
               IF (cpt_adwr(1 DOWNTO 0) = "10") THEN
191
               -- On va écrire le time stamp dans les 8 MSB de la 1ère zone
192
                  data_wr <= timestamp;
193
                  fsm_write <= idlewr_st;
194
               ELSE
195
               -- On cleare les LSB+1 et LSB+2
196
                  data_wr <= x"00";
197
               END IF;
198
 
199
            WHEN gest_over_st =>
200
               overflow <= '0';
201
               wr_dpram <= '0';
202
               IF (eof_store = '1') THEN
203
               -- On attend le signal de fin trame pour recommencer à traiter
204
                  fsm_write <= idlewr_st;
205
               END IF;
206
 
207
            WHEN OTHERS =>
208
               fsm_write <= idlewr_st;
209
         END CASE;
210
      END IF;
211
   END PROCESS;
212
 
213
   wea(0) <= wr_dpram;
214
   store : dpram_storerx
215
      PORT MAP (
216
         clka => clk_sys,
217
         wea => wea,
218
         addra => cpt_adwr,
219
         dina => data_wr,
220
         douta => OPEN,
221
         clkb => clk_sys,
222
         web => vecnull(0 DOWNTO 0),
223
         addrb => adread,
224
         dinb => vecnull,
225
         doutb => frame_data
226
      );
227
END rtl;
228
 

powered by: WebSVN 2.1.0

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