eFEX firmware  1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards

Back to eFEX documentation
efex_aurora_hub2_cdc_sync_exdes.vhd
1 ------------------------------------------------------------------------------/
2 -- (c) Copyright 2013 Xilinx, Inc. All rights reserved.
3 --
4 -- This file contains confidential and proprietary information
5 -- of Xilinx, Inc. and is protected under U.S. and
6 -- international copyright and other intellectual property
7 -- laws.
8 --
9 -- DISCLAIMER
10 -- This disclaimer is not a license and does not grant any
11 -- rights to the materials distributed herewith. Except as
12 -- otherwise provided in a valid license issued to you by
13 -- Xilinx, and to the maximum extent permitted by applicable
14 -- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15 -- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16 -- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17 -- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18 -- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19 -- (2) Xilinx shall not be liable (whether in contract or tort,
20 -- including negligence, or under any other theory of
21 -- liability) for any loss or damage of any kind or nature
22 -- related to, arising under or in connection with these
23 -- materials, including for any direct, or any indirect,
24 -- special, incidental, or consequential loss or damage
25 -- (including loss of data, profits, goodwill, or any type of
26 -- loss or damage suffered as a result of any action brought
27 -- by a third party) even if such damage or loss was
28 -- reasonably foreseeable or Xilinx had been advised of the
29 -- possibility of the same.
30 --
31 -- CRITICAL APPLICATIONS
32 -- Xilinx products are not designed or intended to be fail-
33 -- safe, or for use in any application requiring fail-safe
34 -- performance, such as life-support or safety devices or
35 -- systems, Class III medical devices, nuclear facilities,
36 -- applications related to the deployment of airbags, or any
37 -- other applications that could lead to death, personal
38 -- injury, or severe property or environmental damage
39 -- (individually and collectively, "Critical
40 -- Applications"). Customer assumes the sole risk and
41 -- liability of any use of Xilinx products in Critical
42 -- Applications, subject only to applicable laws and
43 -- regulations governing limitations on product liability.
44 --
45 -- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46 -- PART OF THIS FILE AT ALL TIMES.
47 --
48 --
49 --------------------------------------------------------------------------------
50 
51 --Generic Help
52 --C_CDC_TYPE : Defines the type of CDC needed
53 -- 0 means pulse synchronizer. Used to transfer one clock pulse
54 -- from prmry domain to scndry domain.
55 -- 1 means level synchronizer. Used to transfer level signal.
56 -- 2 means level synchronizer with ack. Used to transfer level
57 -- signal. Input signal should change only when prmry_ack is detected
58 --
59 --C_FLOP_INPUT : when set to 1 adds one flop stage to the input prmry_in signal
60 -- Set to 0 when incoming signal is purely floped signal.
61 --
62 --C_RESET_STATE : Generally sync flops need not have resets. However, in some cases
63 -- it might be needed.
64 -- 0 means reset not needed for sync flops
65 -- 1 means reset needed for sync flops. i
66 -- In this case prmry_resetn should be in prmry clock,
67 -- while scndry_reset should be in scndry clock.
68 --
69 --C_SINGLE_BIT : CDC should normally be done for single bit signals only.
70 -- However, based on design buses can also be CDC'ed.
71 -- 0 means it is a bus. In this case input be connected to prmry_vect_in.
72 -- Output is on scndry_vect_out.
73 -- 1 means it is a single bit. In this case input be connected to prmry_in.
74 -- Output is on scndry_out.
75 --
76 --C_VECTOR_WIDTH : defines the size of bus. This is irrelevant when C_SINGLE_BIT = 1
77 --
78 --C_MTBF_STAGES : Defines the number of sync stages needed. Allowed values are 0 to 6.
79 -- Value of 0, 1 is allowed only for level CDC.
80 -- Min value for Pulse CDC is 2
81 --
82 --Whenever this file is used following XDC constraint has to be added
83 
84 -- set_false_path -to [get_pins -hier *efex_aurora_hub2_cdc_to*/D]
85 
86 
87 --IO Ports
88 --
89 -- prmry_aclk : clock of originating domain (source domain)
90 -- prmry_resetn : sync reset of originating clock domain (source domain)
91 -- prmry_in : input signal bit. This should be a pure flop output without
92 -- any combi logic. This is source.
93 -- prmry_vect_in : bus signal. From Source domain.
94 -- prmry_ack : Ack signal, valid for one clock period, in prmry_aclk domain.
95 -- Used only when C_CDC_TYPE = 2
96 -- scndry_aclk : destination clock.
97 -- scndry_resetn : sync reset of destination domain
98 -- scndry_out : sync'ed output in destination domain. Single bit.
99 -- scndry_vect_out : sync'ed output in destination domain. bus.
100 
101 
102 
103 
104 library ieee;
105 use ieee.std_logic_1164.all;
106 use ieee.numeric_std.all;
107 use ieee.std_logic_misc.all;
108 
109 
110 
112  generic (
113  C_CDC_TYPE : integer range 0 to 2 := 1 ;
114  -- 0 is pulse synch
115  -- 1 is level synch
116  -- 2 is ack based level sync
117  C_RESET_STATE : integer range 0 to 1 := 0 ;
118  -- 0 is reset not needed
119  -- 1 is reset needed
120  C_SINGLE_BIT : integer range 0 to 1 := 1 ;
121  -- 0 is bus input
122  -- 1 is single bit input
123  C_FLOP_INPUT : integer range 0 to 1 := 0 ;
124  C_VECTOR_WIDTH : integer range 0 to 32 := 32 ;
125  C_MTBF_STAGES : integer range 0 to 6 := 2
126  -- Vector Data witdth
127  );
128 
129  port (
130  prmry_aclk : in std_logic ; --
131  prmry_resetn : in std_logic ; --
132  prmry_in : in std_logic ; --
133  prmry_vect_in : in std_logic_vector --
134  (C_VECTOR_WIDTH - 1 downto 0) ; --
135  prmry_ack : out std_logic ;
136  --
137  scndry_aclk : in std_logic ; --
138  scndry_resetn : in std_logic ; --
139  --
140  -- Primary to Secondary Clock Crossing --
141  scndry_out : out std_logic ; --
142  --
143  scndry_vect_out : out std_logic_vector --
144  (C_VECTOR_WIDTH - 1 downto 0) --
145 
146  );
147 
149 
150 -------------------------------------------------------------------------------
151 -- Architecture
152 -------------------------------------------------------------------------------
154  attribute DowngradeIPIdentifiedWarnings: string;
155  attribute DowngradeIPIdentifiedWarnings of implementation : architecture is "yes";
156 
157 -------------------------------------------------------------------------------
158 -- Functions
159 -------------------------------------------------------------------------------
160 
161 -- No Functions Declared
162 
163 -------------------------------------------------------------------------------
164 -- Constants Declarations
165 -------------------------------------------------------------------------------
166 
167 -- No Constants Declared
168 
169 -------------------------------------------------------------------------------
170 -- Begin architecture logic
171 -------------------------------------------------------------------------------
172 begin
173 -- Generate PULSE clock domain crossing
174 GENERATE_PULSE_P_S_CDC_OPEN_ENDED : if C_CDC_TYPE = 0 generate
175 
176 -- Primary to Secondary
177 signal s_out_d1_efex_aurora_hub2_cdc_to : std_logic := '0';
178 signal s_out_d2 : std_logic := '0';
179 signal s_out_d3 : std_logic := '0';
180 signal s_out_d4 : std_logic := '0';
181 signal s_out_d5 : std_logic := '0';
182 signal s_out_d6 : std_logic := '0';
183 signal s_out_d7 : std_logic := '0';
184 signal s_out_re : std_logic := '0';
185 signal prmry_in_xored : std_logic := '0';
186 signal p_in_d1_cdc_from : std_logic := '0';
187 
188 
189 
190  -----------------------------------------------------------------------------
191  -- ATTRIBUTE Declarations
192  -----------------------------------------------------------------------------
193  -- Prevent x-propagation on clock-domain crossing register
194  ATTRIBUTE async_reg : STRING;
195  ATTRIBUTE async_reg OF s_out_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "true";
196  ATTRIBUTE async_reg OF s_out_d2 : SIGNAL IS "true";
197  ATTRIBUTE async_reg OF s_out_d3 : SIGNAL IS "true";
198  ATTRIBUTE async_reg OF s_out_d4 : SIGNAL IS "true";
199  ATTRIBUTE async_reg OF s_out_d5 : SIGNAL IS "true";
200  ATTRIBUTE async_reg OF s_out_d6 : SIGNAL IS "true";
201  ATTRIBUTE async_reg OF s_out_d7 : SIGNAL IS "true";
202 
203  ATTRIBUTE shift_extract : STRING;
204  ATTRIBUTE shift_extract OF s_out_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "no";
205  ATTRIBUTE shift_extract OF s_out_d2 : SIGNAL IS "no";
206  ATTRIBUTE shift_extract OF s_out_d3 : SIGNAL IS "no";
207  ATTRIBUTE shift_extract OF s_out_d4 : SIGNAL IS "no";
208  ATTRIBUTE shift_extract OF s_out_d5 : SIGNAL IS "no";
209  ATTRIBUTE shift_extract OF s_out_d6 : SIGNAL IS "no";
210  ATTRIBUTE shift_extract OF s_out_d7 : SIGNAL IS "no";
211 
212 begin
213 
214  --*****************************************************************************
215  --** Asynchronous Pulse Clock Crossing **
216  --** PRIMARY TO SECONDARY OPEN-ENDED **
217  --*****************************************************************************
218 
219 prmry_in_xored <= prmry_in xor p_in_d1_cdc_from;
220 
221  REG_P_IN : process(prmry_aclk)
222  begin
223  if(prmry_aclk'EVENT and prmry_aclk ='1')then
224  if(prmry_resetn = '0' and C_RESET_STATE = 1)then
225  p_in_d1_cdc_from <= '0';
226  else
227  p_in_d1_cdc_from <= prmry_in_xored;
228  end if;
229  end if;
230  end process REG_P_IN;
231 
232 
233  P_IN_CROSS2SCNDRY : process(scndry_aclk)
234  begin
235  if(scndry_aclk'EVENT and scndry_aclk ='1')then
236  if(scndry_resetn = '0' and C_RESET_STATE = 1)then
237  s_out_d1_efex_aurora_hub2_cdc_to <= '0';
238  s_out_d2 <= '0';
239  s_out_d3 <= '0';
240  s_out_d4 <= '0';
241  s_out_d5 <= '0';
242  s_out_d6 <= '0';
243  s_out_d7 <= '0';
244  scndry_out <= '0';
245  else
246  s_out_d1_efex_aurora_hub2_cdc_to <= p_in_d1_cdc_from;
247  s_out_d2 <= s_out_d1_efex_aurora_hub2_cdc_to;
248  s_out_d3 <= s_out_d2;
249  s_out_d4 <= s_out_d3;
250  s_out_d5 <= s_out_d4;
251  s_out_d6 <= s_out_d5;
252  s_out_d7 <= s_out_d6;
253  scndry_out <= s_out_re;
254  end if;
255  end if;
256  end process P_IN_CROSS2SCNDRY;
257 
258 MTBF_2 : if C_MTBF_STAGES = 2 generate
259 begin
260  s_out_re <= s_out_d2 xor s_out_d3;
261 
262 end generate MTBF_2;
263 
264 MTBF_3 : if C_MTBF_STAGES = 3 generate
265 begin
266  s_out_re <= s_out_d3 xor s_out_d4;
267 
268 end generate MTBF_3;
269 
270 MTBF_4 : if C_MTBF_STAGES = 4 generate
271 begin
272  s_out_re <= s_out_d4 xor s_out_d5;
273 
274 end generate MTBF_4;
275 
276 MTBF_5 : if C_MTBF_STAGES = 5 generate
277 begin
278  s_out_re <= s_out_d5 xor s_out_d6;
279 
280 end generate MTBF_5;
281 
282 MTBF_6 : if C_MTBF_STAGES = 6 generate
283 begin
284  s_out_re <= s_out_d6 xor s_out_d7;
285 
286 end generate MTBF_6;
287 
288  -- Feed secondary pulse out
289 
290 end generate GENERATE_PULSE_P_S_CDC_OPEN_ENDED;
291 
292 
293 -- Generate LEVEL clock domain crossing with reset state = 0
294 GENERATE_LEVEL_P_S_CDC : if C_CDC_TYPE = 1 generate
295 begin
296 -- Primary to Secondary
297 
298 SINGLE_BIT : if C_SINGLE_BIT = 1 generate
299 
300 signal p_level_in_d1_cdc_from : std_logic := '0';
301 signal p_level_in_int : std_logic := '0';
302 signal s_level_out_d1_efex_aurora_hub2_cdc_to : std_logic := '0';
303 signal s_level_out_d2 : std_logic := '0';
304 signal s_level_out_d3 : std_logic := '0';
305 signal s_level_out_d4 : std_logic := '0';
306 signal s_level_out_d5 : std_logic := '0';
307 signal s_level_out_d6 : std_logic := '0';
308  -----------------------------------------------------------------------------
309  -- ATTRIBUTE Declarations
310  -----------------------------------------------------------------------------
311  -- Prevent x-propagation on clock-domain crossing register
312  ATTRIBUTE async_reg : STRING;
313  ATTRIBUTE async_reg OF s_level_out_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "true";
314  ATTRIBUTE async_reg OF s_level_out_d2 : SIGNAL IS "true";
315  ATTRIBUTE async_reg OF s_level_out_d3 : SIGNAL IS "true";
316  ATTRIBUTE async_reg OF s_level_out_d4 : SIGNAL IS "true";
317  ATTRIBUTE async_reg OF s_level_out_d5 : SIGNAL IS "true";
318  ATTRIBUTE async_reg OF s_level_out_d6 : SIGNAL IS "true";
319 
320  ATTRIBUTE shift_extract : STRING;
321  ATTRIBUTE shift_extract OF s_level_out_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "no";
322  ATTRIBUTE shift_extract OF s_level_out_d2 : SIGNAL IS "no";
323  ATTRIBUTE shift_extract OF s_level_out_d3 : SIGNAL IS "no";
324  ATTRIBUTE shift_extract OF s_level_out_d4 : SIGNAL IS "no";
325  ATTRIBUTE shift_extract OF s_level_out_d5 : SIGNAL IS "no";
326  ATTRIBUTE shift_extract OF s_level_out_d6 : SIGNAL IS "no";
327 
328  ATTRIBUTE keep : STRING;
329  ATTRIBUTE keep OF p_level_in_d1_cdc_from : SIGNAL IS "true";
330 begin
331 
332  --*****************************************************************************
333  --** Asynchronous Level Clock Crossing **
334  --** PRIMARY TO SECONDARY **
335  --*****************************************************************************
336  -- register is scndry to provide clean ff output to clock crossing logic
337 
338 INPUT_FLOP : if C_FLOP_INPUT = 1 generate
339 begin
340 
341  REG_PLEVEL_IN : process(prmry_aclk)
342  begin
343  if(prmry_aclk'EVENT and prmry_aclk ='1')then
344  if(prmry_resetn = '0' and C_RESET_STATE = 1)then
345  p_level_in_d1_cdc_from <= '0';
346  else
347  p_level_in_d1_cdc_from <= prmry_in;
348  end if;
349  end if;
350  end process REG_PLEVEL_IN;
351 
352  p_level_in_int <= p_level_in_d1_cdc_from;
353 
354 end generate INPUT_FLOP;
355 
356 
357 NO_INPUT_FLOP : if C_FLOP_INPUT = 0 generate
358 begin
359 
360  p_level_in_int <= prmry_in;
361 
362 end generate NO_INPUT_FLOP;
363 
364  CROSS_PLEVEL_IN2SCNDRY : process(scndry_aclk)
365  begin
366  if(scndry_aclk'EVENT and scndry_aclk ='1')then
367  if(scndry_resetn = '0' and C_RESET_STATE = 1)then
368  s_level_out_d1_efex_aurora_hub2_cdc_to <= '0';
369  s_level_out_d2 <= '0';
370  s_level_out_d3 <= '0';
371  s_level_out_d4 <= '0';
372  s_level_out_d5 <= '0';
373  s_level_out_d6 <= '0';
374  else
375  s_level_out_d1_efex_aurora_hub2_cdc_to <= p_level_in_int;
376  s_level_out_d2 <= s_level_out_d1_efex_aurora_hub2_cdc_to;
377  s_level_out_d3 <= s_level_out_d2;
378  s_level_out_d4 <= s_level_out_d3;
379  s_level_out_d5 <= s_level_out_d4;
380  s_level_out_d6 <= s_level_out_d5;
381  end if;
382  end if;
383  end process CROSS_PLEVEL_IN2SCNDRY;
384 
385 
386 
387 
388 MTBF_L1 : if C_MTBF_STAGES = 1 generate
389 begin
390  scndry_out <= s_level_out_d1_efex_aurora_hub2_cdc_to;
391 
392 
393 end generate MTBF_L1;
394 
395 MTBF_L2 : if C_MTBF_STAGES = 2 generate
396 begin
397 
398  scndry_out <= s_level_out_d2;
399 
400 
401 end generate MTBF_L2;
402 
403 MTBF_L3 : if C_MTBF_STAGES = 3 generate
404 begin
405 
406  scndry_out <= s_level_out_d3;
407 
408 
409 
410 end generate MTBF_L3;
411 
412 MTBF_L4 : if C_MTBF_STAGES = 4 generate
413 begin
414  scndry_out <= s_level_out_d4;
415 
416 
417 
418 end generate MTBF_L4;
419 
420 MTBF_L5 : if C_MTBF_STAGES = 5 generate
421 begin
422 
423  scndry_out <= s_level_out_d5;
424 
425 
426 end generate MTBF_L5;
427 
428 MTBF_L6 : if C_MTBF_STAGES = 6 generate
429 begin
430 
431  scndry_out <= s_level_out_d6;
432 
433 
434 end generate MTBF_L6;
435 
436 end generate SINGLE_BIT;
437 
438 
439 
440 MULTI_BIT : if C_SINGLE_BIT = 0 generate
441 
442 signal p_level_in_bus_d1_cdc_from : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
443 signal s_level_out_bus_d1_efex_aurora_hub2_cdc_to : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
444 signal s_level_out_bus_d1_cdc_tig : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
445 signal s_level_out_bus_d2 : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
446 signal s_level_out_bus_d3 : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
447 signal s_level_out_bus_d4 : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
448 signal s_level_out_bus_d5 : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
449 signal s_level_out_bus_d6 : std_logic_vector(C_VECTOR_WIDTH - 1 downto 0);
450  -----------------------------------------------------------------------------
451  -- ATTRIBUTE Declarations
452  -----------------------------------------------------------------------------
453  -- Prevent x-propagation on clock-domain crossing register
454  ATTRIBUTE async_reg : STRING;
455  ATTRIBUTE async_reg OF s_level_out_bus_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "true";
456  ATTRIBUTE async_reg OF s_level_out_bus_d2 : SIGNAL IS "true";
457  ATTRIBUTE async_reg OF s_level_out_bus_d3 : SIGNAL IS "true";
458  ATTRIBUTE async_reg OF s_level_out_bus_d4 : SIGNAL IS "true";
459  ATTRIBUTE async_reg OF s_level_out_bus_d5 : SIGNAL IS "true";
460  ATTRIBUTE async_reg OF s_level_out_bus_d6 : SIGNAL IS "true";
461 
462  ATTRIBUTE shift_extract : STRING;
463  ATTRIBUTE shift_extract OF s_level_out_bus_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "no";
464  ATTRIBUTE shift_extract OF s_level_out_bus_d2 : SIGNAL IS "no";
465  ATTRIBUTE shift_extract OF s_level_out_bus_d3 : SIGNAL IS "no";
466  ATTRIBUTE shift_extract OF s_level_out_bus_d4 : SIGNAL IS "no";
467  ATTRIBUTE shift_extract OF s_level_out_bus_d5 : SIGNAL IS "no";
468  ATTRIBUTE shift_extract OF s_level_out_bus_d6 : SIGNAL IS "no";
469 
470 begin
471 
472  --*****************************************************************************
473  --** Asynchronous Level Clock Crossing **
474  --** PRIMARY TO SECONDARY **
475  --*****************************************************************************
476  -- register is scndry to provide clean ff output to clock crossing logic
477 -- REG_PLEVEL_IN : process(prmry_aclk)
478 -- begin
479 -- if(prmry_aclk'EVENT and prmry_aclk ='1')then
480 -- if(prmry_resetn = '0' and C_RESET_STATE = 1)then
481 -- p_level_in_bus_d1_cdc_from <= (others => '0');
482 -- else
483 -- p_level_in_bus_d1_cdc_from <= prmry_vect_in;
484 -- end if;
485 -- end if;
486 -- end process REG_PLEVEL_IN;
487 
488  CROSS_PLEVEL_IN2SCNDRY : process(scndry_aclk)
489  begin
490  if(scndry_aclk'EVENT and scndry_aclk ='1')then
491  if(scndry_resetn = '0' and C_RESET_STATE = 1)then
492  s_level_out_bus_d1_efex_aurora_hub2_cdc_to <= (others => '0');
493  s_level_out_bus_d2 <= (others => '0');
494  s_level_out_bus_d3 <= (others => '0');
495  s_level_out_bus_d4 <= (others => '0');
496  s_level_out_bus_d5 <= (others => '0');
497  s_level_out_bus_d6 <= (others => '0');
498  else
499  s_level_out_bus_d1_efex_aurora_hub2_cdc_to <= prmry_vect_in;
500  s_level_out_bus_d2 <= s_level_out_bus_d1_efex_aurora_hub2_cdc_to;
501  s_level_out_bus_d3 <= s_level_out_bus_d2;
502  s_level_out_bus_d4 <= s_level_out_bus_d3;
503  s_level_out_bus_d5 <= s_level_out_bus_d4;
504  s_level_out_bus_d6 <= s_level_out_bus_d5;
505  end if;
506  end if;
507  end process CROSS_PLEVEL_IN2SCNDRY;
508 
509 
510 
511 MTBF_L1 : if C_MTBF_STAGES = 1 generate
512 begin
513 
514  scndry_vect_out <= s_level_out_bus_d1_efex_aurora_hub2_cdc_to;
515 
516 
517 end generate MTBF_L1;
518 
519 MTBF_L2 : if C_MTBF_STAGES = 2 generate
520 begin
521 
522  scndry_vect_out <= s_level_out_bus_d2;
523 
524 
525 end generate MTBF_L2;
526 
527 MTBF_L3 : if C_MTBF_STAGES = 3 generate
528 begin
529 
530  scndry_vect_out <= s_level_out_bus_d3;
531 
532 
533 
534 end generate MTBF_L3;
535 
536 MTBF_L4 : if C_MTBF_STAGES = 4 generate
537 begin
538  scndry_vect_out <= s_level_out_bus_d4;
539 
540 
541 
542 end generate MTBF_L4;
543 
544 MTBF_L5 : if C_MTBF_STAGES = 5 generate
545 begin
546 
547  scndry_vect_out <= s_level_out_bus_d5;
548 
549 
550 end generate MTBF_L5;
551 
552 MTBF_L6 : if C_MTBF_STAGES = 6 generate
553 begin
554 
555  scndry_vect_out <= s_level_out_bus_d6;
556 
557 
558 end generate MTBF_L6;
559 
560 end generate MULTI_BIT;
561 
562 
563 end generate GENERATE_LEVEL_P_S_CDC;
564 
565 
566 GENERATE_LEVEL_ACK_P_S_CDC : if C_CDC_TYPE = 2 generate
567 -- Primary to Secondary
568 
569 
570 signal p_level_in_d1_cdc_from : std_logic := '0';
571 signal p_level_in_int : std_logic := '0';
572 signal s_level_out_d1_efex_aurora_hub2_cdc_to : std_logic := '0';
573 signal s_level_out_d2 : std_logic := '0';
574 signal s_level_out_d3 : std_logic := '0';
575 signal s_level_out_d4 : std_logic := '0';
576 signal s_level_out_d5 : std_logic := '0';
577 signal s_level_out_d6 : std_logic := '0';
578 signal p_level_out_d1_efex_aurora_hub2_cdc_to : std_logic := '0';
579 signal p_level_out_d2 : std_logic := '0';
580 signal p_level_out_d3 : std_logic := '0';
581 signal p_level_out_d4 : std_logic := '0';
582 signal p_level_out_d5 : std_logic := '0';
583 signal p_level_out_d6 : std_logic := '0';
584 signal p_level_out_d7 : std_logic := '0';
585 signal scndry_out_int : std_logic := '0';
586 signal prmry_pulse_ack : std_logic := '0';
587  -----------------------------------------------------------------------------
588  -- ATTRIBUTE Declarations
589  -----------------------------------------------------------------------------
590  -- Prevent x-propagation on clock-domain crossing register
591  ATTRIBUTE async_reg : STRING;
592  ATTRIBUTE async_reg OF s_level_out_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "true";
593  ATTRIBUTE async_reg OF s_level_out_d2 : SIGNAL IS "true";
594  ATTRIBUTE async_reg OF s_level_out_d3 : SIGNAL IS "true";
595  ATTRIBUTE async_reg OF s_level_out_d4 : SIGNAL IS "true";
596  ATTRIBUTE async_reg OF s_level_out_d5 : SIGNAL IS "true";
597  ATTRIBUTE async_reg OF s_level_out_d6 : SIGNAL IS "true";
598 
599  ATTRIBUTE async_reg OF p_level_out_d1_efex_aurora_hub2_cdc_to : SIGNAL IS "true";
600  ATTRIBUTE async_reg OF p_level_out_d2 : SIGNAL IS "true";
601  ATTRIBUTE async_reg OF p_level_out_d3 : SIGNAL IS "true";
602  ATTRIBUTE async_reg OF p_level_out_d4 : SIGNAL IS "true";
603  ATTRIBUTE async_reg OF p_level_out_d5 : SIGNAL IS "true";
604  ATTRIBUTE async_reg OF p_level_out_d6 : SIGNAL IS "true";
605 
606 begin
607 
608  --*****************************************************************************
609  --** Asynchronous Level Clock Crossing **
610  --** PRIMARY TO SECONDARY **
611  --*****************************************************************************
612  -- register is scndry to provide clean ff output to clock crossing logic
613 INPUT_FLOP : if C_FLOP_INPUT = 1 generate
614 begin
615 
616  REG_PLEVEL_IN : process(prmry_aclk)
617  begin
618  if(prmry_aclk'EVENT and prmry_aclk ='1')then
619  if(prmry_resetn = '0' and C_RESET_STATE = 1)then
620  p_level_in_d1_cdc_from <= '0';
621  else
622  p_level_in_d1_cdc_from <= prmry_in;
623  end if;
624  end if;
625  end process REG_PLEVEL_IN;
626 
627  p_level_in_int <= p_level_in_d1_cdc_from;
628 
629 end generate INPUT_FLOP;
630 
631 
632 NO_INPUT_FLOP : if C_FLOP_INPUT = 0 generate
633 begin
634 
635  p_level_in_int <= prmry_in;
636 
637 end generate NO_INPUT_FLOP;
638 
639  CROSS_PLEVEL_IN2SCNDRY : process(scndry_aclk)
640  begin
641  if(scndry_aclk'EVENT and scndry_aclk ='1')then
642  if(scndry_resetn = '0' and C_RESET_STATE = 1)then
643  s_level_out_d1_efex_aurora_hub2_cdc_to <= '0';
644  s_level_out_d2 <= '0';
645  s_level_out_d3 <= '0';
646  s_level_out_d4 <= '0';
647  s_level_out_d5 <= '0';
648  s_level_out_d6 <= '0';
649  else
650  s_level_out_d1_efex_aurora_hub2_cdc_to <= p_level_in_int;
651  s_level_out_d2 <= s_level_out_d1_efex_aurora_hub2_cdc_to;
652  s_level_out_d3 <= s_level_out_d2;
653  s_level_out_d4 <= s_level_out_d3;
654  s_level_out_d5 <= s_level_out_d4;
655  s_level_out_d6 <= s_level_out_d5;
656  end if;
657  end if;
658  end process CROSS_PLEVEL_IN2SCNDRY;
659 
660 
661  CROSS_PLEVEL_SCNDRY2PRMRY : process(prmry_aclk)
662  begin
663  if(prmry_aclk'EVENT and prmry_aclk ='1')then
664  if(prmry_resetn = '0' and C_RESET_STATE = 1)then
665  p_level_out_d1_efex_aurora_hub2_cdc_to <= '0';
666  p_level_out_d2 <= '0';
667  p_level_out_d3 <= '0';
668  p_level_out_d4 <= '0';
669  p_level_out_d5 <= '0';
670  p_level_out_d6 <= '0';
671  p_level_out_d7 <= '0';
672  prmry_ack <= '0';
673  else
674  p_level_out_d1_efex_aurora_hub2_cdc_to <= scndry_out_int;
675  p_level_out_d2 <= p_level_out_d1_efex_aurora_hub2_cdc_to;
676  p_level_out_d3 <= p_level_out_d2;
677  p_level_out_d4 <= p_level_out_d3;
678  p_level_out_d5 <= p_level_out_d4;
679  p_level_out_d6 <= p_level_out_d5;
680  p_level_out_d7 <= p_level_out_d6;
681  prmry_ack <= prmry_pulse_ack;
682  end if;
683  end if;
684  end process CROSS_PLEVEL_SCNDRY2PRMRY;
685 
686 
687 
688 
689 MTBF_L2 : if C_MTBF_STAGES = 2 or C_MTBF_STAGES = 1 generate
690 begin
691 
692  scndry_out_int <= s_level_out_d2;
693  prmry_pulse_ack <= p_level_out_d3 xor p_level_out_d2;
694 
695 
696 end generate MTBF_L2;
697 
698 MTBF_L3 : if C_MTBF_STAGES = 3 generate
699 begin
700 
701  scndry_out_int <= s_level_out_d3;
702  prmry_pulse_ack <= p_level_out_d4 xor p_level_out_d3;
703 
704 
705 
706 end generate MTBF_L3;
707 
708 MTBF_L4 : if C_MTBF_STAGES = 4 generate
709 begin
710  scndry_out_int <= s_level_out_d4;
711  prmry_pulse_ack <= p_level_out_d5 xor p_level_out_d4;
712 
713 
714 
715 end generate MTBF_L4;
716 
717 MTBF_L5 : if C_MTBF_STAGES = 5 generate
718 begin
719 
720  scndry_out_int <= s_level_out_d5;
721  prmry_pulse_ack <= p_level_out_d6 xor p_level_out_d5;
722 
723 
724 end generate MTBF_L5;
725 
726 MTBF_L6 : if C_MTBF_STAGES = 6 generate
727 begin
728 
729  scndry_out_int <= s_level_out_d6;
730  prmry_pulse_ack <= p_level_out_d7 xor p_level_out_d6;
731 
732 
733 end generate MTBF_L6;
734 
735  scndry_out <= scndry_out_int;
736 
737 
738 end generate GENERATE_LEVEL_ACK_P_S_CDC;
739 
740 
741 end implementation;