SURF  1.0
AxiLiteAsync.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiLiteAsync.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-04-02
5 -- Last update: 2016-04-26
6 -------------------------------------------------------------------------------
7 -- Description:
8 -- Asynchronous bridge for AXI Lite bus. Allows AXI transactions to cross
9 -- a clock boundary.
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 AxiLiteAsync is
31  generic (
32  TPD_G : time := 1 ns;
34  COMMON_CLK_G : boolean := false;
35  NUM_ADDR_BITS_G : natural := 32;
36  PIPE_STAGES_G : integer range 0 to 16 := 0);
37  port (
38  -- Slave Port
39  sAxiClk : in sl;
40  sAxiClkRst : in sl;
45  -- Master Port
46  mAxiClk : in sl;
47  mAxiClkRst : in sl;
52 end AxiLiteAsync;
53 
54 architecture STRUCTURE of AxiLiteAsync is
55 
56  signal s2mRst : sl; -- Slave rst sync'd to master clk
57  signal m2sRst : sl; -- Master rst sync'd to slave clk
58 
59  signal readSlaveToMastDin : slv(NUM_ADDR_BITS_G+2 downto 0);
60  signal readSlaveToMastDout : slv(NUM_ADDR_BITS_G+2 downto 0);
65 
66  signal readMastToSlaveDin : slv(33 downto 0);
67  signal readMastToSlaveDout : slv(33 downto 0);
72 
79 
80  signal writeDataSlaveToMastDin : slv(35 downto 0);
81  signal writeDataSlaveToMastDout : slv(35 downto 0);
86 
87  signal writeMastToSlaveDin : slv(1 downto 0);
88  signal writeMastToSlaveDout : slv(1 downto 0);
93 
94 begin
95 
96  GEN_SYNC : if (COMMON_CLK_G = true) generate
97 
102 
103  end generate;
104 
105  GEN_ASYNC : if (COMMON_CLK_G = false) generate
106 
107  -- Synchronize each reset across to the other clock domain
108  LOC_S2M_RstSync : entity work.RstSync
109  generic map (
110  TPD_G => TPD_G,
111  OUT_REG_RST_G => false)
112  port map (
113  clk => mAxiClk,
114  asyncRst => sAxiClkRst,
115  syncRst => s2mRst);
116 
117  LOC_M2S_RstSync : entity work.RstSync
118  generic map (
119  TPD_G => TPD_G,
120  OUT_REG_RST_G => false)
121  port map (
122  clk => sAxiClk,
123  asyncRst => mAxiClkRst,
124  syncRst => m2sRst);
125 
126 
127 
128  ------------------------------------
129  -- Read: Slave to Master
130  ------------------------------------
131 
132  -- Read Slave To Master FIFO
133  U_ReadSlaveToMastFifo : entity work.FifoASync
134  generic map (
135  TPD_G => TPD_G,
136  RST_POLARITY_G => '1',
137  BRAM_EN_G => false, -- Use Dist Ram
138  FWFT_EN_G => true,
139  USE_DSP48_G => "no",
140  ALTERA_SYN_G => false,
141  ALTERA_RAM_G => "M9K",
142  SYNC_STAGES_G => 3,
143  PIPE_STAGES_G => PIPE_STAGES_G,
144  DATA_WIDTH_G => NUM_ADDR_BITS_G+3,
145  ADDR_WIDTH_G => 4,
146  INIT_G => "0",
147  FULL_THRES_G => 15,
148  EMPTY_THRES_G => 1)
149  port map (
150  rst => s2mRst,
151  wr_clk => sAxiClk,
152  wr_en => readSlaveToMastWrite,
153  din => readSlaveTomastDin,
154  wr_data_count => open,
155  wr_ack => open,
156  overflow => open,
157  prog_full => open,
158  almost_full => open,
159  full => readSlaveToMastFull,
160  not_full => open,
161  rd_clk => mAxiClk,
162  rd_en => readSlaveToMastRead,
163  dout => readSlaveTomastDout,
164  rd_data_count => open,
165  valid => readSlaveToMastValid,
166  underflow => open,
167  prog_empty => open,
168  almost_empty => open,
169  empty => open
170  );
171 
172  -- Data In
175 
176  -- Write control and ready generation
177  sAxiReadSlave.arready <= ite(m2sRst = '0', not readSlaveToMastFull, '1');
179 
180  -- Data Out
182 
183  process (readSlaveToMastDout)
184  begin
185  mAxiReadMaster.araddr <= (others => '0');
187  end process;
188 
189  -- Read control and valid
192 
193 
194  ------------------------------------
195  -- Read: Master To Slave
196  ------------------------------------
197 
198  -- Read Master To Slave FIFO
199  U_ReadMastToSlaveFifo : entity work.FifoASync
200  generic map (
201  TPD_G => TPD_G,
202  RST_POLARITY_G => '1',
203  BRAM_EN_G => false, -- Use Dist Ram
204  FWFT_EN_G => true,
205  USE_DSP48_G => "no",
206  ALTERA_SYN_G => false,
207  ALTERA_RAM_G => "M9K",
208  SYNC_STAGES_G => 3,
209  PIPE_STAGES_G => PIPE_STAGES_G,
210  DATA_WIDTH_G => 34,
211  ADDR_WIDTH_G => 4,
212  INIT_G => "0",
213  FULL_THRES_G => 15,
214  EMPTY_THRES_G => 1)
215  port map (
216  rst => m2sRst,
217  wr_clk => mAxiClk,
218  wr_en => readMastToSlaveWrite,
219  din => readMastToSlaveDin,
220  wr_data_count => open,
221  wr_ack => open,
222  overflow => open,
223  prog_full => open,
224  almost_full => open,
225  full => readMastToSlaveFull,
226  not_full => open,
227  rd_clk => sAxiClk,
228  rd_en => readMastToSlaveRead,
229  dout => readMastToSlaveDout,
230  rd_data_count => open,
231  valid => readMastToSlaveValid,
232  underflow => open,
233  prog_empty => open,
234  almost_empty => open,
235  empty => open
236  );
237 
238  -- Data In
239  readMastToSlaveDin(1 downto 0) <= mAxiReadSlave.rresp;
240  readMastToSlaveDin(33 downto 2) <= mAxiReadSlave.rdata;
241 
242  -- Write control and ready generation
243  mAxiReadMaster.rready <= ite(mAxiClkRst = '0', not readMastToSlaveFull, '1');
245 
246  -- Data Out
247  sAxiReadSlave.rresp <= ite(m2sRst = '0', readMastToSlaveDout(1 downto 0), AXI_ERROR_RESP_G);
248  sAxiReadSlave.rdata <= readMastToSlaveDout(33 downto 2);
249 
250  -- Read control and valid
251  sAxiReadSlave.rvalid <= ite(m2sRst = '0', readMastToSlaveValid, '1');
253 
254 
255  ------------------------------------
256  -- Write Addr : Slave To Master
257  ------------------------------------
258 
259  -- Write Addr Master To Slave FIFO
260  U_WriteAddrSlaveToMastFifo : entity work.FifoASync
261  generic map (
262  TPD_G => TPD_G,
263  RST_POLARITY_G => '1',
264  BRAM_EN_G => false, -- Use Dist Ram
265  FWFT_EN_G => true,
266  USE_DSP48_G => "no",
267  ALTERA_SYN_G => false,
268  ALTERA_RAM_G => "M9K",
269  SYNC_STAGES_G => 3,
270  PIPE_STAGES_G => PIPE_STAGES_G,
271  DATA_WIDTH_G => NUM_ADDR_BITS_G+3,
272  ADDR_WIDTH_G => 4,
273  INIT_G => "0",
274  FULL_THRES_G => 15,
275  EMPTY_THRES_G => 1)
276  port map (
277  rst => s2mRst,
278  wr_clk => sAxiClk,
279  wr_en => writeAddrSlaveToMastWrite,
281  wr_data_count => open,
282  wr_ack => open,
283  overflow => open,
284  prog_full => open,
285  almost_full => open,
286  full => writeAddrSlaveToMastFull,
287  not_full => open,
288  rd_clk => mAxiClk,
289  rd_en => writeAddrSlaveToMastRead,
290  dout => writeAddrSlaveToMastDout,
291  rd_data_count => open,
292  valid => writeAddrSlaveToMastValid,
293  underflow => open,
294  prog_empty => open,
295  almost_empty => open,
296  empty => open
297  );
298 
299  -- Data In
302 
303  -- Write control and ready generation
304  sAxiWriteSlave.awready <= ite(m2sRst = '0', not writeAddrSlaveToMastFull, '1');
306 
307  -- Data Out
309 
310  process (writeAddrSlaveToMastDout)
311  begin
312  mAxiWriteMaster.awaddr <= (others => '0');
314  end process;
315 
316  -- Read control and valid
319 
320 
321  ------------------------------------
322  -- Write Data : Slave to Master
323  ------------------------------------
324 
325  -- Write Data Slave To Master FIFO
326  U_WriteDataSlaveToMastFifo : entity work.FifoASync
327  generic map (
328  TPD_G => TPD_G,
329  RST_POLARITY_G => '1',
330  BRAM_EN_G => false, -- Use Dist Ram
331  FWFT_EN_G => true,
332  USE_DSP48_G => "no",
333  ALTERA_SYN_G => false,
334  ALTERA_RAM_G => "M9K",
335  SYNC_STAGES_G => 3,
336  PIPE_STAGES_G => PIPE_STAGES_G,
337  DATA_WIDTH_G => 36,
338  ADDR_WIDTH_G => 4,
339  INIT_G => "0",
340  FULL_THRES_G => 15,
341  EMPTY_THRES_G => 1)
342  port map (
343  rst => s2mRst,
344  wr_clk => sAxiClk,
345  wr_en => writeDataSlaveToMastWrite,
346  din => writeDataSlaveTomastDin,
347  wr_data_count => open,
348  wr_ack => open,
349  overflow => open,
350  prog_full => open,
351  almost_full => open,
352  full => writeDataSlaveToMastFull,
353  not_full => open,
354  rd_clk => mAxiClk,
355  rd_en => writeDataSlaveToMastRead,
356  dout => writeDataSlaveTomastDout,
357  rd_data_count => open,
358  valid => writeDataSlaveToMastValid,
359  underflow => open,
360  prog_empty => open,
361  almost_empty => open,
362  empty => open
363  );
364 
365  -- Data In
368 
369  -- Write control and ready generation
370  sAxiWriteSlave.wready <= ite(m2sRst = '0', not writeDataSlaveToMastFull, '1');
372 
373  -- Data Out
376 
377  -- Read control and valid
380 
381 
382  ------------------------------------
383  -- Write: Status Master To Slave
384  ------------------------------------
385 
386  -- Write Status Master To Slave FIFO
387  U_WriteMastToSlaveFifo : entity work.FifoASync
388  generic map (
389  TPD_G => TPD_G,
390  RST_POLARITY_G => '1',
391  BRAM_EN_G => false, -- Use Dist Ram
392  FWFT_EN_G => true,
393  USE_DSP48_G => "no",
394  ALTERA_SYN_G => false,
395  ALTERA_RAM_G => "M9K",
396  SYNC_STAGES_G => 3,
397  PIPE_STAGES_G => PIPE_STAGES_G,
398  DATA_WIDTH_G => 2,
399  ADDR_WIDTH_G => 4,
400  INIT_G => "0",
401  FULL_THRES_G => 15,
402  EMPTY_THRES_G => 1)
403  port map (
404  rst => m2sRst,
405  wr_clk => mAxiClk,
406  wr_en => writeMastToSlaveWrite,
407  din => writeMastToSlaveDin,
408  wr_data_count => open,
409  wr_ack => open,
410  overflow => open,
411  prog_full => open,
412  almost_full => open,
413  full => writeMastToSlaveFull,
414  not_full => open,
415  rd_clk => sAxiClk,
416  rd_en => writeMastToSlaveRead,
417  dout => writeMastToSlaveDout,
418  rd_data_count => open,
419  valid => writeMastToSlaveValid,
420  underflow => open,
421  prog_empty => open,
422  almost_empty => open,
423  empty => open
424  );
425 
426  -- Data In
428 
429  -- Write control and ready generation
432 
433  -- Data Out
435 
436  -- Read control and valid
439 
440  end generate;
441 
442 end architecture STRUCTURE;
slv( 2 downto 0) arprot
Definition: AxiLitePkg.vhd:62
COMMON_CLK_Gboolean := false
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
slv( 1 downto 0) rresp
Definition: AxiLitePkg.vhd:90
out syncRstsl
Definition: RstSync.vhd:36
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
slv( 31 downto 0) rdata
Definition: AxiLitePkg.vhd:89
out mAxiReadMasterAxiLiteReadMasterType
slv( NUM_ADDR_BITS_G+ 2 downto 0) writeAddrSlaveToMastDout
PIPE_STAGES_Ginteger range 0 to 16:= 0
slv( NUM_ADDR_BITS_G+ 2 downto 0) writeAddrSlaveToMastDin
in mAxiWriteSlaveAxiLiteWriteSlaveType
_library_ ieeeieee
in asyncRstsl
Definition: RstSync.vhd:35
slv( 1 downto 0) writeMastToSlaveDin
out sAxiWriteSlaveAxiLiteWriteSlaveType
slv( 31 downto 0) wdata
Definition: AxiLitePkg.vhd:117
in clksl
Definition: RstSync.vhd:34
slv( 1 downto 0) writeMastToSlaveDout
in sAxiReadMasterAxiLiteReadMasterType
slv( NUM_ADDR_BITS_G+ 2 downto 0) readSlaveToMastDout
slv( 1 downto 0) := "10" AXI_RESP_SLVERR_C
Definition: AxiLitePkg.vhd:36
in sAxiWriteMasterAxiLiteWriteMasterType
slv( NUM_ADDR_BITS_G+ 2 downto 0) readSlaveToMastDin
slv( 35 downto 0) writeDataSlaveToMastDout
slv( 2 downto 0) awprot
Definition: AxiLitePkg.vhd:114
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
slv( 31 downto 0) awaddr
Definition: AxiLitePkg.vhd:113
TPD_Gtime := 1 ns
Definition: RstSync.vhd:27
slv( 1 downto 0) bresp
Definition: AxiLitePkg.vhd:150
out sAxiReadSlaveAxiLiteReadSlaveType
slv( 35 downto 0) writeDataSlaveToMastDin
OUT_REG_RST_Gboolean := true
Definition: RstSync.vhd:32
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
in mAxiReadSlaveAxiLiteReadSlaveType
in mAxiClkRstsl
slv( 31 downto 0) araddr
Definition: AxiLitePkg.vhd:61
slv( 33 downto 0) readMastToSlaveDout
slv( 3 downto 0) wstrb
Definition: AxiLitePkg.vhd:118
TPD_Gtime := 1 ns
slv( 33 downto 0) readMastToSlaveDin
out mAxiWriteMasterAxiLiteWriteMasterType
in sAxiClkRstsl
NUM_ADDR_BITS_Gnatural := 32
std_logic_vector slv
Definition: StdRtlPkg.vhd:29