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

Subversion Repositories saturn

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : MEMORY_MAP
3
--  DESCRIPTION : 
4
--        Mappe la zone mémoire du BAR accédée par le bus local sur les registres
5
--        internes et les DPRAM 
6
--        Les registres sont accesibles en RD / WR par le bus local. 
7
--        Les signaux discrets associés aux registres sortent/entrent directement.
8
--        Les zones mémoires utilisées pour stocker les commandes périodiques et 
9
--        apériodiques sont accessibles d'un coté par le bus local, de l'autre
10
--        par un bus dédié.
11
--
12
--          BUS LOCAL                                       Bus dédié
13
--        Mots de 32 bits                                Mots de 8 bits
14
--        -----------------|--------------------------|
15
--                         |0000h                     |
16
--              BAR 0      |    Registres             |   Pas d'accès
17
--                         |7FFFh                     |
18
--        -----------------|--------------------------|----------------------
19
--                         |8000h                0000h|
20
--                         |    Zone Tx Periodique    |
21
--                         |87FFh                1FFFh|
22
--                         |--------------------------|
23
--                         |8800h                2000h|
24
--                         |     Zone réservée        |
25
--                         |8FFFh                3FFFh|
26
--              BAR 1      |--------------------------|    Accés par addrr_tx
27
--              (RFU)      |9000h                4000h|
28
--                         |    Zone Tx Apériodique   |
29
--                         |97FFh                5FFFh|
30
--                         |--------------------------|
31
--                         |9800h                6000h|
32
--                         |     Zone réservée        |
33
--                         |9FFFh                7FFFh|
34
--        -----------------|--------------------------|---------------------
35
--                         |A000h                     |
36
--              BAR 1      |     Zone réservée        |   Pas d'accès
37
--                         |FFFFh                     |
38
--        -----------------|--------------------------|---------------------
39
--
40
--  Les DMA transfèrent les trames reçus Rx1, Rx2, et émises par le PIC Tx dans 3 zones de 32 buffers chacune.
41
--  L'adresse de ce transfert vaut @ = DMA_BASE_PA + ZON * 2000h + BUF * 100h
42
--  Avec :
43
--            ZON = 0, 1 ou 2 pour respectivement les zones Rx1, RX2 et Tx
44
--            BUF = poids du bit à ‘1’ choisi dans un des registres RX1_AVAI, RX2_AVAI ou TX_AVAI (de 0 à 31).
45
--
46
--  FICHIER :        memory_map.vhd 
47
--=============================================================================
48
--  CREATION 
49
--  DATE              AUTEUR    PROJET  REVISION 
50
--  10/04/2014  DRA        SATURN       V1.0 
51
--=============================================================================
52
--  HISTORIQUE  DES  MODIFICATIONS :
53
--  DATE              AUTEUR    PROJET  REVISION
54
--  03/03/2015 DRA      SATURN   V1.1 
55
--    Rajout du bit 7 au registre status 
56
--=============================================================================
57
 
58
LIBRARY IEEE;
59
USE IEEE.STD_LOGIC_1164.ALL;
60
USE IEEE.STD_LOGIC_ARITH.ALL;
61
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
62
 
63
LIBRARY work;
64
USE work.package_saturn.ALL;
65
 
66
ENTITY memory_map IS
67
   GENERIC (
68
      reg_version : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"10"   -- Version du firmware
69
      );
