SURF  1.0
AxiLiteFifoPush.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiLiteFifoPush.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-04-02
5 -- Last update: 2016-04-26
6 -------------------------------------------------------------------------------
7 -- Description:
8 -- Supports writing of general purpose FIFOs from the AxiLite bus.
9 -- 16 address locations 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 AxiLiteFifoPush is
31  generic (
32  TPD_G : time := 1 ns;
33  PUSH_FIFO_COUNT_G : positive := 1;
34  PUSH_SYNC_FIFO_G : boolean := false;
35  PUSH_BRAM_EN_G : boolean := false;
36  PUSH_ADDR_WIDTH_G : integer range 4 to 48 := 4;
37  ALTERA_SYN_G : boolean := false;
38  ALTERA_RAM_G : string := "M9K";
39  USE_BUILT_IN_G : boolean := false;
40  XIL_DEVICE_G : string := "7SERIES"
41  );
42  port (
43 
44  -- AXI Interface (axiClk)
45  axiClk : in sl;
46  axiClkRst : in sl;
51  pushFifoAFull : out slv(PUSH_FIFO_COUNT_G-1 downto 0);
52 
53  -- Push FIFO Read Interface (pushFifoClk)
54  pushFifoClk : in slv(PUSH_FIFO_COUNT_G-1 downto 0);
55  pushFifoRst : in slv(PUSH_FIFO_COUNT_G-1 downto 0);
56  pushFifoValid : out slv(PUSH_FIFO_COUNT_G-1 downto 0);
58  pushFifoRead : in slv(PUSH_FIFO_COUNT_G-1 downto 0)
59  );
60 end AxiLiteFifoPush;
61 
62 architecture structure of AxiLiteFifoPush is
63 
64  constant PUSH_SIZE_C : integer := bitSize(PUSH_FIFO_COUNT_G-1);
65  constant PUSH_COUNT_C : integer := 2**PUSH_SIZE_C;
66 
67  -- Local Signals
68  signal ipushFifoFull : slv(PUSH_COUNT_C-1 downto 0);
69  signal ipushFifoAFull : slv(PUSH_COUNT_C-1 downto 0);
70  signal ipushFifoDin : Slv(35 downto 0);
71  signal ipushFifoWrite : slv(PUSH_COUNT_C-1 downto 0);
72 
73  type RegType is record
75  pushFifoDin : slv(35 downto 0);
78  end record RegType;
79 
80  constant REG_INIT_C : RegType := (
81  pushFifoWrite => (others => '0'),
82  pushFifoDin => (others => '0'),
85  );
86 
87  signal r : RegType := REG_INIT_C;
88  signal rin : RegType;
89 
90 begin
91 
92 
93  -----------------------------------------
94  -- FIFOs
95  -----------------------------------------
96  U_GenFifo : for i in 0 to PUSH_FIFO_COUNT_G-1 generate
97  U_FIfo : entity work.FifoCascade
98  generic map (
99  TPD_G => TPD_G,
100  CASCADE_SIZE_G => 1,
101  LAST_STAGE_ASYNC_G => true,
102  RST_POLARITY_G => '1',
103  RST_ASYNC_G => true,
106  FWFT_EN_G => true,
107  USE_DSP48_G => "no",
112  SYNC_STAGES_G => 3,
113  DATA_WIDTH_G => 36,
115  INIT_G => "0",
116  FULL_THRES_G => 1,
117  EMPTY_THRES_G => 1
118  ) port map (
119  rst => pushFifoRst(i),
120  wr_clk => axiClk,
121  wr_en => ipushFifoWrite(i),
122  din => ipushFifoDin,
123  wr_data_count => open,
124  wr_ack => open,
125  overflow => open,
126  prog_full => open,
128  full => ipushFifoFull(i),
129  not_full => open,
130  rd_clk => pushFifoClk(i),
131  rd_en => pushFifoRead(i),
132  dout => pushFifoDout(i),
133  rd_data_count => open,
134  valid => pushFifoValid(i),
135  underflow => open,
136  prog_empty => open,
137  almost_empty => open,
138  empty => open
139  );
140 
141  pushFifoAFull(i) <= ipushFifoAFull(i);
142  end generate;
143 
144  U_AlignGen : if PUSH_FIFO_COUNT_G /= PUSH_COUNT_C generate
145  ipushFifoAFull(PUSH_COUNT_C-1 downto PUSH_FIFO_COUNT_G) <= (others=>'0');
146  ipushFifoFull(PUSH_COUNT_C-1 downto PUSH_FIFO_COUNT_G) <= (others=>'0');
147  end generate;
148 
149 
150  -----------------------------------------
151  -- AXI Lite
152  -----------------------------------------
153 
154  -- Sync
155  process (axiClk) is
156  begin
157  if (rising_edge(axiClk)) then
158  r <= rin after TPD_G;
159  end if;
160  end process;
161 
162  -- Async
164  variable v : RegType;
165  variable axiStatus : AxiLiteStatusType;
166  begin
167  v := r;
168 
169  v.pushFifoWrite := (others=>'0');
170 
172 
173  -- Write
174  if (axiStatus.writeEnable = '1') then
175  v.pushFifoDin(31 downto 0) := axiWriteMaster.wdata;
176  v.pushFifoDin(35 downto 32) := axiWriteMaster.awaddr(5 downto 2);
177 
178  v.pushFifoWrite(conv_integer(axiWriteMaster.awaddr(PUSH_SIZE_C+5 downto 6))) := '1';
179 
180  axiSlaveWriteResponse(v.axiWriteSlave);
181  end if;
182 
183  -- Read
184  if (axiStatus.readEnable = '1') then
185 
186  v.axiReadSlave.rdata := (others=>'0');
187  v.axiReadSlave.rdata(0) := ipushFifoFull(conv_integer(axiReadMaster.araddr(PUSH_SIZE_C+5 downto 6)));
188  v.axiReadSlave.rdata(1) := ipushFifoAFull(conv_integer(axiReadMaster.araddr(PUSH_SIZE_C+5 downto 6)));
189 
190  -- Send Axi Response
191  axiSlaveReadResponse(v.axiReadSlave);
192 
193  end if;
194 
195  -- Reset
196  if (axiClkRst = '1') then
197  v := REG_INIT_C;
198  end if;
199 
200  -- Next register assignment
201  rin <= v;
202 
203  -- Outputs
208 
209  end process;
210 
211 end architecture structure;
212 
out almost_fullsl
Definition: FifoCascade.vhd:59
ALTERA_RAM_Gstring := "M9K"
Definition: FifoCascade.vhd:38
out validsl
Definition: FifoCascade.vhd:68
integer := bitSize( PUSH_FIFO_COUNT_G- 1) PUSH_SIZE_C
out doutslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:66
TPD_Gtime := 1 ns
XIL_DEVICE_Gstring := "7SERIES"
Definition: FifoCascade.vhd:40
slv( 35 downto 0) pushFifoDin
RST_ASYNC_Gboolean := false
Definition: FifoCascade.vhd:32
out almost_emptysl
Definition: FifoCascade.vhd:71
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
INIT_Gslv := "0"
Definition: FifoCascade.vhd:45
std_logic sl
Definition: StdRtlPkg.vhd:28
_library_ IEEEIEEE
Definition: StdRtlPkg.vhd:18
out pushFifoAFullslv( PUSH_FIFO_COUNT_G- 1 downto 0)
PUSH_ADDR_WIDTH_Ginteger range 4 to 48:= 4
integer := 2** PUSH_SIZE_C PUSH_COUNT_C
in pushFifoRstslv( PUSH_FIFO_COUNT_G- 1 downto 0)
BRAM_EN_Gboolean := true
Definition: FifoCascade.vhd:34
out pushFifoValidslv( PUSH_FIFO_COUNT_G- 1 downto 0)
AxiLiteReadSlaveType axiReadSlave
slv( PUSH_COUNT_C- 1 downto 0) ipushFifoFull
slv( 31 downto 0) rdata
Definition: AxiLitePkg.vhd:89
in dinslv( DATA_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:54
slv( PUSH_COUNT_C- 1 downto 0) ipushFifoWrite
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
Slv( 35 downto 0) ipushFifoDin
ALTERA_SYN_Gboolean := false
in axiWriteMasterAxiLiteWriteMasterType
slv( 31 downto 0) wdata
Definition: AxiLitePkg.vhd:117
in rd_ensl := '0'
Definition: FifoCascade.vhd:65
in axiReadMasterAxiLiteReadMasterType := AXI_LITE_READ_MASTER_INIT_C
AxiLiteStatusType axiStatus
Definition: AxiLitePkg.vhd:183
out wr_acksl
Definition: FifoCascade.vhd:56
PUSH_FIFO_COUNT_Gpositive := 1
in rstsl := '0'
Definition: FifoCascade.vhd:50
XIL_DEVICE_Gstring := "7SERIES"
PUSH_BRAM_EN_Gboolean := false
slv( PUSH_COUNT_C- 1 downto 0) pushFifoWrite
in wr_clksl
Definition: FifoCascade.vhd:52
out overflowsl
Definition: FifoCascade.vhd:57
ALTERA_RAM_Gstring := "M9K"
FULL_THRES_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:46
SYNC_STAGES_Ginteger range 3 to ( 2** 24):= 3
Definition: FifoCascade.vhd:41
RegType := REG_INIT_C r
in pushFifoClkslv( PUSH_FIFO_COUNT_G- 1 downto 0)
USE_BUILT_IN_Gboolean := false
out axiReadSlaveAxiLiteReadSlaveType
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
PUSH_SYNC_FIFO_Gboolean := false
out axiWriteSlaveAxiLiteWriteSlaveType
slv( 31 downto 0) awaddr
Definition: AxiLitePkg.vhd:113
in wr_ensl := '0'
Definition: FifoCascade.vhd:53
AxiLiteReadSlaveType :=(arready => '0',rdata =>( others => '0'),rresp =>( others => '0'),rvalid => '0') AXI_LITE_READ_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:95
out fullsl
Definition: FifoCascade.vhd:60
RegType :=(pushFifoWrite =>( others => '0'),pushFifoDin =>( others => '0'),axiReadSlave => AXI_LITE_READ_SLAVE_INIT_C,axiWriteSlave => AXI_LITE_WRITE_SLAVE_INIT_C) REG_INIT_C
out pushFifoDoutSlv36Array( PUSH_FIFO_COUNT_G- 1 downto 0)
GEN_SYNC_FIFO_Gboolean := false
Definition: FifoCascade.vhd:33
AxiLiteReadMasterType :=(araddr =>( others => '0'),arprot =>( others => '0'),arvalid => '0',rready => '1') AXI_LITE_READ_MASTER_INIT_C
Definition: AxiLitePkg.vhd:69
TPD_Gtime := 1 ns
Definition: FifoCascade.vhd:28
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
array(natural range <> ) of slv( 35 downto 0) Slv36Array
Definition: StdRtlPkg.vhd:375
slv( PUSH_COUNT_C- 1 downto 0) ipushFifoAFull
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
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
out underflowsl
Definition: FifoCascade.vhd:69
in pushFifoReadslv( PUSH_FIFO_COUNT_G- 1 downto 0)
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
Definition: FifoCascade.vhd:29
out prog_emptysl
Definition: FifoCascade.vhd:70
_library_ ieeeieee
out wr_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:55
AxiLiteWriteSlaveType :=(awready => '0',wready => '0',bresp =>( others => '0'),bvalid => '0') AXI_LITE_WRITE_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:156
RST_POLARITY_Gsl := '1'
Definition: FifoCascade.vhd:31
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
out rd_data_countslv( ADDR_WIDTH_G- 1 downto 0)
Definition: FifoCascade.vhd:67
AxiLiteWriteSlaveType axiWriteSlave