SURF  1.0
AxiLiteFifoPop.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiLiteFifoPop.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-04-02
5 -- Last update: 2016-04-26
6 -------------------------------------------------------------------------------
7 -- Description:
8 -- Supports reading of general purpose FIFOs from the AxiLite bus.
9 -- One address location per FIFO.
10 -------------------------------------------------------------------------------
11 -- This file is part of 'SLAC Firmware Standard Library'.
12 -- It is subject to the license terms in the LICENSE.txt file found in the
13 -- top-level directory of this distribution and at:
14 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
15 -- No part of 'SLAC Firmware Standard Library', including this file,
16 -- may be copied, modified, propagated, or distributed except according to
17 -- the terms contained in the LICENSE.txt file.
18 -------------------------------------------------------------------------------
19 
20 library ieee;
21 use ieee.std_logic_1164.all;
22 use IEEE.STD_LOGIC_ARITH.ALL;
23 use IEEE.STD_LOGIC_UNSIGNED.ALL;
24 
25 use work.StdRtlPkg.all;
26 use work.AxiLitePkg.all;
27 
28 --! @see entity
29  --! @ingroup axi
30 entity AxiLiteFifoPop is
31  generic (
32  TPD_G : time := 1 ns;
33  POP_FIFO_COUNT_G : positive := 1;
34  POP_SYNC_FIFO_G : boolean := false;
35  POP_BRAM_EN_G : boolean := true;
36  POP_ADDR_WIDTH_G : integer range 4 to 48 := 4;
37  POP_FULL_THRES_G : integer range 1 to (2**24) := 1;
38  LOOP_FIFO_EN_G : boolean := false;
39  LOOP_FIFO_COUNT_G : positive := 1;
40  LOOP_BRAM_EN_G : boolean := true;
41  LOOP_ADDR_WIDTH_G : integer range 4 to 48 := 4;
42  RANGE_LSB_G : integer range 0 to 31 := 8;
43  VALID_POSITION_G : integer range 0 to 31 := 0;
44  VALID_POLARITY_G : sl := '0';
45  ALTERA_SYN_G : boolean := false;
46  ALTERA_RAM_G : string := "M9K";
47  USE_BUILT_IN_G : boolean := false;
48  XIL_DEVICE_G : string := "7SERIES"
49  );
50  port (
51 
52  -- AXI Interface (axiClk)
53  axiClk : in sl;
54  axiClkRst : in sl;
59  popFifoValid : out slv(POP_FIFO_COUNT_G-1 downto 0);
60  popFifoAEmpty : out slv(POP_FIFO_COUNT_G-1 downto 0);
61  loopFifoValid : out slv(LOOP_FIFO_COUNT_G-1 downto 0);
63  loopFifoAFull : out slv(LOOP_FIFO_COUNT_G-1 downto 0);
64 
65  -- POP FIFO Write Interface (popFifoClk)
66  popFifoClk : in slv(POP_FIFO_COUNT_G-1 downto 0);
67  popFifoRst : in slv(POP_FIFO_COUNT_G-1 downto 0);
68  popFifoWrite : in slv(POP_FIFO_COUNT_G-1 downto 0);
70  popFifoFull : out slv(POP_FIFO_COUNT_G-1 downto 0);
71  popFifoAFull : out slv(POP_FIFO_COUNT_G-1 downto 0);
72  popFifoPFull : out slv(POP_FIFO_COUNT_G-1 downto 0)
73  );
74 end AxiLiteFifoPop;
75 
76 architecture structure of AxiLiteFifoPop is
77 
78  constant POP_SIZE_C : integer := bitSize(POP_FIFO_COUNT_G-1);
79  constant POP_COUNT_C : integer := 2**POP_SIZE_C;
80  constant LOOP_SIZE_C : integer := bitSize(LOOP_FIFO_COUNT_G-1);
81  constant LOOP_COUNT_C : integer := 2**LOOP_SIZE_C;
82 
83  -- Local Signals
84  signal ipopFifoValid : slv(POP_COUNT_C-1 downto 0);
85  signal ipopFifoDout : Slv32Array(POP_COUNT_C-1 downto 0);
86  signal ipopFifoRead : slv(POP_COUNT_C-1 downto 0);
87  signal iloopFifoDin : slv(31 downto 0);
88  signal iloopFifoWrite : Slv(LOOP_COUNT_C-1 downto 0);
89  signal iloopFifoValid : slv(LOOP_COUNT_C-1 downto 0);
90  signal iloopFifoDout : Slv32Array(LOOP_COUNT_C-1 downto 0);
91  signal iloopFifoRead : slv(LOOP_COUNT_C-1 downto 0);
92 
93  type RegType is record
94  loopFifoDin : slv(31 downto 0);
95  loopFifoWrite : Slv(LOOP_COUNT_C-1 downto 0);
96  loopFifoRead : slv(LOOP_COUNT_C-1 downto 0);
97  popFifoRead : slv(POP_COUNT_C-1 downto 0);
100  end record RegType;
101 
102  constant REG_INIT_C : RegType := (
103  loopFifoDin => (others => '0'),
104  loopFifoWrite => (others => '0'),
105  loopFifoRead => (others => '0'),
106  popFifoRead => (others => '0'),
109  );
110 
111  signal r : RegType := REG_INIT_C;
112  signal rin : RegType;
113 
114 begin
115 
116  assert RANGE_LSB_G > (POP_SIZE_C +2)
117  report "RANGE_LSB_G is too small for POP_FIFO_COUNT_G" severity failure;
118 
119  assert RANGE_LSB_G > (LOOP_SIZE_C +2)
120  report "RANGE_LSB_G is too small for LOOP_FIFO_COUNT_G" severity failure;
121 
122  -----------------------------------------
123  -- pop FIFOs
124  -----------------------------------------
125  U_ReadFifo : for i in 0 to POP_FIFO_COUNT_G-1 generate
126  U_FIfo : entity work.FifoCascade
127  generic map (
128  TPD_G => TPD_G,
129  CASCADE_SIZE_G => 1,
130  LAST_STAGE_ASYNC_G => true,
131  RST_POLARITY_G => '1',
132  RST_ASYNC_G => true,
135  FWFT_EN_G => true,
136  USE_DSP48_G => "no",
141  SYNC_STAGES_G => 3,
142  DATA_WIDTH_G => 32,
144  INIT_G => "0",
146  EMPTY_THRES_G => 1
147  ) port map (
148  rst => popFifoRst(i),
149  wr_clk => popFifoClk(i),
150  wr_en => popFifoWrite(i),
151  din => popFifoDin(i),
152  wr_data_count => open,
153  wr_ack => open,
154  overflow => open,
155  prog_full => popFifoPFull(i),
157  full => popFifoFull(i),
158  not_full => open,
159  rd_clk => axiClk,
160  rd_en => ipopFifoRead(i),
161  dout => ipopFifoDout(i),
162  rd_data_count => open,
163  valid => ipopFifoValid(i),
164  underflow => open,
165  prog_empty => open,
167  empty => open
168  );
169 
170  popFifoValid(i) <= ipopFifoValid(i);
171  end generate;
172 
173  U_ReadUnused : if POP_FIFO_COUNT_G /= POP_COUNT_C generate
174  ipopFifoValid(POP_COUNT_C-1 downto POP_FIFO_COUNT_G) <= (others=>'0');
175  ipopFifoDout(POP_COUNT_C-1 downto POP_FIFO_COUNT_G) <= (others=>(others=>'0'));
176  end generate;
177 
178 
179  -----------------------------------------
180  -- Loop FIFOs
181  -----------------------------------------
182  U_LoopFifoEn : if LOOP_FIFO_EN_G generate
183  U_LoopFifo : for i in 0 to LOOP_FIFO_COUNT_G-1 generate
184  U_FIfo : entity work.FifoCascade
185  generic map (
186  TPD_G => TPD_G,
187  CASCADE_SIZE_G => 1,
188  LAST_STAGE_ASYNC_G => true,
189  RST_POLARITY_G => '1',
190  RST_ASYNC_G => true,
191  GEN_SYNC_FIFO_G => true,
193  FWFT_EN_G => true,
194  USE_DSP48_G => "no",
199  SYNC_STAGES_G => 3,
200  DATA_WIDTH_G => 32,
202  INIT_G => "0",
203  FULL_THRES_G => 1,
204  EMPTY_THRES_G => 1
205  ) port map (
206  rst => axiClkRst,
207  wr_clk => axiClk,
208  wr_en => iloopFifoWrite(i),
209  din => iloopFifoDin,
210  wr_data_count => open,
211  wr_ack => open,
212  overflow => open,
213  prog_full => open,
215  full => open,
216  not_full => open,
217  rd_clk => axiClk,
218  rd_en => iloopFifoRead(i),
219  dout => iloopFifoDout(i),
220  rd_data_count => open,
221  valid => iloopFifoValid(i),
222  underflow => open,
223  prog_empty => open,
225  empty => open
226  );
227  loopFifoValid(i) <= iloopFifoValid(i);
228 
229  end generate;
230  end generate;
231 
232  U_LoopDis : if LOOP_FIFO_EN_G = false generate
233  loopFifoAFull(LOOP_FIFO_COUNT_G-1 downto 0) <= (others=>'0');
234  iloopFifoDout(LOOP_FIFO_COUNT_G-1 downto 0) <= (others=>(others=>'0'));
235  iloopFifoValid(LOOP_FIFO_COUNT_G-1 downto 0) <= (others=>'0');
236  loopFifoValid(LOOP_FIFO_COUNT_G-1 downto 0) <= (others=>'0');
237  loopFifoAEmpty(LOOP_FIFO_COUNT_G-1 downto 0) <= (others=>'0');
238  end generate;
239 
240  U_LoopUnused : if LOOP_FIFO_COUNT_G /= LOOP_COUNT_C generate
241  iloopFifoValid(LOOP_COUNT_C-1 downto LOOP_FIFO_COUNT_G) <= (others=>'0');
242  iloopFifoDout(LOOP_COUNT_C-1 downto LOOP_FIFO_COUNT_G) <= (others=>(others=>'0'));
243  end generate;
244 
245 
246  -----------------------------------------
247  -- AXI Lite
248  -----------------------------------------
249 
250  -- Sync
251  process (axiClk) is
252  begin
253  if (rising_edge(axiClk)) then
254  r <= rin after TPD_G;
255  end if;
256  end process;
257 
258  -- Async
260  variable v : RegType;
261  variable axiStatus : AxiLiteStatusType;
262  begin
263  v := r;
264 
265  v.popFifoRead := (others=>'0');
266  v.loopFifoRead := (others=>'0');
267  v.loopFifoWrite := (others=>'0');
268 
270 
271  -- Write
272  if (axiStatus.writeEnable = '1') then
273 
274  if axiWriteMaster.awaddr(RANGE_LSB_G) = '1' then
276 
277  v.loopFifoWrite(conv_integer(axiWriteMaster.awaddr(LOOP_SIZE_C+1 downto 2))) := '1';
278 
279  end if;
280 
281  axiSlaveWriteResponse(v.axiWriteSlave);
282  end if;
283 
284  -- Read
285  if (axiStatus.readEnable = '1') then
286 
287 
288  if axiReadMaster.araddr(RANGE_LSB_G) = '0' then
289 
290  v.axiReadSlave.rdata := ipopFifoDout(conv_integer(axiReadMaster.araddr(POP_SIZE_C+1 downto 2)));
291 
293  VALID_POLARITY_G xor (not ipopFifoValid(conv_integer(axiReadMaster.araddr(POP_SIZE_C+1 downto 2))));
294 
295  v.popFifoRead(conv_integer(axiReadMaster.araddr(POP_SIZE_C+1 downto 2))) :=
296  ipopFifoValid(conv_integer(axiReadMaster.araddr(POP_SIZE_C+1 downto 2)));
297 
298  else
299 
300  v.axiReadSlave.rdata := iloopFifoDout(conv_integer(axiReadMaster.araddr(LOOP_SIZE_C+1 downto 2)));
301 
303  VALID_POLARITY_G xor (not iloopFifoValid(conv_integer(axiReadMaster.araddr(LOOP_SIZE_C+1 downto 2))));
304 
305  v.loopFifoRead(conv_integer(axiReadMaster.araddr(LOOP_SIZE_C+1 downto 2))) :=
306  iloopFifoValid(conv_integer(axiReadMaster.araddr(LOOP_SIZE_C+1 downto 2)));
307 
308  end if;
309 
310  -- Send Axi Response
311  axiSlaveReadResponse(v.axiReadSlave);
312 
313  end if;
314 
315  -- Reset
316  if (axiClkRst = '1') then
317  v := REG_INIT_C;
318  end if;
319 
320  -- Next register assignment
321  rin <= v;
322 
323  -- Outputs
330 
331  end process;
332 
333 end architecture structure;
334 
out almost_fullsl
Definition: FifoCascade.vhd:59
in axiReadMasterAxiLiteReadMasterType
ALTERA_RAM_Gstring := "M9K"
Definition: FifoCascade.vhd:38
out validsl
Definition: FifoCascade.vhd:68
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:66
XIL_DEVICE_Gstring := "7SERIES"
Definition: FifoCascade.vhd:40
Slv( LOOP_COUNT_C- 1 downto 0) loopFifoWrite
slv( 31 downto 0) loopFifoDin
array(natural range <> ) of slv( 31 downto 0) Slv32Array
Definition: StdRtlPkg.vhd:379
POP_ADDR_WIDTH_Ginteger range 4 to 48:= 4
ALTERA_RAM_Gstring := "M9K"
out popFifoPFullslv( POP_FIFO_COUNT_G- 1 downto 0)
slv( POP_COUNT_C- 1 downto 0) ipopFifoRead
VALID_POLARITY_Gsl := '0'
out popFifoFullslv( POP_FIFO_COUNT_G- 1 downto 0)
RST_ASYNC_Gboolean := false
Definition: FifoCascade.vhd:32
out almost_emptysl
Definition: FifoCascade.vhd:71
POP_BRAM_EN_Gboolean := true
in popFifoRstslv( POP_FIFO_COUNT_G- 1 downto 0)
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
INIT_Gslv := "0"
Definition: FifoCascade.vhd:45
std_logic sl
Definition: StdRtlPkg.vhd:28
RegType := REG_INIT_C r
_library_ IEEEIEEE
Definition: StdRtlPkg.vhd:18
AxiLiteWriteSlaveType axiWriteSlave
BRAM_EN_Gboolean := true
Definition: FifoCascade.vhd:34
slv( 31 downto 0) rdata
Definition: AxiLitePkg.vhd:89
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:54
out popFifoAEmptyslv( POP_FIFO_COUNT_G- 1 downto 0)
AxiLiteReadSlaveType axiReadSlave
Slv32Array( POP_COUNT_C- 1 downto 0) ipopFifoDout
slv( POP_COUNT_C- 1 downto 0) ipopFifoValid
ALTERA_SYN_Gboolean := false
out axiReadSlaveAxiLiteReadSlaveType
in rd_clksl
Definition: FifoCascade.vhd:64
out prog_fullsl
Definition: FifoCascade.vhd:58
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:47
in popFifoWriteslv( POP_FIFO_COUNT_G- 1 downto 0)
USE_BUILT_IN_Gboolean := false
ALTERA_SYN_Gboolean := false
Definition: FifoCascade.vhd:37
slv( 31 downto 0) wdata
Definition: AxiLitePkg.vhd:117
in rd_ensl := '0'
Definition: FifoCascade.vhd:65
AxiLiteStatusType axiStatus
Definition: AxiLitePkg.vhd:183
Slv( LOOP_COUNT_C- 1 downto 0) iloopFifoWrite
out wr_acksl
Definition: FifoCascade.vhd:56
in rstsl := '0'
Definition: FifoCascade.vhd:50
slv( LOOP_COUNT_C- 1 downto 0) iloopFifoValid
in wr_clksl
Definition: FifoCascade.vhd:52
LOOP_BRAM_EN_Gboolean := true
out overflowsl
Definition: FifoCascade.vhd:57
RANGE_LSB_Ginteger range 0 to 31:= 8
integer := bitSize( POP_FIFO_COUNT_G- 1) POP_SIZE_C
RegType :=(loopFifoDin =>( others => '0'),loopFifoWrite =>( others => '0'),loopFifoRead =>( others => '0'),popFifoRead =>( others => '0'),axiReadSlave => AXI_LITE_READ_SLAVE_INIT_C,axiWriteSlave => AXI_LITE_WRITE_SLAVE_INIT_C) REG_INIT_C
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:46
out loopFifoValidslv( LOOP_FIFO_COUNT_G- 1 downto 0)
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: FifoCascade.vhd:41
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
POP_FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
slv( 31 downto 0) awaddr
Definition: AxiLitePkg.vhd:113
in wr_ensl := '0'
Definition: FifoCascade.vhd:53
Slv32Array( LOOP_COUNT_C- 1 downto 0) iloopFifoDout
AxiLiteReadSlaveType :=(arready => '0',rdata =>( others => '0'),rresp =>( others => '0'),rvalid => '0') AXI_LITE_READ_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:95
LOOP_FIFO_EN_Gboolean := false
TPD_Gtime := 1 ns
out fullsl
Definition: FifoCascade.vhd:60
POP_FIFO_COUNT_Gpositive := 1
VALID_POSITION_Ginteger range 0 to 31:= 0
integer := 2** LOOP_SIZE_C LOOP_COUNT_C
in popFifoClkslv( POP_FIFO_COUNT_G- 1 downto 0)
out loopFifoAEmptyslv( LOOP_FIFO_COUNT_G- 1 downto 0)
GEN_SYNC_FIFO_Gboolean := false
Definition: FifoCascade.vhd:33
slv( 31 downto 0) iloopFifoDin
out loopFifoAFullslv( LOOP_FIFO_COUNT_G- 1 downto 0)
POP_SYNC_FIFO_Gboolean := false
TPD_Gtime := 1 ns
Definition: FifoCascade.vhd:28
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
in axiWriteMasterAxiLiteWriteMasterType := AXI_LITE_WRITE_MASTER_INIT_C
AxiLiteWriteMasterType :=(awaddr =>( others => '0'),awprot =>( others => '0'),awvalid => '0',wdata =>( others => '0'),wstrb =>( others => '1'),wvalid => '0',bready => '1') AXI_LITE_WRITE_MASTER_INIT_C
Definition: AxiLitePkg.vhd:125
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: FifoCascade.vhd:44
slv( 31 downto 0) araddr
Definition: AxiLitePkg.vhd:61
USE_BUILT_IN_Gboolean := false
Definition: FifoCascade.vhd:39
out popFifoAFullslv( POP_FIFO_COUNT_G- 1 downto 0)
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
slv( LOOP_COUNT_C- 1 downto 0) iloopFifoRead
XIL_DEVICE_Gstring := "7SERIES"
out underflowsl
Definition: FifoCascade.vhd:69
integer := bitSize( LOOP_FIFO_COUNT_G- 1) LOOP_SIZE_C
LOOP_FIFO_COUNT_Gpositive := 1
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:29
out prog_emptysl
Definition: FifoCascade.vhd:70
slv( POP_COUNT_C- 1 downto 0) popFifoRead
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:55
LOOP_ADDR_WIDTH_Ginteger range 4 to 48:= 4
AxiLiteWriteSlaveType :=(awready => '0',wready => '0',bresp =>( others => '0'),bvalid => '0') AXI_LITE_WRITE_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:156
out popFifoValidslv( POP_FIFO_COUNT_G- 1 downto 0)
RST_POLARITY_Gsl := '1'
Definition: FifoCascade.vhd:31
out axiWriteSlaveAxiLiteWriteSlaveType
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
in popFifoDinSlv32Array( POP_FIFO_COUNT_G- 1 downto 0)
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:67
integer := 2** POP_SIZE_C POP_COUNT_C
slv( LOOP_COUNT_C- 1 downto 0) loopFifoRead