library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity clock_generator is generic(clock_in_speed, clock_out_speed: integer); port( clock_in: in std_logic; clock_out: out std_logic); end entity clock_generator; architecture rtl of clock_generator is function num_bits(n: natural) return natural is begin if n > 0 then return 1 + num_bits(n / 2); else return 1; end if; end num_bits; constant max_counter: natural := clock_in_speed / clock_out_speed / 2; constant counter_bits: natural := num_bits(max_counter); signal counter: unsigned(counter_bits - 1 downto 0) := (others => '0'); signal clock_signal: std_logic; begin update_counter: process(clock_in) begin if clock_in'event and clock_in = '1' then if counter = max_counter then counter <= to_unsigned(0, counter_bits); clock_signal <= not clock_signal; else counter <= counter + 1; end if; end if; end process; clock_out <= clock_signal; end architecture rtl;
Usage:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity test is port( clk_50mhz: in std_logic; btn_south: in std_logic; led: out std_logic); end entity test; architecture rtl of test is constant system_speed: natural := 50e6; signal clock_10hz: std_logic; begin clock_10hz_generator: entity clock_generator generic map(clock_in_speed => system_speed, clock_out_speed => 10) port map( clock_in => clk_50mhz, clock_out => clock_10hz); led <= clock_10hz; end architecture rtl;