70
   PORT (
71
      clk_sys        : IN  STD_LOGIC;                       -- Clock général système à 62.5MHz issue du module IF_PCIE
72
      rst_n          : IN  STD_LOGIC;                       -- Reset général système
73
      iid            : IN  STD_LOGIC_VECTOR(63 DOWNTO 0);   -- iid du Cocentrateur
74
      actif_passifn  : IN  STD_LOGIC;                       -- Indique que le concentrateur est actif ou passif
75
 
76
      -- Signaux du bus Local Bus du PCIe
77
      rd_addr        : IN  STD_LOGIC_VECTOR(NBBIT_ADD_LOCAL-1 DOWNTO 0);
78
      rd_data        : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
79
      rd_be          : IN  STD_LOGIC_VECTOR(3 DOWNTO 0);
80
      rd_en          : IN  STD_LOGIC;
81
      wr_addr        : IN  STD_LOGIC_VECTOR(NBBIT_ADD_LOCAL-1 DOWNTO 0);
82
      wr_data        : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
83
      wr_be          : IN  STD_LOGIC_VECTOR(3 DOWNTO 0);
84
      wr_en          : IN  STD_LOGIC;
85
      wr_busy        : OUT STD_LOGIC;
86
 
87
      -- Interface Main Process
88
      -- Controle général
89
      rst_regn       : OUT STD_LOGIC;                       -- Reset du FPGA par registre interne
90
      store_enable   : OUT STD_LOGIC;                       -- Autorise le stockage de trame dans la mémoire DMA
91
      dma_inprogress : IN  STD_LOGIC;                       -- Indique qu'un DMA est en cours
92
      update_ena     : IN  STD_LOGIC;                       -- Indique que les mémoires d'émission pridoique peuvent être modifiées
93
      rx_flushn      : OUT STD_LOGIC;                       -- Purge les mémoires de stockage destrames
94
      topcyc         : IN  STD_LOGIC;                       -- Un pulse indique un début de cycle
95
 
96
      -- Paramètres DMA
97
      dma_base_pa    : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Adresse de base du DMA coté micro
98
      dma_timestamp  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);    -- LSB du numéro de cycle en cours
99
 
100
      -- Interfaces de gestion des buffers d'enregitrement des trames Rx et Tx
101
      bufferrx1_full : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Buffers non vides en réception coté port 1
102
      bufferrx2_full : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Buffers non vides en réception coté port 2
103
      buffertx_full  : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Buffers non vides des trames émises par le PIC
104
      newframe_rx1   : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Indique un(les) nouveau(x) buffer(s) Rx 1 rempli(s)
105
      newframe_rx2   : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Indique un(les) nouveau(x) buffer(s) Rx 2 rempli(s)
106
      newframe_tx    : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);   -- Indique un(les) nouveau(x) buffer(s) Tx rempli(s)
107
      rx1_overflow   : IN  STD_LOGIC;                       -- Indique l'impossiblité de stocker une trame reçue sur Rx1
108
      rx2_overflow   : IN  STD_LOGIC;                       -- Indique l'impossiblité de stocker une trame reçue sur Rx2
109
      tx_overflow    : IN  STD_LOGIC;                       -- Indique l'impossiblité de stocker une trame Tx
110
      rx1_badformat  : IN  STD_LOGIC;                       -- Indique une erreur de fromat sur une trame de Rx1
111
      rx2_badformat  : IN  STD_LOGIC;                       -- Indique une erreur de fromat sur une trame de Rx2
112
                clk_96                  : IN  STD_LOGIC;                       -- Horloge 96MHz synhcrone des traitements LS1 et LS2               
113
 
114
      testpoint      : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)     -- Signaux de tests généralistes
115
     );
116
END memory_map;
117
 
118
ARCHITECTURE rtl of memory_map is
119
   -- Définition des @ des registres sur le bus Local
120
   CONSTANT msb_addr       : INTEGER := 5;
121
   CONSTANT ad_iid1        : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000000";
122
   CONSTANT ad_iid2        : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000001";
123
   CONSTANT ad_controle    : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000010";
124
   CONSTANT ad_statut      : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000011";
125
   CONSTANT ad_statutrp    : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000100";
126
   CONSTANT ad_txenaper    : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000101";
127
   CONSTANT ad_txenaaper   : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000110";
128
   CONSTANT ad_rx1avai     : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "000111";
129
   CONSTANT ad_rx2avai     : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "001000";
130
   CONSTANT ad_txavai      : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "001001";
131
   CONSTANT ad_dmabasepa   : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "001010";
132
   CONSTANT ad_timestamp   : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "001011";
133
   CONSTANT ad_fifoforce   : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "001100";
134
   CONSTANT ad_testpoint   : STD_LOGIC_VECTOR(msb_addr DOWNTO 0) := "001101";
135
 
136
   CONSTANT vec_null : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00000000";
137
 
