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

Subversion Repositories saturn

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 DavidRAMBA
--============================================================================= 
2
--  TITRE : IF_PICSPI
3
--  DESCRIPTION : 
4
--       Assure l'interface avec le PIC32 à travers un lien SPI
5
--       Implémente les registres mémoires tels que définis dans le HSI
6
 
7
--  FICHIER :        if_picspi.vhd 
8
--=============================================================================
9
--  CREATION 
10
--  DATE              AUTEUR    PROJET  REVISION 
11
--  10/04/2014  DRA        SATURN       V1.0 
12
--=============================================================================
13
--  HISTORIQUE  DES  MODIFICATIONS :
14
--  DATE                 AUTEUR PROJET  REVISION 
15
--  24/11/2014    DRA      SATURN   1.01
16
--  Modification de l'état des bits recopie au reset pour être conforme 
17
--  à l'exigence CON-PRO-0110
18
--=============================================================================
19
 
20
LIBRARY IEEE;
21
USE IEEE.STD_LOGIC_1164.ALL;
22
USE IEEE.STD_LOGIC_ARITH.ALL;
23
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
24
LIBRARY UNISIM;
25
USE UNISIM.VComponents.ALL;
26
 
27
ENTITY if_picspi IS
28
   GENERIC (
29
      version : STD_LOGIC_VECTOR(7 DOWNTO 0);
30
      pic_num : INTEGER := 1);
31
   PORT (
32
      -- Ports système
33
      clk_sys  : IN  STD_LOGIC;  -- Clock système
34
      rst_n    : IN  STD_LOGIC;  -- Reset général système
35
 
36
      -- Interface SPI
37
      sclk     : IN  STD_LOGIC;  -- Clock SPI
38
      sdi      : IN  STD_LOGIC;  -- Bit IN SPI
39
      sdo      : OUT STD_LOGIC;  -- Bit OUT SPI
40
      ssn      : IN  STD_LOGIC;  -- CSn SPI
41
 
42
      -- Interface avec les autres modules du FPGA
43
      -- Tous ces signaux sont synchrones de clk_sys ou bien considérés statiques (comme IID)
44
      -- Signaux de configurations
45
      iid      : IN  STD_LOGIC_VECTOR(63 DOWNTO 0);   -- Identifiant IID du FPGA
46
      tid      : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);    -- Identifiant TID du FPGA
47
      cpy1     : OUT STD_LOGIC;                       -- Autorise la recopie du port 1 sur port 2
48
      cpy2     : OUT STD_LOGIC;                       -- Autorise la recopie du port 2 sur port 1
49
      repli    : OUT STD_LOGIC;                       -- Indique que le module est en repli (gestion des LED)
50
 
51
      -- Interfaces de lecture des trames port 1
52
      l7_rx1       : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);-- Données reçues sur port 1
53
      l7_soc1      : IN  STD_LOGIC;                   -- Indique le début d'une trame
54
      l7_rd1       : OUT STD_LOGIC;                   -- Signal de lecture d'une donnée supplémentaire
55
      l7_comdispo1 : IN  STD_LOGIC;                   -- Indique qu'il y'a au moins une trame de dispo
56
      l7_newframe1 : IN  STD_LOGIC;                   -- Indique la réception d'une nouvelle trame
57
      l7_l2ok1     : IN  STD_LOGIC;                   -- Indique si la couche transport est bonne ou non
58
      l7_overflow1 : IN  STD_LOGIC;                   -- Indique un overflow sur réception
59
      activity1    : IN  STD_LOGIC;                   -- Indique une trame sur le port 1 (couche 2)
60
 
61
         -- Interfaces de lecture des trames port 2
62
      l7_rx2       : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);-- Données reçues sur port 2
63
      l7_soc2      : IN  STD_LOGIC;                   -- Indique le début d'une trame
64
      l7_rd2       : OUT STD_LOGIC;                   -- Signal de lecture d'une donnée supplémentaire
65
      l7_comdispo2 : IN  STD_LOGIC;                   -- Indique qu'il y'a au moins une trame de dispo
66
      l7_newframe2 : IN  STD_LOGIC;                   -- Indique la réception d'une nouvelle trame
67
      l7_l2ok2     : IN  STD_LOGIC;                   -- Indique si la couche transport est bonne ou non
68
      l7_overflow2 : IN  STD_LOGIC;                   -- Indique un overflow sur réception
69
      activity2    : IN  STD_LOGIC;                   -- Indique une trame sur le port 2 (couche 2)
70
 
71
      -- Interface d'écriture des trames
72
      tx_dat       : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-- Données à transmettre sur les 2 ports
73
      val_txdat    : OUT STD_LOGIC;                   -- Validant de chaque octet
74
      tx_sof       : OUT STD_LOGIC;                   -- Indique le début d'une trame
75
      tx_eof       : OUT STD_LOGIC;                   -- Indique la fin d'une trame
76
      txdat_free   : IN  STD_LOGIC;                   -- Indique que la couche transport en tx est libre
77
      clr_fifo_tx  : OUT STD_LOGIC;                   -- Permet de purger les FIFO Tx
78
 
79
      -- Gestion de l'interface SPI PROM
80
      txprom_dat   : OUT STD_LOGIC_VECTOR(7 downto 0);-- Donnée + commandes à écrire dans le module de reprog
81
      txprom_val   : OUT STD_LOGIC;                   -- Validant de txprom_data
82
      rxprom_dat   : IN  STD_LOGIC_VECTOR(7 downto 0);-- Donnée lue depuis le module de reprog
83
      rxprom_val   : IN  STD_LOGIC;                   -- Indique qu'il y a des données à lire dans le module de reprog
84
      rxprom_next  : OUT STD_LOGIC;                   -- Lit une donnée de plus sur txprom_dat
85
      prom_type_com: OUT STD_LOGIC;                   -- Type de commande à exécuter (RD ou WR)
86
      prom_exec_com: OUT STD_LOGIC;                   -- Lance une commande dans le module de reprog
87
      prom_busy    : IN  STD_LOGIC;                   -- Indique que le module de reprog est occupé
