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

Subversion Repositories xmatchpro

[/] [xmatchpro/] [trunk/] [xmw4-comdec/] [xmatch_sim7/] [ipcore_dir/] [fifo_32x512/] [simulation/] [fifo_32x512_pctrl.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 eejlny
 
2
--------------------------------------------------------------------------------
3
--
4
-- FIFO Generator Core Demo Testbench 
5
--
6
--------------------------------------------------------------------------------
7
--
8
-- (c) Copyright 2009 - 2010 Xilinx, Inc. All rights reserved.
9
-- 
10
-- This file contains confidential and proprietary information
11
-- of Xilinx, Inc. and is protected under U.S. and
12
-- international copyright and other intellectual property
13
-- laws.
14
-- 
15
-- DISCLAIMER
16
-- This disclaimer is not a license and does not grant any
17
-- rights to the materials distributed herewith. Except as
18
-- otherwise provided in a valid license issued to you by
19
-- Xilinx, and to the maximum extent permitted by applicable
20
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
21
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
22
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
23
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
24
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
25
-- (2) Xilinx shall not be liable (whether in contract or tort,
26
-- including negligence, or under any other theory of
27
-- liability) for any loss or damage of any kind or nature
28
-- related to, arising under or in connection with these
29
-- materials, including for any direct, or any indirect,
30
-- special, incidental, or consequential loss or damage
31
-- (including loss of data, profits, goodwill, or any type of
32
-- loss or damage suffered as a result of any action brought
33
-- by a third party) even if such damage or loss was
34
-- reasonably foreseeable or Xilinx had been advised of the
35
-- possibility of the same.
36
-- 
37
-- CRITICAL APPLICATIONS
38
-- Xilinx products are not designed or intended to be fail-
39
-- safe, or for use in any application requiring fail-safe
40
-- performance, such as life-support or safety devices or
41
-- systems, Class III medical devices, nuclear facilities,
42
-- applications related to the deployment of airbags, or any
43
-- other applications that could lead to death, personal
44
-- injury, or severe property or environmental damage
45
-- (individually and collectively, "Critical
46
-- Applications"). Customer assumes the sole risk and
47
-- liability of any use of Xilinx products in Critical
48
-- Applications, subject only to applicable laws and
49
-- regulations governing limitations on product liability.
50
-- 
51
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
52
-- PART OF THIS FILE AT ALL TIMES.
53
--------------------------------------------------------------------------------
54
--
55
-- Filename: fifo_32x512_pctrl.vhd
56
--
57
-- Description:
58
--   Used for protocol control on write and read interface stimulus and status generation
59
--
60
--------------------------------------------------------------------------------
61
-- Library Declarations
62
--------------------------------------------------------------------------------
63
LIBRARY ieee;
64
USE ieee.std_logic_1164.ALL;
65
USE ieee.std_logic_unsigned.all;
66
USE IEEE.std_logic_arith.all;
67
USE IEEE.std_logic_misc.all;
68
 
69
LIBRARY work;
70
USE work.fifo_32x512_pkg.ALL;
71
 
72
ENTITY fifo_32x512_pctrl IS
73
  GENERIC(
74
   AXI_CHANNEL         : STRING  :="NONE";
75
   C_APPLICATION_TYPE  : INTEGER := 0;
76
   C_DIN_WIDTH         : INTEGER := 0;
77
   C_DOUT_WIDTH        : INTEGER := 0;
78
   C_WR_PNTR_WIDTH     : INTEGER := 0;
79
   C_RD_PNTR_WIDTH     : INTEGER := 0;
80
   C_CH_TYPE           : INTEGER := 0;
81
   FREEZEON_ERROR      : INTEGER := 0;
82
   TB_STOP_CNT         : INTEGER := 2;
83
   TB_SEED             : INTEGER := 2
84
  );
85
  PORT(
86
       RESET_WR        : IN STD_LOGIC;
87
       RESET_RD        : IN STD_LOGIC;
88
       WR_CLK          : IN STD_LOGIC;
89
       RD_CLK          : IN STD_LOGIC;
90
       FULL            : IN STD_LOGIC;
91
       EMPTY           : IN STD_LOGIC;
92
       ALMOST_FULL     : IN STD_LOGIC;
93
       ALMOST_EMPTY    : IN STD_LOGIC;
94
       DATA_IN         : IN STD_LOGIC_VECTOR(C_DIN_WIDTH-1 DOWNTO 0);
95
       DATA_OUT        : IN STD_LOGIC_VECTOR(C_DOUT_WIDTH-1 DOWNTO 0);
96
       DOUT_CHK        : IN STD_LOGIC;
97
       PRC_WR_EN       : OUT STD_LOGIC;
98
       PRC_RD_EN       : OUT STD_LOGIC;
99
       RESET_EN        : OUT STD_LOGIC;
100
       SIM_DONE        : OUT STD_LOGIC;
101
       STATUS          : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
102
      );
103
END ENTITY;
104
 
105
 
106
ARCHITECTURE fg_pc_arch OF fifo_32x512_pctrl IS
107
 
108
 CONSTANT C_DATA_WIDTH   : INTEGER := if_then_else(C_DIN_WIDTH > C_DOUT_WIDTH,C_DIN_WIDTH,C_DOUT_WIDTH);
109
 CONSTANT LOOP_COUNT     : INTEGER := divroundup(C_DATA_WIDTH,8);
110
 CONSTANT D_WIDTH_DIFF   :   INTEGER := log2roundup(C_DOUT_WIDTH/C_DIN_WIDTH);
111
 
112
 SIGNAL data_chk_i       : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
113
 SIGNAL full_chk_i       : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
114
 SIGNAL empty_chk_i      : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
115
 SIGNAL status_i         : STD_LOGIC_VECTOR(4 DOWNTO 0):= (OTHERS => '0');
116
 SIGNAL status_d1_i      : STD_LOGIC_VECTOR(4 DOWNTO 0):= (OTHERS => '0');
117
 SIGNAL wr_en_gen        : STD_LOGIC_VECTOR(7 DOWNTO 0):= (OTHERS => '0');
118
 SIGNAL rd_en_gen        : STD_LOGIC_VECTOR(7 DOWNTO 0):= (OTHERS => '0');
119
 SIGNAL wr_cntr          : STD_LOGIC_VECTOR(C_WR_PNTR_WIDTH-2 DOWNTO 0)   := (OTHERS => '0');
120
 SIGNAL full_as_timeout  : STD_LOGIC_VECTOR(C_WR_PNTR_WIDTH DOWNTO 0)   := (OTHERS => '0');
121
 SIGNAL full_ds_timeout  : STD_LOGIC_VECTOR(C_WR_PNTR_WIDTH DOWNTO 0) := (OTHERS => '0');
122
 SIGNAL rd_cntr          : STD_LOGIC_VECTOR(C_RD_PNTR_WIDTH-2 DOWNTO 0)   := (OTHERS => '0');
123
 SIGNAL empty_as_timeout : STD_LOGIC_VECTOR(C_RD_PNTR_WIDTH DOWNTO 0)  := (OTHERS => '0');
124
 SIGNAL empty_ds_timeout : STD_LOGIC_VECTOR(C_RD_PNTR_WIDTH DOWNTO 0):= (OTHERS => '0');
125
 SIGNAL wr_en_i          : STD_LOGIC := '0';
126
 SIGNAL rd_en_i          : STD_LOGIC := '0';
127
 SIGNAL state            : STD_LOGIC := '0';
128
 SIGNAL wr_control       : STD_LOGIC := '0';
129
 SIGNAL rd_control       : STD_LOGIC := '0';
130
 SIGNAL stop_on_err      : STD_LOGIC := '0';
131
 SIGNAL sim_stop_cntr    : STD_LOGIC_VECTOR(7 DOWNTO 0):= conv_std_logic_vector(if_then_else(C_CH_TYPE=2,64,TB_STOP_CNT),8);
132
 SIGNAL sim_done_i       : STD_LOGIC := '0';
133
 SIGNAL reset_ex1        : STD_LOGIC := '0';
134
 SIGNAL reset_ex2        : STD_LOGIC := '0';
135
 SIGNAL reset_ex3        : STD_LOGIC := '0';
136
 SIGNAL af_chk_i         : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
137
 SIGNAL rdw_gt_wrw       : STD_LOGIC_VECTOR(D_WIDTH_DIFF-1 DOWNTO 0) := (OTHERS => '1');
138
 SIGNAL wrw_gt_rdw       : STD_LOGIC_VECTOR(D_WIDTH_DIFF-1 DOWNTO 0) := (OTHERS => '1');
139
 SIGNAL rd_activ_cont    : STD_LOGIC_VECTOR(25 downto 0):= (OTHERS => '0');
140
 SIGNAL prc_we_i         : STD_LOGIC := '0';
141
 SIGNAL prc_re_i         : STD_LOGIC := '0';
142
 SIGNAL reset_en_i       : STD_LOGIC := '0';
143
 SIGNAL sim_done_d1      : STD_LOGIC := '0';
144
 SIGNAL sim_done_wr1     : STD_LOGIC := '0';
145
 SIGNAL sim_done_wr2     : STD_LOGIC := '0';
146
 SIGNAL empty_d1         : STD_LOGIC := '0';
147
 SIGNAL empty_wr_dom1    : STD_LOGIC := '0';
148
 SIGNAL state_d1         : STD_LOGIC := '0';
149
 SIGNAL state_rd_dom1    : STD_LOGIC := '0';
150
 SIGNAL rd_en_d1         : STD_LOGIC := '0';
151
 SIGNAL rd_en_wr1        : STD_LOGIC := '0';
152
 SIGNAL wr_en_d1         : STD_LOGIC := '0';
153
 SIGNAL wr_en_rd1        : STD_LOGIC := '0';
154
 SIGNAL full_chk_d1      : STD_LOGIC := '0';
155
 SIGNAL full_chk_rd1     : STD_LOGIC := '0';
156
 SIGNAL empty_wr_dom2    : STD_LOGIC := '0';
157
 
158
 SIGNAL state_rd_dom2    : STD_LOGIC := '0';
159
 SIGNAL state_rd_dom3    : STD_LOGIC := '0';
160
 SIGNAL rd_en_wr2        : STD_LOGIC := '0';
161
 SIGNAL wr_en_rd2        : STD_LOGIC := '0';
162
 SIGNAL full_chk_rd2     : STD_LOGIC := '0';
163
 SIGNAL reset_en_d1      : STD_LOGIC := '0';
164
 SIGNAL reset_en_rd1     : STD_LOGIC := '0';
165
 SIGNAL reset_en_rd2     : STD_LOGIC := '0';
166
 
167
 SIGNAL data_chk_wr_d1   : STD_LOGIC := '0';
168
 SIGNAL data_chk_rd1     : STD_LOGIC := '0';
169
 SIGNAL data_chk_rd2     : STD_LOGIC := '0';
170
 SIGNAL af_chk_d1        : STD_LOGIC := '0';
171
 SIGNAL af_chk_rd1       : STD_LOGIC := '0';
172
 SIGNAL af_chk_rd2       : STD_LOGIC := '0';
173
 SIGNAL post_rst_dly_wr  : STD_LOGIC_VECTOR(4 DOWNTO 0) := (OTHERS => '1');
174
 SIGNAL post_rst_dly_rd  : STD_LOGIC_VECTOR(4 DOWNTO 0) := (OTHERS => '1');
175
BEGIN
176
 status_i  <= data_chk_i & full_chk_rd2 & empty_chk_i & af_chk_rd2 & '0';
177
 STATUS    <= status_d1_i & '0' & '0' & rd_activ_cont(rd_activ_cont'high);
178
 
179
 prc_we_i <= wr_en_i  WHEN sim_done_wr2 = '0' ELSE '0';
180
 prc_re_i <= rd_en_i  WHEN sim_done_i   = '0' ELSE '0';
181
 
182
 SIM_DONE   <= sim_done_i;
183
 rdw_gt_wrw <= (OTHERS => '1');
184
 wrw_gt_rdw <= (OTHERS => '1');
185
 
186
 PROCESS(RD_CLK)
187
 BEGIN
188
   IF (RD_CLK'event AND RD_CLK='1') THEN
189
     IF(prc_re_i = '1') THEN
190
       rd_activ_cont <= rd_activ_cont + "1";
191
     END IF;
192
   END IF;
193
 END PROCESS;
194
 
195
 
196
 PROCESS(sim_done_i)
197
 BEGIN
198
    assert sim_done_i = '0'
199
    report "Simulation Complete for:" & AXI_CHANNEL
200
    severity note;
201
 END PROCESS;
202
 
203
-----------------------------------------------------
204
-- SIM_DONE SIGNAL GENERATION
205
-----------------------------------------------------
206
PROCESS (RD_CLK,RESET_RD)
207
BEGIN
208
    IF(RESET_RD = '1') THEN
209
      --sim_done_i <= '0';
210
    ELSIF(RD_CLK'event AND RD_CLK='1') THEN
211
      IF((OR_REDUCE(sim_stop_cntr) = '0' AND TB_STOP_CNT /= 0) OR stop_on_err = '1') THEN
212
        sim_done_i <= '1';
213
      END IF;
214
    END IF;
215
END PROCESS;
216
 
217
 -- TB Timeout/Stop
218
 fifo_tb_stop_run:IF(TB_STOP_CNT /= 0) GENERATE
219
   PROCESS (RD_CLK)
220
   BEGIN
221
       IF (RD_CLK'event AND RD_CLK='1') THEN
222
         IF(state_rd_dom2 = '0' AND state_rd_dom3 = '1') THEN
223
           sim_stop_cntr <= sim_stop_cntr - "1";
224
         END IF;
225
       END IF;
226
   END PROCESS;
227
 END GENERATE fifo_tb_stop_run;
228
 
229
 
230
  -- Stop when error found
231
  PROCESS (RD_CLK)
232
  BEGIN
233
    IF (RD_CLK'event AND RD_CLK='1') THEN
234
      IF(sim_done_i = '0') THEN
235
        status_d1_i <= status_i OR status_d1_i;
236
      END IF;
237
      IF(FREEZEON_ERROR = 1 AND status_i /= "0") THEN
238
        stop_on_err <= '1';
239
      END IF;
240
    END IF;
241
  END PROCESS;
242
  -----------------------------------------------------
243
 
244
  -----------------------------------------------------
245
  -- CHECKS FOR FIFO
246
  -----------------------------------------------------
247
 
248
  -- Reset pulse extension require for FULL flags checks
249
  -- FULL flag may stay high for 3 clocks after reset is removed.
250
  PROCESS(WR_CLK,RESET_WR)
251
  BEGIN
252
    IF(RESET_WR = '1') THEN
253
      reset_ex1 <= '1';
254
      reset_ex2 <= '1';
255
      reset_ex3 <= '1';
256
    ELSIF (WR_CLK'event AND WR_CLK='1') THEN
257
      reset_ex1 <= '0';
258
      reset_ex2 <= reset_ex1;
259
      reset_ex3 <= reset_ex2;
260
    END IF;
261
  END PROCESS;
262
 
263
  PROCESS(RD_CLK,RESET_RD)
264
  BEGIN
265
    IF(RESET_RD = '1') THEN
266
      post_rst_dly_rd <= (OTHERS => '1');
267
    ELSIF (RD_CLK'event AND RD_CLK='1') THEN
268
      post_rst_dly_rd <= post_rst_dly_rd-post_rst_dly_rd(4);
269
    END IF;
270
  END PROCESS;
271
 
272
  PROCESS(WR_CLK,RESET_WR)
273
  BEGIN
274
    IF(RESET_WR = '1') THEN
275
      post_rst_dly_wr <= (OTHERS => '1');
276
    ELSIF (WR_CLK'event AND WR_CLK='1') THEN
277
      post_rst_dly_wr <= post_rst_dly_wr-post_rst_dly_wr(4);
278
    END IF;
279
  END PROCESS;
280
 
281
 
282
  -- FULL de-assert Counter
283
  PROCESS(WR_CLK,RESET_WR)
284
  BEGIN
285
    IF(RESET_WR = '1') THEN
286
      full_ds_timeout <= (OTHERS => '0');
287
    ELSIF(WR_CLK'event AND WR_CLK='1') THEN
288
      IF(state = '1') THEN
289
        IF(rd_en_wr2 = '1' AND wr_en_i = '0' AND FULL = '1' AND AND_REDUCE(wrw_gt_rdw) = '1') THEN
290
          full_ds_timeout <= full_ds_timeout + '1';
291
        END IF;
292
      ELSE
293
        full_ds_timeout <= (OTHERS => '0');
294
      END IF;
295
    END IF;
296
  END PROCESS;
297
 
298
 
299
 -- EMPTY deassert counter
300
  PROCESS(RD_CLK,RESET_RD)
301
  BEGIN
302
    IF(RESET_RD = '1') THEN
303
      empty_ds_timeout <= (OTHERS => '0');
304
    ELSIF(RD_CLK'event AND RD_CLK='1') THEN
305
      IF(state = '0') THEN
306
        IF(wr_en_rd2 = '1' AND rd_en_i = '0' AND EMPTY = '1' AND AND_REDUCE(rdw_gt_wrw) = '1') THEN
307
          empty_ds_timeout <= empty_ds_timeout + '1';
308
        END IF;
309
      ELSE
310
        empty_ds_timeout <= (OTHERS => '0');
311
      END IF;
312
    END IF;
313
  END PROCESS;
314
 
315
  -- Full check signal generation
316
  PROCESS(WR_CLK,RESET_WR)
317
  BEGIN
318
    IF(RESET_WR = '1') THEN
319
      full_chk_i <= '0';
320
    ELSIF(WR_CLK'event AND WR_CLK='1') THEN
321
      IF(C_APPLICATION_TYPE = 1 AND (AXI_CHANNEL = "WACH" OR AXI_CHANNEL = "RACH" OR AXI_CHANNEL = "AXI4_Stream")) THEN
322
        full_chk_i <= '0';
323
      ELSE
324
        full_chk_i <= AND_REDUCE(full_as_timeout) OR
325
                      AND_REDUCE(full_ds_timeout);
326
      END IF;
327
    END IF;
328
  END PROCESS;
329
 
330
  -- Empty checks
331
  PROCESS(RD_CLK,RESET_RD)
332
  BEGIN
333
    IF(RESET_RD = '1') THEN
334
      empty_chk_i <= '0';
335
    ELSIF(RD_CLK'event AND RD_CLK='1') THEN
336
      IF(C_APPLICATION_TYPE = 1 AND (AXI_CHANNEL = "WACH" OR AXI_CHANNEL = "RACH" OR AXI_CHANNEL = "AXI4_Stream")) THEN
337
        empty_chk_i <= '0';
338
      ELSE
339
        empty_chk_i <= AND_REDUCE(empty_as_timeout) OR
340
                       AND_REDUCE(empty_ds_timeout);
341
      END IF;
342
    END IF;
343
  END PROCESS;
344
 
345
  fifo_d_chk:IF(C_CH_TYPE /= 2) GENERATE
346
    PRC_WR_EN  <= prc_we_i  AFTER 100 ns;
347
    PRC_RD_EN  <= prc_re_i  AFTER 50 ns;
348
    data_chk_i <= dout_chk;
349
  END GENERATE fifo_d_chk;
350
 
351
  -- Almost full flag checks
352
   PROCESS(WR_CLK,reset_ex3)
353
   BEGIN
354
     IF(reset_ex3 = '1') THEN
355
         af_chk_i <= '0';
356
     ELSIF (WR_CLK'event AND WR_CLK='1') THEN
357
       IF((FULL = '1' AND ALMOST_FULL = '0') OR (empty_wr_dom2 = '1' AND ALMOST_FULL = '1' AND C_WR_PNTR_WIDTH > 4)) THEN
358
         af_chk_i <= '1';
359
       ELSE
360
         af_chk_i <= '0';
361
       END IF;
362
     END IF;
363
   END PROCESS;
364
  -----------------------------------------------------
365
 
366
 
367
 -----------------------------------------------------
368
 -- SYNCHRONIZERS B/W WRITE AND READ DOMAINS
369
 -----------------------------------------------------
370
   PROCESS(WR_CLK,RESET_WR)
371
   BEGIN
372
     IF(RESET_WR = '1') THEN
373
       empty_wr_dom1  <= '1';
374
       empty_wr_dom2  <= '1';
375
       state_d1       <= '0';
376
       wr_en_d1       <= '0';
377
       rd_en_wr1      <= '0';
378
       rd_en_wr2      <= '0';
379
       full_chk_d1    <= '0';
380
       af_chk_d1      <= '0';
381
       reset_en_d1    <= '0';
382
       sim_done_wr1   <= '0';
383
       sim_done_wr2   <= '0';
384
     ELSIF (WR_CLK'event AND WR_CLK='1') THEN
385
       sim_done_wr1   <= sim_done_d1;
386
       sim_done_wr2   <= sim_done_wr1;
387
       reset_en_d1    <= reset_en_i;
388
       state_d1       <= state;
389
       empty_wr_dom1  <= empty_d1;
390
       empty_wr_dom2  <= empty_wr_dom1;
391
       wr_en_d1       <= wr_en_i;
392
       rd_en_wr1      <= rd_en_d1;
393
       rd_en_wr2      <= rd_en_wr1;
394
       full_chk_d1    <= full_chk_i;
395
       af_chk_d1      <= af_chk_i;
396
     END IF;
397
   END PROCESS;
398
 
399
   PROCESS(RD_CLK,RESET_RD)
400
   BEGIN
401
     IF(RESET_RD = '1') THEN
402
         empty_d1       <= '1';
403
         state_rd_dom1  <= '0';
404
         state_rd_dom2  <= '0';
405
         state_rd_dom3  <= '0';
406
         wr_en_rd1      <= '0';
407
         wr_en_rd2      <= '0';
408
         rd_en_d1       <= '0';
409
         full_chk_rd1   <= '0';
410
         full_chk_rd2   <= '0';
411
         af_chk_rd1     <= '0';
412
         af_chk_rd2     <= '0';
413
         reset_en_rd1   <= '0';
414
         reset_en_rd2   <= '0';
415
         sim_done_d1    <= '0';
416
     ELSIF (RD_CLK'event AND RD_CLK='1') THEN
417
         sim_done_d1    <= sim_done_i;
418
         reset_en_rd1   <= reset_en_d1;
419
         reset_en_rd2   <= reset_en_rd1;
420
         empty_d1       <= EMPTY;
421
         rd_en_d1       <= rd_en_i;
422
         state_rd_dom1  <= state_d1;
423
         state_rd_dom2  <= state_rd_dom1;
424
         state_rd_dom3  <= state_rd_dom2;
425
         wr_en_rd1      <= wr_en_d1;
426
         wr_en_rd2      <= wr_en_rd1;
427
         full_chk_rd1   <= full_chk_d1;
428
         full_chk_rd2   <= full_chk_rd1;
429
         af_chk_rd1     <= af_chk_d1;
430
         af_chk_rd2     <= af_chk_rd1;
431
     END IF;
432
   END PROCESS;
433
 
434
   RESET_EN   <= reset_en_rd2;
435
 
436
 
437
   data_fifo_en:IF(C_CH_TYPE /= 2) GENERATE
438
    -----------------------------------------------------
439
    -- WR_EN GENERATION
440
    -----------------------------------------------------
441
    gen_rand_wr_en:fifo_32x512_rng
442
    GENERIC MAP(
443
                 WIDTH => 8,
444
                 SEED  => TB_SEED+1
445
               )
446
    PORT MAP(
447
              CLK        => WR_CLK,
448
              RESET      => RESET_WR,
449
              RANDOM_NUM => wr_en_gen,
450
              ENABLE     => '1'
451
            );
452
 
453
    PROCESS(WR_CLK,RESET_WR)
454
    BEGIN
455
      IF(RESET_WR = '1') THEN
456
        wr_en_i   <=  '0';
457
      ELSIF(WR_CLK'event AND WR_CLK='1') THEN
458
        IF(state = '1') THEN
459
          wr_en_i <= wr_en_gen(0) AND wr_en_gen(7) AND wr_en_gen(2) AND wr_control;
460
        ELSE
461
          wr_en_i <= (wr_en_gen(3) OR wr_en_gen(4) OR wr_en_gen(2)) AND (NOT post_rst_dly_wr(4));
462
        END IF;
463
      END IF;
464
    END PROCESS;
465
 
466
    -----------------------------------------------------
467
    -- WR_EN CONTROL
468
    -----------------------------------------------------
469
    PROCESS(WR_CLK,RESET_WR)
470
    BEGIN
471
      IF(RESET_WR = '1') THEN
472
        wr_cntr         <= (OTHERS => '0');
473
        wr_control      <= '1';
474
        full_as_timeout <= (OTHERS => '0');
475
      ELSIF(WR_CLK'event AND WR_CLK='1') THEN
476
        IF(state = '1') THEN
477
          IF(wr_en_i = '1') THEN
478
            wr_cntr <= wr_cntr + "1";
479
          END IF;
480
          full_as_timeout <= (OTHERS => '0');
481
        ELSE
482
          wr_cntr <= (OTHERS => '0');
483
          IF(rd_en_wr2 = '0') THEN
484
            IF(wr_en_i = '1') THEN
485
              full_as_timeout <= full_as_timeout + "1";
486
            END IF;
487
          ELSE
488
            full_as_timeout <= (OTHERS => '0');
489
          END IF;
490
        END IF;
491
 
492
        wr_control <= NOT wr_cntr(wr_cntr'high);
493
 
494
      END IF;
495
    END PROCESS;
496
 
497
    -----------------------------------------------------
498
    -- RD_EN GENERATION
499
    -----------------------------------------------------
500
    gen_rand_rd_en:fifo_32x512_rng
501
    GENERIC MAP(
502
                 WIDTH => 8,
503
                 SEED  => TB_SEED
504
               )
505
    PORT MAP(
506
              CLK        => RD_CLK,
507
              RESET      => RESET_RD,
508
              RANDOM_NUM => rd_en_gen,
509
              ENABLE     => '1'
510
            );
511
 
512
    PROCESS(RD_CLK,RESET_RD)
513
    BEGIN
514
      IF(RESET_RD = '1') THEN
515
        rd_en_i    <= '0';
516
      ELSIF(RD_CLK'event AND RD_CLK='1') THEN
517
        IF(state_rd_dom2 = '0') THEN
518
            rd_en_i <= rd_en_gen(1) AND rd_en_gen(5) AND rd_en_gen(3) AND rd_control AND (NOT post_rst_dly_rd(4));
519
        ELSE
520
          rd_en_i <= rd_en_gen(0) OR rd_en_gen(6);
521
        END IF;
522
      END IF;
523
    END PROCESS;
524
 
525
    -----------------------------------------------------
526
    -- RD_EN CONTROL
527
    -----------------------------------------------------
528
    PROCESS(RD_CLK,RESET_RD)
529
    BEGIN
530
      IF(RESET_RD = '1') THEN
531
        rd_cntr    <= (OTHERS => '0');
532
        rd_control <= '1';
533
        empty_as_timeout <= (OTHERS => '0');
534
      ELSIF(RD_CLK'event AND RD_CLK='1') THEN
535
        IF(state_rd_dom2 = '0') THEN
536
          IF(rd_en_i = '1') THEN
537
            rd_cntr <= rd_cntr + "1";
538
          END IF;
539
          empty_as_timeout <= (OTHERS => '0');
540
        ELSE
541
          rd_cntr <= (OTHERS => '0');
542
          IF(wr_en_rd2 = '0') THEN
543
            IF(rd_en_i = '1') THEN
544
              empty_as_timeout <= empty_as_timeout + "1";
545
            END IF;
546
          ELSE
547
            empty_as_timeout <= (OTHERS => '0');
548
          END IF;
549
        END IF;
550
 
551
        rd_control <= NOT rd_cntr(rd_cntr'high);
552
 
553
      END IF;
554
    END PROCESS;
555
 
556
    -----------------------------------------------------
557
    -- STIMULUS CONTROL
558
    -----------------------------------------------------
559
    PROCESS(WR_CLK,RESET_WR)
560
    BEGIN
561
      IF(RESET_WR = '1') THEN
562
        state      <= '0';
563
        reset_en_i <= '0';
564
      ELSIF(WR_CLK'event AND WR_CLK='1') THEN
565
        CASE state IS
566
          WHEN '0' =>
567
            IF(FULL = '1' AND empty_wr_dom2 = '0') THEN
568
              state      <= '1';
569
              reset_en_i <= '0';
570
            END IF;
571
          WHEN '1' =>
572
            IF(empty_wr_dom2 = '1' AND FULL = '0') THEN
573
              state      <= '0';
574
              reset_en_i <= '1';
575
            END IF;
576
          WHEN OTHERS => state <= state;
577
        END CASE;
578
      END IF;
579
    END PROCESS;
580
  END GENERATE data_fifo_en;
581
 
582
END ARCHITECTURE;

powered by: WebSVN 2.1.0

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