1 ------------------------------------------------------------------------------- 2 -- File : AxiStreamFifoV2.vhd 3 -- Company : SLAC National Accelerator Laboratory 4 -- Created : 2016-09-02 5 -- Last update: 2016-11-30 6 ------------------------------------------------------------------------------- 8 -- Block to serve as an async FIFO for AXI Streams. This block also allows the 9 -- bus to be compress/expanded, allowing different standard sizes on each side 10 -- of the FIFO. Re-sizing is always little endian. 11 ------------------------------------------------------------------------------- 12 -- This file is part of 'SLAC Firmware Standard Library'. 13 -- It is subject to the license terms in the LICENSE.txt file found in the 14 -- top-level directory of this distribution and at: 15 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html. 16 -- No part of 'SLAC Firmware Standard Library', including this file, 17 -- may be copied, modified, propagated, or distributed except according to 18 -- the terms contained in the LICENSE.txt file. 19 ------------------------------------------------------------------------------- 22 use ieee.std_logic_1164.
all;
23 use ieee.std_logic_unsigned.
all;
24 use ieee.std_logic_arith.
all;
34 -- General Configurations 40 -- Valid threshold should always be 1 when using interleaved tdest 42 -- =0 = only when frame ready 43 -- >1 = only when frame ready or # entries 45 -- FIFO configurations 57 -- Internal FIFO width select, "WIDE", "NARROW" or "CUSTOM" 58 -- WIDE uses wider of slave / master. NARROW uses narrower. 59 -- CUSOTM uses passed FIFO_DATA_WIDTH_G 63 -- If VALID_THOLD_G /=1, FIFO that stores on tLast txns can be smaller. 64 -- Set to 0 for same size as primary fifo (default) 65 -- Set >4 for custom size. 66 -- Use at own risk. Overflow of tLast fifo is not checked 69 -- Index = 0 is output, index = n is input 72 -- AXI Stream Port Configurations 85 -- FIFO status & config , synchronous to sAxisClk, be carefull when using with 86 -- output pipeline stages 94 mTLastTUser : out slv(7 downto 0));
-- when VALID_THOLD_G /= 1, used to look ahead at tLast's tUser 99 constant LAST_FIFO_ADDR_WIDTH_C : range 4 to 48 := 102 -- Generate configuration for FIFO 105 -- Enable strobe only if used on both sides 108 -- Determine FIFO data bytes 112 -- Using wider of the two 116 -- Use narrower of the two 120 -- Use the lesser of the two DEST widths 124 -- Use the lesser of the two ID widths 128 -- Use the lesser of the two USER widths 132 -- Use slave settings for tkeep and tuser mode 136 constant FIFO_BITS_C : := getSlvSize(FIFO_CONFIG_C);
138 constant FIFO_USER_BITS_C : := FIFO_CONFIG_C.TUSER_BITS_C;
148 signal fifoDin : slv(FIFO_BITS_C-1 downto 0);
149 signal fifoWrite : sl;
150 signal fifoWriteLast : sl;
151 signal fifoWriteUser : slv(maximum(FIFO_USER_BITS_C-1, 0) downto 0);
154 signal fifoAFull : sl;
155 signal fifoReady : sl;
156 signal fifoPFull : sl;
158 signal fifoDout : slv(FIFO_BITS_C-1 downto 0);
159 signal fifoRead : sl;
160 signal fifoReadLast : sl;
161 signal fifoReadUser : slv(maximum(FIFO_USER_BITS_C-1, 0) downto 0);
162 signal fifoValidInt : sl;
163 signal fifoValid : sl;
164 signal fifoValidLast : sl;
165 signal fifoInFrame : sl;
168 signal burstLast : sl;
179 -- Cant use tkeep_fixed on master side when resizing or if not on slave side 182 report "AxiStreamFifoV2: Can't have TKEEP_MODE = TKEEP_FIXED on master side if not on slave side" 185 ------------------------- 187 ------------------------- 202 ------------------------- 204 ------------------------- 224 fifoDin <= toSlv(fifoWriteMaster, FIFO_CONFIG_C);
225 fifoWrite <= fifoWriteMaster.tValid and fifoReady;
226 fifoWriteLast <= fifoWriteMaster.tValid and fifoReady and fifoWriteMaster.tLast;
227 fifoWriteUser <= ite(FIFO_USER_BITS_C > 0, 228 resize(axiStreamGetUserField(FIFO_CONFIG_C, fifoWriteMaster, -1), FIFO_USER_BITS_C), 231 fifoWriteSlave.tReady <= fifoReady;
269 valid => fifoValidInt
);
298 wr_en => fifoWriteLast,
299 din => fifoWriteUser,
301 rd_en => fifoReadLast,
302 dout => fifoReadUser,
303 valid => fifoValidLast
);
311 -- Stop output if fifo valid goes away, wait until another block is ready 312 if mAxisRst = '1' or fifoReadLast = '1' or fifoValidInt = '0' then 313 fifoInFrame <= '0' after TPD_G;
315 -- Start output when a block or end of frame is available 317 fifoInFrame <= '1' after TPD_G;
329 if (mAxisRst = '1') or (fifoReadLast = '1') then 331 fifoInFrame <= '0' after TPD_G;
332 burstEn <= '0' after TPD_G;
333 burstLast <= '0' after TPD_G;
335 -- Check if for burst mode 336 if (burstEn = '1') and (burstLast = '0') and (fifoRead = '1') then 337 -- Increment the counter 338 burstCnt <= burstCnt + 1 after TPD_G;
342 fifoInFrame <= '0' after TPD_G;
343 burstEn <= '0' after TPD_G;
346 if (fifoValidLast = '1') or ((fifoRdCount >= VALID_THOLD_G) and (burstEn = '0')) then 348 burstEn <= '1' after TPD_G;
349 burstLast <= fifoValidLast after TPD_G;
350 fifoInFrame <= '1' after TPD_G;
352 burstCnt <= 0 after TPD_G;
360 fifoValid <= fifoValidInt and fifoInFrame;
365 fifoValidLast <= '0';
367 fifoReadUser <= (others => '0');
368 fifoValid <= fifoValidInt;
373 -- Map output Signals 374 fifoReadMaster <= toAxiStreamMaster (fifoDout, fifoValid, FIFO_CONFIG_C);
376 fifoRead <= fifoReadSlave.tReady and fifoValid;
377 fifoReadLast <= fifoReadSlave.tReady and fifoValid and fifoReadMaster.tLast;
379 ------------------------- 381 ------------------------- 396 ------------------------- 398 ------------------------- 399 -- Synchronize master side tvalid back to slave side ctrl.idle 400 -- This is a total hack 408 dataIn => axisMaster.tValid,
411 ------------------------- 413 -------------------------
ALTERA_RAM_Gstring := "M9K"
out progFullVecslv( CASCADE_SIZE_G- 1 downto 0)
FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
PIPE_STAGES_Gnatural range 0 to 16:= 0
natural range 0 to 8 TDEST_BITS_C
out doutslv( DATA_WIDTH_G- 1 downto 0)
out sAxisCtrlAxiStreamCtrlType
ALTERA_RAM_Gstring := "M9K"
XIL_DEVICE_Gstring := "7SERIES"
RST_ASYNC_Gboolean := false
PIPE_STAGES_Gnatural range 0 to 16:= 1
in rstsl :=not RST_POLARITY_G
SLAVE_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
SLAVE_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
in dinslv( DATA_WIDTH_G- 1 downto 0)
out sAxisSlaveAxiStreamSlaveType
SLAVE_READY_EN_Gboolean := true
FIFO_FIXED_THRESH_Gboolean := true
natural range 1 to 16 TDATA_BYTES_C
in mAxisSlaveAxiStreamSlaveType
INT_DATA_WIDTH_Gnatural range 1 to 16:= 16
PIPE_STAGES_Gnatural range 0 to 16:= 0
EMPTY_THRES_Ginteger range 1 to ( 2** 24):= 1
GEN_SYNC_FIFO_Gboolean := false
ALTERA_SYN_Gboolean := false
TkeepModeType TKEEP_MODE_C
XIL_DEVICE_Gstring := "7SERIES"
natural range 0 to 8 TID_BITS_C
INT_WIDTH_SELECT_Gstring := "WIDE"
out mAxisMasterAxiStreamMasterType
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
INT_PIPE_STAGES_Gnatural range 0 to 16:= 0
in sAxisMasterAxiStreamMasterType
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
in mAxisSlaveAxiStreamSlaveType
in sAxisMasterAxiStreamMasterType
TUserModeType TUSER_MODE_C
natural range 0 to 8 TUSER_BITS_C
out mAxisMasterAxiStreamMasterType
out sAxisSlaveAxiStreamSlaveType
ALTERA_SYN_Gboolean := false
GEN_SYNC_FIFO_Gboolean := false
READY_EN_Gboolean := true
VALID_BURST_MODE_Gboolean := false
AxiStreamConfigType :=(TSTRB_EN_C => false,TDATA_BYTES_C => 16,TDEST_BITS_C => 4,TID_BITS_C => 0,TKEEP_MODE_C => TKEEP_NORMAL_C,TUSER_BITS_C => 4,TUSER_MODE_C => TUSER_NORMAL_C) AXI_STREAM_CONFIG_INIT_C
MASTER_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
LAST_FIFO_ADDR_WIDTH_Ginteger range 0 to 48:= 0
out mTLastTUserslv( 7 downto 0)
in sAxisMasterAxiStreamMasterType
USE_DSP48_Gstring := "no"
LAST_STAGE_ASYNC_Gboolean := true
out mAxisMasterAxiStreamMasterType
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
in fifoPauseThreshslv( FIFO_ADDR_WIDTH_G- 1 downto 0) :=( others => '1')
in mAxisSlaveAxiStreamSlaveType
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
USE_BUILT_IN_Gboolean := false
FIFO_PAUSE_THRESH_Ginteger range 1 to ( 2** 24):= 1
VALID_THOLD_Ginteger range 0 to ( 2** 24):= 1
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
out sAxisSlaveAxiStreamSlaveType
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
MASTER_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
CASCADE_PAUSE_SEL_Ginteger range 0 to ( 2** 24):= 0
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)