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_demux_wr.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- File        : double_fifo.vhd
3
-- Description : Includes two fifos. Multi-clk systems are supported.
4
--
5
-- Author      : Lasse Lehtonen
6
-- Project     : Nocbench, Funbase
7
-- Design      : 
8
-- Date        : 1.4.2011
9
-- Modified    : 
10
-- TO DO:
11
--      Rename the entity and file, because mux was actually removed
12
--      and new write port added by LL (note by ES 2011-10-07)
13
-------------------------------------------------------------------------------
14
-- Funbase IP library Copyright (C) 2011 TUT Department of Computer Systems
15
--
16
-- This file is part of HIBI
17
--
18
-- This source file may be used and distributed without
19
-- restriction provided that this copyright statement is not
20
-- removed from the file and that any derivative work contains
21
-- the original copyright notice and the associated disclaimer.
22
--
23
-- This source file is free software; you can redistribute it
24
-- and/or modify it under the terms of the GNU Lesser General
25
-- Public License as published by the Free Software Foundation;
26
-- either version 2.1 of the License, or (at your option) any
27
-- later version.
28
--
29
-- This source is distributed in the hope that it will be
30
-- useful, but WITHOUT ANY WARRANTY; without even the implied
31
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
32
-- PURPOSE.  See the GNU Lesser General Public License for more
33
-- details.
34
--
35
-- You should have received a copy of the GNU Lesser General
36
-- Public License along with this source; if not, download it
37
-- from http://www.opencores.org/lgpl.shtml
38
-------------------------------------------------------------------------------
39
library ieee;
40
use ieee.std_logic_1164.all;
41
use ieee.std_logic_arith.all;
42
use ieee.std_logic_unsigned.all;
43
 
44
 
45
entity double_fifo_demux_wr is
46
 
47
  generic (
48
    -- 0 synch multiclk, 1 basic GALS,
49
    -- 2 Gray FIFO (depth=2^n!), 3 mixed clock pausible    
50
    fifo_sel_g : integer := 0;
51
 
52
    -- needed for fifos 0 (accurate) and 3 (which is faster)    
53
    re_freq_g     : integer := 1;
54
    we_freq_g     : integer := 1;
55
    depth_0_g     : integer := 5;
56
    depth_1_g     : integer := 5;
57
    data_width_g  : integer := 32;
58
    debug_width_g : integer := 0;
59
    comm_width_g  : integer := 3
60
    );
61
  port (
62
    clk_re     : in std_logic;
63
    clk_we     : in std_logic;
64
    -- pulsed clocks. used in pausible clock scheme
65
    clk_re_pls : in std_logic;
66
    clk_we_pls : in std_logic;
67
    rst_n      : in std_logic;
68
 
69
    -- Data inputs
70
    av_0_in     : in  std_logic;
71
    data_0_in   : in  std_logic_vector (data_width_g-1 downto 0);
72
    comm_0_in   : in  std_logic_vector (comm_width_g-1 downto 0);
73
    we_0_in     : in  std_logic;
74
    one_p_0_out : out std_logic;
75
    full_0_out  : out std_logic;
76
 
77
    av_1_in     : in  std_logic;
78
    data_1_in   : in  std_logic_vector (data_width_g-1 downto 0);
79
    comm_1_in   : in  std_logic_vector (comm_width_g-1 downto 0);
80
    we_1_in     : in  std_logic;
81
    one_p_1_out : out std_logic;
82
    full_1_out  : out std_logic;
83
 
84
    -- Data outputs
85
    re_0_in     : in  std_logic;
86
    av_0_out    : out std_logic;
87
    data_0_out  : out std_logic_vector (data_width_g-1 downto 0);
88
    comm_0_out  : out std_logic_vector (comm_width_g-1 downto 0);
89
    empty_0_out : out std_logic;
90
    one_d_0_out : out std_logic;
91
 
92
    re_1_in     : in  std_logic;
93
    av_1_out    : out std_logic;
94
    data_1_out  : out std_logic_vector (data_width_g-1 downto 0);
95
    comm_1_out  : out std_logic_vector (comm_width_g-1 downto 0);
96
    empty_1_out : out std_logic;
97
    debug_out   : out std_logic_vector(debug_width_g downto 0);
98
    one_d_1_out : out std_logic
99
    );
100
end double_fifo_demux_wr;
101
 
102
 
103
 
104
architecture structural of double_fifo_demux_wr is
105
 
106
  constant re_faster_c : integer := re_freq_g/we_freq_g;
107
 
108
  component mixed_clk_fifo
109
    generic (
110
--      re_freq_g    : integer := 0;      -- integer multiple of clk_we
111
--      we_freq_g    : integer := 0;      -- or vice versa
112
      re_faster_g  : integer := 0;
113
      data_width_g : integer := 0;
114
      depth_g      : integer := 0
115
      );
116
    port (
117
      clk_re    : in std_logic;
118
      clk_we    : in std_logic;
119
      clk_ps_re : in std_logic;         -- phase shifted pulse      
120
      clk_ps_we : in std_logic;         -- phase shifted pulse      
121
      rst_n     : in std_logic;
122
 
123
      data_in   : in  std_logic_vector (data_width_g-1 downto 0);
124
      we_in     : in  std_logic;
125
      full_out  : out std_logic;
126
      one_p_out : out std_logic;
127
 
128
      re_in     : in  std_logic;
129
      data_out  : out std_logic_vector (data_width_g-1 downto 0);
130
      empty_out : out std_logic;
131
      one_d_out : out std_logic
132
      );
133
  end component;  --fifo;
134
 
135
 
136
  component multiclk_fifo
137
    generic (
138
      re_freq_g    : integer;
139
      we_freq_g    : integer;
140
      depth_g      : integer;
141
      data_width_g : integer);
142
    port (
143
      clk_re    : in  std_logic;
144
      clk_we    : in  std_logic;
145
      rst_n     : in  std_logic;
146
      data_in   : in  std_logic_vector (data_width_g-1 downto 0);
147
      we_in     : in  std_logic;
148
      full_out  : out std_logic;
149
      one_p_out : out std_logic;
150
      re_in     : in  std_logic;
151
      data_out  : out std_logic_vector (data_width_g-1 downto 0);
152
      empty_out : out std_logic;
153
      one_d_out : out std_logic);
154
  end component;
155
 
156
  component cdc_fifo
157
    generic (
158
      READ_AHEAD_g  : integer;
159
      SYNC_CLOCKS_g : integer;
160
      depth_log2_g  : integer;
161
      dataw_g       : integer);
162
    port (
163
      rst_n        : in  std_logic;
164
      rd_clk       : in  std_logic;
165
      rd_en_in     : in  std_logic;
166
      rd_one_d_out : out std_logic;
167
      rd_empty_out : out std_logic;
168
      rd_data_out  : out std_logic_vector(dataw_g-1 downto 0);
169
      wr_clk       : in  std_logic;
170
      wr_en_in     : in  std_logic;
171
      wr_full_out  : out std_logic;
172
      wr_one_p_out  : out std_logic;
173
      wr_data_in   : in  std_logic_vector(dataw_g-1 downto 0));
174
  end component;
175
 
176
  component fifo
177
    generic (
178
      data_width_g : integer := 0;
179
      depth_g      : integer := 0
180
      );
181
    port (
182
      clk   : in std_logic;
183
      rst_n : in std_logic;
184
 
185
      data_in   : in  std_logic_vector (data_width_g-1 downto 0);
186
      we_in     : in  std_logic;
187
      full_out  : out std_logic;
188
      one_p_out : out std_logic;
189
 
190
      re_in     : in  std_logic;
191
      data_out  : out std_logic_vector (data_width_g-1 downto 0);
192
      empty_out : out std_logic;
193
      one_d_out : out std_logic
194
      );
195
  end component;  --fifo;
196
 
197
 
198
  component fifo_demux_wr
199
    generic (
200
      data_width_g : integer := 0;
201
      comm_width_g : integer := 0
202
      );
203
    port (
204
      -- 13.04 clk                : in  std_logic;
205
      -- 13.04 rst_n              : in  std_logic;
206
      av_in     : in  std_logic;
207
      data_in   : in  std_logic_vector (data_width_g-1 downto 0);
208
      comm_in   : in  std_logic_vector (comm_width_g-1 downto 0);
209
      we_in     : in  std_logic;
210
      full_out  : out std_logic;
211
      one_p_out : out std_logic;
212
 
213
      -- data/comm/AV conencted to both fifos
214
      -- Distinction made with WE!
215
      av_out     : out std_logic;
216
      data_out   : out std_logic_vector (data_width_g-1 downto 0);
217
      comm_out   : out std_logic_vector (comm_width_g-1 downto 0);
218
      we_0_out   : out std_logic;
219
      we_1_out   : out std_logic;
220
      full_0_in  : in  std_logic;
221
      full_1_in  : in  std_logic;
222
      one_p_0_in : in  std_logic;
223
      one_p_1_in : in  std_logic
224
      );
225
  end component;
226
 
227
 
228
  component aif_read_top
229
    generic (
230
      data_width_g : integer);
231
    port (
232
      tx_clk       : in  std_logic;
233
      tx_rst_n     : in  std_logic;
234
      tx_data_in   : in  std_logic_vector(data_width_g-1 downto 0);
235
      tx_empty_in  : in  std_logic;
236
      tx_re_out    : out std_logic;
237
      rx_clk       : in  std_logic;
238
      rx_rst_n     : in  std_logic;
239
      rx_empty_out : out std_logic;
240
      rx_re_in     : in  std_logic;
241
      rx_data_out  : out std_logic_vector(data_width_g-1 downto 0));
242
  end component;
243
 
244
 
245
  signal data_0 : std_logic_vector(1+comm_width_g+data_width_g-1 downto 0);
246
  signal data_1 : std_logic_vector(1+comm_width_g+data_width_g-1 downto 0);
247
 
248
  signal data_0_i : std_logic_vector(1+comm_width_g+data_width_g-1 downto 0);
249
  signal data_1_i : std_logic_vector(1+comm_width_g+data_width_g-1 downto 0);
250
 
251
  signal tx_data_0_to_aif  : std_logic_vector(1+comm_width_g+data_width_g-1 downto 0);
252
  signal tx_data_1_to_aif  : std_logic_vector(1+comm_width_g+data_width_g-1 downto 0);
253
  signal tx_empty_0_to_aif : std_logic;
254
  signal tx_empty_1_to_aif : std_logic;
255
  signal tx_re_0_from_aif : std_logic;
256
  signal tx_re_1_from_aif : std_logic;
257
 
258
  function log2 (
259
    constant value : integer)
260
    return integer is
261
    variable temp    : integer := 1;
262
    variable counter : integer := 0;
263
  begin  -- log2
264
    while temp < value loop
265
      temp    := temp*2;
266
      counter := counter+1;
267
    end loop;
268
 
269
    return counter;
270
  end log2;
271
 
272
begin  -- structural
273
 
274
  av_0_out   <= data_0(1 + comm_width_g + data_width_g - 1);
275
  comm_0_out <= data_0(comm_width_g + data_width_g -1 downto data_width_g);
276
  data_0_out <= data_0(data_width_g - 1 downto 0);
277
 
278
  av_1_out   <= data_1(1 + comm_width_g + data_width_g - 1);
279
  comm_1_out <= data_1(comm_width_g + data_width_g -1 downto data_width_g);
280
  data_1_out <= data_1(data_width_g - 1 downto 0);
281
 
282
  data_0_i <= av_0_in & comm_0_in & data_0_in;
283
  data_1_i <= av_1_in & comm_1_in & data_1_in;
284
 
285
  multi : if fifo_sel_g = 0 generate
286
    -- synch multiclk
287
 
288
    Map_Fifo_0 : if depth_0_g > 0 generate
289
      Multiclk_Fifo_0 : multiclk_fifo
290
        generic map(
291
          re_freq_g    => re_freq_g,
292
          we_freq_g    => we_freq_g,
293
          data_width_g => 1 + comm_width_g + data_width_g,
294
          depth_g      => depth_0_g
295
          )
296
        port map(
297
          clk_re    => clk_re,
298
          clk_we    => clk_we,
299
          rst_n     => rst_n,
300
          data_in   => data_0_i,
301
          we_in     => we_0_in,
302
          full_out  => full_0_out,
303
          one_p_out => one_p_0_out,
304
 
305
          re_in     => re_0_in,
306
          data_out  => data_0,
307
          empty_out => empty_0_out,
308
          one_d_out => one_d_0_out
309
          );
310
    end generate Map_Fifo_0;
311
 
312
    Map_Fifo_1 : if depth_1_g > 0 generate
313
      Multiclk_Fifo_1 : multiclk_fifo
314
        generic map(
315
          re_freq_g    => re_freq_g,
316
          we_freq_g    => we_freq_g,
317
          data_width_g => 1 + comm_width_g + data_width_g,
318
          depth_g      => depth_1_g
319
          )
320
        port map(
321
          clk_re => clk_re,
322
          clk_we => clk_we,
323
          rst_n  => rst_n,
324
 
325
          data_in   => data_1_i,
326
          we_in     => we_1_in,
327
          one_p_out => one_p_1_out,
328
          full_out  => full_1_out,
329
 
330
          re_in     => re_1_in,
331
          data_out  => data_1,
332
          empty_out => empty_1_out,
333
          one_d_out => one_d_1_out
334
          );
335
    end generate Map_Fifo_1;
336
 
337
  end generate multi;
338
 
339
 
340
  gals : if fifo_sel_g = 1 generate
341
    -- GALS, may be used with fast synch
342
 
343
    Map_Fifo_0 : if depth_0_g > 0 generate
344
 
345
      aif_read_top_0 : aif_read_top
346
        generic map (
347
          data_width_g => 1 + comm_width_g + data_width_g
348
          )
349
        port map (
350
          tx_clk      => clk_we_pls,
351
          tx_rst_n    => rst_n,
352
 
353
          tx_data_in  => tx_data_0_to_aif,
354
          tx_empty_in => tx_empty_0_to_aif,
355
          tx_re_out   => tx_re_0_from_aif,
356
 
357
          rx_clk       => clk_re,       -- should be the agent clock...
358
          rx_rst_n     => rst_n,
359
          rx_empty_out => empty_0_out,
360
          rx_re_in     => re_0_in,
361
          rx_data_out  => data_0
362
          );
363
 
364
 
365
      Multiclk_Fifo_0 : multiclk_fifo
366
        generic map(
367
          re_freq_g    => re_freq_g,
368
          we_freq_g    => we_freq_g,
369
          data_width_g => 1 + comm_width_g + data_width_g,
370
          depth_g      => depth_0_g
371
          )
372
        port map(
373
          clk_re    => clk_we_pls,
374
          clk_we    => clk_we,
375
          rst_n     => rst_n,
376
          data_in   => data_0_i,
377
          we_in     => we_0_in,
378
          full_out  => full_0_out,
379
          one_p_out => one_p_0_out,   --- ???
380
 
381
          re_in     => tx_re_0_from_aif,
382
          data_out  => tx_data_0_to_aif,
383
          empty_out => tx_empty_0_to_aif,
384
          one_d_out => one_d_0_out      -- ???
385
          );
386
    end generate Map_Fifo_0;
387
 
388
    Map_Fifo_1 : if depth_1_g > 0 generate
389
 
390
      aif_read_top_1 : aif_read_top
391
        generic map (
392
          data_width_g => 1 + comm_width_g + data_width_g
393
          )
394
        port map (
395
          tx_clk      => clk_we_pls,
396
          tx_rst_n    => rst_n,
397
          tx_data_in  => tx_data_1_to_aif,
398
          tx_empty_in => tx_empty_1_to_aif,
399
          tx_re_out   => tx_re_1_from_aif,
400
 
401
          rx_clk       => clk_re,       -- should be the agent clock...
402
          rx_rst_n     => rst_n,
403
          rx_empty_out => empty_1_out,
404
          rx_re_in     => re_1_in,
405
          rx_data_out  => data_1
406
          );
407
 
408
      Multiclk_Fifo_1 : multiclk_fifo
409
        generic map(
410
          re_freq_g    => re_freq_g,
411
          we_freq_g    => we_freq_g,
412
          data_width_g => 1 + comm_width_g + data_width_g,
413
          depth_g      => depth_1_g
414
          )
415
        port map(
416
          clk_re    => clk_we_pls,
417
          clk_we    => clk_we,
418
          rst_n     => rst_n,
419
          data_in   => data_1_i,
420
          we_in     => we_1_in,
421
          full_out  => full_1_out,
422
          one_p_out => one_p_1_out,   --- ???
423
 
424
          re_in     => tx_re_1_from_aif,
425
          data_out  => tx_data_1_to_aif,
426
          empty_out => tx_empty_1_to_aif,
427
          one_d_out => one_d_1_out      -- ???
428
          );
429
    end generate Map_Fifo_1;
430
 
431
  end generate gals;
432
 
433
 
434
  gray : if fifo_sel_g = 2 generate
435
    -- Gray FIFO
436
 
437
    Map_Fifo_0 : if depth_0_g > 0 generate
438
      cdc_fifo_0 : cdc_fifo
439
        generic map (
440
          READ_AHEAD_g  => 1,           -- this is the hibi style, look-ahead
441
          SYNC_CLOCKS_g => 0,           -- we use two flops
442
          depth_log2_g  => log2(depth_0_g),
443
          dataw_g       => 1 + comm_width_g + data_width_g)
444
        port map (
445
          rst_n        => rst_n,
446
          rd_clk       => clk_re,
447
          rd_en_in     => re_0_in,
448
          rd_empty_out => empty_0_out,
449
          rd_one_d_out => one_d_0_out,
450
          rd_data_out  => data_0,
451
 
452
          wr_clk      => clk_we,
453
          wr_en_in    => we_0_in,
454
          wr_full_out => full_0_out,
455
          wr_one_p_out => one_p_0_out,
456
          wr_data_in  => data_0_i
457
          );
458
 
459
    end generate Map_Fifo_0;
460
 
461
 
462
    Map_Fifo_1 : if depth_1_g > 0 generate
463
      cdc_fifo_1 : cdc_fifo
464
        generic map (
465
          READ_AHEAD_g  => 1,           -- this is the hibi style, look-ahead
466
          SYNC_CLOCKS_g => 0,           -- we use two flops
467
          depth_log2_g  => log2(depth_1_g),
468
          dataw_g       => 1 + comm_width_g + data_width_g
469
          )
470
        port map (
471
          rst_n        => rst_n,
472
          rd_clk       => clk_re,
473
          rd_en_in     => re_1_in,
474
          rd_empty_out => empty_1_out,
475
          rd_one_d_out => one_d_1_out,
476
          rd_data_out  => data_1,
477
 
478
          wr_clk      => clk_we,
479
          wr_en_in    => we_1_in,
480
          wr_full_out => full_1_out,
481
          wr_one_p_out => one_p_1_out,
482
          wr_data_in  => data_1_i
483
          );
484
    end generate Map_Fifo_1;
485
 
486
  end generate gray;
487
 
488
  mixed : if fifo_sel_g = 3 generate
489
 
490
    Map_Fifo_0 : if depth_0_g > 0 generate
491
      Mixed_clk_Fifo_0 : mixed_clk_fifo
492
        generic map(
493
          re_faster_g  => re_faster_c,
494
          data_width_g => 1 + comm_width_g + data_width_g,
495
          depth_g      => depth_0_g
496
          )
497
        port map(
498
          clk_re    => clk_re,
499
          clk_we    => clk_we,
500
          clk_ps_we => clk_we_pls,
501
          clk_ps_re => clk_re_pls,
502
          rst_n     => rst_n,
503
 
504
          data_in   => data_0_i,
505
          we_in     => we_0_in,
506
          full_out  => full_0_out,
507
          one_p_out => one_p_0_out,
508
 
509
          re_in     => re_0_in,
510
          data_out  => data_0,
511
          empty_out => empty_0_out,
512
          one_d_out => one_d_0_out
513
          );
514
    end generate Map_Fifo_0;
515
 
516
    Map_Fifo_1 : if depth_1_g > 0 generate
517
      Mixed_clk_Fifo_1 : mixed_clk_fifo
518
        generic map(
519
          re_faster_g  => re_faster_c,
520
          data_width_g => 1 + comm_width_g + data_width_g,
521
          depth_g      => depth_1_g
522
          )
523
        port map(
524
          clk_re    => clk_re,
525
          clk_we    => clk_we,
526
          clk_ps_we => clk_we_pls,
527
          clk_ps_re => clk_re_pls,
528
          rst_n     => rst_n,
529
 
530
          data_in   => data_1_i,
531
          we_in     => we_1_in,
532
          one_p_out => one_p_1_out,
533
          full_out  => full_1_out,
534
 
535
          re_in     => re_1_in,
536
          data_out  => data_1,
537
          empty_out => empty_1_out,
538
          one_d_out => one_d_1_out
539
          );
540
    end generate Map_Fifo_1;
541
 
542
  end generate mixed;
543
 
544
 
545
  Not_Map_Fifo_0 : if depth_0_g = 0 generate
546
 
547
--    assert false report "Do not map fifo 0."
548
--      & " This fails because there's no logic to convert "
549
--      & " WE interface to RE interface" severity failure;
550
 
551
    full_0_out <= '1';
552
    one_p_0_out <= '0';
553
 
554
    empty_0_out <= '1';
555
    one_d_0_out <= '0';
556
 
557
  end generate Not_Map_Fifo_0;
558
 
559
  Not_Map_Fifo_1 : if depth_1_g = 0 generate
560
 
561
    assert false report "Do not map fifo 0."
562
      & " This fails because there's no logic to convert "
563
      & " WE interface to RE interface" severity failure;
564
 
565
  end generate Not_Map_Fifo_1;
566
 
567
end structural;
568
 
569
 
570
 
571
 

powered by: WebSVN 2.1.0

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