-- project parking management system

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use work.sevenseg_package.all;

entity parking is
   port(s_en, s_ex, clk, reset: in std_logic;
        so_en, so_ex: out std_logic;
		sega, segb, segc, segd, sege, segf, segg: out std_logic
		);
end parking;

architecture p_lot of parking is
    
	type state_type is (idle, signal_entrance, signal_exit, solenoid_entrance, solenoid_exit,display_cond, signal_state);
    signal state: state_type;
	signal cnt: std_logic_vector (2 downto 0);
	signal segaa,segbb,segcc,segdd,segee,segff,seggg: std_logic;
	signal condition_cnt: std_logic;    
	signal clk_1 :std_logic;
	signal s_en_dis, s_ex_dis, s_en_dis1, s_ex_dis1 ,s_ex_dis2, s_en_dis2,s_en_dis3,s_ex_dis3: std_logic;
	

   begin
	  clk_1 <= not clk;
	  FA_0: sevenseg port map (cnt,clk_1,segaa,segbb,segcc,segdd,segee,segff,seggg);
      process(clk)
      begin
        if clk'EVENT and clk = '0' then 
  			if reset = '1' then 
             
             
						
             cnt <= (others => '0');
   			 so_en <= '0';
             so_ex <= '0';
			 s_ex_dis <= '0';
			 s_en_dis <= '0';
			 s_ex_dis1 <= '0';
			 s_en_dis1 <= '0';
			 s_en_dis2 <= '0';
			 s_ex_dis2 <= '0';
		 	 sega <= segaa;
			 segb <= segbb;
			 segc <= segcc;
			 segd <= segdd;
			 sege <= segee;
			 segf <= segff;
			 segg <= seggg;
			 state <= idle;
           else 
              CASE state IS
                   
				  when idle =>
                        so_en <= '0';
                        so_ex <= '0';
						s_ex_dis <= '0';
			 			s_en_dis <= '0';
			 			s_ex_dis1 <= '0';
			 			s_en_dis1 <= '0';
			 			s_en_dis2 <= '0';
			 			s_ex_dis2 <= '0';
						
                        if s_en = '1' and  s_en_dis3 = '0' then
								s_ex_dis3 <= '0';
                           		state <= signal_entrance;
                        elsif s_ex = '1' and  s_ex_dis3 = '0' then
        						s_en_dis3 <= '0';
		                      	state <= signal_exit;
		
                        end if;

                   when signal_entrance =>
                        if s_en = '1' then
                           condition_cnt <= cnt(0) and cnt(1) and cnt(2);
                           state <= solenoid_entrance;
                        
                        end if;

				   when signal_exit =>
						if s_ex = '1' then
						   
						   condition_cnt <= cnt(0) or cnt(1) or cnt(2);
                           state <= solenoid_exit;
                           
                        
						end if;

                   when solenoid_entrance =>
                        if s_en = '1'and s_en_dis1 = '0' then
							
							if condition_cnt /= '1' then
								so_en <= '1';
                           		cnt <= cnt + '1';
								
                            	state <= display_cond;
							else
								so_en <= '0';
								s_en_dis <= '1';
							
								state <= display_cond;
							end if;
                        elsif s_en = '0' and s_en_dis1 = '1' then
					
	                          so_en <= '0'; 
                              state <= display_cond;
                        end if;

                    when solenoid_exit =>
						

                        if s_ex = '1'and s_ex_dis1 = '0' then 
							
																					
							if condition_cnt /= '0' then 
								
                           		so_ex <= '1';
                           		cnt <= cnt - '1';
                           		state <= display_cond;
							else
								so_ex <= '0';
								s_ex_dis <= '1';
								state <= display_cond;
							end if;
                        elsif s_ex = '0' and s_ex_dis1 = '1' then 
						   		so_ex <= '0'; 
                           		state <= display_cond;
                        end if;

                    when display_cond =>
                        if s_en = '1' and s_en_dis /= '1'  then
                            -- display count
							sega <= segaa;
			 				segb <= segbb;
			 				segc <= segcc;
			 				segd <= segdd;
			 				sege <= segee;
			 				segf <= segff;
			 				segg <= seggg;
							s_en_dis2 <= '1';
                           state <= signal_state;
                         elsif s_ex = '1' and s_ex_dis /= '1' then
                           --% display count %
							
							sega <= segaa;
			 				segb <= segbb;
			 				segc <= segcc;
			 				segd <= segdd;
			 				sege <= segee;
			 				segf <= segff;
			 				segg <= seggg;
							s_ex_dis2 <= '1';
                            state <= signal_state;
	
                        elsif s_ex_dis1 = '1' or s_en_dis1 = '1' then
							

							sega <= segaa;
			 				segb <= segbb;
			 				segc <= segcc;
			 				segd <= segdd;
			 				sege <= segee;
			 				segf <= segff;
			 				segg <= seggg;
							
                            state <= idle; 
						elsif s_ex_dis = '1' and condition_cnt = '0' then
							sega <= segaa;
			 				segb <= segbb;
			 				segc <= segcc;
			 				segd <= segdd;
			 				sege <= segee;
			 				segf <= segff;
			 				segg <= seggg;
							s_ex_dis3 <= '1';
							
					
                            state <= idle; 
						
						elsif s_en_dis = '1' and condition_cnt = '1' then
							sega <= segaa;
			 				segb <= segbb;
			 				segc <= segcc;
			 				segd <= segdd;
			 				sege <= segee;
			 				segf <= segff;
			 				segg <= seggg;
							
							s_en_dis3 <= '1';
							
                            state <= idle; 																										
						end if;

                    when signal_state =>
                        if s_en = '0' and s_en_dis2 = '1' then
                           
							s_en_dis1 <= '1';
							s_en_dis <= '1';
							s_en_dis2 <= '0';
                            state <= solenoid_entrance;
                        elsif s_ex = '0' and s_ex_dis2 = '1' then
                           
						    s_ex_dis1 <= '1';
							s_ex_dis <= '1';
							s_ex_dis2 <= '0';
                            state <= solenoid_exit;
                        end if;
               
			 end case;
           end if;
       end if;
    end process;
end p_lot;












