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 / 2;
signal curr_count : integer range 0 to MAX - 1;
signal next_count : integer range 0 to MAX - 1;
signal gen_clk : std_logic;
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
clk_o <= gen_clk;
next_count <= (curr_count - 1) when curr_count > 0 else MAX - 1;
set_counter: process (clk_i) is
begin -- process set_counter
if rising_edge(clk_i) then -- rising clock edge
curr_count <= next_count;
if curr_count = 0 then
gen_clk <= not gen_clk;
end if;
end if;
end process set_counter;
end generate counter;
end architecture a1;