88
      prom_nbread  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-- Nombre d'octet qu'il faut lire avec une commande de lecture
89
      prom_rstn    : OUT STD_LOGIC                    -- Reset du module de reprog
90
      );
91
END if_picspi;
92
 
93
ARCHITECTURE rtl of if_picspi is
94
   TYPE fsmtx_state IS (idle_st, senddat_st);         -- Machine d'état d'émission sur le SPI
95
   SIGNAL fsm_tx  : fsmtx_state;
96
 
97
   TYPE fsmrx_state IS (idle_st, pump_st, recdat_st, waitnotempty_st);  -- Machine de réception sur SPI
98
   SIGNAL fsm_rx  : fsmrx_state;
99
 
100
   -- Définition du Mapping mémoire des registre SPI
101
   CONSTANT adreg_iid      : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(0, 7);
102
   CONSTANT adreg_tid      : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(8, 7);
103
   CONSTANT adreg_ctl      : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(9, 7);
104
   CONSTANT adreg_stat     : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(10, 7);
105
   CONSTANT adreg_rxsize1  : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(11, 7);
106
   CONSTANT adreg_rxsize2  : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(12, 7);
107
   CONSTANT adreg_txfree   : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(13, 7);
108
   CONSTANT adreg_fiforx1  : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(14, 7);
109
   CONSTANT adreg_fiforx2  : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(15, 7);
110
   CONSTANT adreg_fifotx   : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(16, 7);
111
   CONSTANT adreg_version  : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(17, 7);
112
   CONSTANT adreg_promtx   : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(18, 7);
113
   CONSTANT adreg_promrx   : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(19, 7);
114
   CONSTANT adreg_promctl  : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(20, 7);
115
   CONSTANT adreg_promnbrd : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(21, 7);
