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


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

entity mult_controller is
    port (
        clk             : in  std_logic;
        reset_btn       : in  std_logic;
        slow            : in  std_logic;
        use_ip          : in  std_logic;
        result_valid    : out std_logic;
        bcd_0           : out integer range 0 to 9;
        bcd_1           : out integer range 0 to 9;
        bcd_2           : out integer range 0 to 9;
        bcd_3           : out integer range 0 to 9;
        bcd_4           : out integer range 0 to 9;
        -- Отладочные выходы
        reg_a_dbg       : out std_logic_vector(7 downto 0);
        reg_b_dbg       : out std_logic_vector(7 downto 0);
        reg_c_dbg       : out std_logic_vector(15 downto 0);
        display_reg_dbg : out std_logic_vector(15 downto 0)
    );
end mult_controller;

architecture rtl of mult_controller is

    -- Сигналы между модулями
    signal reg_a            : std_logic_vector(7 downto 0);
    signal reg_b            : std_logic_vector(7 downto 0);
    signal mult_ip_result   : std_logic_vector(15 downto 0);
    signal mult_logic_result: std_logic_vector(15 downto 0);
    signal selected_result  : std_logic_vector(15 downto 0);
    signal display_reg      : std_logic_vector(15 downto 0);

    -- Цепочка задержки slow
    signal slow_reg : std_logic;
    signal slow_d1  : std_logic;
    signal slow_d2  : std_logic;

begin

    -- ==========================================
    -- 1. Входная стадия: MUX + reg_a, reg_b
    -- ==========================================
    u_input : entity work.input_stage
        port map (
            clk   => clk,
            reset => reset_btn,
            slow  => slow,
            reg_a => reg_a,
            reg_b => reg_b
        );

    -- ==========================================
    -- 2. Умножители (параллельно)
    -- ==========================================
    u_mult_ip : entity work.mult_ip
        port map (
            dataa  => reg_a,
            datab  => reg_b,
            result => mult_ip_result
        );

    u_logic_mult : entity work.logic_mult
        port map (
            a      => reg_a,
            b      => reg_b,
            result => mult_logic_result
        );

    -- ==========================================
    -- 3. Мультиплексор выбора результата
    -- ==========================================
    selected_result <= mult_ip_result when use_ip = '1' else mult_logic_result;

    -- ==========================================
    -- 4. Цепочка задержки slow (3 такта)
    -- ==========================================
    process(clk)
    begin
        if rising_edge(clk) then
            slow_reg <= slow;
            slow_d1  <= slow_reg;
            slow_d2  <= slow_d1;
        end if;
    end process;

    -- ==========================================
    -- 5. Выходная стадия: reg_c, display_reg
    -- ==========================================
    u_output : entity work.output_stage
        port map (
            clk             => clk,
            reset           => reset_btn,
            slow_d1         => slow_d1,
            slow_d2         => slow_d2,
            selected_result => selected_result,
            result_valid    => result_valid,
            reg_c           => reg_c_dbg,
            display_reg     => display_reg
        );

    -- ==========================================
    -- 6. Преобразование display_reg в BCD
    -- ==========================================
    u_bcd : entity work.display_to_bcd
        port map (
            display_reg => display_reg,
            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;
    reg_b_dbg       <= reg_b;
    display_reg_dbg <= display_reg;

end rtl;

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

entity display_to_bcd is
    port (
        display_reg : in  std_logic_vector(15 downto 0);
        bcd_0       : out integer range 0 to 9;
        bcd_1       : out integer range 0 to 9;
        bcd_2       : out integer range 0 to 9;
        bcd_3       : out integer range 0 to 9;
        bcd_4       : out integer range 0 to 9
    );
end display_to_bcd;

architecture rtl of display_to_bcd is
    signal val : unsigned(15 downto 0);
begin
    val <= unsigned(display_reg);

    -- Комбинационное преобразование в 5 BCD-цифр
    bcd_0 <= to_integer((val / 10000) mod 10);
    bcd_1 <= to_integer((val / 1000)  mod 10);
    bcd_2 <= to_integer((val / 100)   mod 10);
    bcd_3 <= to_integer((val / 10)    mod 10);
    bcd_4 <= to_integer(val mod 10);

end rtl;

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

entity output_stage is
    port (
        clk             : in  std_logic;
        reset           : in  std_logic;
        slow_d1         : in  std_logic;
        slow_d2         : in  std_logic;
        selected_result : in  std_logic_vector(15 downto 0);
        result_valid    : out std_logic;
        reg_c           : out std_logic_vector(15 downto 0);
        display_reg     : out std_logic_vector(15 downto 0)
    );
end output_stage;

architecture rtl of output_stage is
    signal reg_c_int      : std_logic_vector(15 downto 0);
    signal res_valid_reg  : std_logic;
    signal display_reg_int: std_logic_vector(15 downto 0);
begin

    -- Основной регистр reg_c (обнуляется по Варианту B)
    process(clk)
    begin
        if rising_edge(clk) then
            if reset = '1' then
                reg_c_int <= (others => '0');
                res_valid_reg <= '0';
            elsif slow_d1 = '1' then
                reg_c_int <= selected_result;
                res_valid_reg <= '1';
            else
                reg_c_int <= (others => '0');
                res_valid_reg <= '0';
            end if;
        end if;
    end process;

    -- Регистр display_reg (сбрасывается только по reset, защелкивается по slow_d2)
    process(clk)
    begin
        if rising_edge(clk) then
            if reset = '1' then
                display_reg_int <= (others => '0');
            elsif slow_d2 = '1' then
                display_reg_int <= selected_result;
            end if;
        end if;
    end process;

    -- Выходы
    result_valid <= res_valid_reg;
    reg_c        <= reg_c_int;
    display_reg  <= display_reg_int;

end rtl;

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

entity input_stage is
    port (
        clk       : in  std_logic;
        reset     : in  std_logic;
        slow      : in  std_logic;
        reg_a     : out std_logic_vector(7 downto 0);
        reg_b     : out std_logic_vector(7 downto 0)
    );
end input_stage;

architecture rtl of input_stage is
    constant NUM_A : std_logic_vector(7 downto 0) := std_logic_vector(to_unsigned(12, 8));
    constant NUM_B : std_logic_vector(7 downto 0) := std_logic_vector(to_unsigned(15, 8));

    signal mux_a_out : std_logic_vector(7 downto 0);
    signal mux_b_out : std_logic_vector(7 downto 0);
begin

    -- Мультиплексоры (комбинационные)
    mux_a_out <= NUM_A when slow = '1' else (others => '0');
    mux_b_out <= NUM_B when slow = '1' else (others => '0');

    -- Регистры после мультиплексоров
    process(clk)
    begin
        if rising_edge(clk) then
            if reset = '1' then
                reg_a <= (others => '0');
                reg_b <= (others => '0');
            else
                reg_a <= mux_a_out;
                reg_b <= mux_b_out;
            end if;
        end if;
    end process;

end rtl;