138
   -- Signaux temporaires de constitution des bus adresse et data (RFU)
139
   SIGNAL rd_data_int      : STD_LOGIC_VECTOR(31 DOWNTO 0); -- Pour passer le bus data read du local bus de Little à Big Endian
140
   SIGNAL wr_data_int      : STD_LOGIC_VECTOR(31 DOWNTO 0); -- Pour passer le bus data write du local bus de Little à Big Endian
141
   SIGNAL rd_reg           : STD_LOGIC_VECTOR(31 DOWNTO 0); -- Signal multiplexé de lecture des registres
142
   SIGNAL mem_rxflush      : STD_LOGIC;                     -- Pour gérer l'ordre de flush des mémories Rx
143
 
144
   -- Registres internes
145
   SIGNAL reg_iid          : STD_LOGIC_VECTOR(63 DOWNTO 0);
146
   SIGNAL reg_ctl          : STD_LOGIC_VECTOR(31 DOWNTO 0);
147
   SIGNAL reg_status       : STD_LOGIC_VECTOR(31 DOWNTO 0);
148
   SIGNAL reg_statutrp     : STD_LOGIC_VECTOR(31 DOWNTO 0);
149
   SIGNAL reg_rx1avai      : STD_LOGIC_VECTOR(31 DOWNTO 0);
150
   SIGNAL reg_rx2avai      : STD_LOGIC_VECTOR(31 DOWNTO 0);
151
   SIGNAL reg_txavai       : STD_LOGIC_VECTOR(31 DOWNTO 0);
152
   SIGNAL reg_dmabasepa    : STD_LOGIC_VECTOR(31 DOWNTO 0);
153
   SIGNAL reg_timestamp    : STD_LOGIC_VECTOR(31 DOWNTO 0);
154
   SIGNAL reg_testpoint    : STD_LOGIC_VECTOR(31 DOWNTO 0);
155
 
156
   -- Compteurs de satut
157
   SIGNAL cpt_badfmt1      : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Compteur de trame reçue avec un mauvais FCS sur port 1
158
   SIGNAL cpt_badfmt2      : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Compteur de trame reçue avec un mauvais FCS sur port 2
159
 
160
   -- Pour détecter un front sur Top_cyc
161
   SIGNAL top_cyc_r        : STD_LOGIC_VECTOR(2 DOWNTO 0);
162
   SIGNAL front_topcyc     : STD_LOGIC;
163
 
164
BEGIN
165
   wr_busy <= '0';         -- Aucune opération de WR sur le bus local ne dure plus d'un cycle de clk_sys
166
   -- Swap des octets des mots de 32 bits (little endian <-> big endian) 
167
   wr_data_int <= wr_data( 7 DOWNTO  0) & wr_data(15 DOWNTO  8) &
168
                  wr_data(23 DOWNTO 16) & wr_data(31 DOWNTO 24);
169
   rd_data <= rd_data_int( 7 DOWNTO  0) & rd_data_int(15 DOWNTO  8) &
170
              rd_data_int(23 DOWNTO 16) & rd_data_int(31 DOWNTO 24);
171
 
172
   reg_iid <= iid;         -- Affectation de l'IID du module
173
 
174
   -- Affectation des sorties de controle général
175
   store_enable <= reg_ctl(0);   -- Autorise le stockage des trames pour transfert DMA
176
 
177
   -- Affectation des sorties de gestion des buffers de réception
178
   bufferrx1_full <= reg_rx1avai;
179
   bufferrx2_full <= reg_rx2avai;
180
   buffertx_full  <= reg_txavai;
181
 
182
   -- Affectation de l'adresse de base du DMA
183
   dma_base_pa <= reg_dmabasepa;
184
   dma_timestamp <= reg_timestamp(7 DOWNTO 0);
185
 
186
   testpoint <= reg_testpoint(7 DOWNTO 0);
187
 
188
   -- Process pour assurer que le reset interne piloté par registre dure un clk
189
   proc_rstreg : PROCESS(clk_sys)
190
   BEGIN
