library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity study_demo is port ( KEY : in std_logic_vector(3 downto 0); -- KEY(0) = шаг/такт, KEY(1) = reset SW : in std_logic_vector(3 downto 0); -- переключатели LEDG : out std_logic_vector(7 downto 0); -- светодиоды HEX0 : out std_logic_vector(6 downto 0) -- семисегментный индикатор ); end study_demo; architecture beh of study_demo is ----------------------------------------------------------------- -- ФУНКЦИЯ: перевод 4-битного числа в код для HEX0 -- Здесь показано, как писать function и использовать case ----------------------------------------------------------------- function to_7seg(x : std_logic_vector(3 downto 0)) return std_logic_vector is begin case x is when "0000" => return "1000000"; -- 0 when "0001" => return "1111001"; -- 1 when "0010" => return "0100100"; -- 2 when "0011" => return "0110000"; -- 3 when "0100" => return "0011001"; -- 4 when "0101" => return "0010010"; -- 5 when "0110" => return "0000010"; -- 6 when "0111" => return "1111000"; -- 7 when "1000" => return "0000000"; -- 8 when "1001" => return "0010000"; -- 9 when "1010" => return "0001000"; -- A when "1011" => return "0000011"; -- b when "1100" => return "1000110"; -- C when "1101" => return "0100001"; -- d when "1110" => return "0000110"; -- E when others => return "0001110"; -- F end case; end function; signal cnt : unsigned(3 downto 0) := (others => '0'); -- 4-битный счётчик signal data4 : std_logic_vector(3 downto 0); -- что показывать на HEX0 signal led_temp : std_logic_vector(7 downto 0); -- внутренний сигнал для LEDG begin ----------------------------------------------------------------- -- ПРОЦЕСС 1: счётчик -- Здесь показано: -- 1) process -- 2) if / elsif / else -- 3) rising_edge ----------------------------------------------------------------- process(KEY(0), KEY(1)) begin -- Асинхронный сброс: если KEY(1) = '0', счётчик обнуляется if KEY(1) = '0' then cnt <= (others => '0'); -- По фронту KEY(0) выполняем действие elsif rising_edge(KEY(0)) then -- if / else: направление счёта задаёт SW(0) if SW(0) = '1' then cnt <= cnt + 1; -- счёт вверх else cnt <= cnt - 1; -- счёт вниз end if; end if; end process; ----------------------------------------------------------------- -- ПРОЦЕСС 2: логика выбора режима и работа с LEDG -- Здесь показано: -- 1) variable -- 2) for loop -- 3) if / elsif / else ----------------------------------------------------------------- process(cnt, SW) variable v_led : std_logic_vector(7 downto 0); begin -- Пример цикла FOR: -- младшие 4 LED показывают cnt -- старшие 4 LED показывают инверсию cnt for i in 0 to 3 loop v_led(i) := std_logic(cnt(i)); v_led(i+4) := not std_logic(cnt(i)); end loop; led_temp <= v_led; -- Выбор, что выводить на HEX0 -- SW(3 downto 2) задают режим if SW(3 downto 2) = "00" then -- режим 0: показываем значение счётчика data4 <= std_logic_vector(cnt); elsif SW(3 downto 2) = "01" then -- режим 1: показываем сами переключатели SW data4 <= SW; elsif SW(3 downto 2) = "10" then -- режим 2: показываем cnt XOR SW data4 <= std_logic_vector(cnt xor unsigned(SW)); else -- режим 3: показываем cnt + SW data4 <= std_logic_vector(cnt + unsigned(SW)); end if; end process; ----------------------------------------------------------------- -- Обычные присваивания ----------------------------------------------------------------- LEDG <= led_temp; HEX0 <= to_7seg(data4); end beh;