-- -- Double flip-flop synchronizer. -- -- This entity is used to safely capture asynchronous signals. -- -- An implementation may assign additional constraints to this entity -- in order to reduce the probability of meta-stability issues. -- For example, an extra tight timing constraint could be placed on -- the data path from syncdff_ff1 to syncdff_ff2 to ensure that -- meta-stability of ff1 is resolved before ff2 captures the signal. -- library ieee; use ieee.std_logic_1164.all; entity syncdff is port ( clk: in std_logic; -- clock (destination domain) rst: in std_logic; -- asynchronous reset, active-high di: in std_logic; -- input data do: out std_logic -- output data ); -- Turn off register replication in XST. attribute REGISTER_DUPLICATION: string; attribute REGISTER_DUPLICATION of syncdff: entity is "NO"; end entity syncdff; architecture syncdff_arch of syncdff is -- flip-flops signal syncdff_ff1: std_ulogic := '0'; signal syncdff_ff2: std_ulogic := '0'; -- Turn of shift-register extraction in XST. attribute SHIFT_EXTRACT: string; attribute SHIFT_EXTRACT of syncdff_ff1: signal is "NO"; attribute SHIFT_EXTRACT of syncdff_ff2: signal is "NO"; -- Tell XST to place both flip-flops in the same slice. attribute RLOC: string; attribute RLOC of syncdff_ff1: signal is "X0Y0"; attribute RLOC of syncdff_ff2: signal is "X0Y0"; -- Tell XST to keep the flip-flop net names to be used in timing constraints. attribute KEEP: string; attribute KEEP of syncdff_ff1: signal is "SOFT"; attribute KEEP of syncdff_ff2: signal is "SOFT"; begin -- second flip-flop drives the output signal do <= syncdff_ff2; process (clk, rst) is begin if rst = '1' then -- asynchronous reset syncdff_ff1 <= '0'; syncdff_ff2 <= '0'; elsif rising_edge(clk) then -- data synchronization syncdff_ff1 <= di; syncdff_ff2 <= syncdff_ff1; end if; end process; end architecture syncdff_arch;