SURF  1.0
AxiReadPathFifo.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiReadPathFifo.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-25
5 -- Last update: 2014-05-01
6 -------------------------------------------------------------------------------
7 -- Description: FIFO for AXI write path transactions.
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.std_logic_unsigned.all;
21 use ieee.std_logic_arith.all;
22 
23 use work.StdRtlPkg.all;
24 use work.AxiPkg.all;
25 
26 --! @see entity
27  --! @ingroup axi
28 entity AxiReadPathFifo is
29  generic (
30 
31  -- General Configurations
32  TPD_G : time := 1 ns;
33 
34  -- General FIFO configurations
35  XIL_DEVICE_G : string := "7SERIES";
36  USE_BUILT_IN_G : boolean := false;
37  GEN_SYNC_FIFO_G : boolean := false;
38  ALTERA_SYN_G : boolean := false;
39  ALTERA_RAM_G : string := "M9K";
40 
41  -- Bit Optimizations
42  ADDR_LSB_G : natural range 0 to 31 := 0;
43  ID_FIXED_EN_G : boolean := false;
44  SIZE_FIXED_EN_G : boolean := false;
45  BURST_FIXED_EN_G : boolean := false;
46  LEN_FIXED_EN_G : boolean := false;
47  LOCK_FIXED_EN_G : boolean := false;
48  PROT_FIXED_EN_G : boolean := false;
49  CACHE_FIXED_EN_G : boolean := false;
50 
51  -- Address FIFO Config
52  ADDR_BRAM_EN_G : boolean := true;
53  ADDR_CASCADE_SIZE_G : integer range 1 to (2**24) := 1;
54  ADDR_FIFO_ADDR_WIDTH_G : integer range 4 to 48 := 9;
55 
56  -- Data FIFO Config
57  DATA_BRAM_EN_G : boolean := true;
58  DATA_CASCADE_SIZE_G : integer range 1 to (2**24) := 1;
59  DATA_FIFO_ADDR_WIDTH_G : integer range 4 to 48 := 9;
60 
61  -- BUS Config
63  );
64  port (
65 
66  -- Slave Port
67  sAxiClk : in sl;
68  sAxiRst : in sl;
71 
72  -- Master Port
73  mAxiClk : in sl;
74  mAxiRst : in sl;
77 end AxiReadPathFifo;
78 
79 architecture rtl of AxiReadPathFifo is
80 
81  constant ADDR_BITS_C : integer := AXI_CONFIG_G.ADDR_WIDTH_C - ADDR_LSB_G;
82  constant ID_BITS_C : integer := ite(ID_FIXED_EN_G,0,AXI_CONFIG_G.ID_BITS_C);
83  constant LEN_BITS_C : integer := ite(LEN_FIXED_EN_G,0,AXI_CONFIG_G.LEN_BITS_C);
84  constant SIZE_BITS_C : integer := ite(SIZE_FIXED_EN_G,0,3);
85  constant BURST_BITS_C : integer := ite(BURST_FIXED_EN_G,0,2);
86  constant LOCK_BITS_C : integer := ite(LOCK_FIXED_EN_G,0,2);
87  constant PROT_BITS_C : integer := ite(PROT_FIXED_EN_G,0,3);
88  constant CACHE_BITS_C : integer := ite(CACHE_FIXED_EN_G,0,4);
89  constant DATA_BITS_C : integer := AXI_CONFIG_G.DATA_BYTES_C*8;
90  constant STRB_BITS_C : integer := AXI_CONFIG_G.DATA_BYTES_C;
91  constant RESP_BITS_C : integer := 2;
92 
93  constant ADDR_FIFO_SIZE_C : integer := ADDR_BITS_C + ID_BITS_C + LEN_BITS_C + SIZE_BITS_C +
94  BURST_BITS_C + LOCK_BITS_C + PROT_BITS_C + CACHE_BITS_C;
95 
96  constant DATA_FIFO_SIZE_C : integer := 1 + DATA_BITS_C + RESP_BITS_C + ID_BITS_C;
97 
98  -- Convert address record to slv
99  function addrToSlv (din : AxiReadMasterType) return slv is
100  variable retValue : slv(ADDR_FIFO_SIZE_C-1 downto 0);
101  variable i : integer;
102  begin
103 
104  retValue(ADDR_BITS_C-1 downto 0) := din.araddr(AXI_CONFIG_G.ADDR_WIDTH_C-1 downto ADDR_LSB_G);
105  i := ADDR_BITS_C;
106 
107  if ID_FIXED_EN_G = false then
108  retValue((ID_BITS_C+i)-1 downto i) := din.arid(ID_BITS_C-1 downto 0);
109  i := i + ID_BITS_C;
110  end if;
111 
112  if LEN_FIXED_EN_G = false then
113  retValue((LEN_BITS_C+i)-1 downto i) := din.arlen(LEN_BITS_C-1 downto 0);
114  i := i + LEN_BITS_C;
115  end if;
116 
117  if SIZE_FIXED_EN_G = false then
118  retValue((SIZE_BITS_C+i)-1 downto i) := din.arsize(SIZE_BITS_C-1 downto 0);
119  i := i + SIZE_BITS_C;
120  end if;
121 
122  if BURST_FIXED_EN_G = false then
123  retValue((BURST_BITS_C+i)-1 downto i) := din.arburst(BURST_BITS_C-1 downto 0);
124  i := i + BURST_BITS_C;
125  end if;
126 
127  if LOCK_FIXED_EN_G = false then
128  retValue((LOCK_BITS_C+i)-1 downto i) := din.arlock(LOCK_BITS_C-1 downto 0);
129  i := i + LOCK_BITS_C;
130  end if;
131 
132  if PROT_FIXED_EN_G = false then
133  retValue((PROT_BITS_C+i)-1 downto i) := din.arprot(PROT_BITS_C-1 downto 0);
134  i := i + PROT_BITS_C;
135  end if;
136 
137  if CACHE_FIXED_EN_G = false then
138  retValue((CACHE_BITS_C+i)-1 downto i) := din.arcache(CACHE_BITS_C-1 downto 0);
139  i := i + CACHE_BITS_C;
140  end if;
141 
142  return(retValue);
143 
144  end function;
145 
146  -- Convert slv to address record
147 - procedure slvToAddr (din : in slv(ADDR_FIFO_SIZE_C1 downto 0);
148  valid : in sl;
149  slave : in AxiReadMasterType;
150  master : inout AxiReadMasterType ) is
151  variable i : integer;
152  begin
153 
154  -- Set valid,
155  master.arvalid := valid;
156 
157  master.araddr := (others=>'0');
158  master.araddr(AXI_CONFIG_G.ADDR_WIDTH_C-1 downto ADDR_LSB_G) := din(ADDR_BITS_C-1 downto 0);
159  i := ADDR_BITS_C;
160 
161  if ID_FIXED_EN_G then
162  master.arid := slave.arid;
163  else
164  master.arid := (others=>'0');
165  master.arid(ID_BITS_C-1 downto 0) := din((ID_BITS_C+i)-1 downto i);
166  i := i + ID_BITS_C;
167  end if;
168 
169  if LEN_FIXED_EN_G then
170  master.arlen := slave.arlen;
171  else
172  master.arlen := (others=>'0');
173  master.arlen(LEN_BITS_C-1 downto 0) := din((LEN_BITS_C+i)-1 downto i);
174  i := i + LEN_BITS_C;
175  end if;
176 
177  if SIZE_FIXED_EN_G then
178  master.arsize := slave.arsize;
179  else
180  master.arsize := (others=>'0');
181  master.arsize(SIZE_BITS_C-1 downto 0) := din((SIZE_BITS_C+i)-1 downto i);
182  i := i + SIZE_BITS_C;
183  end if;
184 
185  if BURST_FIXED_EN_G then
186  master.arburst := slave.arburst;
187  else
188  master.arburst := (others=>'0');
189  master.arburst(BURST_BITS_C-1 downto 0) := din((BURST_BITS_C+i)-1 downto i);
190  i := i + BURST_BITS_C;
191  end if;
192 
193  if LOCK_FIXED_EN_G then
194  master.arlock := slave.arlock;
195  else
196  master.arlock := (others=>'0');
197  master.arlock(LOCK_BITS_C-1 downto 0) := din((LOCK_BITS_C+i)-1 downto i);
198  i := i + LOCK_BITS_C;
199  end if;
200 
201  if PROT_FIXED_EN_G then
202  master.arprot := (others=>'0');
203  master.arprot := slave.arprot;
204  else
205  master.arprot(PROT_BITS_C-1 downto 0) := din((PROT_BITS_C+i)-1 downto i);
206  i := i + PROT_BITS_C;
207  end if;
208 
209  if CACHE_FIXED_EN_G then
210  master.arcache := (others=>'0');
211  master.arcache := slave.arcache;
212  else
213  master.arcache(CACHE_BITS_C-1 downto 0) := din((CACHE_BITS_C+i)-1 downto i);
214  i := i + CACHE_BITS_C;
215  end if;
216 
217  end procedure;
218 
219  -- Convert data record to slv
220  function dataToSlv (din : AxiReadSlaveType) return slv is
221  variable retValue : slv(DATA_FIFO_SIZE_C-1 downto 0);
222  variable i : integer;
223  begin
224 
225  retValue(0) := din.rlast;
226  i := 1;
227 
228  retValue((DATA_BITS_C+i)-1 downto i) := din.rdata(DATA_BITS_C-1 downto 0);
229  i := i + DATA_BITS_C;
230 
231  if ID_FIXED_EN_G = false then
232  retValue((ID_BITS_C+i)-1 downto i) := din.rid(ID_BITS_C-1 downto 0);
233  i := i + ID_BITS_C;
234  end if;
235 
236  retValue((RESP_BITS_C+i)-1 downto i) := din.rresp;
237  i := RESP_BITS_C;
238 
239  return(retValue);
240 
241  end function;
242 
243  -- Convert slv to data record
244 - procedure slvToData (din : in slv(DATA_FIFO_SIZE_C1 downto 0);
245  valid : in sl;
246  master : in AxiReadMasterType;
247  slave : inout AxiReadSlaveType ) is
248  variable i : integer;
249  begin
250 
251  -- Set valid,
252  slave.rvalid := valid;
253  slave.rlast := din(0);
254  i := 1;
255 
256  slave.rdata := (others=>'0');
257  slave.rdata(DATA_BITS_C-1 downto 0) := din((DATA_BITS_C+i)-1 downto i);
258  i := i + DATA_BITS_C;
259 
260  if ID_FIXED_EN_G then
261  slave.rid := master.arid;
262  else
263  slave.rid := (others=>'0');
264  slave.rid(ID_BITS_C-1 downto 0) := din((ID_BITS_C+i)-1 downto i);
265  i := i + ID_BITS_C;
266  end if;
267 
268  slave.rresp := din((RESP_BITS_C+i)-1 downto i);
269  i := RESP_BITS_C;
270 
271  end procedure;
272 
273  signal addrFifoWrite : sl;
274  signal addrFifoDin : slv(ADDR_FIFO_SIZE_C-1 downto 0);
275  signal addrFifoDout : slv(ADDR_FIFO_SIZE_C-1 downto 0);
276  signal addrFifoValid : sl;
277  signal addrFifoAFull : sl;
278  signal addrFifoRead : sl;
279  signal dataFifoWrite : sl;
280  signal dataFifoDin : slv(DATA_FIFO_SIZE_C-1 downto 0);
281  signal dataFifoDout : slv(DATA_FIFO_SIZE_C-1 downto 0);
282  signal dataFifoValid : sl;
283  signal dataFifoAFull : sl;
284  signal dataFifoRead : sl;
285 
286 begin
287 
288  -------------------------
289  -- FIFOs
290  -------------------------
291 
292  U_AddrFifo : entity work.FifoCascade
293  generic map (
294  TPD_G => TPD_G,
296  LAST_STAGE_ASYNC_G => true,
297  RST_POLARITY_G => '1',
298  RST_ASYNC_G => false,
301  FWFT_EN_G => true,
302  USE_DSP48_G => "no",
307  SYNC_STAGES_G => 3,
308  DATA_WIDTH_G => ADDR_FIFO_SIZE_C,
310  INIT_G => "0",
311  FULL_THRES_G => 1,
312  EMPTY_THRES_G => 1
313  )
314  port map (
315  rst => sAxiRst,
316  wr_clk => sAxiClk,
317  wr_en => addrFifoWrite,
318  din => addrFifoDin,
319  wr_data_count => open,
320  wr_ack => open,
321  overflow => open,
322  prog_full => open,
323  almost_full => addrFifoAFull,
324  full => open,
325  not_full => open,
326  rd_clk => mAxiClk,
327  rd_en => addrFifoRead,
328  dout => addrFifoDout,
329  rd_data_count => open,
330  valid => addrFifoValid,
331  underflow => open,
332  prog_empty => open,
333  almost_empty => open,
334  empty => open
335  );
336 
337  U_DataFifo : entity work.FifoCascade
338  generic map (
339  TPD_G => TPD_G,
341  LAST_STAGE_ASYNC_G => true,
342  RST_POLARITY_G => '1',
343  RST_ASYNC_G => false,
346  FWFT_EN_G => true,
347  USE_DSP48_G => "no",
352  SYNC_STAGES_G => 3,
353  DATA_WIDTH_G => DATA_FIFO_SIZE_C,
355  INIT_G => "0",
356  FULL_THRES_G => 1,
357  EMPTY_THRES_G => 1
358  )
359  port map (
360  rst => sAxiRst,
361  wr_clk => mAxiClk,
362  wr_en => dataFifoWrite,
363  din => dataFifoDin,
364  wr_data_count => open,
365  wr_ack => open,
366  overflow => open,
367  prog_full => open,
368  almost_full => dataFifoAFull,
369  full => open,
370  not_full => open,
371  rd_clk => sAxiClk,
372  rd_en => dataFifoRead,
373  dout => dataFifoDout,
374  rd_data_count => open,
375  valid => dataFifoValid,
376  underflow => open,
377  prog_empty => open,
378  almost_empty => open,
379  empty => open
380  );
381 
382 
383  -------------------------
384  -- Fifo Inputs
385  -------------------------
386 
387  addrFifoDin <= addrToSlv(sAxiReadMaster);
388  addrFifoWrite <= sAxiReadMaster.arvalid and (not addrFifoAFull);
389 
390  dataFifoDin <= dataToSlv(mAxiReadSlave);
391  dataFifoWrite <= mAxiReadSlave.rvalid and (not dataFifoAFull);
392 
393  -------------------------
394  -- Fifo Reads
395  -------------------------
396  addrFifoRead <= mAxiReadSlave.arready and addrFifoValid;
397  dataFifoRead <= sAxiReadMaster.rready and dataFifoValid;
398 
399  -------------------------
400  -- Fifo Outputs
401  -------------------------
402 
403  process ( sAxiReadMaster, mAxiReadSlave,
404  addrFifoDout, addrFifoAFull, addrFifoValid,
405  dataFifoDout, dataFifoAFull, dataFifoValid ) is
406 
407  variable imAxiReadMaster : AxiReadMasterType;
408  variable isAxiReadSlave : AxiReadSlaveType;
409 
410  begin
411 
412  imAxiReadMaster := AXI_READ_MASTER_INIT_C;
413  isAxiReadSlave := AXI_READ_SLAVE_INIT_C;
414 
415  slvToAddr(addrFifoDout, addrFifoValid, sAxiReadMaster, imAxiReadMaster);
416  slvToData(dataFifoDout, dataFifoValid, sAxiReadMaster, isAxiReadSlave);
417 
418  isAxiReadSlave.arready := not addrFifoAFull;
419  imAxiReadMaster.rready := not dataFifoAFull;
420 
421  sAxiReadSlave <= isAxiReadSlave;
422  mAxiReadMaster <= imAxiReadMaster;
423 
424  end process;
425 
426 end rtl;
427 
out almost_fullsl
Definition: FifoCascade.vhd:59
ALTERA_RAM_Gstring := "M9K"
Definition: FifoCascade.vhd:38
out validsl
Definition: FifoCascade.vhd:68
GEN_SYNC_FIFO_Gboolean := false
slv( 7 downto 0) arlen
Definition: AxiPkg.vhd:37
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:66
XIL_DEVICE_Gstring := "7SERIES"
Definition: FifoCascade.vhd:40
AxiReadMasterType :=(arvalid => '0',araddr =>( others => '0'),arid =>( others => '0'),arlen =>( others => '0'),arsize =>( others => '0'),arburst =>( others => '0'),arlock =>( others => '0'),arprot =>( others => '0'),arcache =>( others => '0'),arqos =>( others => '0'),arregion =>( others => '0'),rready => '0') AXI_READ_MASTER_INIT_C
Definition: AxiPkg.vhd:49
out sAxiReadSlaveAxiReadSlaveType
slv( 1023 downto 0) rdata
Definition: AxiPkg.vhd:83
sl rready
Definition: AxiPkg.vhd:46
slv( 31 downto 0) rid
Definition: AxiPkg.vhd:86
slv( 1 downto 0) rresp
Definition: AxiPkg.vhd:87
in mAxiReadSlaveAxiReadSlaveType
PROT_FIXED_EN_Gboolean := false
RST_ASYNC_Gboolean := false
Definition: FifoCascade.vhd:32
out almost_emptysl
Definition: FifoCascade.vhd:71
DATA_CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
sl rvalid
Definition: AxiPkg.vhd:85
INIT_Gslv := "0"
Definition: FifoCascade.vhd:45
std_logic sl
Definition: StdRtlPkg.vhd:28
ADDR_CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
BRAM_EN_Gboolean := true
Definition: FifoCascade.vhd:34
ALTERA_SYN_Gboolean := false
TPD_Gtime := 1 ns
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:54
slv( 3 downto 0) arcache
Definition: AxiPkg.vhd:42
sl arready
Definition: AxiPkg.vhd:81
out mAxiReadMasterAxiReadMasterType
ADDR_FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
USE_BUILT_IN_Gboolean := false
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
ALTERA_SYN_Gboolean := false
Definition: FifoCascade.vhd:37
in rd_ensl := '0'
Definition: FifoCascade.vhd:65
positive range 12 to 64 ADDR_WIDTH_C
Definition: AxiPkg.vhd:214
AxiReadSlaveType
Definition: AxiPkg.vhd:79
out wr_acksl
Definition: FifoCascade.vhd:56
in rstsl := '0'
Definition: FifoCascade.vhd:50
ID_FIXED_EN_Gboolean := false
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
ADDR_BRAM_EN_Gboolean := true
XIL_DEVICE_Gstring := "7SERIES"
slv( 31 downto 0) arid
Definition: AxiPkg.vhd:36
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: FifoCascade.vhd:41
LEN_FIXED_EN_Gboolean := false
BURST_FIXED_EN_Gboolean := false
slv( 63 downto 0) araddr
Definition: AxiPkg.vhd:35
AxiConfigType
Definition: AxiPkg.vhd:213
DATA_BRAM_EN_Gboolean := true
slv( 2 downto 0) arsize
Definition: AxiPkg.vhd:38
ADDR_LSB_Gnatural range 0 to 31:= 0
in wr_ensl := '0'
Definition: FifoCascade.vhd:53
out fullsl
Definition: FifoCascade.vhd:60
slv( 1 downto 0) arburst
Definition: AxiPkg.vhd:39
GEN_SYNC_FIFO_Gboolean := false
Definition: FifoCascade.vhd:33
LOCK_FIXED_EN_Gboolean := false
in sAxiReadMasterAxiReadMasterType
TPD_Gtime := 1 ns
Definition: FifoCascade.vhd:28
DATA_FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
ALTERA_RAM_Gstring := "M9K"
positive range 1 to 128 DATA_BYTES_C
Definition: AxiPkg.vhd:215
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
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
sl rlast
Definition: AxiPkg.vhd:84
slv( 1 downto 0) arlock
Definition: AxiPkg.vhd:40
CACHE_FIXED_EN_Gboolean := false
out emptysl
Definition: FifoCascade.vhd:72
out underflowsl
Definition: FifoCascade.vhd:69
_library_ ieeeieee
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:29
out prog_emptysl
Definition: FifoCascade.vhd:70
AxiConfigType :=axiConfig(ADDR_WIDTH_C => 32,DATA_BYTES_C => 4,ID_BITS_C => 12,LEN_BITS_C => 4) AXI_CONFIG_INIT_C
Definition: AxiPkg.vhd:227
positive range 1 to 32 ID_BITS_C
Definition: AxiPkg.vhd:216
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:55
AXI_CONFIG_GAxiConfigType := AXI_CONFIG_INIT_C
AxiReadMasterType
Definition: AxiPkg.vhd:32
SIZE_FIXED_EN_Gboolean := false
slv( 2 downto 0) arprot
Definition: AxiPkg.vhd:41
RST_POLARITY_Gsl := '1'
Definition: FifoCascade.vhd:31
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
sl arvalid
Definition: AxiPkg.vhd:34
natural range 0 to 8 LEN_BITS_C
Definition: AxiPkg.vhd:217
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:67
AxiReadSlaveType :=(arready => '0',rdata =>( others => '0'),rlast => '0',rvalid => '0',rid =>( others => '0'),rresp =>( others => '0')) AXI_READ_SLAVE_INIT_C
Definition: AxiPkg.vhd:90