SURF  1.0
SsiFifo.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : SsiFifo.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-05-02
5 -- Last update: 2016-10-17
6 -------------------------------------------------------------------------------
7 -- Description: This module is the AXIS FIFO with a frame filter
8 --
9 -- Note: If EN_FRAME_FILTER_G = true, then this module DOES NOT support
10 -- interleaving of channels during the middle of a frame transfer.
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 -------------------------------------------------------------------------------
20 
21 library ieee;
22 use ieee.std_logic_1164.all;
23 
24 use work.StdRtlPkg.all;
25 use work.AxiStreamPkg.all;
26 use work.SsiPkg.all;
27 
28 --! @see entity
29  --! @ingroup protocols_ssi
30 entity SsiFifo is
31  generic (
32  -- General Configurations
33  TPD_G : time := 1 ns;
34  INT_PIPE_STAGES_G : natural := 0;
35  PIPE_STAGES_G : natural := 1;
36  SLAVE_READY_EN_G : boolean := true;
37  EN_FRAME_FILTER_G : boolean := true;
38  OR_DROP_FLAGS_G : boolean := false;
39  VALID_THOLD_G : natural := 1;
40  VALID_BURST_MODE_G : boolean := false;
41  -- FIFO configurations
42  BRAM_EN_G : boolean := true;
43  XIL_DEVICE_G : string := "7SERIES";
44  USE_BUILT_IN_G : boolean := false;
45  GEN_SYNC_FIFO_G : boolean := false;
46  ALTERA_SYN_G : boolean := false;
47  ALTERA_RAM_G : string := "M9K";
48  CASCADE_SIZE_G : positive := 1;
49  CASCADE_PAUSE_SEL_G : natural := 0;
50  FIFO_ADDR_WIDTH_G : integer range 4 to 48 := 9;
51  FIFO_FIXED_THRESH_G : boolean := true;
52  FIFO_PAUSE_THRESH_G : positive := 1;
53  -- AXI Stream Port Configurations
56  port (
57  -- Slave Port
58  sAxisClk : in sl;
59  sAxisRst : in sl;
65  fifoPauseThresh : in slv(FIFO_ADDR_WIDTH_G-1 downto 0) := (others => '1');
66  -- Master Port
67  mAxisClk : in sl;
68  mAxisRst : in sl;
73 end SsiFifo;
74 
75 architecture mapping of SsiFifo is
76 
80  signal sAxisReset : sl;
81 
84  signal txTLastTUser : slv(7 downto 0);
85  signal overflow : sl;
86 
87  signal sDropWrite : sl;
88  signal sDropWriteSync : sl;
89  signal sTermFrame : sl;
90  signal sTermFrameSync : sl;
91 
92  signal mDropWrite : sl;
93  signal mDropWriteSync : sl;
94  signal mTermFrame : sl;
95  signal mTermFrameSync : sl;
96 
97 begin
98 
99  assert (SLAVE_AXI_CONFIG_G.TUSER_BITS_C >= 2) report "SsiFifo: SLAVE_AXI_CONFIG_G.TUSER_BITS_C must be >= 2" severity failure;
100  assert (MASTER_AXI_CONFIG_G.TUSER_BITS_C >= 2) report "SsiFifo: MASTER_AXI_CONFIG_G.TUSER_BITS_C must be >= 2" severity failure;
101 
102  U_IbFilter : entity work.SsiIbFrameFilter
103  generic map (
104  TPD_G => TPD_G,
108  port map (
109  -- Slave Port
112  sAxisCtrl => sAxisCtrl,
115  -- Master Port
117  mAxisSlave => rxSlave,
118  mAxisCtrl => rxCtrl,
119  -- Clock and Reset
120  axisClk => sAxisClk,
121  axisRst => sAxisReset);
122 
123  U_Fifo : entity work.AxiStreamFifoV2
124  generic map (
125  -- General Configurations
126  TPD_G => TPD_G,
132  -- FIFO configurations
133  BRAM_EN_G => BRAM_EN_G,
144  -- AXI Stream Port Configurations
147  port map (
148  -- Slave Port
149  sAxisClk => sAxisClk,
150  sAxisRst => sAxisReset,
152  sAxisSlave => rxSlave,
153  sAxisCtrl => rxCtrl,
154  -- FIFO status & config , synchronous to sAxisClk
156  -- Master Port
157  mAxisClk => mAxisClk,
158  mAxisRst => mAxisRst,
160  mAxisSlave => txSlave,
162 
163  sAxisReset <= (sAxisRst or (rxCtrl.overflow and not(rxCtrl.idle))) when(EN_FRAME_FILTER_G) else sAxisRst;
164 
165  GEN_SYNC_SLAVE : if (GEN_SYNC_FIFO_G = true) generate
167  end generate;
168 
169  GEN_ASYNC_SLAVE : if (GEN_SYNC_FIFO_G = false) generate
170  Sync_Overflow : entity work.SynchronizerOneShot
171  generic map (
172  TPD_G => TPD_G)
173  port map (
174  clk => mAxisClk,
175  rst => mAxisRst,
176  dataIn => rxCtrl.overflow,
177  dataOut => overflow);
178  end generate;
179 
180  U_ObFilter : entity work.SsiObFrameFilter
181  generic map (
182  TPD_G => TPD_G,
186  port map (
187  -- Slave Port
189  sAxisSlave => txSlave,
191  overflow => overflow,
192  -- Master Port
197  -- Clock and Reset
198  axisClk => mAxisClk,
199  axisRst => mAxisRst);
200 
201 
202  ORING_DROP : if (OR_DROP_FLAGS_G = true) generate
203 
204  GEN_SYNC : if (GEN_SYNC_FIFO_G = true) generate
209  end generate;
210 
211  GEN_ASYNC : if (GEN_SYNC_FIFO_G = false) generate
212 
217 
218  Sync_0 : entity work.SynchronizerOneShot
219  generic map (
220  TPD_G => TPD_G)
221  port map (
222  clk => sAxisClk,
223  dataIn => mDropWrite,
224  dataOut => mDropWriteSync);
225 
226  Sync_1 : entity work.SynchronizerOneShot
227  generic map (
228  TPD_G => TPD_G)
229  port map (
230  clk => sAxisClk,
231  dataIn => mTermFrame,
232  dataOut => mTermFrameSync);
233 
234  Sync_2 : entity work.SynchronizerOneShot
235  generic map (
236  TPD_G => TPD_G)
237  port map (
238  clk => mAxisClk,
239  dataIn => sDropWrite,
240  dataOut => sDropWriteSync);
241 
242  Sync_3 : entity work.SynchronizerOneShot
243  generic map (
244  TPD_G => TPD_G)
245  port map (
246  clk => mAxisClk,
247  dataIn => sTermFrame,
248  dataOut => sTermFrameSync);
249 
250  end generate;
251  end generate;
252 
253  NO_ORING_DROP : if (OR_DROP_FLAGS_G = false) generate
258  end generate;
259 
260 end mapping;
out mAxisDropWritesl
Definition: SsiFifo.vhd:71
FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
out sAxisCtrlAxiStreamCtrlType
ALTERA_RAM_Gstring := "M9K"
SLAVE_READY_EN_Gboolean := true
Definition: SsiFifo.vhd:36
VALID_THOLD_Gnatural := 1
SLAVE_READY_EN_Gboolean := true
slv( 7 downto 0) txTLastTUser
Definition: SsiFifo.vhd:84
PIPE_STAGES_Gnatural range 0 to 16:= 1
in mAxisSlaveAxiStreamSlaveType
std_logic sl
Definition: StdRtlPkg.vhd:28
out mAxisMasterAxiStreamMasterType
Definition: SsiFifo.vhd:69
AXIS_CONFIG_GAxiStreamConfigType := ssiAxiStreamConfig( 16)
FIFO_PAUSE_THRESH_Gpositive := 1
Definition: SsiFifo.vhd:52
SLAVE_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
Definition: SsiFifo.vhd:50
AxiStreamMasterType rxMaster
Definition: SsiFifo.vhd:77
SLAVE_READY_EN_Gboolean := true
FIFO_FIXED_THRESH_Gboolean := true
out sAxisCtrlAxiStreamCtrlType
in sAxisClksl
Definition: SsiFifo.vhd:58
INT_PIPE_STAGES_Gnatural := 0
Definition: SsiFifo.vhd:34
GEN_SYNC_FIFO_Gboolean := false
out mAxisMasterAxiStreamMasterType
GEN_SYNC_FIFO_Gboolean := false
Definition: SsiFifo.vhd:45
XIL_DEVICE_Gstring := "7SERIES"
XIL_DEVICE_Gstring := "7SERIES"
Definition: SsiFifo.vhd:43
ALTERA_SYN_Gboolean := false
Definition: SsiFifo.vhd:46
VALID_THOLD_Gnatural := 1
Definition: SsiFifo.vhd:39
out sAxisDropWritesl
Definition: SsiFifo.vhd:63
EN_FRAME_FILTER_Gboolean := true
in rstsl :=not RST_POLARITY_G
out mAxisTermFramesl
Definition: SsiFifo.vhd:72
INT_PIPE_STAGES_Gnatural range 0 to 16:= 0
FIFO_FIXED_THRESH_Gboolean := true
Definition: SsiFifo.vhd:51
VALID_BURST_MODE_Gboolean := false
Definition: SsiFifo.vhd:40
BRAM_EN_Gboolean := true
in mAxisClksl
Definition: SsiFifo.vhd:67
BRAM_EN_Gboolean := true
Definition: SsiFifo.vhd:42
USE_BUILT_IN_Gboolean := false
Definition: SsiFifo.vhd:44
in sAxisRstsl
Definition: SsiFifo.vhd:59
TPD_Gtime := 1 ns
Definition: SsiFifo.vhd:33
_library_ ieeeieee
Definition: SsiDbgTap.vhd:18
TPD_Gtime := 1 ns
in mAxisCtrlAxiStreamCtrlType
AxiStreamMasterType txMaster
Definition: SsiFifo.vhd:82
out sAxisTermFramesl
Definition: SsiFifo.vhd:64
natural range 0 to 8 TUSER_BITS_C
out sAxisSlaveAxiStreamSlaveType
ALTERA_SYN_Gboolean := false
in mAxisSlaveAxiStreamSlaveType
Definition: SsiFifo.vhd:70
VALID_BURST_MODE_Gboolean := false
AxiStreamConfigType := ssiAxiStreamConfig( 16) SSI_CONFIG_INIT_C
Definition: SsiPkg.vhd:60
out sAxisSlaveAxiStreamSlaveType
in sAxisMasterAxiStreamMasterType
EN_FRAME_FILTER_Gboolean := true
Definition: SsiFifo.vhd:37
in sTLastTUserslv( 7 downto 0)
out mTLastTUserslv( 7 downto 0)
in sAxisMasterAxiStreamMasterType
in sAxisMasterAxiStreamMasterType
out mAxisMasterAxiStreamMasterType
SLAVE_AXI_CONFIG_GAxiStreamConfigType := SSI_CONFIG_INIT_C
Definition: SsiFifo.vhd:54
CASCADE_SIZE_Gpositive := 1
Definition: SsiFifo.vhd:48
AXIS_CONFIG_GAxiStreamConfigType := ssiAxiStreamConfig( 16)
out sAxisCtrlAxiStreamCtrlType
Definition: SsiFifo.vhd:62
ALTERA_RAM_Gstring := "M9K"
Definition: SsiFifo.vhd:47
in fifoPauseThreshslv( FIFO_ADDR_WIDTH_G- 1 downto 0) :=( others => '1')
Definition: SsiFifo.vhd:65
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
in mAxisSlaveAxiStreamSlaveType
FIFO_PAUSE_THRESH_Ginteger range 1 to ( 2** 24):= 1
VALID_THOLD_Ginteger range 0 to ( 2** 24):= 1
AxiStreamSlaveType txSlave
Definition: SsiFifo.vhd:83
CASCADE_PAUSE_SEL_Gnatural := 0
Definition: SsiFifo.vhd:49
PIPE_STAGES_Gnatural := 1
Definition: SsiFifo.vhd:35
MASTER_AXI_CONFIG_GAxiStreamConfigType := SSI_CONFIG_INIT_C
Definition: SsiFifo.vhd:55
in mAxisRstsl
Definition: SsiFifo.vhd:68
MASTER_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
AxiStreamCtrlType rxCtrl
Definition: SsiFifo.vhd:79
out sAxisSlaveAxiStreamSlaveType
out sAxisSlaveAxiStreamSlaveType
Definition: SsiFifo.vhd:61
CASCADE_PAUSE_SEL_Ginteger range 0 to ( 2** 24):= 0
out mAxisMasterAxiStreamMasterType
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
EN_FRAME_FILTER_Gboolean := true
OR_DROP_FLAGS_Gboolean := false
Definition: SsiFifo.vhd:38
AxiStreamSlaveType rxSlave
Definition: SsiFifo.vhd:78
in sAxisMasterAxiStreamMasterType
Definition: SsiFifo.vhd:60