Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library IEEE;
- use IEEE.std_logic_1164.all;
- entity trafficlightcontroller is
- port
- (
- clk : in std_logic;
- reset : in std_logic;
- ambulance : in std_logic;
- smr : in std_logic;
- sml : in std_logic;
- ssr : in std_logic;
- rlmr : out std_logic;
- almr : out std_logic;
- glmr : out std_logic;
- rlsr : out std_logic;
- alsr : out std_logic;
- glsr : out std_logic
- );
- end entity;
- architecture rtl of trafficlightcontroller is
- -- Build an enumerated type for the state machine
- -- r=red;a=amber;g=green;c=car waiting;m=main road;s=side road
- type state_type is (rmgs, rmas, rmrs, amrs, gmrs, gmrcs, ramrs, rmacs, rmrcs, ramrcs, rmras, rmrs2);
- -- Signals to hold the states
- signal present_state, next_state : state_type;
- signal divclk, reset2, reset2b, reset3, reset3b, reset10, reset20, reset20b, count2, count2b, count3, count3b, count10, count20, count20b: std_logic;
- component timer is
- generic (
- trigger_cnt: natural := 20
- );
- port (
- clk: in std_logic;
- reset: in std_logic;
- count: buffer std_logic
- );
- end component timer;
- component clockdivider
- port(clkin : in std_logic;
- dividedclk : out std_logic
- );
- end component clockdivider;
- begin
- timer2 : timer generic map (trigger_cnt => 2) port map(divclk,reset2,count2);
- timer2b : timer generic map (trigger_cnt => 2) port map(divclk,reset2b,count2b);
- timer3 : timer generic map (trigger_cnt => 3) port map(divclk,reset3,count3);
- timer3b : timer generic map (trigger_cnt => 3) port map(divclk,reset3b,count3b);
- timer10 : timer generic map (trigger_cnt => 10) port map(divclk,reset10,count10);
- timer20 : timer generic map (trigger_cnt => 20) port map(divclk,reset20,count20);
- timer20b : timer generic map (trigger_cnt => 20) port map(divclk,reset20b,count20b);
- divider : clockdivider port map(clk, divclk);
- process (present_state, reset, ssr)
- begin
- if reset = '0' then
- reset2 <= '0';
- reset2b <= '0';
- reset3 <= '0';
- reset3b <='0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- next_state <= rmrs;
- --Various casses for side road sensor being pressed
- elsif ssr = '0' and present_state=gmrs then
- next_state <= gmrcs;
- elsif ssr = '0' and present_state=rmas then
- next_state <= rmacs;
- elsif ssr = '0' and present_state=rmrs then
- next_state <= rmrcs;
- elsif ssr = '0' and present_state=ramrs then
- next_state <= ramrcs;
- --Various cases for emergency vehicle approach:
- --Lights will go to their amber state and then red.
- --Due to thr present state design, triggering the emergency vehicle override when in a red + amber state will result in those cars
- --missing a "turn" of green.
- elsif ambulance = '0' and present_state=gmrs then
- next_state <= amrs;
- elsif ambulance = '0' and present_state=ramrs then
- next_state <= amrs;
- elsif ambulance = '0' and present_state=ramrcs then
- next_state <= amrs;
- elsif ambulance = '0' and present_state=rmgs then
- next_state <= rmas;
- elsif ambulance = '0' and present_state=rmras then
- next_state <= rmas;
- --maintain red light until vehicle has passed
- elsif ambulance = '0' and present_state=rmrs then
- next_state <= rmrs;
- elsif ambulance = '0' and present_state=rmrcs then
- next_state <= rmrcs;
- elsif ambulance = '0' and present_state=rmrs2 then
- next_state <= rmrs2;
- else
- -- Determine the next state synchronously, based on
- -- the current state and the input
- case present_state is
- --Red light main; green side road
- when rmgs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3 <= '0';
- reset3b <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '0';
- alsr <= '0';
- glsr <= '1';
- reset10 <= '1';
- --if count is complete then move to next state
- if ( count10='1' ) THEN
- next_state <= rmas;
- --otherwise, return to current state
- else
- next_state <= rmgs;
- end if;
- --Red light main; amber side road
- when rmas=>
- reset2 <= '0';
- reset2b <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '0';
- alsr <= '1';
- glsr <= '0';
- reset3 <= '1';
- if ( count3='1' ) THEN
- next_state <= rmrs;
- else
- next_state <= rmas;
- end if;
- --Red main; red side road
- --Used for change over from green on side road to green on main; also used for emergency vehicle approach
- when rmrs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3 <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset3b <= '1';
- if ( count3b='1' ) THEN
- next_state <= ramrs;
- else
- next_state <= rmrs;
- end if;
- --Amber main; red side road
- when amrs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '0';
- almr <= '1';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset3 <= '1';
- if ( count3='1' ) THEN
- next_state <= rmrs2;
- else
- next_state <= amrs;
- end if;
- --Green main; red side road
- when gmrs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3 <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20b <= '0';
- rlmr <= '0';
- almr <= '0';
- glmr <= '1';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset20 <= '1';
- next_state <= gmrs;
- --Green main; red side road; car waiting
- when gmrcs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3 <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- rlmr <= '0';
- almr <= '0';
- glmr <= '1';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset20 <= '1';
- if ( count20='1' ) THEN
- next_state <= amrs;
- else
- next_state <= gmrcs;
- end if;
- --Red main; amber side road; car waiting
- when rmacs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3 <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '0';
- alsr <= '1';
- glsr <= '0';
- reset3 <= '1';
- if ( count3='1' ) THEN
- next_state <= rmrcs;
- else
- next_state <= rmacs;
- end if;
- --Red main; red side road; car waiting
- when rmrcs=>
- reset2 <= '0';
- reset2b <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset3b <= '1';
- if ( count3b='1' ) THEN
- next_state <= ramrcs;
- else
- next_state <= rmrcs;
- end if;
- --Red + amber main; red side road; car waiting
- when ramrcs=>
- reset2 <= '0';
- reset3 <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '1';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset2 <= '1';
- if ( count2='1' ) THEN
- next_state <= gmrcs;
- else
- next_state <= ramrcs;
- end if;
- --Red + amber main; red side road
- when ramrs=>
- reset2b <= '0';
- reset3 <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '1';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset2 <= '1';
- if ( count2='1' ) THEN
- next_state <= gmrs;
- else
- next_state <= ramrs;
- end if;
- --Red main; red + amber side road
- when rmras=>
- reset2b <= '0';
- reset3 <= '0';
- reset3b <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '1';
- glsr <= '0';
- reset2 <= '1';
- if ( count2='1' ) THEN
- next_state <= rmgs;
- else
- next_state <= rmras;
- end if;
- --Red main; red side road
- --Used for changeover between green on main and green on side road
- when rmrs2=>
- reset2 <= '0';
- reset3 <= '0';
- reset10 <= '0';
- reset20 <= '0';
- reset20b <= '0';
- rlmr <= '1';
- almr <= '0';
- glmr <= '0';
- rlsr <= '1';
- alsr <= '0';
- glsr <= '0';
- reset3b <= '1';
- if ( count3b='1' ) THEN
- next_state <= rmras;
- else
- next_state <= rmrs2;
- end if;
- end case;
- end if;
- end process;
- --Every clock tick, the next state is selected as the present state.
- state_clocked: process(clk)
- begin
- if ( rising_edge( clk ) ) THEN
- present_state <= next_state;
- end if;
- end process state_clocked;
- end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement