SURF  1.0
FifoCascade.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : FifoCascade.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-10
5 -- Last update: 2014-09-23
6 -------------------------------------------------------------------------------
7 -- Description: Wrapper for cascading FWFT FIFOs together
8 -------------------------------------------------------------------------------
9 -- This file is part of 'SLAC Firmware Standard Library'.
10 -- It is subject to the license terms in the LICENSE.txt file found in the
11 -- top-level directory of this distribution and at:
12 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
13 -- No part of 'SLAC Firmware Standard Library', including this file,
14 -- may be copied, modified, propagated, or distributed except according to
15 -- the terms contained in the LICENSE.txt file.
16 -------------------------------------------------------------------------------
17 
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.numeric_std.all;
21 
22 use work.StdRtlPkg.all;
23 
24 --! @see entity
25  --! @ingroup base_fifo
26 entity FifoCascade is
27  generic (
28  TPD_G : time := 1 ns;
29  CASCADE_SIZE_G : integer range 1 to (2**24) := 1; -- Number of FIFOs to cascade (if set to 1, then no FIFO cascading)
30  LAST_STAGE_ASYNC_G : boolean := true; -- If set to true, the last stage will be the ASYNC FIFO
31  RST_POLARITY_G : sl := '1'; -- '1' for active high rst, '0' for active low
32  RST_ASYNC_G : boolean := false;
33  GEN_SYNC_FIFO_G : boolean := false;
34  BRAM_EN_G : boolean := true;
35  FWFT_EN_G : boolean := false;
36  USE_DSP48_G : string := "no";
37  ALTERA_SYN_G : boolean := false;
38  ALTERA_RAM_G : string := "M9K";
39  USE_BUILT_IN_G : boolean := false; -- If set to true, this module is only Xilinx compatible only!!!
40  XIL_DEVICE_G : string := "7SERIES"; -- Xilinx only generic parameter
41  SYNC_STAGES_G : integer range 3 to (2**24) := 3;
42  PIPE_STAGES_G : natural range 0 to 16 := 0;
43  DATA_WIDTH_G : integer range 1 to (2**24) := 16;
44  ADDR_WIDTH_G : integer range 4 to 48 := 4;
45  INIT_G : slv := "0";
46  FULL_THRES_G : integer range 1 to (2**24) := 1;
47  EMPTY_THRES_G : integer range 1 to (2**24) := 1);
48  port (
49  -- Resets
50  rst : in sl := '0';
51  --Write Ports (wr_clk domain)
52  wr_clk : in sl;
53  wr_en : in sl := '0';
54  din : in slv(DATA_WIDTH_G-1 downto 0);
55  wr_data_count : out slv(ADDR_WIDTH_G-1 downto 0);
56  wr_ack : out sl;
57  overflow : out sl;
58  prog_full : out sl;
59  almost_full : out sl;
60  full : out sl;
61  not_full : out sl;
62  progFullVec : out slv(CASCADE_SIZE_G-1 downto 0); -- Output stage = 0
63  --Read Ports (rd_clk domain)
64  rd_clk : in sl; --unused if GEN_SYNC_FIFO_G = true
65  rd_en : in sl := '0';
66  dout : out slv(DATA_WIDTH_G-1 downto 0);
67  rd_data_count : out slv(ADDR_WIDTH_G-1 downto 0);
68  valid : out sl;
69  underflow : out sl;
70  prog_empty : out sl;
72  empty : out sl);
73 end FifoCascade;
74 
75 architecture mapping of FifoCascade is
76 
77  constant GEN_SYNC_FIFO_FIRST_C : boolean := ite(LAST_STAGE_ASYNC_G, true, GEN_SYNC_FIFO_G);
78  constant GEN_SYNC_FIFO_LAST_C : boolean := ite(LAST_STAGE_ASYNC_G, GEN_SYNC_FIFO_G, true);
79  constant CASCADE_SIZE_C : integer := ite((CASCADE_SIZE_G = 1), 0, (CASCADE_SIZE_G-2));
80 
81  type FifoDataType is array (CASCADE_SIZE_C downto 0) of slv((DATA_WIDTH_G-1) downto 0);
82 
83  signal progFull,
85  signal readJump,
86  validJump,
89 
90 begin
91 
92  cascadeClk <= wr_clk when(LAST_STAGE_ASYNC_G = true) else rd_clk;
93 
94  -----------------------------------------------------------------
95  -----------------------------------------------------------------
96  -----------------------------------------------------------------
97 
98  ONE_STAGE : if (CASCADE_SIZE_G = 1) generate
99 
100  prog_full <= progFull;
101  progFullVec(0) <= progFull;
102 
103  Fifo_1xStage : entity work.Fifo
104  generic map (
105  TPD_G => TPD_G,
109  BRAM_EN_G => BRAM_EN_G,
110  FWFT_EN_G => FWFT_EN_G,
120  INIT_G => INIT_G,
123  port map (
124  -- Resets
125  rst => rst,
126  --Write Ports (wr_clk domain)
127  wr_clk => wr_clk,
128  wr_en => wr_en,
129  din => din,
131  wr_ack => wr_ack,
132  overflow => overflow,
133  prog_full => progFull,
135  full => full,
136  not_full => not_full,
137  --Read Ports (rd_clk domain)
138  rd_clk => rd_clk,
139  rd_en => rd_en,
140  dout => dout,
142  valid => valid,
143  underflow => underflow,
146  empty => empty);
147 
148  end generate;
149 
150  -----------------------------------------------------------------
151  -----------------------------------------------------------------
152  -----------------------------------------------------------------
153 
154  TWO_STAGE : if (CASCADE_SIZE_G >= 2) generate
155 
156  prog_full <= progFull;
158 
159  Fifo_First_Stage : entity work.Fifo
160  generic map (
161  TPD_G => TPD_G,
165  BRAM_EN_G => BRAM_EN_G,
166  FWFT_EN_G => true,
176  INIT_G => INIT_G,
179  port map (
180  -- Resets
181  rst => rst,
182  --Write Ports (wr_clk domain)
183  wr_clk => wr_clk,
184  wr_en => wr_en,
185  din => din,
187  wr_ack => wr_ack,
188  overflow => overflow,
189  prog_full => progFull,
191  full => full,
192  not_full => not_full,
193  --Read Ports (rd_clk domain)
194  rd_clk => cascadeClk,
199 
200  MULTI_STAGE : if (CASCADE_SIZE_G > 2) generate
201 
202  GEN_MULTI_STAGE :
203  for i in (CASCADE_SIZE_G-2) downto 1 generate
204 
205  Fifo_Middle_Stage : entity work.Fifo
206  generic map (
207  TPD_G => TPD_G,
210  GEN_SYNC_FIFO_G => true,
211  BRAM_EN_G => BRAM_EN_G,
212  FWFT_EN_G => true,
222  INIT_G => INIT_G,
225  port map (
226  -- Resets
227  rst => rst,
228  --Write Ports (wr_clk domain)
229  wr_clk => cascadeClk,
230  wr_en => readJump(i),
231  din => dataJump(i),
232  almost_full => AFullJump(i),
233  prog_full => progFullVec(i),
234  --Read Ports (rd_clk domain)
235  rd_clk => cascadeClk,
236  rd_en => readJump(i-1),
237  dout => dataJump(i-1),
238  valid => validJump(i-1));
239  readJump(i-1) <= validJump(i-1) and not AFullJump(i-1);
240 
241  end generate GEN_MULTI_STAGE;
242  end generate;
243 
244  Fifo_Last_Stage : entity work.Fifo
245  generic map (
246  TPD_G => TPD_G,
250  BRAM_EN_G => BRAM_EN_G,
251  FWFT_EN_G => FWFT_EN_G,
261  INIT_G => INIT_G,
264  port map (
265  -- Resets
266  rst => rst,
267  --Write Ports (wr_clk domain)
268  wr_clk => cascadeClk,
269  wr_en => readJump(0),
270  din => dataJump(0),
271  almost_full => AFullJump(0),
272  prog_full => progFullVec(0),
273  --Read Ports (rd_clk domain)
274  rd_clk => rd_clk,
275  rd_en => rd_en,
276  dout => dout,
278  valid => valid,
279  underflow => underflow,
282  empty => empty);
283 
284  end generate;
285 
286 end architecture mapping;
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: Fifo.vhd:39
out almost_fullsl
Definition: FifoCascade.vhd:59
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:52
ALTERA_RAM_Gstring := "M9K"
Definition: FifoCascade.vhd:38
out validsl
Definition: FifoCascade.vhd:68
out almost_emptysl
Definition: Fifo.vhd:68
out progFullVecslv( CASCADE_SIZE_G- 1 downto 0)
Definition: FifoCascade.vhd:62
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:53
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:66
XIL_DEVICE_Gstring := "7SERIES"
Definition: Fifo.vhd:38
slv( CASCADE_SIZE_C downto 0) readJump
Definition: FifoCascade.vhd:87
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: Fifo.vhd:45
boolean := ite( LAST_STAGE_ASYNC_G, GEN_SYNC_FIFO_G, true) GEN_SYNC_FIFO_LAST_C
Definition: FifoCascade.vhd:78
XIL_DEVICE_Gstring := "7SERIES"
Definition: FifoCascade.vhd:40
BRAM_EN_Gboolean := true
Definition: Fifo.vhd:32
RST_ASYNC_Gboolean := false
Definition: FifoCascade.vhd:32
out almost_emptysl
Definition: FifoCascade.vhd:71
INIT_Gslv := "0"
Definition: FifoCascade.vhd:45
std_logic sl
Definition: StdRtlPkg.vhd:28
FWFT_EN_Gboolean := false
Definition: Fifo.vhd:33
( CASCADE_SIZE_C downto 0) slv(( DATA_WIDTH_G- 1) downto 0) FifoDataType
Definition: FifoCascade.vhd:81
BRAM_EN_Gboolean := true
Definition: FifoCascade.vhd:34
out emptysl
Definition: Fifo.vhd:69
_library_ ieeeieee
out wr_acksl
Definition: Fifo.vhd:54
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: Fifo.vhd:44
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:54
RST_ASYNC_Gboolean := false
Definition: Fifo.vhd:30
boolean := ite( LAST_STAGE_ASYNC_G, true, GEN_SYNC_FIFO_G) GEN_SYNC_FIFO_FIRST_C
Definition: FifoCascade.vhd:77
ALTERA_SYN_Gboolean := false
Definition: Fifo.vhd:35
in rd_clksl
Definition: FifoCascade.vhd:64
out prog_fullsl
Definition: FifoCascade.vhd:58
out almost_fullsl
Definition: Fifo.vhd:57
PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: FifoCascade.vhd:42
FifoDataType dataJump
Definition: FifoCascade.vhd:88
in rd_clksl
Definition: Fifo.vhd:61
USE_DSP48_Gstring := "no"
Definition: Fifo.vhd:34
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:47
TPD_Gtime := 1 ns
Definition: Fifo.vhd:28
slv( CASCADE_SIZE_C downto 0) AFullJump
Definition: FifoCascade.vhd:87
ALTERA_SYN_Gboolean := false
Definition: FifoCascade.vhd:37
in rd_ensl := '0'
Definition: FifoCascade.vhd:65
out wr_acksl
Definition: FifoCascade.vhd:56
RST_POLARITY_Gsl := '1'
Definition: Fifo.vhd:29
in rstsl := '0'
Definition: FifoCascade.vhd:50
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
Definition: Fifo.vhd:41
in wr_clksl
Definition: Fifo.vhd:50
in wr_clksl
Definition: FifoCascade.vhd:52
out overflowsl
Definition: FifoCascade.vhd:57
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:46
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: FifoCascade.vhd:41
out fullsl
Definition: Fifo.vhd:58
out validsl
Definition: Fifo.vhd:65
in rd_ensl := '0'
Definition: Fifo.vhd:62
out underflowsl
Definition: Fifo.vhd:66
integer := ite(( CASCADE_SIZE_G= 1), 0,( CASCADE_SIZE_G- 2)) CASCADE_SIZE_C
Definition: FifoCascade.vhd:79
out overflowsl
Definition: Fifo.vhd:55
in wr_ensl := '0'
Definition: FifoCascade.vhd:53
ALTERA_RAM_Gstring := "M9K"
Definition: Fifo.vhd:36
out fullsl
Definition: FifoCascade.vhd:60
GEN_SYNC_FIFO_Gboolean := false
Definition: Fifo.vhd:31
INIT_Gslv := "0"
Definition: Fifo.vhd:43
GEN_SYNC_FIFO_Gboolean := false
Definition: FifoCascade.vhd:33
out not_fullsl
Definition: Fifo.vhd:59
TPD_Gtime := 1 ns
Definition: FifoCascade.vhd:28
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:63
in rstsl :=not RST_POLARITY_G
Definition: Fifo.vhd:48
PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: Fifo.vhd:40
USE_DSP48_Gstring := "no"
Definition: FifoCascade.vhd:36
LAST_STAGE_ASYNC_Gboolean := true
Definition: FifoCascade.vhd:30
ADDR_WIDTH_Ginteger range 4 to 48:= 4
Definition: Fifo.vhd:42
ADDR_WIDTH_Ginteger range 4 to 48:= 4
Definition: FifoCascade.vhd:44
USE_BUILT_IN_Gboolean := false
Definition: Fifo.vhd:37
USE_BUILT_IN_Gboolean := false
Definition: FifoCascade.vhd:39
FWFT_EN_Gboolean := false
Definition: FifoCascade.vhd:35
out not_fullsl
Definition: FifoCascade.vhd:61
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
Definition: FifoCascade.vhd:43
out emptysl
Definition: FifoCascade.vhd:72
out underflowsl
Definition: FifoCascade.vhd:69
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:29
out prog_emptysl
Definition: FifoCascade.vhd:70
out prog_fullsl
Definition: Fifo.vhd:56
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:55
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:64
slv( CASCADE_SIZE_C downto 0) validJump
Definition: FifoCascade.vhd:87
out prog_emptysl
Definition: Fifo.vhd:67
Definition: Fifo.vhd:26
RST_POLARITY_Gsl := '1'
Definition: FifoCascade.vhd:31
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:67
in wr_ensl := '0'
Definition: Fifo.vhd:51