Загрузка данных
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;