library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; library machxo2; use machxo2.components.all; entity FiRoE is generic ( IMP : string := "HDL", 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 0 to 30 generate HdlG : if IMP = "HDL" generate s_ring(index) <= not(s_ring(index - 1)); end generate HdlG; LutG : if IMP = "LUT" generate lut : LUT4 generic map ( init => x"FFFF" ) port map ( Z => s_ring(i-1), A => s_ring(i), B => '0', C => '0', D => '0' ); end generate LutG; 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;