Hier ein skalierbarer Ringoszillator. Der reset geht bei dieser variante nur auf die erste Stufe der Gatterkette. Wenn eine gerade Gatteranzahl ausgewählt wird, bricht die Synthese und der Simulator mit einer Fehlermeldung ab:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity RingO is Port ( reset : in STD_LOGIC; fout : out STD_LOGIC); end RingO; architecture Behavioral of RingO is signal ring : std_logic_vector(2 downto 0); -- ungerade Bitanzahl -- signal ring : std_logic_vector(20 downto 0); -- ungerade Bitanzahl attribute KEEP : string; attribute KEEP of ring : signal is "true"; begin assert ring'length mod 2 = 1 report "Length of ring must be an odd number!" severity failure; process (ring,reset) begin for i in ring'range loop if i = ring'left then if reset='1' then ring(i) <= '1'; else ring(i) <= not ring(0) after 1ns; end if; else ring(i) <= not ring(i+1) after 1ns; end if; end loop; end process; fout <= ring(0); end Behavioral;
Bei der Simulation sieht man den Einfluss der Ringlänge. Hier sind es 3 Bit:
Mit 21 Bit Ringlänge ist die Frequenz deutlich niedriger:
Das Attribut Keep muss wieder dafür sorgen, dass der Ring vom Synthesizer nicht auf 1 Gatter zurechtgestutzt wird: