library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity trainticket_machine is PORT( Clock,Reset,Cancel : IN STD_LOGIC; RM1,RM2,RM5 : IN STD_LOGIC; KL_station,Mid_station,Klang_station : IN STD_LOGIC; Ticket : OUT STD_LOGIC; Change,Retrn : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); Money_sum : INOUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); end trainticket_machine; architecture Behavioral of trainticket_machine is TYPE state IS (S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,Cancl,waiting1,waiting2,waiting3,KL_Ticket,Mid_Ticket,Shah_Ticket); SIGNAL p_state,Train_state: STATE; BEGIN PROCESS(Reset,Clock) BEGIN IF (Reset = '1') THEN p_state <= S0; ELSIF (Clock'EVENT AND Clock = '1') THEN p_state <= Train_state; END IF; END PROCESS; PROCESS (p_state,Cancel,RM1,RM2,RM5,KL_station,Mid_station,Klang_station) BEGIN CASE p_state IS WHEN S0 => Money_sum <= "0000"; Change <= "0000"; IF (KL_station = '1') THEN Train_state <= waiting1; ELSIF(Mid_station = '1') THEN Train_state <= waiting2; ELSIF(Klang_station = '1') THEN Train_state <= waiting3; ELSE Train_state <= S0; END IF; WHEN waiting1 => Ticket <= '0'; Change <= "0000"; IF (RM1 = '1') THEN Train_state <= S1; ELSIF (RM2 = '1') THEN Train_state <= S2; ELSIF (RM5 = '1') THEN Train_state <= S3; ELSIF (Money_sum >= 2) THEN train_state <= KL_Ticket; ELSIF (Cancel = '1') THEN Train_state <= Cancl; ELSE Train_state <= waiting1; END IF; WHEN waiting2 => Ticket <= '0'; Change <= "0000"; IF (RM1 = '1') THEN Train_state <= S4; ELSIF (RM2 = '1') THEN Train_state <= S5; ELSIF (RM5 = '1') THEN Train_state <= S6; ELSIF (Money_sum >= 4) THEN train_state <= Mid_Ticket; ELSIF (Cancel = '1') THEN Train_state <= Cancl; ELSE Train_state <= waiting2; END IF; WHEN waiting3 => Ticket <= '0'; Change <= "0000"; IF (RM1 = '1') THEN Train_state <= S7; ELSIF (RM2 = '1') THEN Train_state <= S8; ELSIF (RM5 = '1') THEN Train_state <= S9; ELSIF (Money_sum >= 6) THEN train_state <= Shah_Ticket; ELSIF (Cancel = '1') THEN Train_state <= Cancl; END IF; WHEN S1 => IF (RM1 <= '1' AND RM2 <= '0' AND RM5 <= '0') THEN Ticket <= '0'; Change <= "0000"; Money_sum <= Money_sum + 1; ELSE Train_state <= waiting1; END IF; WHEN S2 => IF (RM1 <= '1' AND RM2 <= '1' AND RM5 <= '0') THEN Ticket <= '1'; Change <= "0000"; Money_sum <= Money_sum + 2; ELSE Train_state <= waiting1; END IF; WHEN S3 => IF (RM1 <= '0' AND RM2 <= '0' AND RM5 <= '1') THEN Ticket <= '1'; Change <= "0001"; Money_sum <= Money_sum + 5; ELSE Train_state <= waiting1; END IF; WHEN S4 => IF (RM1 <= '1' AND RM2 <= '0' AND RM5 <= '0') THEN Ticket <= '0'; Change <= "0000"; Money_sum <= Money_sum + 1; ELSE Train_state <= waiting2; END IF; WHEN S5 => IF (RM1 <= '0' AND RM2 <= '1' AND RM5 <= '0') THEN Ticket <= '0'; Change <= "0000"; Money_sum <= Money_sum + 2; ELSE Train_state <= waiting2; END IF; WHEN S6 => IF (RM1 <= '0' AND RM2 <= '0' AND RM5 <= '1') THEN Ticket <= '0'; Change <= "0001"; Money_sum <= Money_sum + 5; ELSE Train_state <= waiting2; END IF; WHEN S7 => IF (RM1 <= '1' AND RM2 <= '0' AND RM5 <= '0') THEN Ticket <= '0'; Change <= "0000"; Money_sum <= Money_sum + 1; ELSE Train_state <= waiting3; END IF; WHEN S8 => IF (RM1 <= '0' AND RM2 <= '1' AND RM5 <= '0') THEN Ticket <= '0'; Change <= "0000"; Money_sum <= Money_sum + 2; ELSE Train_state <= waiting3; END IF; WHEN S9 => IF (RM1 <= '0' AND RM2 <= '0' AND RM5 <= '1') THEN Ticket <= '0'; Change <= "0000"; Money_sum <= Money_sum + 5; ELSE Train_state <= waiting3; END IF; WHEN KL_Ticket => Ticket <= '1'; Change <= Money_sum - 2; Train_state <= waiting1; WHEN Mid_Ticket => Ticket <= '1'; Change <= Money_sum - 4; Train_state <= waiting2; WHEN Shah_Ticket => Ticket <= '1'; Change <= Money_sum - 6; Train_state <= waiting3; WHEN Cancl => IF (Cancel <= '1') THEN Retrn <= Money_sum; ELSE Train_state <= S0; END IF; END CASE; END PROCESS; end Behavioral;