Лифт на vhdl, FPGA, ALTERA DE2-115
Задали задание на ПЛИС, начинающий. Требуется реализовать механизм лифт с 1 по 5 этаж. Задача в том, чтобы светились диоды по мере движения лифта, чтобы это работало не только в ModelSim, но и на самой плате DE2-115. Подскажите, пожалуйста, как реализовать поочередное свечение ламп. number - номер этажа, call - вызов лифта на определенный этаж, lamp - диод определенного этажа. Механизм wait не работает. Вот мой код:
-- Library Declaration
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity un is
port(
clk : in std_logic;
reset : in std_logic;
call_1 : in std_logic;
call_2 : in std_logic;
call_3 : in std_logic;
call_4 : in std_logic;
call_5 : in std_logic;
lamp_1 : out std_logic;
lamp_2 : out std_logic;
lamp_3 : out std_logic;
lamp_4 : out std_logic;
lamp_5 : out std_logic
);
end un;
architecture behaviour of un is
signal number : std_logic_vector(1 to 5);
begin
process(clk,reset)
begin
if reset = '1' then
number <= "10000";
lamp_1 <= '1';
lamp_2 <= '0';
lamp_3 <= '0';
lamp_4 <= '0';
lamp_5 <= '0';
elsif clk'event and clk = '1' then
if call_1 = '1' then
case number is
when "10000" =>
lamp_1 <= '1';
number <= "10000";
when "01000" =>
lamp_2 <= '1';
lamp_2 <= '0';
lamp_1 <= '1';
number <= "10000";
when "00100" =>
lamp_3 <= '1';
lamp_3 <= '0';
lamp_2 <= '1';
lamp_2 <= '0';
lamp_1 <= '1';
number <= "10000";
when "00010" =>
lamp_4 <= '1';
lamp_4 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_2 <= '1';
lamp_2 <= '0';
lamp_1 <= '1';
number <= "10000";
when "00001" =>
lamp_5 <= '1';
lamp_5 <= '0';
lamp_4 <= '1';
lamp_4 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_2 <= '1';
lamp_2 <= '0';
lamp_1 <= '1';
number <= "10000";
when others => null;
end case;
elsif call_2 = '1' then
case number is
when "10000" =>
lamp_1 <= '1';
lamp_1 <= '0';
lamp_2 <= '1';
number <= "01000";
when "01000" =>
lamp_2 <= '1';
number <= "01000";
when "00100" =>
lamp_3 <= '1';
lamp_3 <= '0';
lamp_2 <= '1';
number <= "01000";
when "00010" =>
lamp_4 <= '1';
lamp_4 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_2 <= '1';
number <= "01000";
when "00001" =>
lamp_5 <= '1';
lamp_5 <= '0';
lamp_4 <= '1';
lamp_4 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_2 <= '1';
number <= "01000";
when others => null;
end case;
elsif call_3 = '1' then
case number is
when "10000" =>
lamp_1 <= '1';
lamp_1 <= '0';
lamp_2 <= '1';
lamp_2 <= '0';
lamp_3 <= '1';
number <= "00100";
when "01000" =>
lamp_2 <= '1';
lamp_2 <= '0';
lamp_3 <= '1';
number <= "00100";
when "00100" =>
lamp_3 <= '1';
number <= "00100";
when "00010" =>
lamp_4 <= '1';
lamp_4 <= '0';
lamp_3 <= '1';
number <= "00100";
when "00001" =>
lamp_5 <= '1';
lamp_5 <= '0';
lamp_4 <= '1';
lamp_4 <= '0';
lamp_3 <= '1';
number <= "00100";
when others => null;
end case;
elsif call_4 = '1' then
case number is
when "10000" =>
lamp_1 <= '1';
lamp_1 <= '0';
lamp_2 <= '1';
lamp_2 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_4 <= '1';
number <= "00010";
when "01000" =>
lamp_2 <= '1';
lamp_2 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_4 <= '1';
number <= "00010";
when "00100" =>
lamp_3 <= '1';
lamp_3 <= '0';
lamp_4 <= '1';
number <= "00010";
when "00010" =>
lamp_4 <= '1';
number <= "00010";
when "00001" =>
lamp_5 <= '1';
lamp_5 <= '0';
lamp_4 <= '1';
number <= "00010";
when others => null;
end case;
elsif call_5 = '1' then
case number is
when "10000" =>
lamp_1 <= '1';
lamp_1 <= '0';
lamp_2 <= '1';
lamp_2 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_4 <= '1';
lamp_4 <= '0';
lamp_5 <= '1';
number <= "00001";
when "01000" =>
lamp_2 <= '1';
lamp_2 <= '0';
lamp_3 <= '1';
lamp_3 <= '0';
lamp_4 <= '1';
lamp_4 <= '0';
lamp_5 <= '1';
number <= "00001";
when "00100" =>
lamp_3 <= '1';
lamp_3 <= '0';
lamp_4 <= '1';
lamp_4 <= '0';
lamp_5 <= '1';
number <= "00001";
when "00010" =>
lamp_4 <= '1';
lamp_4 <= '0';
lamp_5 <= '1';
number <= "00001";
when "00001" =>
lamp_5 <= '1';
number <= "00001";
when others => null;
end case;
end if;
end if;
end process;
end behaviour;