Загрузка данных
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity bcd_converter is
port (
result_valid_ip : in std_logic; -- ✅ Новый вход
result_valid_log : in std_logic; -- ✅ Новый вход
ip_bcd_0 : in integer range 0 to 9;
ip_bcd_1 : in integer range 0 to 9;
ip_bcd_2 : in integer range 0 to 9;
ip_bcd_3 : in integer range 0 to 9;
ip_bcd_4 : in integer range 0 to 9;
log_bcd_0 : in integer range 0 to 9;
log_bcd_1 : in integer range 0 to 9;
log_bcd_2 : in integer range 0 to 9;
log_bcd_3 : in integer range 0 to 9;
log_bcd_4 : in integer range 0 to 9;
char_0 : out std_logic_vector(7 downto 0);
char_1 : out std_logic_vector(7 downto 0);
char_2 : out std_logic_vector(7 downto 0);
char_3 : out std_logic_vector(7 downto 0);
char_4 : out std_logic_vector(7 downto 0)
);
end bcd_converter;
architecture rtl of bcd_converter is
type hex_array is array (0 to 9) of std_logic_vector(7 downto 0);
constant hex_codes : hex_array := (
"10000001", -- 0
"11110011", -- 1
"01001001", -- 2
"01100001", -- 3
"00110011", -- 4
"00100101", -- 5
"00000101", -- 6
"11110001", -- 7
"00000001", -- 8
"00100001" -- 9
);
-- ✅ Выбор активных BCD цифр
signal selected_bcd_0 : integer range 0 to 9;
signal selected_bcd_1 : integer range 0 to 9;
signal selected_bcd_2 : integer range 0 to 9;
signal selected_bcd_3 : integer range 0 to 9;
signal selected_bcd_4 : integer range 0 to 9;
signal result_valid : std_logic;
begin
-- ✅ Выбор результата внутри bcd_converter
process(result_valid_ip, result_valid_log,
ip_bcd_0, ip_bcd_1, ip_bcd_2, ip_bcd_3, ip_bcd_4,
log_bcd_0, log_bcd_1, log_bcd_2, log_bcd_3, log_bcd_4)
begin
if result_valid_ip = '1' then
-- Активен IP умножитель
selected_bcd_0 <= ip_bcd_0;
selected_bcd_1 <= ip_bcd_1;
selected_bcd_2 <= ip_bcd_2;
selected_bcd_3 <= ip_bcd_3;
selected_bcd_4 <= ip_bcd_4;
result_valid <= '1';
elsif result_valid_log = '1' then
-- Активен логический умножитель
selected_bcd_0 <= log_bcd_0;
selected_bcd_1 <= log_bcd_1;
selected_bcd_2 <= log_bcd_2;
selected_bcd_3 <= log_bcd_3;
selected_bcd_4 <= log_bcd_4;
result_valid <= '1';
else
-- Ничего не активно
selected_bcd_0 <= 0;
selected_bcd_1 <= 0;
selected_bcd_2 <= 0;
selected_bcd_3 <= 0;
selected_bcd_4 <= 0;
result_valid <= '0';
end if;
end process;
-- Преобразование в коды сегментов
process(result_valid, selected_bcd_0, selected_bcd_1, selected_bcd_2,
selected_bcd_3, selected_bcd_4)
begin
if result_valid = '0' then
char_0 <= "11111111";
char_1 <= "11111111";
char_2 <= "11111111";
char_3 <= "11111111";
char_4 <= "11111111";
else
char_0 <= hex_codes(selected_bcd_0);
char_1 <= hex_codes(selected_bcd_1);
char_2 <= hex_codes(selected_bcd_2);
char_3 <= hex_codes(selected_bcd_3);
char_4 <= hex_codes(selected_bcd_4);
end if;
end process;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity sem_mult_top is
port (
clk : in std_logic;
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
signal slow_ip, slow_ip_fall : std_logic;
signal slow_log, slow_log_fall : std_logic;
signal ip_valid, log_valid : std_logic;
-- ✅ BCD цифры от обоих умножителей
signal ip_bcd_0, ip_bcd_1, ip_bcd_2, ip_bcd_3, ip_bcd_4 : integer range 0 to 9;
signal log_bcd_0, log_bcd_1, log_bcd_2, log_bcd_3, log_bcd_4 : integer range 0 to 9;
signal char_0, char_1, char_2, char_3, char_4 : std_logic_vector(7 downto 0);
begin
-- Генераторы slow
u_slow_ip : entity work.slow_generator
port map (clk => clk, reset_btn => reset_btn, show_btn => show_ip_btn,
slow => slow_ip, slow_fall => slow_ip_fall);
u_slow_log : entity work.slow_generator
port map (clk => clk, reset_btn => reset_btn, show_btn => show_logic_btn,
slow => slow_log, slow_fall => slow_log_fall);
-- Модули умножения
u_ip_mult : entity work.ip_multiplier
port map (clk => clk, slow => slow_ip, slow_fall => slow_ip_fall,
result_valid => ip_valid,
bcd_0 => ip_bcd_0, bcd_1 => ip_bcd_1,
bcd_2 => ip_bcd_2, bcd_3 => ip_bcd_3, bcd_4 => ip_bcd_4);
u_log_mult : entity work.logic_multiplier
port map (clk => clk, slow => slow_log, slow_fall => slow_log_fall,
result_valid => log_valid,
bcd_0 => log_bcd_0, bcd_1 => log_bcd_1,
bcd_2 => log_bcd_2, bcd_3 => log_bcd_3, bcd_4 => log_bcd_4);
-- ✅ BCD конвертер с выбором результата ВНУТРИ
u_bcd : entity work.bcd_converter
port map (
result_valid_ip => ip_valid,
result_valid_log => log_valid,
ip_bcd_0 => ip_bcd_0, ip_bcd_1 => ip_bcd_1,
ip_bcd_2 => ip_bcd_2, ip_bcd_3 => ip_bcd_3, ip_bcd_4 => ip_bcd_4,
log_bcd_0 => log_bcd_0, log_bcd_1 => log_bcd_1,
log_bcd_2 => log_bcd_2, log_bcd_3 => log_bcd_3, log_bcd_4 => log_bcd_4,
char_0 => char_0, char_1 => char_1, char_2 => char_2,
char_3 => char_3, char_4 => char_4
);
-- Дисплей
u_disp : 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;