library ieee; use ieee.std_logic_1164.all; entity counter is generic ( MAX : natural := 9; DIGITS : natural; IN_FREQ : natural; OUT_FREQ : natural); port ( clk_i : in std_logic; rst_in : in std_logic; value_o : out std_logic_vector(DIGITS * 4 - 1 downto 0)); end entity counter; architecture a1 of counter is signal count_clk : std_logic; signal carries : std_logic_vector(DIGITS downto 0); signal value : std_logic_vector(DIGITS * 4 - 1 downto 0); begin -- architecture a1 value_o <= value; pulse_gen: entity work.sync_edge_detector port map ( clk_i => clk_i, signal_i => count_clk, rising_edge_o => carries(0), falling_edge_o => open); clock_divider: entity work.clock_divider generic map ( IN_FREQ => IN_FREQ, OUT_FREQ => OUT_FREQ) port map ( clk_i => clk_i, clk_o => count_clk); counters: for i in 0 to DIGITS - 1 generate bcd_counter: entity work.bcd_counter generic map ( MAX => MAX) port map ( clk_i => clk_i, rst_in => rst_in, carry_i => carries(i), carry_o => carries(i + 1), count_o => value((i + 1) * 4 - 1 downto i * 4)); end generate counters; end architecture a1;