191
      IF (clk_sys'event AND clk_sys = '1') THEN
192
         -- Gestion du reset interne piloté par registre
193
         rst_regn <= NOT(reg_ctl(1));
194
      END IF;
195
   END PROCESS;
196
 
197
   ---------------------------------------------
198
   -- Process de gestion des écritures dans les registres
199
   -- Une écriture est efefctive lorsque le signal WR_EN est actif
200
   -- et que le vecteur WR_ADDR désigne une adresse valable dans le BAR0
201
   -- L'adresse du registre dans le BAR0 est définie par:
202
   --   @ BAR0 + Offset_registre ce qui équivaut à @BAR OR Offset_registre
203
   -- car l'@BAR0 est forcément aligné sur une adresse multiple de la taille du BAR0 (i.e. les LSB sont nuls)
204
   ---------------------------------------------
205
   proc_writereg : PROCESS(clk_sys, rst_n)
206
   BEGIN
207
      IF (rst_n = '0') THEN
208
         reg_ctl        <= x"00000000";
209
         reg_rx1avai    <= x"00000000";
210
         reg_rx2avai    <= x"00000000";
211
         reg_txavai     <= x"00000000";
212
         reg_dmabasepa  <= x"00000000";
213
         reg_testpoint  <= x"00000000";
214
      ELSIF (clk_sys'event AND clk_sys = '1') THEN
215
         IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_controle, NBBIT_ADD_LOCAL))) THEN
216
            reg_ctl <= wr_data_int;
217
         END IF;
218
         -- Gestion du registre de statuts du buffer DMA pour Rx1
219
         loop_rx1full : FOR i IN 0 TO 31 LOOP
220
            IF (mem_rxflush = '1') THEN
221
               reg_rx1avai(i) <= '0';
222
            ELSIF (newframe_rx1(i) = '1') THEN
223
            -- Lorsqu'une nouvelle trame est envoyée par DMA
224
               reg_rx1avai(i) <= '1';     -- On positionne le bit correspondant
225
            ELSE
226
               IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_rx1avai, NBBIT_ADD_LOCAL))) THEN
227
               -- Sur un WR au registre de RX1_AVAI
228
                  IF (wr_data_int(i) = '1') THEN
229
                  -- Seul un '1' cleare le registre
230
                     reg_rx1avai(i) <= '0';
231
                  END IF;
232
               END IF;
233
            END IF;
234
         END LOOP;
235
         -- Gestion du registre de statuts du buffer DMA pour Rx2
236
         loop_rx2full : FOR i IN 0 TO 31 LOOP
237
         -- Idem pour RX1_AVAI
238
            IF (mem_rxflush = '1') THEN
239
               reg_rx2avai(i) <= '0';
240
            ELSIF (newframe_rx2(i) = '1') THEN
241
               reg_rx2avai(i) <= '1';
242
            ELSE
243
               IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_rx2avai, NBBIT_ADD_LOCAL))) THEN
244
                  IF (wr_data_int(i) = '1') THEN
245
                     reg_rx2avai(i) <= '0';
246
                  END IF;
247
               END IF;
248
            END IF;
249
         END LOOP;
250
         -- Gestion du registre de statuts du buffer DMA pour Tx
251
         loop_txfull : FOR i IN 0 TO 31 LOOP
252
         -- Idem pour RX2_AVAI
253
            IF (mem_rxflush = '1') THEN
254
               reg_txavai(i) <= '0';
255
            ELSIF (newframe_tx(i) = '1') THEN
256
               reg_txavai(i) <= '1';
257
            ELSE
258
               IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_txavai, NBBIT_ADD_LOCAL))) THEN
259
                  IF (wr_data_int(i) = '1') THEN
260
                     reg_txavai(i) <= '0';
261
                  END IF;
262
               END IF;
263
            END IF;
264
         END LOOP;
265
         IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_dmabasepa, NBBIT_ADD_LOCAL))) THEN
266
            reg_dmabasepa <= wr_data_int;
267
         END IF;
268
         IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_testpoint, NBBIT_ADD_LOCAL))) THEN
269
            reg_testpoint <= wr_data_int;
270
         END IF;
271
      END IF;
272
   END PROCESS;
273
 
274
   -------------------------------------
