I'm working on elevator code in VHDL and I have an issue with signal (przybycie) that shows elevator arrived to choosen floor. There is a code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
use IEEE.std_logic_unsigned.ALL;
entity winda is
port (clk : in std_logic;
-- przycisk1 : in std_logic; -- 000
-- przycisk2 : in std_logic; -- 001
-- przycisk3 : in std_logic; -- 010
-- przycisk4 : in std_logic; -- 011
pietro : in std_logic_vector(2 downto 0); -- button
alarm : in std_logic;
numer_pietra : out std_logic_vector(2 downto 0);
koniec : out std_logic);
end entity winda;
architecture winda_arch of winda is
type STANY is (otwarcie_drzwi,spoczynek, wybor_pietra, zamkniecie_drzwi, praca_windy, koniec_pracy);
signal stan, stan_nast: STANY;
signal licznik_pieter: std_logic_vector(2 downto 0) :="000";
signal drzwi: std_logic; -- 0 OTWARTE, 1 ZAMKNIETE
signal przybycie: std_logic :='0'; -- przybycie na wybrane pietro
signal otwarciozamkniecie: std_logic :='0'; -- sygnal otwierania/zamykania drzwi
begin
reg:process(clk, alarm)
begin
if (alarm = '1') then
stan <= spoczynek;
elsif rising_edge(clk) then
stan <= stan_nast;
end if;
end process reg;
komb:process(clk, alarm, stan)
begin
stan_nast <= stan;
case stan is
when otwarcie_drzwi =>
stan_nast <= spoczynek;
when spoczynek =>
stan_nast <= wybor_pietra;
when wybor_pietra =>
if (pietro /= licznik_pieter) then
stan_nast <= zamkniecie_drzwi;
else
stan_nast <= wybor_pietra;
end if;
when zamkniecie_drzwi =>
stan_nast <= praca_windy;
when praca_windy =>
if (pietro = licznik_pieter) then
stan_nast <= koniec_pracy;
else
stan_nast <= praca_windy;
end if;
when koniec_pracy =>
stan_nast <= otwarcie_drzwi;
when others =>
stan_nast <= spoczynek;
end case;
end process komb;
drzwi<= '1' when stan = praca_windy or stan = zamkniecie_drzwi or stan = koniec_pracy else '0';
otwarciozamkniecie <= '1' when stan = zamkniecie_drzwi or stan = otwarcie_drzwi else '0';
licznik:process(clk,alarm,przybycie,pietro,otwarciozamkniecie)
begin
if (alarm = '1' or drzwi = '0' or otwarciozamkniecie = '1') then
przybycie <= '0';
elsif (rising_edge(clk)) then
if (stan = praca_windy) then
if (licznik_pieter = pietro) then
przybycie <= '1';
elsif ( licznik_pieter > pietro ) then
przybycie <= '0';
licznik_pieter <= licznik_pieter - "01";
else
przybycie <= '0';
licznik_pieter <= licznik_pieter + "01";
end if;
end if;
end if;
end process licznik;
koniec <= '1' when stan = koniec_pracy or stan = spoczynek else '0';
numer_pietra <= licznik_pieter when drzwi = '0' else "000";
end architecture winda_arch;
And there simulation: simulation picture
Problem is that "przybycie = '1'" should be one clock tact before ( just after licznik_pieter shows "2") how it should be
What is wrong with that code?