105 use ieee.std_logic_1164.
all;
106 use ieee.numeric_std.
all;
107 use ieee.std_logic_misc.
all;
113 C_CDC_TYPE : integer range 0 to 2 := 1 ;
117 C_RESET_STATE : integer range 0 to 1 := 0 ;
120 C_SINGLE_BIT : integer range 0 to 1 := 1 ;
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
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 ;
137 scndry_aclk : in std_logic ;
138 scndry_resetn : in std_logic ;
141 scndry_out : out std_logic ;
143 scndry_vect_out : out std_logic_vector
144 (C_VECTOR_WIDTH - 1 downto 0)
154 attribute DowngradeIPIdentifiedWarnings: string;
155 attribute DowngradeIPIdentifiedWarnings of implementation : architecture is "yes";
174 GENERATE_PULSE_P_S_CDC_OPEN_ENDED : if C_CDC_TYPE = 0 generate
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';
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";
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";
219 prmry_in_xored <= prmry_in xor p_in_d1_cdc_from;
221 REG_P_IN :
process(prmry_aclk)
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';
227 p_in_d1_cdc_from <= prmry_in_xored;
230 end process REG_P_IN;
233 P_IN_CROSS2SCNDRY :
process(scndry_aclk)
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';
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;
256 end process P_IN_CROSS2SCNDRY;
258 MTBF_2 : if C_MTBF_STAGES = 2 generate
260 s_out_re <= s_out_d2 xor s_out_d3;
264 MTBF_3 : if C_MTBF_STAGES = 3 generate
266 s_out_re <= s_out_d3 xor s_out_d4;
270 MTBF_4 : if C_MTBF_STAGES = 4 generate
272 s_out_re <= s_out_d4 xor s_out_d5;
276 MTBF_5 : if C_MTBF_STAGES = 5 generate
278 s_out_re <= s_out_d5 xor s_out_d6;
282 MTBF_6 : if C_MTBF_STAGES = 6 generate
284 s_out_re <= s_out_d6 xor s_out_d7;
290 end generate GENERATE_PULSE_P_S_CDC_OPEN_ENDED;
294 GENERATE_LEVEL_P_S_CDC : if C_CDC_TYPE = 1 generate
298 SINGLE_BIT : if C_SINGLE_BIT = 1 generate
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';
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";
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";
328 ATTRIBUTE keep : STRING;
329 ATTRIBUTE keep OF p_level_in_d1_cdc_from : SIGNAL IS "true";
338 INPUT_FLOP : if C_FLOP_INPUT = 1 generate
341 REG_PLEVEL_IN :
process(prmry_aclk)
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';
347 p_level_in_d1_cdc_from <= prmry_in;
350 end process REG_PLEVEL_IN;
352 p_level_in_int <= p_level_in_d1_cdc_from;
354 end generate INPUT_FLOP;
357 NO_INPUT_FLOP : if C_FLOP_INPUT = 0 generate
360 p_level_in_int <= prmry_in;
362 end generate NO_INPUT_FLOP;
364 CROSS_PLEVEL_IN2SCNDRY :
process(scndry_aclk)
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';
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;
383 end process CROSS_PLEVEL_IN2SCNDRY;
388 MTBF_L1 : if C_MTBF_STAGES = 1 generate
390 scndry_out <= s_level_out_d1_efex_aurora_hub2_cdc_to;
393 end generate MTBF_L1;
395 MTBF_L2 : if C_MTBF_STAGES = 2 generate
398 scndry_out <= s_level_out_d2;
401 end generate MTBF_L2;
403 MTBF_L3 : if C_MTBF_STAGES = 3 generate
406 scndry_out <= s_level_out_d3;
410 end generate MTBF_L3;
412 MTBF_L4 : if C_MTBF_STAGES = 4 generate
414 scndry_out <= s_level_out_d4;
418 end generate MTBF_L4;
420 MTBF_L5 : if C_MTBF_STAGES = 5 generate
423 scndry_out <= s_level_out_d5;
426 end generate MTBF_L5;
428 MTBF_L6 : if C_MTBF_STAGES = 6 generate
431 scndry_out <= s_level_out_d6;
434 end generate MTBF_L6;
436 end generate SINGLE_BIT;
440 MULTI_BIT : if C_SINGLE_BIT = 0 generate
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);
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";
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";
488 CROSS_PLEVEL_IN2SCNDRY :
process(scndry_aclk)
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');
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;
507 end process CROSS_PLEVEL_IN2SCNDRY;
511 MTBF_L1 : if C_MTBF_STAGES = 1 generate
514 scndry_vect_out <= s_level_out_bus_d1_efex_aurora_hub2_cdc_to;
517 end generate MTBF_L1;
519 MTBF_L2 : if C_MTBF_STAGES = 2 generate
522 scndry_vect_out <= s_level_out_bus_d2;
525 end generate MTBF_L2;
527 MTBF_L3 : if C_MTBF_STAGES = 3 generate
530 scndry_vect_out <= s_level_out_bus_d3;
534 end generate MTBF_L3;
536 MTBF_L4 : if C_MTBF_STAGES = 4 generate
538 scndry_vect_out <= s_level_out_bus_d4;
542 end generate MTBF_L4;
544 MTBF_L5 : if C_MTBF_STAGES = 5 generate
547 scndry_vect_out <= s_level_out_bus_d5;
550 end generate MTBF_L5;
552 MTBF_L6 : if C_MTBF_STAGES = 6 generate
555 scndry_vect_out <= s_level_out_bus_d6;
558 end generate MTBF_L6;
560 end generate MULTI_BIT;
563 end generate GENERATE_LEVEL_P_S_CDC;
566 GENERATE_LEVEL_ACK_P_S_CDC : if C_CDC_TYPE = 2 generate
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';
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";
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";
613 INPUT_FLOP : if C_FLOP_INPUT = 1 generate
616 REG_PLEVEL_IN :
process(prmry_aclk)
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';
622 p_level_in_d1_cdc_from <= prmry_in;
625 end process REG_PLEVEL_IN;
627 p_level_in_int <= p_level_in_d1_cdc_from;
629 end generate INPUT_FLOP;
632 NO_INPUT_FLOP : if C_FLOP_INPUT = 0 generate
635 p_level_in_int <= prmry_in;
637 end generate NO_INPUT_FLOP;
639 CROSS_PLEVEL_IN2SCNDRY :
process(scndry_aclk)
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';
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;
658 end process CROSS_PLEVEL_IN2SCNDRY;
661 CROSS_PLEVEL_SCNDRY2PRMRY :
process(prmry_aclk)
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';
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;
684 end process CROSS_PLEVEL_SCNDRY2PRMRY;
689 MTBF_L2 : if C_MTBF_STAGES = 2 or C_MTBF_STAGES = 1 generate
692 scndry_out_int <= s_level_out_d2;
693 prmry_pulse_ack <= p_level_out_d3 xor p_level_out_d2;
696 end generate MTBF_L2;
698 MTBF_L3 : if C_MTBF_STAGES = 3 generate
701 scndry_out_int <= s_level_out_d3;
702 prmry_pulse_ack <= p_level_out_d4 xor p_level_out_d3;
706 end generate MTBF_L3;
708 MTBF_L4 : if C_MTBF_STAGES = 4 generate
710 scndry_out_int <= s_level_out_d4;
711 prmry_pulse_ack <= p_level_out_d5 xor p_level_out_d4;
715 end generate MTBF_L4;
717 MTBF_L5 : if C_MTBF_STAGES = 5 generate
720 scndry_out_int <= s_level_out_d5;
721 prmry_pulse_ack <= p_level_out_d6 xor p_level_out_d5;
724 end generate MTBF_L5;
726 MTBF_L6 : if C_MTBF_STAGES = 6 generate
729 scndry_out_int <= s_level_out_d6;
730 prmry_pulse_ack <= p_level_out_d7 xor p_level_out_d6;
733 end generate MTBF_L6;
735 scndry_out <= scndry_out_int;
738 end generate GENERATE_LEVEL_ACK_P_S_CDC;