275
   -- Process de gestion du registre STATUT
276
   -------------------------------------
277
   proc_status : PROCESS(clk_sys, rst_n)
278
   BEGIN
279
      IF (rst_n = '0') THEN
280
         reg_status   <= x"00000000";
281
      ELSIF (clk_sys'event AND clk_sys = '1') THEN
282
         IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_statut, NBBIT_ADD_LOCAL))) THEN
283
         -- Remise à '0' des bits en Write One Clear
284
         -- Un registre n'est remis à '0' sur WOC que si l'évènement corrspondant n'est pas actif
285
            IF (wr_data_int(0) = '1') THEN
286
               reg_status(0)  <= front_topcyc;
287
            END IF;
288
            IF (wr_data_int(1) = '1') THEN
289
               reg_status(1)  <= rx1_overflow;
290
            END IF;
291
            IF (wr_data_int(2) = '1') THEN
292
               reg_status(2) <= rx2_overflow;
293
            END IF;
294
            IF (wr_data_int(3) = '1') THEN
295
               reg_status(3)  <= tx_overflow;
296
            END IF;
297
            IF (wr_data_int(4) = '1') THEN
298
               reg_status(4) <= rx1_badformat;
299
            END IF;
300
            IF (wr_data_int(5) = '1') THEN
301
               reg_status(5) <= rx2_badformat;
302
            END IF;
303
         ELSE
304
            IF (front_topcyc = '1') THEN
305
               reg_status(0)  <= '1';
306
            END IF;
307
            IF (rx1_overflow = '1') THEN
308
               reg_status(1)  <= '1';
309
            END IF;
310
            IF (rx2_overflow = '1') THEN
311
               reg_status(2) <= '1';
312
            END IF;
313
            IF (tx_overflow = '1') THEN
314
               reg_status(3)  <= '1';
315
            END IF;
316
            IF (rx1_badformat = '1') THEN
317
               reg_status(4)  <= '1';
318
            END IF;
319
            IF (rx2_badformat = '1') THEN
320
               reg_status(5)  <= '1';
321
            END IF;
322
         END IF;
323
         reg_status(6) <= update_ena;
324
         reg_status(7) <= actif_passifn;
325
         reg_status(23 DOWNTO 8) <= (OTHERS => '0');
326
         reg_status(31 DOWNTO 24) <= reg_version;
327
      END IF;
328
   END PROCESS;
329
 
330
   ---------------------------------------------
331
   -- Process de gestion des registres particuliers
332
   ---------------------------------------------
333
   proc_spec : PROCESS(clk_sys, rst_n)
334
   BEGIN
335
      IF (rst_n = '0') THEN
336
         mem_rxflush <= '1';
337
         rx_flushn   <= '0';  -- Pour faire un Reset au démarrage
