library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity bcd_counter is generic ( MAX : integer := 10); port ( clk_i : in std_logic; rst_in : in std_logic; carry_i : in std_logic; carry_o : out std_logic; count_o : out std_logic_vector(3 downto 0)); end entity bcd_counter; architecture a1 of bcd_counter is signal count_next : unsigned(3 downto 0); signal count_reg : unsigned(3 downto 0); begin -- architecture a1 count_next <= ((count_reg + 1) mod MAX) when carry_i = '1' else count_reg; carry_o <= '1' when count_next = "0000" and carry_i = '1' else '0'; count_o <= std_logic_vector(count_reg); set_count: process (clk_i) is begin -- process set_count if rising_edge(clk_i) then -- rising clock edge if rst_in = '0' then -- synchronous reset (active low) count_reg <= "0000"; else count_reg <= count_next; end if; end if; end process set_count; end architecture a1;