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


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity calculator_top is
    port
    (
        clk   : in std_logic;
        key   : in std_logic_vector(3 downto 0);  -- key(0)=logic, key(1)=dsp
        dig   : out std_logic_vector(3 downto 0);
        seg   : out std_logic_vector(7 downto 0)
    );
end entity;
 
architecture struct of calculator_top is
    signal calc_result  : integer := 0;
    signal calc_trigger : std_logic := '0';
    signal display_result : integer := 0;
    signal c0,c1,c2,c3 : std_logic_vector(7 downto 0);
    
    component calculator is
        port(
            clk     : in std_logic;
            key     : in std_logic_vector(1 downto 0);
            result  : out integer;
            trigger : out std_logic
        );
    end component;
    
    -- Функция декодирования в 7-сегментный код
    function num_to_seg(num:integer) return std_logic_vector is
    begin
        case num is
            when 0 => return "11000000";
            when 1 => return "11111001";
            when 2 => return "10100100";
            when 3 => return "10110000";
            when 4 => return "10011001";
            when 5 => return "10010010";
            when 6 => return "10000010";
            when 7 => return "11111000";
            when 8 => return "10000000";
            when 9 => return "10010000";
            when others => return "11111111";
        end case;
    end function;
    
begin
    calc_inst: calculator
        port map(
            clk     => clk,
            key     => key(1 downto 0),
            result  => calc_result,
            trigger => calc_trigger
        );
    
    -- Фиксация результата для дисплея
    process(clk)
    begin
        if rising_edge(clk) then
            if calc_trigger = '1' then
                display_result <= calc_result;
            end if;
        end if;
    end process;
    
    -- Декодирование на 7-сегментный индикатор
    process(display_result)
        variable tens, ones : integer;
    begin
        if display_result >= 0 and display_result <= 99 then
            tens := display_result / 10;
            ones := display_result mod 10;
            c3 <= num_to_seg(tens);
            c2 <= num_to_seg(ones);
            c1 <= "11111111";  -- Гасим неиспользуемые
            c0 <= "11111111";
        else
            c3 <= "11111111";
            c2 <= "11111111";
            c1 <= "11111111";
            c0 <= "11111111";
        end if;
    end process;
    
    -- Динамическая индикация
    display_inst: entity work.display_control
        port map (
            clk   => clk,
            reset => '0',
            seg   => seg,
            dig   => dig,
            dig0  => c0,
            dig1  => c1,
            dig2  => c2,
            dig3  => c3
        );
end struct;