338
      ELSIF (clk_sys'event AND clk_sys = '1') THEN
339
         IF (wr_en = '1' AND wr_addr = (ADD_BASE_BAR0 OR EXT(ad_controle, NBBIT_ADD_LOCAL)) AND
340
             wr_data_int(7) = '1') THEN
341
         -- Si on écrit un '1' dans le bit 7 du registre de controle
342
            mem_rxflush <= '1';  -- on mémorise la commande 
343
         ELSIF (dma_inprogress = '0') THEN
344
            mem_rxflush <= '0';  -- la commande reste active jusqu'à la fin d'un DMA
345
         END IF;
346
         -- le reset du module DMA ne survient que si un DMA n'est pas en cours.
347
         -- la condition sur mem_rxflush fait en sorte que le rx_flush ne dure qu'1 cycle
348
         rx_flushn    <= NOT(mem_rxflush) OR dma_inprogress;
349
      END IF;
350
   END PROCESS;
351
 
352
   --------------------------------------------------
353
   -- Process de gestion des compteurs de trame avec un mauvais format
354
   --------------------------------------------------
355
   proc_fmt : PROCESS(clk_sys, rst_n)
356
   BEGIN
357
      IF (rst_n = '0') THEN
358
         cpt_badfmt1 <= (OTHERS => '0');
359
         cpt_badfmt2 <= (OTHERS => '0');
360
      ELSIF (clk_sys'event AND clk_sys = '1') THEN
361
         IF (rd_en = '1' AND rd_addr = (ADD_BASE_BAR0 OR EXT(ad_statutrp, NBBIT_ADD_LOCAL))) THEN
362
         -- Les compteurs sont remis à 0 sur un RD du registre. Si l'évènement est actif à ce moment là
363
         -- on remet pas à 0 mais à 1 -> LSB = évènement
364
            cpt_badfmt1 <= "0000000" & rx1_badformat;
365
            cpt_badfmt2 <= "0000000" & rx2_badformat;
366
         ELSE
367
            IF (rx1_badformat = '1') THEN
368
               IF (cpt_badfmt1 /= x"FF") THEN
369
                  cpt_badfmt1 <= cpt_badfmt1 + 1;
370
               END IF;
371
            END IF;
372
            IF (rx2_badformat = '1') THEN
373
               IF (cpt_badfmt2 /= x"FF") THEN
374
                  cpt_badfmt2 <= cpt_badfmt2 + 1;
375
               END IF;
376
             END IF;
377
         END IF;
378
      END IF;
379
   END PROCESS;
380
 
381
   reg_statutrp   <= x"0000" & cpt_badfmt2 & cpt_badfmt1;
382
 
383
   ---------------------------------------------
384
   -- Process de gestion d'un free compteur de cycle indiquant le timestamp
385
   ---------------------------------------------
386
   front_topcyc <= NOT(top_cyc_r(2)) AND top_cyc_r(1);
387
   proc_tmstmp : PROCESS(clk_sys, rst_n)
388
   BEGIN
389
      IF (rst_n = '0') THEN
390
         reg_timestamp <= (OTHERS => '0');
391
         top_cyc_r <= "000";
392
      ELSIF (clk_sys'event AND clk_sys = '1') THEN
393
         top_cyc_r <= top_cyc_r(1 DOWNTO 0) & topcyc; -- Pour détecter un front montant de top_cyc qu est généré à 96MHz
394
         IF (front_topcyc = '1') THEN
395
            reg_timestamp <= reg_timestamp + 1;
396
         END IF;
397
      END IF;
398
   END PROCESS;
399
 
400
   ---------------------------------------------
401
   -- Multiplexage du bus de donnée local en lecture
402
   ---------------------------------------------
403
   -- Sélection entre registres ou mémoires internes selon MSB du bus local
404
   rd_data_int <= rd_reg;
405
 
406
   -- Multiplexage des registres en lecture
407
   proc_readreg : PROCESS(clk_sys, rst_n)
408
   BEGIN
409
      IF (rst_n = '0') THEN
410
         rd_reg     <= (OTHERS => '0');
411
      ELSIF (clk_sys'event AND clk_sys = '1') THEN
412
         CASE rd_addr(msb_addr DOWNTO 0) IS
413
            WHEN ad_iid1 =>
414
               rd_reg <= reg_iid(31 DOWNTO  0);
415
            WHEN ad_iid2 =>
416
               rd_reg <= reg_iid(63 DOWNTO 32);
417
            WHEN ad_controle =>
418
               rd_reg <= reg_ctl;
419
            WHEN ad_statut =>
420
               rd_reg <= reg_status;
421
            WHEN ad_statutrp =>
422
               rd_reg <= reg_statutrp;
423
            WHEN ad_rx1avai =>
424
               rd_reg <= reg_rx1avai;
425
            WHEN ad_rx2avai =>
426
               rd_reg <= reg_rx2avai;
427
            WHEN ad_txavai =>
428
               rd_reg <= reg_txavai;
429
            WHEN ad_dmabasepa =>
430
               rd_reg <= reg_dmabasepa;
431
            WHEN ad_timestamp =>
432
               rd_reg <= reg_timestamp;
433
            WHEN ad_testpoint =>
434
               rd_reg <= reg_testpoint;
435
            WHEN OTHERS =>
436
               rd_reg <= reg_status;
437
         END CASE;
438
      END IF;
439
   END PROCESS;
440
 
441
END rtl;
442
 

powered by: WebSVN 2.1.0

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