-- 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;