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 |
|
|
|