SURF  1.0
Fifo.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : Fifo.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-07-14
5 -- Last update: 2014-05-05
6 -------------------------------------------------------------------------------
7 -- Description: FIFO Wrapper
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 Fifo is
27  generic (
28  TPD_G : time := 1 ns;
29  RST_POLARITY_G : sl := '1'; -- '1' for active high rst, '0' for active low
30  RST_ASYNC_G : boolean := false;
31  GEN_SYNC_FIFO_G : boolean := false;
32  BRAM_EN_G : boolean := true;
33  FWFT_EN_G : boolean := false;
34  USE_DSP48_G : string := "no";
35  ALTERA_SYN_G : boolean := false;
36  ALTERA_RAM_G : string := "M9K";
37  USE_BUILT_IN_G : boolean := false; --if set to true, this module is only xilinx compatible only!!!
38  XIL_DEVICE_G : string := "7SERIES"; --xilinx only generic parameter
39  SYNC_STAGES_G : integer range 3 to (2**24) := 3;
40  PIPE_STAGES_G : natural range 0 to 16 := 0;
41  DATA_WIDTH_G : integer range 1 to (2**24) := 16;
42  ADDR_WIDTH_G : integer range 4 to 48 := 4;
43  INIT_G : slv := "0";
44  FULL_THRES_G : integer range 1 to (2**24) := 1;
45  EMPTY_THRES_G : integer range 1 to (2**24) := 1);
46  port (
47  -- Resets
48  rst : in sl := not RST_POLARITY_G;
49  --Write Ports (wr_clk domain)
50  wr_clk : in sl;
51  wr_en : in sl := '0';
52  din : in slv(DATA_WIDTH_G-1 downto 0);
53  wr_data_count : out slv(ADDR_WIDTH_G-1 downto 0);
54  wr_ack : out sl;
55  overflow : out sl;
56  prog_full : out sl;
57  almost_full : out sl;
58  full : out sl;
59  not_full : out sl;
60  --Read Ports (rd_clk domain)
61  rd_clk : in sl; --unused if GEN_SYNC_FIFO_G = true
62  rd_en : in sl := '0';
63  dout : out slv(DATA_WIDTH_G-1 downto 0);
64  rd_data_count : out slv(ADDR_WIDTH_G-1 downto 0);
65  valid : out sl;
66  underflow : out sl;
67  prog_empty : out sl;
69  empty : out sl);
70 end Fifo;
71 
72 architecture rtl of Fifo is
73 
74  constant INIT_C : slv(DATA_WIDTH_G-1 downto 0) := ite(INIT_G = "0", slvZero(DATA_WIDTH_G), INIT_G);
75  signal data_count : slv(ADDR_WIDTH_G-1 downto 0) := (others => '0');
76 
77 begin
78 
79  assert (INIT_G = "0" or INIT_G'length = DATA_WIDTH_G) report
80  "INIT_G must either be ""0"" or the same length as DATA_WIDTH_G" severity failure;
81 
82  NON_BUILT_IN_GEN : if (USE_BUILT_IN_G = false) generate
83  FIFO_ASYNC_Gen : if (GEN_SYNC_FIFO_G = false) generate
84  FifoAsync_Inst : entity work.FifoAsync
85  generic map (
86  TPD_G => TPD_G,
97  INIT_G => INIT_C,
100  port map (
101  rst => rst,
102  wr_clk => wr_clk,
103  wr_en => wr_en,
104  din => din,
106  wr_ack => wr_ack,
107  overflow => overflow,
108  prog_full => prog_full,
110  full => full,
111  not_full => not_full,
112  rd_clk => rd_clk,
113  rd_en => rd_en,
114  dout => dout,
116  valid => valid,
117  underflow => underflow,
120  empty => empty);
121  end generate;
122 
123  FIFO_SYNC_Gen : if (GEN_SYNC_FIFO_G = true) generate
124  wr_data_count <= data_count;
125  rd_data_count <= data_count;
126 
127  FifoSync_Inst : entity work.FifoSync
128  generic map (
129  TPD_G => TPD_G,
132  BRAM_EN_G => BRAM_EN_G,
133  FWFT_EN_G => FWFT_EN_G,
139  INIT_G => INIT_C,
142  port map (
143  rst => rst,
144  clk => wr_clk,
145  wr_en => wr_en,
146  rd_en => rd_en,
147  din => din,
148  dout => dout,
149  data_count => data_count,
150  wr_ack => wr_ack,
151  valid => valid,
152  overflow => overflow,
153  underflow => underflow,
154  prog_full => prog_full,
158  full => full,
159  not_full => not_full,
160  empty => empty);
161  --NOTE:
162  -- When mapping the FifoSync, I am assuming that
163  -- wr_clk = rd_clk (both in frequency and in phase)
164  -- and I only pass wr_clk into the FifoSync_Inst
165  end generate;
166  end generate;
167 
168  BUILT_IN_GEN : if (USE_BUILT_IN_G = true) generate
169  FIFO_SYNC_BUILT_IN_GEN : if (GEN_SYNC_FIFO_G = true) generate
170  wr_data_count <= data_count;
171  rd_data_count <= data_count;
172 
173  FifoSyncBuiltIn_Inst : entity work.FifoSyncBuiltIn
174  generic map (
175  TPD_G => TPD_G,
179  FWFT_EN_G => FWFT_EN_G,
185  port map (
186  rst => rst,
187  clk => wr_clk,
188  wr_en => wr_en,
189  rd_en => rd_en,
190  din => din,
191  dout => dout,
192  data_count => data_count,
193  wr_ack => wr_ack,
194  valid => valid,
195  overflow => overflow,
196  underflow => underflow,
197  prog_full => prog_full,
201  full => full,
202  not_full => not_full,
203  empty => empty);
204  --NOTE:
205  -- When mapping the FifoSync, I am assuming that
206  -- wr_clk = rd_clk (both in frequency and in phase)
207  -- and I only pass wr_clk into the FifoSyncBuiltIn_Inst
208  end generate;
209  FIFO_ASYNC_BUILT_IN_GEN : if (GEN_SYNC_FIFO_G = false) generate
210  FifoAsyncBuiltIn_Inst : entity work.FifoAsyncBuiltIn
211  generic map (
212  TPD_G => TPD_G,
214  FWFT_EN_G => FWFT_EN_G,
223  port map (
224  rst => rst,
225  wr_clk => wr_clk,
226  wr_en => wr_en,
227  din => din,
229  wr_ack => wr_ack,
230  overflow => overflow,
231  prog_full => prog_full,
233  full => full,
234  not_full => not_full,
235  rd_clk => rd_clk,
236  rd_en => rd_en,
237  dout => dout,
239  valid => valid,
240  underflow => underflow,
243  empty => empty);
244  end generate;
245  end generate;
246 
247 end architecture rtl;
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: Fifo.vhd:39
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:52
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
out almost_emptysl
Definition: Fifo.vhd:68
in rstsl
Definition: FifoAsync.vhd:45
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoAsync.vhd:42
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:53
ADDR_WIDTH_Ginteger range 4 to 48:= 4
Definition: FifoSync.vhd:40
XIL_DEVICE_Gstring := "7SERIES"
Definition: Fifo.vhd:38
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: Fifo.vhd:45
USE_DSP48_Gstring := "no"
Definition: FifoSync.vhd:35
USE_DSP48_Gstring := "no"
in wr_ensl
Definition: FifoSync.vhd:47
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
in wr_clksl
Definition: FifoAsync.vhd:47
BRAM_EN_Gboolean := true
Definition: Fifo.vhd:32
out prog_emptysl
Definition: FifoSync.vhd:57
DATA_WIDTH_Ginteger range 1 to 72:= 18
out doutslv( DATA_WIDTH_G- 1 downto 0)
in rstsl :=not RST_POLARITY_G
Definition: FifoSync.vhd:45
ADDR_WIDTH_Ginteger range 9 to 13:= 10
out almost_fullsl
Definition: FifoAsync.vhd:54
std_logic sl
Definition: StdRtlPkg.vhd:28
in rd_clksl
Definition: FifoAsync.vhd:58
RST_POLARITY_Gsl := '1'
Definition: FifoAsync.vhd:30
FWFT_EN_Gboolean := false
Definition: Fifo.vhd:33
in wr_ensl
Definition: FifoAsync.vhd:48
PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: FifoAsync.vhd:37
out emptysl
Definition: Fifo.vhd:69
BRAM_EN_Gboolean := true
Definition: FifoSync.vhd:32
out wr_acksl
Definition: Fifo.vhd:54
out prog_fullsl
Definition: FifoSync.vhd:56
FULL_THRES_Ginteger range 1 to 8190:= 1
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: Fifo.vhd:44
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: FifoAsync.vhd:36
out overflowsl
Definition: FifoSync.vhd:54
out validsl
Definition: FifoSync.vhd:53
out not_fullsl
Definition: FifoAsync.vhd:56
RST_ASYNC_Gboolean := false
Definition: Fifo.vhd:30
out data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoSync.vhd:51
ALTERA_SYN_Gboolean := false
Definition: Fifo.vhd:35
in rd_ensl
Definition: FifoAsync.vhd:59
out almost_fullsl
Definition: Fifo.vhd:57
out underflowsl
Definition: FifoAsync.vhd:63
out doutslv( DATA_WIDTH_G- 1 downto 0)
in rd_clksl
Definition: Fifo.vhd:61
PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: FifoSync.vhd:38
USE_DSP48_Gstring := "no"
Definition: Fifo.vhd:34
TPD_Gtime := 1 ns
Definition: Fifo.vhd:28
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoAsync.vhd:60
out almost_emptysl
Definition: FifoSync.vhd:59
ADDR_WIDTH_Ginteger range 9 to 13:= 10
PIPE_STAGES_Gnatural range 0 to 16:= 0
TPD_Gtime := 1 ns
Definition: FifoSync.vhd:29
EMPTY_THRES_Ginteger range 1 to 8190:= 1
ALTERA_RAM_Gstring := "M9K"
Definition: FifoSync.vhd:37
out prog_emptysl
Definition: FifoAsync.vhd:64
XIL_DEVICE_Gstring := "7SERIES"
RST_POLARITY_Gsl := '1'
Definition: Fifo.vhd:29
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
Definition: FifoAsync.vhd:38
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
Definition: FifoSync.vhd:39
ALTERA_SYN_Gboolean := false
Definition: FifoAsync.vhd:34
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
Definition: Fifo.vhd:41
FWFT_EN_Gboolean := false
FWFT_EN_Gboolean := false
INIT_Gslv := "0"
Definition: FifoAsync.vhd:40
in wr_clksl
Definition: Fifo.vhd:50
ALTERA_RAM_Gstring := "M9K"
Definition: FifoAsync.vhd:35
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
out prog_fullsl
Definition: FifoAsync.vhd:53
ADDR_WIDTH_Ginteger range 2 to 48:= 4
Definition: FifoAsync.vhd:39
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoSync.vhd:49
RST_POLARITY_Gsl := '1'
Definition: FifoSync.vhd:30
out emptysl
Definition: FifoSync.vhd:62
in dinslv( DATA_WIDTH_G- 1 downto 0)
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoSync.vhd:42
out data_countslv( ADDR_WIDTH_G- 1 downto 0)
FULL_THRES_Ginteger range 1 to 8190:= 1
XIL_DEVICE_Gstring := "7SERIES"
out wr_acksl
Definition: FifoAsync.vhd:51
RST_POLARITY_Gsl := '1'
out emptysl
Definition: FifoAsync.vhd:66
out fullsl
Definition: Fifo.vhd:58
out validsl
Definition: Fifo.vhd:65
EMPTY_THRES_Ginteger range 1 to 8190:= 1
in rd_ensl := '0'
Definition: Fifo.vhd:62
out underflowsl
Definition: Fifo.vhd:66
DATA_WIDTH_Ginteger range 1 to 72:= 18
out underflowsl
Definition: FifoSync.vhd:55
out overflowsl
Definition: Fifo.vhd:55
ALTERA_RAM_Gstring := "M9K"
Definition: Fifo.vhd:36
in dinslv( DATA_WIDTH_G- 1 downto 0)
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoSync.vhd:50
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoAsync.vhd:61
USE_DSP48_Gstring := "no"
Definition: FifoAsync.vhd:33
GEN_SYNC_FIFO_Gboolean := false
Definition: Fifo.vhd:31
in clksl
Definition: FifoSync.vhd:46
out overflowsl
Definition: FifoAsync.vhd:52
in rd_ensl
Definition: FifoSync.vhd:48
INIT_Gslv := "0"
Definition: Fifo.vhd:43
out not_fullsl
Definition: Fifo.vhd:59
FWFT_EN_Gboolean := false
Definition: FifoAsync.vhd:32
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:63
in rstsl :=not RST_POLARITY_G
Definition: Fifo.vhd:48
out almost_fullsl
Definition: FifoSync.vhd:58
RST_ASYNC_Gboolean := false
Definition: FifoSync.vhd:31
PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: Fifo.vhd:40
ADDR_WIDTH_Ginteger range 4 to 48:= 4
Definition: Fifo.vhd:42
FWFT_EN_Gboolean := false
Definition: FifoSync.vhd:34
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoAsync.vhd:41
out wr_acksl
Definition: FifoSync.vhd:52
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoAsync.vhd:49
USE_BUILT_IN_Gboolean := false
Definition: Fifo.vhd:37
out fullsl
Definition: FifoAsync.vhd:55
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoAsync.vhd:50
out not_fullsl
Definition: FifoSync.vhd:61
out validsl
Definition: FifoAsync.vhd:62
TPD_Gtime := 1 ns
out prog_fullsl
Definition: Fifo.vhd:56
INIT_Gslv := "0"
Definition: FifoSync.vhd:41
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoSync.vhd:43
out fullsl
Definition: FifoSync.vhd:60
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: Fifo.vhd:64
out prog_emptysl
Definition: Fifo.vhd:67
USE_DSP48_Gstring := "no"
BRAM_EN_Gboolean := true
Definition: FifoAsync.vhd:31
PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: Fifo.vhd:26
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
TPD_Gtime := 1 ns
Definition: FifoAsync.vhd:29
out almost_emptysl
Definition: FifoAsync.vhd:65
in wr_ensl := '0'
Definition: Fifo.vhd:51