library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity FiRoE is generic ( TOGGLE : boolean := true ); port ( FiRo_o : out std_logic; Run_i : in std_logic ); end entity FiRoE; architecture rtl of FiRoE is --+ signal for inverter loop signal s_ring : std_logic_vector(15 downto 0); signal s_tff : std_logic; --+ attributes for synthesis tool to preserve inverter loop attribute syn_keep : boolean; attribute syn_hier : string; attribute syn_hier of rtl : architecture is "hard"; attribute syn_keep of s_ring : signal is true; attribute syn_keep of s_tff : signal is true; --+ Attributes for lattice map tool to not merging inverter loop attribute nomerge : boolean; attribute nomerge of s_ring : signal is true; begin FiroRingG : for index in 1 to 15 generate s_ring(index) <= not(s_ring(index - 1)); end generate FiroRingG; s_ring(0) <= (s_ring(15) xor s_ring(14) xor s_ring(7) xor s_ring(6) xor s_ring(5) xor s_ring(4) xor s_ring(2)) and Run_i; WithToggleG : if TOGGLE generate tffP : process(Run_i, s_ring(15)) is begin if(Run_i = '0') then s_tff <= '0'; elsif(rising_edge(s_ring(15))) then s_tff <= not s_tff; end if; end process tffP; FiRo_o <= s_ring(15) xor s_tff; end generate WithToggleG; WithoutToggleG : if not(TOGGLE) generate FiRo_o <= s_ring(15); end generate WithoutToggleG; end architecture rtl;