----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date: 09.03.2026 14:40:14
-- Design Name: 
-- Module Name: top_modul - Behavioral
-- Project Name: 
-- Target Devices: 
-- Tool Versions: 
-- Description: 
-- 
-- Dependencies: 
-- 
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
-- 
----------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity top_modul is
    Port ( CLK : in STD_LOGIC;
           RST : in STD_LOGIC;
           START : in STD_LOGIC;
           SEGMENTS : out STD_LOGIC_VECTOR (7 downto 0);
           ANODS : out STD_LOGIC_VECTOR (3 downto 0));
end top_modul;

architecture Behavioral of top_modul is
    
    component divider is
        Port ( CLK : in STD_LOGIC;
               RST : in STD_LOGIC;
               CLK_1_Hz : out STD_LOGIC); -- This will be our enable pulse
    end component;
    
    component divider_400Hz is
        Port ( CLK : in STD_LOGIC;
               RST : in STD_LOGIC;
               CLK_400_Hz : out STD_LOGIC); -- This will be our enable pulse
    end component;
    
    component counter is
        Port ( CLK : in STD_LOGIC;
               RST : in STD_LOGIC;
               CE : in STD_LOGIC;
               TC : out STD_LOGIC;
               COUNT_OUT : out STD_LOGIC_VECTOR (3 downto 0));
    end component;
    
    component counter_2bit is
        Port ( CLK : in STD_LOGIC;
               RST : in STD_LOGIC;
               COUNT_OUT : out STD_LOGIC_VECTOR (1 downto 0));
    end component;

    component decoder_an is
        Port ( SEL : in STD_LOGIC_VECTOR (1 downto 0);
               ANODES : out STD_LOGIC_VECTOR (3 downto 0));
    end component;

    component mux is
        Port ( I0 : in STD_LOGIC_VECTOR (3 downto 0);
               I1 : in STD_LOGIC_VECTOR (3 downto 0);
               I2 : in STD_LOGIC_VECTOR (3 downto 0);
               I3 : in STD_LOGIC_VECTOR (3 downto 0);
               S  : in STD_LOGIC_VECTOR (1 downto 0);
               Y  : out STD_LOGIC_VECTOR (3 downto 0));
    end component;
    
    component dec_seg is
        Port ( bcd : in STD_LOGIC_VECTOR (3 downto 0);
               seg : out STD_LOGIC_VECTOR (7 downto 0));
    end component;

    signal clk_1_Hz   : std_logic;
    signal clk_400_Hz : std_logic;
    
    signal s_tc_units   : std_logic; -- Wire connecting Top TC to Bottom CE
    signal s_cnt_units  : std_logic_vector(3 downto 0); -- To MUX I0
    signal s_cnt_tens   : std_logic_vector(3 downto 0); -- To MUX I1
    
    signal s_cnt_2bit   : std_logic_vector(1 downto 0);

    signal s_mux_out : std_logic_vector(3 downto 0);
    
    signal s_ce_units   : std_logic;
        
begin

    U_DIV : divider
        port map (
            CLK => CLK,
            RST => RST,
            CLK_1_Hz => clk_1_Hz
        );
        
        
    U_DIV_400Hz : divider_400Hz
        port map (
            CLK => CLK,
            RST => RST,
            CLK_400_Hz => clk_400_Hz
        );
 
     s_ce_units <= clk_1_Hz and START;
    -- TOP COUNTER (Units)
    U_CNT_TOP : counter
        port map (
            CLK       => CLK,
            RST       => RST,
            CE        => s_ce_units, 
            TC        => s_tc_units,             
            COUNT_OUT => s_cnt_units             
        );

    -- BOTTOM COUNTER (Tens)
    U_CNT_BOTTOM : counter
        port map (
            CLK       => CLK,
            RST       => RST,
            CE        => s_tc_units, -- Increments only when top counter hits 9
            TC        => open,       -- Free TC
            COUNT_OUT => s_cnt_tens  
        );

    U_CNT_2BIT : counter_2bit
        port map (
            CLK       => clk_400_Hz,
            RST       => RST,
            COUNT_OUT => s_cnt_2bit
        );      
        
    U_DEC_ANODES : decoder_an
        port map (
            SEL    => s_cnt_2bit, -- 2-bitový signál 
            ANODES => ANODS       -- Výstupný port top modulu
        );

    U_MUX : mux
        port map (
            I0 => s_cnt_units, -- Výstup z prvého čítača
            I1 => s_cnt_tens,  -- Výstup z druhého čítača
            I2 => "0000",      -- Zatiaľ nevyužité (nula)
            I3 => "0000",      -- Zatiaľ nevyužité (nula)
            S  => s_cnt_2bit,  -- Signál zo zeleného čítača (výber anódy)
            Y  => s_mux_out    -- Vybraná číslica pre segmenty
        );
        
    U_DEC_SEG : dec_seg
        port map (
            BCD => s_mux_out, -- Číslica vybraná multiplexerom
            SEG => SEGMENTS   -- Výstupný port top modulu (8 bitov)
        );        
                
end Behavioral;
