ВЕРХНИЙ ФАЙЛ
Код: Выделить всё
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity led_blink is
port (
clk : in std_logic; -- синхросигнал
btn : in std_logic; --кнопка
led : out std_logic_vector(3 downto 0) --выход на светодиоды
);
end led_blink;
architecture rtl of led_blink is
signal ONN_OFF : std_logic := '1';
signal state : std_logic_vector(3 downto 0) := "0001";
signal divider : unsigned(23 downto 0) := (others => '0'); --делитель частоты
begin
main_p : process(clk)
begin
if (rising_edge(clk)) then
if (divider < 5000000) then ---если меньше 5 млн. тактов, то счётчик наращивает 1
divider <= divider + 1;
else
divider <= (others => '0');--если больше,то счётчик сбрасывается в 0
if (btn = '1') then --если нажата кнопка
ONN_OFF <= not(ONN_OFF);--светодиоды загораются
if (ONN_OFF = '1') then
state <= state(2 downto 0) & state(3);
led <= state;
else --если НЕ нажата
led <= (others => '0');--сигнал на выход светодиодов не идёт
end if;
else
ONN_OFF <= '1';
led <= (others => '0');
end if;
end if;
end if;
end process;
end rtl;
Код: Выделить всё
library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.Numeric_Std.all;
entity led_blink_tb is
end;
architecture bench of led_blink_tb is
component led_blink
port (
clk : in std_logic;
btn : in std_logic;
led : out std_logic_vector(3 downto 0)
);
end component;
signal clk: std_logic;
signal btn: std_logic;
signal led: std_logic_vector(3 downto 0) ;
constant PERIOD : TIME := 100 ns;
constant DUTY_CYCLE : real := 0.5;
constant OFFSET : time := 3 ns;
begin
btn <= '0' after 500 ms, '1' after 3000 ms, '0' after 5000 ms, '1'after 9000 ms, '0' after 14000 ms, '1'after 20000 ms ;
uut: led_blink port map ( clk => clk,
btn => btn,
led => led );
clk_gen: PROCESS
BEGIN
WAIT for OFFSET;
CLOCK_LOOP : LOOP
CLK <= '0';
WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
CLK <= '1';
WAIT FOR (PERIOD * DUTY_CYCLE);
END LOOP CLOCK_LOOP;
END PROCESS;
end;