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 ------------------------------------------------------------------------------- 19 use ieee.std_logic_1164.
all;
20 use ieee.std_logic_unsigned.
all;
21 use ieee.std_logic_arith.
all;
31 -- General Configurations 34 -- General FIFO configurations 47 LOCK_FIXED_EN_G : := false;
51 -- Address FIFO Config 91 constant RESP_BITS_C : := 2;
94 BURST_BITS_C + LOCK_BITS_C + PROT_BITS_C + CACHE_BITS_C;
96 constant DATA_FIFO_SIZE_C : := 1 + DATA_BITS_C + RESP_BITS_C + ID_BITS_C;
98 -- Convert address record to slv 100 variable retValue : slv(ADDR_FIFO_SIZE_C-1 downto 0);
118 retValue((SIZE_BITS_C+i)-1 downto i) := din.arsize(SIZE_BITS_C-1 downto 0);
119 i := i + SIZE_BITS_C;
123 retValue((BURST_BITS_C+i)-1 downto i) := din.arburst(BURST_BITS_C-1 downto 0);
124 i := i + BURST_BITS_C;
128 retValue((LOCK_BITS_C+i)-1 downto i) := din.arlock(LOCK_BITS_C-1 downto 0);
129 i := i + LOCK_BITS_C;
133 retValue((PROT_BITS_C+i)-1 downto i) := din.arprot(PROT_BITS_C-1 downto 0);
134 i := i + PROT_BITS_C;
138 retValue((CACHE_BITS_C+i)-1 downto i) := din.arcache(CACHE_BITS_C-1 downto 0);
139 i := i + CACHE_BITS_C;
146 -- Convert slv to address record 147 -
procedure slvToAddr (din :
in slv(ADDR_FIFO_SIZE_C1
downto 0);
157 master.araddr := (others=>'0');
164 master.arid := (others=>'0');
172 master.arlen := (others=>'0');
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;
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;
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;
202 master.arprot := (others=>'0');
205 master.arprot(PROT_BITS_C-1 downto 0) := din((PROT_BITS_C+i)-1 downto i);
206 i := i + PROT_BITS_C;
210 master.arcache := (others=>'0');
213 master.arcache(CACHE_BITS_C-1 downto 0) := din((CACHE_BITS_C+i)-1 downto i);
214 i := i + CACHE_BITS_C;
219 -- Convert data record to slv 221 variable retValue : slv(DATA_FIFO_SIZE_C-1 downto 0);
225 retValue(0) := din.rlast;
228 retValue((DATA_BITS_C+i)-1 downto i) := din.rdata(DATA_BITS_C-1 downto 0);
229 i := i + DATA_BITS_C;
236 retValue((RESP_BITS_C+i)-1 downto i) := din.rresp;
243 -- Convert slv to data record 244 -
procedure slvToData (din :
in slv(DATA_FIFO_SIZE_C1
downto 0);
253 slave.rlast := din(0);
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;
263 slave.rid := (others=>'0');
268 slave.rresp := din((RESP_BITS_C+i)-1 downto i);
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;
288 ------------------------- 290 ------------------------- 317 wr_en => addrFifoWrite,
327 rd_en => addrFifoRead,
328 dout => addrFifoDout,
330 valid => addrFifoValid,
362 wr_en => dataFifoWrite,
372 rd_en => dataFifoRead,
373 dout => dataFifoDout,
375 valid => dataFifoValid,
383 ------------------------- 385 ------------------------- 393 ------------------------- 395 ------------------------- 399 ------------------------- 401 ------------------------- 404 addrFifoDout, addrFifoAFull, addrFifoValid,
405 dataFifoDout, dataFifoAFull, dataFifoValid )
is 415 slvToAddr(addrFifoDout, addrFifoValid, sAxiReadMaster, imAxiReadMaster);
416 slvToData(dataFifoDout, dataFifoValid, sAxiReadMaster, isAxiReadSlave);
418 isAxiReadSlave.arready := not addrFifoAFull;
419 imAxiReadMaster.rready := not dataFifoAFull;
ALTERA_RAM_Gstring := "M9K"
GEN_SYNC_FIFO_Gboolean := false
out doutslv( DATA_WIDTH_G- 1 downto 0)
XIL_DEVICE_Gstring := "7SERIES"
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
out sAxiReadSlaveAxiReadSlaveType
slv( 1023 downto 0) rdata
in mAxiReadSlaveAxiReadSlaveType
PROT_FIXED_EN_Gboolean := false
RST_ASYNC_Gboolean := false
DATA_CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
ADDR_CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
ALTERA_SYN_Gboolean := false
in dinslv( DATA_WIDTH_G- 1 downto 0)
out mAxiReadMasterAxiReadMasterType
ADDR_FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
USE_BUILT_IN_Gboolean := false
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
ALTERA_SYN_Gboolean := false
positive range 12 to 64 ADDR_WIDTH_C
ID_FIXED_EN_Gboolean := false
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
ADDR_BRAM_EN_Gboolean := true
XIL_DEVICE_Gstring := "7SERIES"
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
LEN_FIXED_EN_Gboolean := false
BURST_FIXED_EN_Gboolean := false
DATA_BRAM_EN_Gboolean := true
ADDR_LSB_Gnatural range 0 to 31:= 0
GEN_SYNC_FIFO_Gboolean := false
LOCK_FIXED_EN_Gboolean := false
in sAxiReadMasterAxiReadMasterType
DATA_FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
ALTERA_RAM_Gstring := "M9K"
positive range 1 to 128 DATA_BYTES_C
USE_DSP48_Gstring := "no"
LAST_STAGE_ASYNC_Gboolean := true
ADDR_WIDTH_Ginteger range 4 to 48:= 4
USE_BUILT_IN_Gboolean := false
FWFT_EN_Gboolean := false
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
CACHE_FIXED_EN_Gboolean := false
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
AxiConfigType :=axiConfig(ADDR_WIDTH_C => 32,DATA_BYTES_C => 4,ID_BITS_C => 12,LEN_BITS_C => 4) AXI_CONFIG_INIT_C
positive range 1 to 32 ID_BITS_C
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
AXI_CONFIG_GAxiConfigType := AXI_CONFIG_INIT_C
SIZE_FIXED_EN_Gboolean := false
natural range 0 to 8 LEN_BITS_C
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
AxiReadSlaveType :=(arready => '0',rdata =>( others => '0'),rlast => '0',rvalid => '0',rid =>( others => '0'),rresp =>( others => '0')) AXI_READ_SLAVE_INIT_C