library ieee; use ieee.std_logic_1164.all; entity clock_divider is generic ( IN_FREQ : integer; OUT_FREQ : integer); port ( clk_i : in std_logic; clk_o : out std_logic); end entity clock_divider; architecture a1 of clock_divider is constant MAX : integer := IN_FREQ / OUT_FREQ; signal counter_next : integer range 0 to MAX; signal counter_reg : integer range 0 to MAX; begin -- architecture a1 keep_max_freq: if IN_FREQ = OUT_FREQ generate clk_o <= clk_i; end generate keep_max_freq; counter: if IN_FREQ /= OUT_FREQ generate counter_next <= (counter_reg + 1) when counter_reg < MAX else 0; clk_o <= '1' when counter_reg >= MAX/2 else '0'; set_counter: process (clk_i) is begin -- process set_counter if rising_edge(clk_i) then -- rising clock edge counter_reg <= counter_next; end if; end process set_counter; end generate counter; end architecture a1;