116
   CONSTANT adreg_trafic   : STD_LOGIC_VECTOR(6 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(22, 7);
117
 
118
   -- Définition des registres internes
119
   SIGNAL reg_tid_spi      : STD_LOGIC_VECTOR(7 DOWNTO 0);
120
   SIGNAL reg_ctl_spi      : STD_LOGIC_VECTOR(7 DOWNTO 0);
121
   SIGNAL reg_stat_spi     : STD_LOGIC_VECTOR(7 DOWNTO 0);
122
   SIGNAL reg_rx1size_spi  : STD_LOGIC_VECTOR(7 DOWNTO 0);
123
   SIGNAL reg_rx2size_spi  : STD_LOGIC_VECTOR(7 DOWNTO 0);
124
   SIGNAL reg_txfree_spi   : STD_LOGIC_VECTOR(7 DOWNTO 0);
125
   SIGNAL reg_fiforx1_spi  : STD_LOGIC_VECTOR(7 DOWNTO 0);
126
   SIGNAL reg_fiforx2_spi  : STD_LOGIC_VECTOR(7 DOWNTO 0);
127
   SIGNAL reg_promctl      : STD_LOGIC_VECTOR(7 DOWNTO 0);
128
   SIGNAL reg_promnbrd     : STD_LOGIC_VECTOR(7 DOWNTO 0);
129
   SIGNAL reg_trafic       : STD_LOGIC_VECTOR(7 DOWNTO 0);
130
 
131
 
132
   -- Signaux de gestion de l'interface SPI
133
   SIGNAL cpt_bitspi       : STD_LOGIC_VECTOR(2 DOWNTO 0); -- Compte le nombre de bits sur un cycle SPI
134
   SIGNAL cptbit_tx        : STD_LOGIC_VECTOR(2 DOWNTO 0); -- Compte le nombre de bits en Tx sur le SPI
135
   SIGNAL adrd_spi         : STD_LOGIC_VECTOR(6 DOWNTO 0); -- Bus d'adresse d'accès des registres SPI en rd
136
   SIGNAL adwr_spi         : STD_LOGIC_VECTOR(6 DOWNTO 0); -- Bus d'adresse d'accès des registres SPI en wr
137
   SIGNAL rwn_spi          : STD_LOGIC;                    -- Mémorise le type d'accès SPI R/Wn
138
   SIGNAL dat_adn          : STD_LOGIC;                    -- Indique si l'octet en cours sur SPI est une data ou l'adresse
139
   SIGNAL shifter_spirx    : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Registre à déclage de réception SPI
140
   SIGNAL shifter_spitx    : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Registre à déclage d'émission SPI
141
   SIGNAL spi_encours      : STD_LOGIC;                    -- Indique un cycle SPI en cours
142
   SIGNAL data_rdspi       : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Donnée lue à l'adresse adrd_spi
143
   SIGNAL wr_reg           : STD_LOGIC;                    -- 1 Pulse pour écrire le registre adwr_spi
144
   SIGNAL rd_reg           : STD_LOGIC;                    -- 1 pulse pour lire le registre adrd_spi
145
   SIGNAL latch_rdspi      : STD_LOGIC;                    -- 1 pulse pour latcher la donnée de adrd_spi (lecture non effective pour les FIFO)
146
   SIGNAL sclk_rise        : STD_LOGIC;                    -- Détection du front montant de sclk
147
   SIGNAL ssn_rise         : STD_LOGIC;                    -- Détection front montant de ssn avec clk_sys
148
   SIGNAL ssn_fall         : STD_LOGIC;                    -- Détection front descendant de ssn avec clk_sys
149
   SIGNAL ssnr             : STD_LOGIC_VECTOR(2 DOWNTO 0); -- DFF pour métastab et détection de front de ssn avec clk_sys
150
   SIGNAL sclkr            : STD_LOGIC_VECTOR(2 DOWNTO 0); -- DFF pour métastab et détection de front de sclk avec clk_sys
151
   SIGNAL front_ssn        : STD_LOGIC;                    -- Détection de front descendant sur ssn avec sclk
152
   SIGNAL sdi_delayed      : STD_LOGIC;                    -- sdi retardé pour intégrer les timing PIC (Tcko)
153
 
154
   -- Signaux de gestion interne et changement d'horloge
155
   SIGNAL difftx_free   : STD_LOGIC_VECTOR(10 DOWNTO 0);   -- Pour calculer la taille dispo en FIFO Tx sur 8 bits
156
   SIGNAL fifotx_datacnt: STD_LOGIC_VECTOR(10 DOWNTO 0);   -- Pour récuper le nb d'octets utilisé en FIFO Tx
157
   SIGNAL wr_datatx_spi : STD_LOGIC;                       -- Ordre d'écriture dans la FIFO Tx
158
   SIGNAL rd_datatx_sys : STD_LOGIC;                       -- Ordre de lecture dans la FIFO Tx
159
   SIGNAL datatx_rd_sys : STD_LOGIC_VECTOR(7 DOWNTO 0);    -- Donnée lue dans la FIFO Tx
160
   SIGNAL fifotx_empty  : STD_LOGIC;                       -- Indique une FFIO Tx vide
161
   SIGNAL rst_fifotx    : STD_LOGIC;                       -- Effacement FIFO Tx
162
   SIGNAL cpt_tx        : STD_LOGIC_VECTOR(7 DOWNTO 0);    -- Compteur d'octet pour relire la FIFO Tx
163
   SIGNAL start_tx      : STD_LOGIC;                       -- Déclenche l'émission d'une trame stockée en FIFO Tx
164
   SIGNAL clr_starttx   : STD_LOGIC;                       -- Indique que la trame en FIFO Tx a été émise
165
 
166
   SIGNAL fiforx_datacnt1: STD_LOGIC_VECTOR(10 DOWNTO 0);  -- Nombre d'octet stockés dans FIFO Rx1
167
   SIGNAL rd_datarx_spi1 : STD_LOGIC;                      -- Ordre de lecture dans la FIFO Rx1
168
   SIGNAL fiforx_empty1  : STD_LOGIC;                      -- FIFO Rx1 vide
169
 
170
   SIGNAL fiforx_datacnt2: STD_LOGIC_VECTOR(10 DOWNTO 0);  -- Nombre d'octet stockés dans FIFO Rx2
171
   SIGNAL rd_datarx_spi2 : STD_LOGIC;                      -- Ordre de lecture dans la FIFO Rx2
172
   SIGNAL fiforx_empty2  : STD_LOGIC;                      -- FIFO Rx2 vide
173
 
174
   SIGNAL l7_rd          : STD_LOGIC;                      -- Demande un octet de plus sur le bus l7_rx1 ou l7_rx2
175
   SIGNAL l7_rd1buf      : STD_LOGIC;                      -- Demande un octet de plus sur le bus l7_rx1
176
   SIGNAL l7_rd2buf      : STD_LOGIC;                      -- Demande un octet de plus sur le bus l7_rx2
177
   SIGNAL sel_voie       : STD_LOGIC;                      -- sélectionne la voie 1 ou 2 pour récupérer des donnée l7
178
   SIGNAL frm1           : STD_LOGIC;                      -- Indique que des données sont dispo en FIFO Rx1
179
   SIGNAL frm2           : STD_LOGIC;                      -- Indique que des données sont dispo en FIFO Rx2
180
   SIGNAL comdispo       : STD_LOGIC;                      -- Indique une trame l7 dispo sur la voie sélectionnée
181
   SIGNAL soc            : STD_LOGIC;                      -- Indqiue un début de trame pour la voie sélectionnée
182
 
183
   SIGNAL mem_activity1  : STD_LOGIC;                      -- Pour mémoriser une acitivté sur le port 1
184
   SIGNAL mem_activity2  : STD_LOGIC;                      -- Pour mémoriser une acitivté sur le port 2
185
 
186
   COMPONENT fifotx_spi
187
   PORT (
188
      rst      : IN STD_LOGIC;
189
      clk      : IN STD_LOGIC;
190
      din      : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
191
      wr_en    : IN STD_LOGIC;
192
      rd_en    : IN STD_LOGIC;
193
      dout     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
194
      full     : OUT STD_LOGIC;
195
      empty    : OUT STD_LOGIC;
196
      data_count : OUT STD_LOGIC_VECTOR(10 DOWNTO 0)
197
      );
198
   END COMPONENT;
199
 
200
   COMPONENT fiforx_spi
201
   PORT (
202
      rst      : IN STD_LOGIC;
203
      clk      : IN STD_LOGIC;
204
      din      : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
205
      wr_en    : IN STD_LOGIC;
206
      rd_en    : IN STD_LOGIC;
207
      dout     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
208
      full     : OUT STD_LOGIC;
209
      empty    : OUT STD_LOGIC;
210
      data_count : OUT STD_LOGIC_VECTOR(10 DOWNTO 0)
211
      );
212
   END COMPONENT;
213
 
214
BEGIN
215
   --------------------------------------------
216
   -- Module de Delay du SDI
217
   --------------------------------------------
218
   IODELAY2_inst : IODELAY2
219
   generic map (
220
      COUNTER_WRAPAROUND => "WRAPAROUND", -- "STAY_AT_LIMIT" or "WRAPAROUND" 
221
      DATA_RATE => "SDR",                 -- "SDR" or "DDR" 
222
      DELAY_SRC => "IDATAIN",             -- "IO", "ODATAIN" or "IDATAIN" 
223
      IDELAY2_VALUE => 0,                 -- Delay value when IDELAY_MODE="PCI" (0-255)
224
      IDELAY_MODE => "NORMAL",            -- "NORMAL" or "PCI" 
225
      IDELAY_TYPE => "FIXED",             -- "FIXED", "DEFAULT", "VARIABLE_FROM_ZERO", "VARIABLE_FROM_HALF_MAX" 
226
                                          -- or "DIFF_PHASE_DETECTOR" 
227
      IDELAY_VALUE => 71,                 -- Amount of taps for fixed input delay (0-255) : Calé à 2.8ns
228
      ODELAY_VALUE => 0,                  -- Amount of taps fixed output delay (0-255)
229
      SERDES_MODE => "NONE",              -- "NONE", "MASTER" or "SLAVE" 
230
      SIM_TAPDELAY_VALUE => 71            -- Per tap delay used for simulation in ps
231
   )
232
   port map (
233
      BUSY => OPEN,         -- 1-bit output: Busy output after CAL
234
      DATAOUT => sdi_delayed,-- 1-bit output: Delayed data output to ISERDES/input register
235
      DATAOUT2 => OPEN,     -- 1-bit output: Delayed data output to general FPGA fabric
236
      DOUT => OPEN,         -- 1-bit output: Delayed data output
237
      TOUT => OPEN,         -- 1-bit output: Delayed 3-state output
238
      CAL => '0',           -- 1-bit input: Initiate calibration input
239
      CE => '0',            -- 1-bit input: Enable INC input
240
      CLK => '0',           -- 1-bit input: Clock input
241
      IDATAIN => sdi,       -- 1-bit input: Data input (connect to top-level port or I/O buffer)
242
      INC => '0',           -- 1-bit input: Increment / decrement input
243
      IOCLK0 => '0',        -- 1-bit input: Input from the I/O clock network
244
      IOCLK1 => '0',        -- 1-bit input: Input from the I/O clock network
245
      ODATAIN => '0',       -- 1-bit input: Output data input from output register or OSERDES2.
246
      RST => '0',           -- 1-bit input: Reset to zero or 1/2 of total delay period
247
      T => '0'              -- 1-bit input: 3-state input signal
248
   );
249
 
250
   --------------------------------------------
251
   -- Process de desérialisation du SDI (sur sclk)
252
   --------------------------------------------
253
   select_frontmont : IF (pic_num = 1) GENERATE
254
   BEGIN
255
      serrx_spi : PROCESS(sclk)
256
      BEGIN
257
         IF (sclk'EVENT AND sclk = '1') THEN
258
            shifter_spirx <= shifter_spirx(6 DOWNTO 0) & sdi_delayed;  -- On déserialise tout le temps
259
         END IF;
260
      END PROCESS;
261
   END GENERATE;
262
 
263
   select_frontdec : IF (pic_num = 2) GENERATE
264
   BEGIN
265
      serrx_spi : PROCESS(sclk)
266
      BEGIN
267
         IF (sclk'EVENT AND sclk = '0') THEN
268
            shifter_spirx <= shifter_spirx(6 DOWNTO 0) & sdi_delayed;  -- On déserialise tout le temps
269
         END IF;
270
      END PROCESS;
271
   END GENERATE;
272
 
273
   --------------------------------------------
274
   -- Process de sérialisation du SDo (sur sclk)
275
   --------------------------------------------
276
   sertx_spi : PROCESS(sclk, ssn)
277
   BEGIN
278
      IF (ssn = '1') THEN
279
      -- Tant que le ssn n'est pas actif, on reste inactif
280
         shifter_spitx <= (OTHERS => '0');
281
         cptbit_tx <= "000";
282
         front_ssn <= '1';
283
      ELSIF (sclk'EVENT and sclk = '0') THEN
284
      -- Sur front descendant de sclk
285
         front_ssn <= '0';                      -- On mémorise le 1er coup d'horloge suite à ssn
286
         cptbit_tx <= cptbit_tx + 1;            -- a chaque sclk on compte 1 bit
287
         IF (cptbit_tx = "000")THEN
288
         -- Pour le 1er sclk de chaque octet
289
            IF (front_ssn = '1') THEN
290
            -- si c'est le 1er octet (front_ssn pas encore à '0')
291
               shifter_spitx <= reg_stat_spi;   -- On va émettre le registre de status
292
            ELSE
293
            -- si c'eux sont les octets suivants, on va émettre la donnée lue dans un registre
294
               shifter_spitx <= data_rdspi;
295
            END IF;
296
         ELSE
297
         -- Pour tous les autres bist, on fait un shift
298
            shifter_spitx <= shifter_spitx(6 DOWNTO 0) & '0';
299
         END IF;
300
      END IF;
301
   END PROCESS;
302
   sdo <= shifter_spitx(7);
303
 
304
   --------------------------------------------
305
   -- Process de gestion d'un cycle SPI
306
   -- Un cycle SPI permet de lire et d'écrire si besoin le même registre
307
   -- Un cycle SPI permet de traiter un nombre variable d'octet inconnu au départ
308
   -- Pour des raions de timing, la lecture d'un registre est anticipée
309
   -- mais rendue effective que si le PIC la veut vraiment (i.e. le cycle SPI n'est pas 
310
   -- interrompu avant)
311
   --------------------------------------------
312
   managespi : PROCESS(clk_sys, rst_n)
313
   BEGIN
314
      IF (rst_n = '0') THEN
315
         ssnr <= "111";
316
         sclkr <= "111";
317
         spi_encours <= '0';
318
         cpt_bitspi <= "000";
319
         dat_adn <= '0';
320
         rwn_spi <= '0';
321
         adrd_spi <= (OTHERS => '0');
322
         rd_reg <= '0';
323
         latch_rdspi <= '0';
324
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
325
         ssnr <= ssnr(1 DOWNTO 0) & ssn;        -- Pour détecter les fronts de ssn à clk_sys
326
         sclkr <= sclkr(1 DOWNTO 0) & sclk;     -- Pour détecter les fronts de sclk à clk_sys
327
         IF (ssn_fall = '1') THEN
328
         -- Initialisations sur activation de ssn
329
            spi_encours <= '1';                 -- On est en cours de traitement
330
            cpt_bitspi <= "000";                -- On comtpe les bits à partir de 0
331
            dat_adn <= '0';                     -- Le 1er octet traité sera l'adresse du registre accédé
332
         ELSIF (ssn_rise = '1') THEN
333
         -- A la fin du scycle spi
334
            spi_encours <= '0';
335
         ELSE
336
         -- On a détecté un front descendant de ssn ou bien on est hors cycle spi
337
            IF (spi_encours = '1') THEN
338
            -- Si on est dans un cycle spi
339
               IF (sclk_rise = '1') THEN
340
               -- Sur chaque front montant de sclk
341
                  cpt_bitspi <= cpt_bitspi + 1;       -- On comtpe un bit de plus
342
                  IF (cpt_bitspi = "110") THEN
343
                  -- Si on a déjà reçu 7 bits, le prochain front montant est pour le 8ème en réception
344
                     IF (dat_adn = '0') THEN
345
                     -- Si c'est le 1er octet de la trame SPI
346
                        adrd_spi  <= shifter_spirx(6 DOWNTO 0);  -- On mémorise l'adresse d'accès
347
                     ELSE
348
                     -- Si c'est une donnée
349
                        adwr_spi <= adrd_spi;    -- On mémorise l'adresse ou on vient de lire pour éventuellement pouvoir écrire
350
                        IF (adrd_spi /= adreg_fiforx1 AND
351
                            adrd_spi /= adreg_fiforx2 AND
352
                            adrd_spi /= adreg_fifotx  AND
353
                            adrd_spi /= adreg_promtx  AND
354
                            adrd_spi /= adreg_promrx) THEN
355
                        -- Si on accède à un registre qui n'est pas une FIFO, on incrémente le pointeur d'@
356
                           adrd_spi <= adrd_spi + 1;
357
                        END IF;
358
                     END IF;
359
                     latch_rdspi <= '1';     -- On va latcher la donéne disponible à l'adresse pointée par adrd_spi
360
                  ELSIF (cpt_bitspi = "111") THEN
361
                  -- Si on est au 8ème coup d'horloge
362
                     dat_adn <= '1';         -- On va traiter des donnée à l'octet suivant
363
                     IF (dat_adn = '0') THEN
364
                     -- Si c'est le 1er octet de la trame SPI
365
                        rwn_spi <= shifter_spirx(0);  -- On mémorise si c'est une écriture ou une elcture
366
                     END IF;
367
                  ELSIF (cpt_bitspi = "000") THEN
368
                  -- Si on commence un cycle, et qu'on traite des données et qu'on est en lecture
369
                     rd_reg <= dat_adn AND rwn_spi;   -- On lit effectivement la donnée dans la registre (utilse pour les FIFO)
370
                  END IF;
371
               ELSE
372
               -- En dehors des front de sclk, on assure que les signaux de lecture ne durent qu'un cycle
373
                  rd_reg <= '0';
374
                  latch_rdspi <= '0';
375
               END IF;
376
            ELSE
377
            -- En dehors d'un cycle SPI, on assure qu'on fait pas de lecture non voulue
378
               rd_reg <= '0';
379
               latch_rdspi <= '0';
380
            END IF;
381
         END IF;
382
      END IF;
383
   END PROCESS;
384
   -- On écrit une donnée dans un registre si:
385
   --   - on triate des données
386
   --   - on a reçu les 8 bits de données
387
   --   - on a détecté un front montant de sclk
388
   --   - on est en write
389
   wr_reg <= dat_adn AND NOT(rwn_spi) WHEN (sclk_rise = '1' AND cpt_bitspi = "111") ELSE '0';
390
   -- Décodage du front descendant de ssn
391
   ssn_fall <= ssnr(2) AND NOT(ssnr(1));
392
   -- Décodage du front montant de ssn
393
   ssn_rise <= NOT(ssnr(2)) AND ssnr(1);
394
   -- Décodage du front montant de sclk
395
   sclk_rise <= NOT(sclkr(2)) AND sclkr(1);
396
 
397
   --------------------------------------------
398
   -- Process de latch d'un registre en lecture
399
   --------------------------------------------
400
   mux_read: PROCESS(clk_sys, rst_n)
401
   BEGIN
402
      IF (rst_n = '0') THEN
403
         data_rdspi <= (OTHERS => '0');
404
      ELSIF (clk_sys'event AND clk_sys ='1') THEN
405
         IF (latch_rdspi = '1') THEN
406
         -- Le letch est piloté par le module de gestion SPI
407
            CASE adrd_spi IS
408
               WHEN adreg_iid    => data_rdspi <= iid(63 DOWNTO 56);
409
               WHEN adreg_iid+1  => data_rdspi <= iid(55 DOWNTO 48);
410
               WHEN adreg_iid+2  => data_rdspi <= iid(47 DOWNTO 40);
411
               WHEN adreg_iid+3  => data_rdspi <= iid(39 DOWNTO 32);
412
               WHEN adreg_iid+4  => data_rdspi <= iid(31 DOWNTO 24);
413
               WHEN adreg_iid+5  => data_rdspi <= iid(23 DOWNTO 16);
414
               WHEN adreg_iid+6  => data_rdspi <= iid(15 DOWNTO 8);
415
               WHEN adreg_iid+7  => data_rdspi <= iid(7 DOWNTO 0);
416
               WHEN adreg_tid    => data_rdspi <= reg_tid_spi;
417
               WHEN adreg_ctl    => data_rdspi <= reg_ctl_spi;
418
               WHEN adreg_stat   => data_rdspi <= reg_stat_spi;
419
               WHEN adreg_rxsize1=> data_rdspi <= reg_rx1size_spi;
420
               WHEN adreg_rxsize2=> data_rdspi <= reg_rx2size_spi;
421
               WHEN adreg_txfree => data_rdspi <= reg_txfree_spi;
422
               WHEN adreg_fiforx1=> data_rdspi <= reg_fiforx1_spi;
423
               WHEN adreg_fiforx2=> data_rdspi <= reg_fiforx2_spi;
424
               -- WHEN adreg_fifotx => data_rdspi <= dummy  -- Ce registre est Write Only
425
               WHEN adreg_version=> data_rdspi <= version;
426
               WHEN adreg_promctl=> data_rdspi <= rxprom_val & reg_promctl(6 DOWNTO 4) & prom_busy & reg_promctl(2 DOWNTO 0);
427
               WHEN adreg_promnbrd=>data_rdspi <= reg_promnbrd;
428
               -- WHEN adreg_promtx => data_rdspi <= dummy  -- Ce registre est Write Only
429
               WHEN adreg_promrx=> data_rdspi <= rxprom_dat;
430
               WHEN adreg_trafic=> data_rdspi <= reg_trafic;
431
               WHEN OTHERS       => data_rdspi <= reg_stat_spi;
432
            END CASE;
433
         END IF;
434
      END IF;
435
   END PROCESS;
436
 
437
   --------------------------------------------
438
   -- Process de gestion des écritures dans les registres
439
   --------------------------------------------
440
   write_reg : PROCESS(clk_sys, rst_n)
441
   BEGIN
442
      IF (rst_n = '0') THEN
443
         reg_tid_spi <= x"8F";
444
         reg_ctl_spi <= x"84";
445
         reg_promctl <= x"00";
446
         reg_promnbrd <= x"00";
447
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
448
         IF (wr_reg = '1') THEN
449
         -- L'écriture est pilotée par le module de gestion SPI
450
            CASE adwr_spi IS
451
               WHEN adreg_tid  => reg_tid_spi <= shifter_spirx;
452
               WHEN adreg_ctl  =>
453
               -- Le bit 3 du registre de controle est traqité à part
454
                  reg_ctl_spi(7 DOWNTO 5) <= shifter_spirx(7 DOWNTO 5);
455
                  reg_ctl_spi(2 DOWNTO 0) <= shifter_spirx(2 DOWNTO 0);
456
               WHEN adreg_promnbrd => reg_promnbrd <= shifter_spirx;
457
               WHEN OTHERS =>
458
            END CASE;
459
         END IF;
460
         IF (clr_starttx = '1') THEN
461
         -- Si on a fini de traiter une trame en Tx
462
            reg_ctl_spi(3) <= '0';     -- On l'indique dans le bit concerné
463
         ELSE
464
            IF (wr_reg = '1') AND (adwr_spi = adreg_ctl) AND (shifter_spirx(3) = '1') THEN
465
            -- Le PIC de peut écrire que un '1' dans le bit 3 du registre de controle
466
               reg_ctl_spi(3) <= '1';
467
            END IF;
468
         END IF;
469
         IF (wr_reg = '1' AND adwr_spi = adreg_promctl) THEN
470
            reg_promctl <= shifter_spirx;
471
         ELSE
472
         -- Le bit 3 ne doit durer qu'un seul coup de clk_sys
473
            reg_promctl(3) <= '0';
474
         END IF;
475
      END IF;
476
   END PROCESS;
477
   -- Affectation des sorties en fonction des registres internes
478
   cpy1 <= reg_ctl_spi(0);
479
   cpy2 <= reg_ctl_spi(1);
480
   rst_fifotx <= reg_ctl_spi(2);
481
   start_tx <= reg_ctl_spi(3);
482
   repli<= reg_ctl_spi(7);
483
   tid  <= reg_tid_spi;
484
 
485
   --------------------------------------------
486
   -- Process de gestion du registre de status
487
   -- Les bits de status mémorisent un évènement
488
   -- Ils ne sont remis à '0' que par ériture d'un '1'
489
   --------------------------------------------
490
   gest_stat : PROCESS(clk_sys, rst_n)
491
   BEGIN
492
      IF (rst_n = '0') THEN
493
         reg_stat_spi(7 DOWNTO 2) <= (OTHERS => '0');
494
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
495
         IF (l7_newframe1 = '1' AND l7_l2ok1 = '0') THEN
496
         -- Détection d'une trame erronnée sur Rx1
497
            reg_stat_spi(2) <= '1';
498
         ELSIF (wr_reg = '1' AND adwr_spi = adreg_stat) THEN
499
            reg_stat_spi(2) <= reg_stat_spi(2) AND NOT(shifter_spirx(2));
500
         END IF;
501
         IF (l7_newframe2 = '1' AND l7_l2ok2 = '0') THEN
502
         -- Détection d'une trame erronnée sur Rx2
503
            reg_stat_spi(3) <= '1';
504
         ELSIF (wr_reg = '1' AND adwr_spi = adreg_stat) THEN
505
            reg_stat_spi(3) <= reg_stat_spi(3) AND NOT(shifter_spirx(3));
506
         END IF;
507
         IF (l7_overflow1 = '1') THEN
508
         -- Détection d'un overflow sur Rx1
509
            reg_stat_spi(4) <= '1';
510
         ELSIF (wr_reg = '1' AND adwr_spi = adreg_stat) THEN
511
            reg_stat_spi(4) <= reg_stat_spi(4) AND NOT(shifter_spirx(4));
512
         END IF;
513
         IF (l7_overflow2 = '1') THEN
514
         -- Détection d'un overflow sur Rx1
515
            reg_stat_spi(5) <= '1';
516
         ELSIF (wr_reg = '1' AND adwr_spi = adreg_stat) THEN
517
            reg_stat_spi(5) <= reg_stat_spi(5) AND NOT(shifter_spirx(5));
518
         END IF;
519
         reg_stat_spi(6) <= NOT(fifotx_empty);  -- Indique que la FIFO Tx n'est pas vide
520
      END IF;
521
   END PROCESS;
522
   reg_stat_spi(1 DOWNTO 0) <= frm2 & frm1;  -- Indication que les FIFO Rx sont pas vides
523
 
524
   --------------------------------------------
525
   -- Process de gestion du registre TRAFIC
526
   --------------------------------------------
527
   gest_trafic : PROCESS(clk_sys, rst_n)
528
   BEGIN
529
      IF (rst_n = '0') THEN
530
         reg_trafic <= x"03";
531
         mem_activity1 <= '1';
532
         mem_activity2 <= '1';
533
      ELSIF (clk_sys'EVENT AND clk_sys = '1') THEN
534
         IF (wr_reg = '1' AND adwr_spi = adreg_ctl AND shifter_spirx(4) = '1') THEN
535
         -- Si on a une indication de début de cycle
536
            reg_trafic <= "000000" & mem_activity2 & mem_activity1;  -- On met à jour le registre traffic
537
            mem_activity1 <= activity1;                     -- On réinit la mémorisation de trafic
538
            mem_activity2 <= activity2;
539
         ELSE
540
         -- Entre 2 début de cycle
541
            IF (activity1 = '1') THEN
542
            -- Si activité sur le port 1, on le mémorise
543
               mem_activity1 <= '1';
544
            END IF;
545
            IF (activity2 = '1') THEN
546
               mem_activity2 <= '1';
547
            END IF;
548
         END IF;
549
      END IF;
550
   END PROCESS;
551
 
552
   --------------------------------------------
553
   -- Process de gestion de la FIFO Tx
554
   --------------------------------------------
555
   difftx_free <= "10000000010" - fifotx_datacnt; -- Calcul du nombre d'octets dispo dans la FIFO 1026-cnt
556
   reg_txfree_spi <= x"FF" WHEN difftx_free(10 DOWNTO 8) /= "000" ELSE  -- Si txfree >=256 on tronque le résultat à 255
557
                     difftx_free(7 DOWNTO 0);              -- Sinon on donne le résultat
558
 
559
   -- Condition d'écriture d'un octet dans la FIFO TX
560
   wr_datatx_spi <= '1' WHEN (wr_reg = '1' AND adwr_spi = adreg_fifotx) ELSE '0';
561
 
562
   clr_fifo_tx <= '0';              -- Spare pour l'instant on ne fait pas de clear de la fifo tx aval
563
 
564
   -- On lit un octet dans la FIFO TX au début lorsuq'on détecte qu'elle n'est plus vide et que le PIC demande de transmettre (start_tx)
565
   -- ou bien en cours de transfert lorsque le module suivant est dispo
566
   rd_datatx_sys <= '1' WHEN ((fsm_tx = idle_st AND fifotx_empty = '0' AND start_tx = '1') OR
567
                              (fsm_tx = senddat_st AND txdat_free = '1' AND fifotx_empty = '0')) ELSE
568
                    '0';
569
 
570
   -- Le valdiant est toujours actif en état d'attente pour démarrer de suite
571
   -- En téta de transmission, il est conditionné au niveau de remplissage
572
   val_txdat <= NOT(fifotx_empty) WHEN (fsm_tx = idle_st) ELSE '1';
573
   -- Donnée lue dans la FIFO à transmettre
574
   tx_dat <= datatx_rd_sys;
575
   -- La fin de trame est valide si le module suivant est dispo
576
   tx_eof <= txdat_free WHEN (fsm_tx = senddat_st AND cpt_tx = "00000001") ELSE '0';
577
 
578
   gest_fsm_tx : PROCESS(clk_sys, rst_n)
579
   BEGIN
580
      IF (rst_n = '0') THEN
581
         fsm_tx <= idle_st;
582
         tx_sof    <= '0';
583
         cpt_tx    <= (OTHERS => '0');
584
         clr_starttx <= '0';
585
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
586
         CASE fsm_tx IS
587
            WHEN idle_st  =>
588
            -- Etat d'attente de données dans la FIFO TX
589
               IF (fifotx_empty = '0' AND start_tx = '1') THEN
590
               -- Si il y'a des données dans la FIFO TX et que le PIC ordonne le Tx
591
                  cpt_tx <= datatx_rd_sys;   -- On initialise le compteur avec la longueur de la trame (1er octet dans la FIFO)
592
                  fsm_tx <= senddat_st;      -- On va transmettre des données
593
                  tx_sof <= '1';             -- On active le sof pour signaler un début de trame
594
                  clr_starttx <= '1';        -- On indique qu'on a pris en compte l'ordre de Tx
595
               END IF;
596
 
597
            WHEN senddat_st =>
598
            -- Etat de transfert d'une donnée
599
               clr_starttx <= '0';           -- Ne dure qu'un seul cycle
600
               IF (txdat_free = '1') THEN
601
               -- Les données restent sur le bus tx_dat tant que le module suivant n'est pas libre
602
               -- i.e. tant qu'il a pas latché la donnée actuelle
603
                  cpt_tx <= cpt_tx - 1;         -- Dans ce cas on enregistre une donnee de moins
604
                  tx_sof <= '0';                -- On peut annuler le sof car on est sur que le module suivant l'a pris en comtpe
605
                  IF (cpt_tx = "00000001") THEN -- Lors du dernier octet à transmettre
606
                     fsm_tx <= idle_st;         -- On a fini
607
                  END IF;
608
               END IF;
609
 
610
            WHEN OTHERS =>
611
               fsm_tx <= idle_st;
612
         END CASE;
613
      END IF;
614
   END PROCESS;
615
 
616
   inst_fiftx : fifotx_spi
617
   PORT MAP (
618
      rst      => rst_fifotx,
619
      clk      => clk_sys,
620
      din      => shifter_spirx,
621
      wr_en    => wr_datatx_spi,
622
      rd_en    => rd_datatx_sys,
623
      dout     => datatx_rd_sys,
624
      full     => OPEN,
625
      empty    => fifotx_empty,
626
      data_count => fifotx_datacnt
627
   );
628
 
629
   --------------------------------------------
630
   -- Process de gestion des FIFO Rx
631
   --------------------------------------------
632
   -- Ordre de lecture dans les FIFO Rx
633
   rd_datarx_spi1 <= '1' WHEN (rd_reg = '1' AND adrd_spi = adreg_fiforx1) ELSE '0';
634
   rd_datarx_spi2 <= '1' WHEN (rd_reg = '1' AND adrd_spi = adreg_fiforx2) ELSE '0';
635
 
636
   -- On transfère des données dans la FIFO Rx trame par trame. On s'arrête
637
   l7_rd1buf <= (l7_rd AND NOT(sel_voie) AND comdispo AND NOT(soc)) WHEN (fsm_rx = recdat_st) ELSE
638
                (l7_rd AND NOT(sel_voie));
639
   l7_rd1 <= l7_rd1buf;
640
   l7_rd2buf <= (l7_rd AND sel_voie AND comdispo AND NOT(soc)) WHEN (fsm_rx = recdat_st) ELSE
641
                (l7_rd AND sel_voie);
642
   l7_rd2 <= l7_rd2buf;
643
 
644
   comdispo <= l7_comdispo1 WHEN (sel_voie = '0') ELSE l7_comdispo2;
645
   soc <= l7_soc1 WHEN (sel_voie = '0') ELSE l7_soc2;
646
 
647
   gest_fsm_rx : PROCESS(clk_sys, rst_n)
648
   BEGIN
649
      IF (rst_n = '0') THEN
650
         l7_rd <= '0';
651
         sel_voie <= '0';
652
         fsm_rx <= idle_st;
653
         frm2 <= '0';
654
         frm1 <= '0';
655
      ELSIF (clk_sys'EVENT and clk_sys = '1') THEN
656
         CASE fsm_rx IS
657
            WHEN idle_st  =>
658
            -- Etat d'attente qu'une FIFO Rx1 ou Rx2 soit vide et qu'il y'ait une trame disponible
659
            -- sur la voie correspondante
660
               frm1 <= NOT(fiforx_empty1);      -- On indique s'il y'a des trames en FIFO Rx
661
               frm2 <= NOT(fiforx_empty2);
662
               IF ((l7_comdispo1 = '1' AND fiforx_empty1 = '1') AND
663
                   (l7_comdispo2 = '0' OR  fiforx_empty2 = '0' OR sel_voie = '1')) THEN
664
               -- On ne recopie que si la FIFO de destination est vide pour garantir qu'on ne stocke qu'une trame à la fois
665
               -- On fait un coup la FIFO Rx1 un coup la Rx2 pour équilibrer les niveaux
666
                  sel_voie <= '0';        -- On sélectionne la voie Rx1
667
                  l7_rd <= '1';           -- On commence à lire dans la DPRAM
668
                  fsm_rx <= pump_st;
669
               ELSIF (l7_comdispo2 = '1' AND fiforx_empty2 = '1') THEN
670
                  sel_voie <= '1';
671
                  l7_rd <= '1';
672
                  fsm_rx <= pump_st;
673
               ELSE
674
                  l7_rd <= '0';
675
               END IF;
676
 
677
            WHEN pump_st =>
678
            -- Etat d'amorçgae du flux entre l'ordre de lecture et la mise à disposition de la donnée
679
               fsm_rx <= recdat_st;
680
 
681
            WHEN recdat_st =>
682
            -- Etat de lecture de chaque octet de la trame
683
               IF (soc = '1' OR comdispo = '0') THEN
684
               -- On s'arrête sur le début de la trame suivante ou bien sur une DPRAM vide
685
                  l7_rd <= '0';
686
                  fsm_rx <= waitnotempty_st;
687
               END IF;
688
 
689
            WHEN waitnotempty_st =>
690
            -- Etat d'attente que la FIFO de la voie sélectionnée soit indiquée comme non vide
691
            -- Etat important pour garantir qu'on est pas réentrant dans la machine
692
            -- en cas de plusieurs petites trames dispo en DPRAM et donc garantir qu'on a
693
            -- une seule trame en FIFO Rx
694
               IF ((fiforx_empty1 = '0' AND sel_voie = '0') OR
695
                  (fiforx_empty2 = '0' AND sel_voie = '1')) THEN
696
                  fsm_rx <= idle_st;
697
               END IF;
698
 
699
            WHEN OTHERS =>
700
               fsm_rx <= idle_st;
701
         END CASE;
702
      END IF;
703
   END PROCESS;
704
 
705
   inst_fifrx1 : fiforx_spi
706
   PORT MAP (
707
      rst      => NOT(rst_n),
708
      clk      => clk_sys,
709
      din      => l7_rx1,
710
      wr_en    => l7_rd1buf,
711
      rd_en    => rd_datarx_spi1,
712
      dout     => reg_fiforx1_spi,
713
      full     => OPEN,
714
      empty    => fiforx_empty1,
715
      data_count => fiforx_datacnt1
716
   );
717
   -- Taille de la trame dans la FIFO : 255 si >= 256, sinon Nb octets dans la FIFO
718
   reg_rx1size_spi <= x"FF" WHEN fiforx_datacnt1(10 DOWNTO 8) /= "000" ELSE
719
                      fiforx_datacnt1(7 DOWNTO 0);
720
 
721
   inst_fifrx2 : fiforx_spi
722
   PORT MAP (
723
      rst      => NOT(rst_n),
724
      clk      => clk_sys,
725
      din      => l7_rx2,
726
      wr_en    => l7_rd2buf,
727
      rd_en    => rd_datarx_spi2,
728
      dout     => reg_fiforx2_spi,
729
      full     => OPEN,
730
      empty    => fiforx_empty2,
731
      data_count => fiforx_datacnt2
732
   );
733
   -- Taille de la trame dans la FIFO : 255 si >= 256, sinon Nb octets dans la FIFO
734
   reg_rx2size_spi <= x"FF" WHEN fiforx_datacnt2(10 DOWNTO 8) /= "000" ELSE
735
                      fiforx_datacnt2(7 DOWNTO 0);
736
 
737
   -------------------------------------------------
738
   -- Signaux de gestion de l'I/F SPI vers la PROM
739
   -------------------------------------------------
740
   txprom_dat     <= shifter_spirx;    -- Le registre est géré par le module PROM (affectation combinatoire)
741
   -- Le validant correspondant à un ordre d'écriture valide
742
   txprom_val     <= wr_reg WHEN (adwr_spi =  adreg_promtx) ELSE '0';
743
   -- On récupère une donnée de plsu dans la FIFO PROM avec une elcture valide
744
   rxprom_next    <= rd_reg WHEN (adrd_spi =  adreg_promrx) ELSE '0';
745
   -- Affectation des signaux de controle
746
   prom_type_com  <= reg_promctl(0);
747
   prom_exec_com  <= reg_promctl(3);
748
   prom_rstn      <= reg_promctl(4);
749
   prom_nbread    <= reg_promnbrd;
750
 
751
END rtl;
752
 

powered by: WebSVN 2.1.0

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