-- -- Aufzug -- use work.smaxpck.ALL; entity AUFZUG is generic (STW: positive); port (progress: in bit; go_up: in bit; go_down: in bit; open_door: in bit; at: out bit_vector (1 to STW); door_open: out bit; moving: out bit); end AUFZUG; -- -- iat Kopie von at -- ido Kopie von door_open -- imv Kopie von moving -- mvwait Zaehler; der Aufzug braucht seine Zeit, um in das naechste -- Stockwerk zu fahren. Von dieser Verzoegerung mal abgesehen -- ist diese Variable total sinnlos. -- architecture AUFZUG of AUFZUG is begin process variable iat : bit_vector (1 to STW) := smax_fae('0',STW-1)&"1"; variable ido : bit := '0'; variable imv : bit := '0'; variable mvwait : bit_vector (1 to 2); begin -- -- dies ist ein Problem bei der Initialisierung -- wir wollen nicht erst -- auf progress warten muessen, bevor wir dem Controller von unserer -- Position erzaehlen koennen. -- at <= iat; wait on progress until progress = '1'; if imv='0' then -- im Stockwerk if ido='0' and open_door='1' then -- 001S -> XX1 -> 011S ido := '1'; door_open <= '1'; elsif ido='1' and open_door='0' then -- 011S -> XX0 -> 001S ido := '0'; door_open <= '0'; elsif go_up='1' then -- 001S -> 100 -> 100S+ imv := '1'; moving <= '1'; iat := smax_rol (iat); mvwait := "00"; elsif go_down='1' then -- 001S -> 010 -> 100S- imv := '1'; moving <= '1'; iat := smax_ror (iat); mvwait := "00"; end if; elsif mvwait(2)='0' then -- wir bewegen uns mvwait := smax_inc (mvwait); -- 100S -> XXX -> 101S else -- angekommen if go_up='1' then -- 101S -> 10X -> 100S+ iat := smax_rol (iat); mvwait := "00"; elsif go_down='1' then -- 101S -> 01X -> 100S- iat := smax_ror (iat); mvwait := "00"; else -- anhalten imv := '0'; -- 101S -> 00X -> 001S moving <= '0'; end if; end if; end process; end AUFZUG;