Загрузка данных


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity sem_mult_top is
    port (
        clk            : in  std_logic;  -- Исходные 50 МГц
        reset_btn      : in  std_logic;
        show_ip_btn    : in  std_logic;
        show_logic_btn : in  std_logic;
        ind            : out std_logic_vector(4 downto 0);
        seg            : out std_logic_vector(7 downto 0)
    );
end sem_mult_top;

architecture rtl of sem_mult_top is

    -- Сигнал высокой частоты от PLL
    signal clk_fast : std_logic;

    -- Сигналы после фильтрации кнопок
    signal reset_clean      : std_logic;
    signal show_ip_clean    : std_logic;
    signal show_logic_clean : std_logic;

    -- Сигналы управления
    signal slow             : std_logic;
    signal use_ip           : std_logic;
    signal result_valid     : std_logic;

    signal bcd_0, bcd_1, bcd_2, bcd_3, bcd_4 : integer range 0 to 9;
    signal char_0, char_1, char_2, char_3, char_4 : std_logic_vector(7 downto 0);

    -- Отладочные сигналы
    signal reg_a_dbg      : std_logic_vector(7 downto 0);
    signal reg_b_dbg      : std_logic_vector(7 downto 0);
    signal reg_c_dbg      : std_logic_vector(15 downto 0);
    signal display_reg_dbg: std_logic_vector(15 downto 0);

begin

    -- ==========================================
    -- PLL: Генерация 100 МГц из 50 МГц
    -- ==========================================
    u_pll : entity work.ATPLL
        port map (
            areset  => '0',       -- Не сбрасываем PLL
            inclk0  => clk,       -- Вход 50 МГц
            c0      => clk_fast,  -- Выход 100 МГц
            locked  => open       -- Сигнал готовности не используем
        );

    -- ==========================================
    -- ДОМЕН 100 МГц (clk_fast)
    -- ==========================================

    -- Фильтры кнопок (теперь тактируются от 100 МГц)
    u_btn_reset : entity work.button_debounce
        port map (clk => clk_fast, btn_in => reset_btn, btn_clean => reset_clean);

    u_btn_show_ip : entity work.button_debounce
        port map (clk => clk_fast, btn_in => show_ip_btn, btn_clean => show_ip_clean);

    u_btn_show_logic : entity work.button_debounce
        port map (clk => clk_fast, btn_in => show_logic_btn, btn_clean => show_logic_clean);

    -- Генератор импульса slow
    u_pulse_gen : entity work.control_pulse_gen
        port map (
            clk       => clk_fast,
            btn_ip    => show_ip_clean,
            btn_logic => show_logic_clean,
            slow      => slow,
            use_ip    => use_ip
        );

    -- Контроллер умножения
    u_mult_ctrl : entity work.mult_controller
        port map (
            clk             => clk_fast,
            reset_btn       => reset_clean,
            slow            => slow,
            use_ip          => use_ip,
            result_valid    => result_valid,
            bcd_0           => bcd_0,
            bcd_1           => bcd_1,
            bcd_2           => bcd_2,
            bcd_3           => bcd_3,
            bcd_4           => bcd_4,
            reg_a_dbg       => reg_a_dbg,
            reg_b_dbg       => reg_b_dbg,
            reg_c_dbg       => reg_c_dbg,
            display_reg_dbg => display_reg_dbg
        );

    -- ==========================================
    -- ДОМЕН 50 МГц (clk)
    -- ==========================================

    -- Преобразование BCD в сегменты (комбинационная логика, clk не используется)
    u_bcd_conv : entity work.bcd_converter
        port map (
            bcd_0  => bcd_0,
            bcd_1  => bcd_1,
            bcd_2  => bcd_2,
            bcd_3  => bcd_3,
            bcd_4  => bcd_4,
            char_0 => char_0,
            char_1 => char_1,
            char_2 => char_2,
            char_3 => char_3,
            char_4 => char_4
        );

    -- Мультиплексирование дисплея (тактируется от 50 МГц)
    u_display : entity work.display_output
        port map (
            clk    => clk,
            char_0 => char_0,
            char_1 => char_1,
            char_2 => char_2,
            char_3 => char_3,
            char_4 => char_4,
            ind    => ind,
            seg    => seg
        );

end rtl;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity button_debounce is
    port (
        clk       : in  std_logic;
        btn_in    : in  std_logic;
        btn_clean : out std_logic
    );
end button_debounce;

architecture rtl of button_debounce is
    -- Увеличили счетчик до 2 000 000 для 100 МГц (~20 мс)
    signal counter    : integer range 0 to 2000000 := 0;  
    signal btn_stable : std_logic := '0';
begin
    process(clk)
    begin
        if rising_edge(clk) then
            if btn_in = '0' then  -- Кнопка нажата (активный низкий уровень)
                if counter < 2000000 then
                    counter <= counter + 1;
                else
                    btn_stable <= '1';
                end if;
            else
                counter <= 0;
                btn_stable <= '0';
            end if;
        end if;
    end process;
    
    btn_clean <= btn_stable;
end rtl;