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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.communication/] [hibi/] [3.0/] [vhd/] [double_fifo_mux_rd.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- File        : double_fifo_mux_rd.vhd
3
-- Description : Includes two fifos and a special multiplexer
4
--               so that the reader sees only one fifo. Multiplexer
5
--               selects addr+data first from fifo 0 (i.e. it has a higher priority)
6
-- Author      : Erno Salminen
7
-- Project      
8
-- Design      : 
9
-- Date        : 07.02.2003
10
-- Modified    : 
11
--
12
--15.12.04      ES names changed
13
--18.12.2006 AK modified to support different kinds of IF fifos
14
-------------------------------------------------------------------------------
15
-- Funbase IP library Copyright (C) 2011 TUT Department of Computer Systems
16
--
17
-- This file is part of HIBI
18
--
19
-- This source file may be used and distributed without
20
-- restriction provided that this copyright statement is not
21
-- removed from the file and that any derivative work contains
22
-- the original copyright notice and the associated disclaimer.
23
--
24
-- This source file is free software; you can redistribute it
25
-- and/or modify it under the terms of the GNU Lesser General
26
-- Public License as published by the Free Software Foundation;
27
-- either version 2.1 of the License, or (at your option) any
28
-- later version.
29
--
30
-- This source is distributed in the hope that it will be
31
-- useful, but WITHOUT ANY WARRANTY; without even the implied
32
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
33
-- PURPOSE.  See the GNU Lesser General Public License for more
34
-- details.
35
--
36
-- You should have received a copy of the GNU Lesser General
37
-- Public License along with this source; if not, download it
38
-- from http://www.opencores.org/lgpl.shtml
39
-------------------------------------------------------------------------------
40
library ieee;
41
use ieee.std_logic_1164.all;
42
use ieee.std_logic_arith.all;
43
use ieee.std_logic_unsigned.all;
44
 
45
 
46
 
47
entity double_fifo_mux_rd is
48
 
49
  generic (
50
    -- 0 synch multiclk, 1 basic GALS,
51
    -- 2 Gray FIFO (depth=2^n!), 3 mixed clock pausible
52
    fifo_sel_g : integer;
53
 
54
    -- needed for fifos 0 (accurate) and 3 (to know which is faster, wr or rd)
55
    re_freq_g       : integer;
56
    we_freq_g       : integer;
57
    depth_0_g       : integer;          -- #words, log2 for fifo 2!
58
    depth_1_g       : integer;          -- -"-
59
    data_width_g    : integer;          -- in bits
60
    debug_width_g   : integer;          -- for debugging
61
    comm_width_g    : integer;
62
    separate_addr_g : integer
63
    );
64
  port (
65
    clk_re     : in std_logic;
66
    clk_we     : in std_logic;
67
    -- pulsed clocks. used in pausible clock scheme
68
    -- used in 1 for faster synchronization, when they are integer multiples
69
    -- of re and we (can also be 1 if the same as clk_re and clk_we
70
    clk_re_pls : in std_logic;
71
    clk_we_pls : in std_logic;
72
    rst_n      : in std_logic;
73
 
74
    av_0_in     : in  std_logic;
75
    data_0_in   : in  std_logic_vector (data_width_g-1 downto 0);
76
    comm_0_in   : in  std_logic_vector (comm_width_g-1 downto 0);
77
    we_0_in     : in  std_logic;
78
    full_0_out  : out std_logic;
79
    one_p_0_out : out std_logic;
80
 
81
    av_1_in     : in  std_logic;
82
    data_1_in   : in  std_logic_vector (data_width_g-1 downto 0);
83
    comm_1_in   : in  std_logic_vector (comm_width_g-1 downto 0);
84
    we_1_in     : in  std_logic;
85
    full_1_out  : out std_logic;
86
    one_p_1_out : out std_logic;
87
 
88
    re_in     : in  std_logic;
89
    av_out    : out std_logic;
90
    data_out  : out std_logic_vector (data_width_g-1 downto 0);
91
    comm_out  : out std_logic_vector (comm_width_g-1 downto 0);
92
    empty_out : out std_logic;
93
    one_d_out : out std_logic;
94
    debug_out : out std_logic_vector(debug_width_g downto 0)
95
    );
96
end double_fifo_mux_rd;
97
 
98
 
99
 
100
architecture structural of double_fifo_mux_rd is
101
 
102
  -- Mixed-clk fifo must know which faster, reader or writer
103
  constant re_faster_c : integer := re_freq_g/we_freq_g;
104
 
105
 
106
  --
107
  --
108
  --
109
  -- one_p currently statically at '0' ...
110
  component mixed_clk_fifo
111
    generic (
112
      re_faster_g  : integer := 1;      -- integer multiple of clk_we
113
--      we_freq_g    : integer := 0;      -- or vice versa
114
      data_width_g : integer := 0;
115
      depth_g      : integer := 0
116
      );
117
    port (
118
      clk_re    : in std_logic;
119
      clk_we    : in std_logic;
120
      clk_ps_re : in std_logic;         -- phase shifted pulse      
121
      clk_ps_we : in std_logic;         -- phase shifted pulse         
122
      rst_n     : in std_logic;
123
 
124
      data_in   : in  std_logic_vector (data_width_g-1 downto 0);
125
      we_in     : in  std_logic;
126
      full_out  : out std_logic;
127
      one_p_out : out std_logic;
128
 
129
      re_in     : in  std_logic;
130
      data_out  : out std_logic_vector (data_width_g-1 downto 0);
131
      one_d_out : out std_logic;
132
      empty_out : out std_logic
133
      );
134
  end component;  --multiclk_fifo;
135
 
136
  --
137
  --
138
  --
139
  component multiclk_fifo
140
    generic (
141
      re_freq_g    : integer;
142
      we_freq_g    : integer;
143
      depth_g      : integer;
144
      data_width_g : integer);
145
    port (
146
      clk_re    : in  std_logic;
147
      clk_we    : in  std_logic;
148
      rst_n     : in  std_logic;
149
      data_in   : in  std_logic_vector (data_width_g-1 downto 0);
150
      we_in     : in  std_logic;
151
      full_out  : out std_logic;
152
      one_p_out : out std_logic;
153
      re_in     : in  std_logic;
154
      data_out  : out std_logic_vector (data_width_g-1 downto 0);
155
      empty_out : out std_logic;
156
      one_d_out : out std_logic);
157
  end component;
158
  -- basic gals, for fifo 1
159
  component aif_we_top
160
    generic (
161
      data_width_g : integer);
162
    port (
163
      tx_clk      : in  std_logic;
164
      tx_rst_n    : in  std_logic;
165
      tx_we_in    : in  std_logic;
166
      tx_data_in  : in  std_logic_vector(data_width_g-1 downto 0);
167
      tx_full_out : out std_logic;
168
      rx_clk      : in  std_logic;
169
      rx_rst_n    : in  std_logic;
170
      rx_full_in  : in  std_logic;
171
      rx_we_out   : out std_logic;
172
      rx_data_out : out std_logic_vector(data_width_g-1 downto 0));
173
  end component;
174
 
175
  --
176
  --
177
  --
178
  component cdc_fifo
179
    generic (
180
      READ_AHEAD_g  : integer;
181
      SYNC_CLOCKS_g : integer;
182
      depth_log2_g  : integer;
183
      dataw_g       : integer);
184
    port (
185
      rst_n        : in  std_logic;
186
      rd_clk       : in  std_logic;
187
      rd_en_in     : in  std_logic;
188
      rd_empty_out : out std_logic;
189
      rd_one_d_out : out std_logic;
190
      rd_data_out  : out std_logic_vector(dataw_g-1 downto 0);
191
      wr_clk       : in  std_logic;
192
      wr_en_in     : in  std_logic;
193
      wr_full_out  : out std_logic;
194
      wr_one_p_out : out std_logic;
195
      wr_data_in   : in  std_logic_vector(dataw_g-1 downto 0));
196
  end component;
197
 
198
  component fifo_mux_rd
199
    generic (
200
      data_width_g    : integer;
201
      comm_width_g    : integer;
202
      separate_addr_g : integer
203
      );
204
    port (
205
      clk   : in std_logic;
206
      rst_n : in std_logic;
207
 
208
      av_0_in    : in  std_logic;
209
      data_0_in  : in  std_logic_vector (data_width_g-1 downto 0);
210
      comm_0_in  : in  std_logic_vector (comm_width_g-1 downto 0);
211
      empty_0_in : in  std_logic;
212
      one_d_0_in : in  std_logic;
213
      re_0_out   : out std_logic;
214
 
215
      av_1_in    : in  std_logic;
216
      data_1_in  : in  std_logic_vector (data_width_g-1 downto 0);
217
      comm_1_in  : in  std_logic_vector (comm_width_g-1 downto 0);
218
      empty_1_in : in  std_logic;
219
      one_d_1_in : in  std_logic;
220
      re_1_out   : out std_logic;
221
 
222
      re_in     : in  std_logic;
223
      av_out    : out std_logic;
224
      data_out  : out std_logic_vector (data_width_g-1 downto 0);
225
      comm_out  : out std_logic_vector (comm_width_g-1 downto 0);
226
      empty_out : out std_logic;
227
      one_d_out : out std_logic
228
      );
229
  end component;  --fifo_mux_rd;
230
 
231
 
232
 
233
 
234
  -- from inputs to fifos (addr_valid + comm + data concatenated together)
235
  signal a_c_d_input_f0 : std_logic_vector (1 + comm_width_g + data_width_g-1 downto 0);
236
  signal a_c_d_input_f1 : std_logic_vector (1 + comm_width_g + data_width_g-1 downto 0);
237
 
238
  -- from fifo 0 to mux
239
  signal a_c_d_f0_mux : std_logic_vector (1 + comm_width_g + data_width_g-1 downto 0);
240
  signal av_f0_mux    : std_logic;
241
  signal data_f0_mux  : std_logic_vector (data_width_g-1 downto 0);
242
  signal comm_f0_mux  : std_logic_vector (comm_width_g-1 downto 0);
243
  signal empty_f0_mux : std_logic;
244
  signal one_d_f0_mux : std_logic;
245
 
246
  -- from fifo 1 to mux
247
  signal a_c_d_f1_mux : std_logic_vector (1 + comm_width_g + data_width_g-1 downto 0);
248
  signal av_f1_mux    : std_logic;
249
  signal data_f1_mux  : std_logic_vector (data_width_g-1 downto 0);
250
  signal comm_f1_mux  : std_logic_vector (comm_width_g-1 downto 0);
251
  signal empty_f1_mux : std_logic;
252
  signal one_d_f1_mux : std_logic;
253
 
254
 
255
  -- Control signals from mux to fifos
256
  signal re_mux_f0 : std_logic;
257
  signal re_mux_f1 : std_logic;
258
 
259
 
260
  signal Tie_High : std_logic;
261
  signal Tie_Low  : std_logic;
262
 
263
 
264
  -- For asynch. interface (aif) used with fifo_sel=1
265
  signal tx_we_to_we_aif     : std_logic;
266
  signal tx_data_to_we_aif   : std_logic_vector(data_width_g+comm_width_g+1-1 downto 0);
267
  signal tx_full_from_we_aif : std_logic;
268
 
269
  signal rx_full_to_we_aif   : std_logic;
270
  signal rx_we_from_we_aif   : std_logic;
271
  signal rx_data_from_we_aif : std_logic_vector(data_width_g+comm_width_g+1-1 downto 0);
272
 
273
  signal tx_msg_we_to_we_aif     : std_logic;
274
  signal tx_msg_data_to_we_aif   : std_logic_vector(data_width_g+comm_width_g+1-1 downto 0);
275
  signal tx_msg_full_from_we_aif : std_logic;
276
 
277
  signal rx_msg_full_to_we_aif   : std_logic;
278
  signal rx_msg_we_from_we_aif   : std_logic;
279
  signal rx_msg_data_from_we_aif : std_logic_vector(data_width_g+comm_width_g+1-1 downto 0);
280
 
281
 
282
 
283
  -- Helper function (needed at least for Gray fifo)
284
  function log2 (
285
    constant value : integer)
286
    return integer is
287
    variable temp    : integer := 1;
288
    variable counter : integer := 0;
289
  begin  -- log2
290
    while temp < value loop
291
      temp    := temp*2;
292
      counter := counter+1;
293
    end loop;
294
 
295
    return counter;
296
  end log2;
297
 
298
 
299
begin  -- structural
300
  -- Check generics
301
  assert (depth_0_g + depth_1_g > 0) report "Both fifo depths zero!" severity warning;
302
 
303
  -- Concurrent assignments
304
  Tie_High       <= '1';
305
  Tie_Low        <= '0';
306
 
307
 
308
  -- Combine fifo inputs
309
  a_c_d_input_f0 <= av_0_in & comm_0_in & data_0_in;
310
  a_c_d_input_f1 <= av_1_in & comm_1_in & data_1_in;
311
 
312
  -- Split fifo output
313
  av_f0_mux   <= a_c_d_f0_mux (1+comm_width_g + data_width_g-1);
314
  comm_f0_mux <= a_c_d_f0_mux (comm_width_g + data_width_g-1 downto data_width_g);
315
  data_f0_mux <= a_c_d_f0_mux (data_width_g-1 downto 0);
316
  av_f1_mux   <= a_c_d_f1_mux (1+comm_width_g + data_width_g-1);
317
  comm_f1_mux <= a_c_d_f1_mux (comm_width_g + data_width_g-1 downto data_width_g);
318
  data_f1_mux <= a_c_d_f1_mux (data_width_g-1 downto 0);
319
 
320
  --
321
  -- Lots of if-generates depending on which fifo type is selected
322
  -- and if both fifos are really needed
323
  -- 
324
 
325
 
326
  multi : if fifo_sel_g = 0 generate
327
    -- regular / multiclock synchronous
328
 
329
    Map_Fifo_0 : if depth_0_g > 0 generate
330
      multiclk_fifo_0 : multiclk_fifo
331
        generic map(
332
          re_freq_g    => re_freq_g,
333
          we_freq_g    => we_freq_g,
334
          data_width_g => 1 + comm_width_g + data_width_g,
335
          depth_g      => depth_0_g
336
          )
337
        port map(
338
          clk_re => clk_re,
339
          clk_we => clk_we,
340
          rst_n  => rst_n,
341
 
342
          data_in   => a_c_d_input_f0,
343
          we_in     => we_0_in,
344
          full_out  => full_0_out,
345
          one_p_out => one_p_0_out,
346
 
347
          re_in     => re_mux_f0,
348
          data_out  => a_c_d_f0_mux,
349
          one_d_out => one_d_f0_mux,
350
          empty_out => empty_f0_mux
351
          );
352
    end generate Map_Fifo_0;
353
 
354
 
355
    Map_Fifo_1 : if depth_1_g > 0 generate
356
      multiclk_fifo_1 : multiclk_fifo
357
        generic map(
358
          re_freq_g    => re_freq_g,
359
          we_freq_g    => we_freq_g,
360
          data_width_g => 1 + comm_width_g + data_width_g,
361
          depth_g      => depth_1_g
362
          )
363
        port map(
364
          clk_re => clk_re,
365
          clk_we => clk_we,
366
          rst_n  => rst_n,
367
 
368
          data_in   => a_c_d_input_f1,
369
          we_in     => we_1_in,
370
          full_out  => full_1_out,
371
          one_p_out => one_p_1_out,
372
 
373
          re_in     => re_mux_f1,
374
          data_out  => a_c_d_f1_mux,
375
          one_d_out => one_d_f1_mux,
376
          empty_out => empty_f1_mux
377
          );
378
    end generate Map_Fifo_1;
379
 
380
  end generate multi;
381
 
382
 
383
 
384
 
385
  gals : if fifo_sel_g = 1 generate
386
 
387
    -- GALS basic + multiclk
388
 
389
    -- signal assigments needed for asynchronous modes
390
 
391
    -- agent writes.
392
 
393
    Map_Fifo_0 : if depth_0_g > 0 generate
394
 
395
      aif_we_top_0 : aif_we_top
396
        generic map (
397
          data_width_g => data_width_g+comm_width_g+1)
398
        port map (
399
          tx_clk      => clk_we,
400
          tx_rst_n    => rst_n,
401
          tx_we_in    => we_0_in,
402
          tx_data_in  => a_c_d_input_f0,
403
          tx_full_out => full_0_out,
404
 
405
          rx_clk      => clk_re_pls,
406
          rx_rst_n    => rst_n,
407
          rx_full_in  => rx_full_to_we_aif,
408
          rx_we_out   => rx_we_from_we_aif,
409
          rx_data_out => rx_data_from_we_aif
410
          );
411
 
412
      multiclk_fifo_0 : multiclk_fifo
413
        generic map(
414
          re_freq_g    => re_freq_g,    -- HIBI reading side
415
          we_freq_g    => we_freq_g,    -- Writing agent OR HIBI synch clk
416
          data_width_g => 1 + comm_width_g + data_width_g,
417
          depth_g      => depth_0_g
418
          )
419
        port map(
420
          clk_re => clk_re,
421
          clk_we => clk_re_pls,         -- HIBI synch clk
422
          rst_n  => rst_n,
423
 
424
          data_in   => rx_data_from_we_aif,
425
          we_in     => rx_we_from_we_aif,
426
          full_out  => rx_full_to_we_aif,
427
          one_p_out => one_p_0_out,     -- ???
428
 
429
          re_in     => re_mux_f0,
430
          data_out  => a_c_d_f0_mux,
431
          one_d_out => one_d_f0_mux,
432
          empty_out => empty_f0_mux
433
          );
434
    end generate Map_Fifo_0;
435
 
436
    Map_Fifo_1 : if depth_1_g > 0 generate
437
 
438
      -- agent msg writes.
439
      aif_we_top_1 : aif_we_top
440
        generic map (
441
          data_width_g => data_width_g+comm_width_g+1)
442
        port map (
443
          tx_clk      => clk_we,
444
          tx_rst_n    => rst_n,
445
          tx_we_in    => we_1_in,
446
          tx_data_in  => a_c_d_input_f1,
447
          tx_full_out => full_1_out,
448
 
449
          rx_clk      => clk_re_pls,
450
          rx_rst_n    => rst_n,
451
          rx_full_in  => rx_msg_full_to_we_aif,
452
          rx_we_out   => rx_msg_we_from_we_aif,
453
          rx_data_out => rx_msg_data_from_we_aif
454
          );
455
 
456
      multiclk_fifo_1 : multiclk_fifo
457
        generic map(
458
          re_freq_g    => re_freq_g,
459
          we_freq_g    => we_freq_g,
460
          data_width_g => 1 + comm_width_g + data_width_g,
461
          depth_g      => depth_1_g
462
          )
463
        port map(
464
          clk_re => clk_re,
465
          clk_we => clk_re_pls,
466
          rst_n  => rst_n,
467
 
468
          data_in   => rx_msg_data_from_we_aif,
469
          we_in     => rx_msg_we_from_we_aif,
470
          full_out  => rx_msg_full_to_we_aif,
471
          one_p_out => one_p_1_out,
472
 
473
          re_in     => re_mux_f1,
474
          data_out  => a_c_d_f1_mux,
475
          one_d_out => one_d_f1_mux,
476
          empty_out => empty_f1_mux
477
          );
478
    end generate Map_Fifo_1;
479
 
480
  end generate gals;
481
 
482
  gray : if fifo_sel_g = 2 generate
483
    -- Gray FIFO
484
 
485
    Map_Fifo_0 : if depth_0_g > 0 generate
486
      cdc_fifo_0 : cdc_fifo
487
        generic map (
488
          READ_AHEAD_g  => 1,           -- this is the hibi style, look-ahead
489
          SYNC_CLOCKS_g => 0,           -- we use two flops
490
          depth_log2_g  => log2(depth_0_g),
491
          dataw_g       => 1 + comm_width_g + data_width_g
492
          )
493
        port map (
494
          rst_n        => rst_n,
495
          rd_clk       => clk_re,
496
          rd_en_in     => re_mux_f0,
497
          rd_empty_out => empty_f0_mux,
498
          rd_one_d_out => one_d_f0_mux,
499
          rd_data_out  => a_c_d_f0_mux,
500
 
501
          wr_clk       => clk_we,
502
          wr_en_in     => we_0_in,
503
          wr_full_out  => full_0_out,
504
          wr_one_p_out => one_p_0_out,
505
          wr_data_in   => a_c_d_input_f0
506
          );
507
 
508
--      one_p_0_out <= '0';
509
 
510
    end generate Map_Fifo_0;
511
 
512
 
513
 
514
    Map_Fifo_1 : if depth_1_g > 0 generate
515
      cdc_fifo_1 : cdc_fifo
516
        generic map (
517
          READ_AHEAD_g  => 1,           -- this is the hibi style, look-ahead
518
          SYNC_CLOCKS_g => 0,           -- we use two flops
519
          depth_log2_g  => log2(depth_1_g),
520
          dataw_g       => 1 + comm_width_g + data_width_g
521
          )
522
        port map (
523
          rst_n        => rst_n,
524
          rd_clk       => clk_re,
525
          rd_en_in     => re_mux_f1,
526
          rd_empty_out => empty_f1_mux,
527
          rd_one_d_out => one_d_f1_mux,
528
          rd_data_out  => a_c_d_f1_mux,
529
 
530
          wr_clk       => clk_we,
531
          wr_en_in     => we_1_in,
532
          wr_full_out  => full_1_out,
533
          wr_one_p_out => one_p_1_out,
534
          wr_data_in   => a_c_d_input_f1
535
          );
536
 
537
--      one_p_1_out <= '0';
538
 
539
    end generate Map_Fifo_1;
540
 
541
  end generate gray;
542
 
543
 
544
  mixed : if fifo_sel_g = 3 generate
545
 
546
    Map_Fifo_0 : if depth_0_g > 0 generate
547
      Mixed_clk_Fifo_0 : mixed_clk_fifo
548
        generic map(
549
          re_faster_g  => re_faster_c,
550
          data_width_g => 1 + comm_width_g + data_width_g,
551
          depth_g      => depth_0_g
552
          )
553
        port map(
554
          clk_re    => clk_re,
555
          clk_we    => clk_we,
556
          clk_ps_we => clk_we_pls,
557
          clk_ps_re => clk_re_pls,
558
          rst_n     => rst_n,
559
 
560
          data_in   => a_c_d_input_f0,
561
          we_in     => we_0_in,
562
          full_out  => full_0_out,
563
          one_p_out => one_p_0_out,
564
 
565
          re_in     => re_mux_f0,
566
          data_out  => a_c_d_f0_mux,
567
          one_d_out => one_d_f0_mux,
568
          empty_out => empty_f0_mux
569
          );
570
    end generate Map_Fifo_0;
571
 
572
 
573
    Map_Fifo_1 : if depth_1_g > 0 generate
574
      Mixed_clk_Fifo_1 : mixed_clk_fifo
575
        generic map(
576
          re_faster_g  => re_faster_c,
577
          data_width_g => 1 + comm_width_g + data_width_g,
578
          depth_g      => depth_1_g
579
          )
580
        port map(
581
          clk_re    => clk_re,
582
          clk_we    => clk_we,
583
          clk_ps_we => clk_we_pls,
584
          clk_ps_re => clk_re_pls,
585
          rst_n     => rst_n,
586
 
587
          data_in   => a_c_d_input_f1,
588
          we_in     => we_1_in,
589
          full_out  => full_1_out,
590
          one_p_out => one_p_1_out,
591
 
592
          re_in     => re_mux_f1,
593
          data_out  => a_c_d_f1_mux,
594
          one_d_out => one_d_f1_mux,
595
          empty_out => empty_f1_mux
596
          );
597
    end generate Map_Fifo_1;
598
 
599
  end generate mixed;
600
 
601
  --
602
  -- Deactivate signals "coming from fifo" that was not
603
  -- instantiated (depth=0)
604
  --
605
 
606
  Not_Map_Fifo_0 : if depth_0_g = 0 generate
607
    -- Fifo #0 does not exist!
608
    a_c_d_f0_mux <= (others => '0');
609
    empty_f0_mux <= Tie_High;
610
    one_d_f0_mux <= Tie_Low;
611
    full_0_out   <= Tie_High;
612
    one_p_0_out  <= Tie_Low;
613
 
614
    -- Connect the other fifo (#1)straight to the outputs ( =>  FSM)
615
    av_out    <= av_f1_mux;
616
    data_out  <= data_f1_mux;
617
    comm_out  <= comm_f1_mux;
618
    empty_out <= empty_f1_mux;
619
    one_d_out <= one_d_f1_mux;
620
 
621
    re_mux_f1 <= re_in;                 --15.05
622
 
623
  end generate Not_Map_Fifo_0;
624
 
625
 
626
  Not_Map_Fifo_1 : if depth_1_g = 0 generate
627
    -- Fifo #1 does not exist!
628
 
629
    -- Signals fifo#1=> IP
630
    --     full_1_out  <= Tie_High;
631
    --     one_p_1_out <= Tie_Low;
632
 
633
    -- Signals fifo#1=> FSM
634
    a_c_d_f1_mux <= (others => '0');
635
    empty_f1_mux <= Tie_High;
636
    one_d_f1_mux <= Tie_Low;
637
 
638
    -- Connect the other fifo (#0)straight to the outputs ( =>  FSM)
639
    av_out    <= av_f0_mux;
640
    data_out  <= data_f0_mux;
641
    comm_out  <= comm_f0_mux;
642
    empty_out <= empty_f0_mux;
643
    one_d_out <= one_d_f0_mux;
644
 
645
    re_mux_f0 <= re_in;                 --15.05
646
 
647
  end generate Not_Map_Fifo_1;
648
 
649
 
650
  --
651
  -- Include a special multiplexer if both fifos are present
652
  --
653
  Map_mux : if depth_0_g > 0 and depth_1_g > 0 generate
654
    -- Multiplexer is needed only if two fifos are used
655
    MUX_01 : fifo_mux_rd
656
      generic map(
657
        data_width_g    => data_width_g,
658
        comm_width_g    => comm_width_g,
659
        separate_addr_g => separate_addr_g
660
        )
661
      port map(
662
        clk   => clk_re,
663
        rst_n => rst_n,
664
 
665
        av_0_in    => av_f0_mux,
666
        data_0_in  => data_f0_mux,
667
        comm_0_in  => comm_f0_mux,
668
        empty_0_in => empty_f0_mux,
669
        one_d_0_in => one_d_f0_mux,
670
        re_0_out   => re_mux_f0,
671
 
672
        av_1_in    => av_f1_mux,
673
        data_1_in  => data_f1_mux,
674
        comm_1_in  => comm_f1_mux,
675
        empty_1_in => empty_f1_mux,
676
        one_d_1_in => one_d_f1_mux,
677
        re_1_out   => re_mux_f1,
678
 
679
        re_in     => re_in,
680
        av_out    => av_out,
681
        data_out  => data_out,
682
        comm_out  => comm_out,
683
        empty_out => empty_out,
684
        one_d_out => one_d_out
685
        );
686
  end generate Map_mux;
687
 
688
 
689
 
690
 
691
 
692
 
693
 
694
 
695
 
696
 
697
end structural;
698
 
699
 
700
 

powered by: WebSVN 2.1.0

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