Advertisement
The_General

Traffic Light Controller

Apr 10th, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 9.07 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.std_logic_1164.all;
  3.  
  4. entity trafficlightcontroller is
  5.   port
  6.   (
  7.     clk       : in  std_logic;
  8.     reset     : in  std_logic;
  9.      ambulance : in std_logic;
  10.      smr          : in  std_logic;
  11.      sml          : in  std_logic;
  12.      ssr          : in  std_logic;
  13.     rlmr          : out std_logic;
  14.      almr         : out std_logic;
  15.      glmr         : out std_logic;
  16.      rlsr         : out std_logic;
  17.      alsr         : out std_logic;
  18.      glsr         : out std_logic
  19.   );
  20. end entity;
  21.  
  22. architecture rtl of trafficlightcontroller is
  23.  
  24.   -- Build an enumerated type for the state machine
  25.   -- r=red;a=amber;g=green;c=car waiting;m=main road;s=side road
  26.      type state_type is (rmgs, rmas, rmrs, amrs, gmrs, gmrcs, ramrs, rmacs, rmrcs, ramrcs, rmras, rmrs2);
  27.  
  28.   -- Signals to hold the states
  29.      signal present_state, next_state : state_type;
  30.       signal divclk, reset2, reset2b, reset3, reset3b, reset10, reset20, reset20b, count2, count2b, count3, count3b, count10, count20, count20b: std_logic;
  31.      
  32.       component timer is
  33.             generic (
  34.                 trigger_cnt:    natural := 20
  35.             );
  36.             port (
  37.                  clk:        in      std_logic;
  38.                  reset:      in      std_logic;
  39.                  count:      buffer  std_logic
  40.             );
  41.       end component timer;
  42.      
  43.       component clockdivider
  44.             port(clkin : in std_logic;
  45.          dividedclk : out std_logic
  46.             );
  47.         end component clockdivider;
  48.       begin
  49.      
  50.       timer2 : timer generic map (trigger_cnt => 2) port map(divclk,reset2,count2);
  51.       timer2b : timer generic map (trigger_cnt => 2) port map(divclk,reset2b,count2b);
  52.       timer3 : timer generic map (trigger_cnt => 3) port map(divclk,reset3,count3);
  53.       timer3b : timer generic map (trigger_cnt => 3) port map(divclk,reset3b,count3b);
  54.       timer10 : timer generic map (trigger_cnt => 10) port map(divclk,reset10,count10);
  55.       timer20 : timer generic map (trigger_cnt => 20) port map(divclk,reset20,count20);
  56.       timer20b : timer generic map (trigger_cnt => 20) port map(divclk,reset20b,count20b);
  57.       divider : clockdivider port map(clk, divclk);
  58.  
  59.   process (present_state, reset, ssr)
  60.   begin
  61.     if reset = '0' then
  62.         reset2 <= '0';
  63.         reset2b <= '0';
  64.         reset3 <= '0';
  65.         reset3b <='0';
  66.         reset10 <= '0';
  67.         reset20 <= '0';
  68.         reset20b <= '0';
  69.       rlmr <= '1';
  70.         almr <= '0';
  71.         glmr <= '0';
  72.         rlsr <= '1';
  73.         alsr <= '0';
  74.         glsr <= '0';
  75.         next_state <= rmrs;
  76.      --Various casses for side road sensor being pressed
  77.     elsif ssr = '0' and present_state=gmrs then
  78.         next_state <= gmrcs;
  79.      elsif ssr = '0' and present_state=rmas then
  80.         next_state <= rmacs;
  81.      elsif ssr = '0' and present_state=rmrs then
  82.         next_state <= rmrcs;
  83.      elsif ssr = '0' and present_state=ramrs then
  84.         next_state <= ramrcs;
  85.      --Various cases for emergency vehicle approach:
  86.      --Lights will go to their amber state and then red.
  87.      --Due to thr present state design, triggering the emergency vehicle override when in a red + amber state will result in those cars
  88.      --missing a "turn" of green.
  89.      elsif ambulance = '0' and present_state=gmrs then
  90.         next_state <= amrs;
  91.      elsif ambulance = '0' and present_state=ramrs then
  92.         next_state <= amrs;
  93.      elsif ambulance = '0' and present_state=ramrcs then
  94.         next_state <= amrs;
  95.      elsif ambulance = '0' and present_state=rmgs then
  96.         next_state <= rmas;
  97.      elsif ambulance = '0' and present_state=rmras then
  98.         next_state <= rmas;
  99.      --maintain red light until vehicle has passed
  100.      elsif ambulance = '0' and present_state=rmrs then
  101.         next_state <= rmrs;
  102.      elsif ambulance = '0' and present_state=rmrcs then
  103.         next_state <= rmrcs;
  104.      elsif ambulance = '0' and present_state=rmrs2 then
  105.         next_state <= rmrs2;
  106.      else
  107.  
  108.       -- Determine the next state synchronously, based on
  109.       -- the current state and the input
  110.       case present_state is
  111.        
  112.           --Red light main; green side road
  113.         when rmgs=>
  114.              reset2 <= '0';
  115.              reset2b <= '0';
  116.              reset3 <= '0';
  117.              reset3b <= '0';
  118.              reset20 <= '0';
  119.              reset20b <= '0';
  120.              rlmr <= '1';
  121.              almr <= '0';
  122.             glmr <= '0';
  123.             rlsr <= '0';
  124.              alsr <= '0';
  125.              glsr <= '1';
  126.              reset10 <= '1';
  127.              --if count is complete then move to next state
  128.              if ( count10='1' ) THEN
  129.                 next_state <= rmas;
  130.              --otherwise, return to current state
  131.              else
  132.                 next_state <= rmgs;
  133.              end if;
  134.              
  135.           --Red light main; amber side road
  136.         when rmas=>
  137.              reset2 <= '0';
  138.              reset2b <= '0';
  139.              reset3b <= '0';
  140.              reset10 <= '0';
  141.              reset20 <= '0';
  142.              reset20b <= '0';
  143.              rlmr <= '1';
  144.              almr <= '0';
  145.             glmr <= '0';
  146.             rlsr <= '0';
  147.              alsr <= '1';
  148.              glsr <= '0';
  149.              reset3 <= '1';
  150.              if ( count3='1' ) THEN
  151.                 next_state <= rmrs;
  152.              else
  153.                 next_state <= rmas;
  154.              end if;
  155.              
  156.             --Red main; red side road
  157.             --Used for change over from green on side road to green on main; also used for emergency vehicle approach
  158.             when rmrs=>
  159.              reset2 <= '0';
  160.              reset2b <= '0';
  161.              reset3 <= '0';
  162.              reset10 <= '0';
  163.              reset20 <= '0';
  164.              reset20b <= '0';
  165.              rlmr <= '1';
  166.              almr <= '0';
  167.             glmr <= '0';
  168.             rlsr <= '1';
  169.              alsr <= '0';
  170.              glsr <= '0';
  171.              reset3b <= '1';
  172.              if ( count3b='1' ) THEN
  173.                 next_state <= ramrs;
  174.              else
  175.                 next_state <= rmrs;
  176.              end if;
  177.              
  178.           --Amber main; red side road
  179.         when amrs=>
  180.              reset2 <= '0';
  181.              reset2b <= '0';
  182.              reset3b <= '0';
  183.              reset10 <= '0';
  184.              reset20 <= '0';
  185.              reset20b <= '0';
  186.              rlmr <= '0';
  187.              almr <= '1';
  188.             glmr <= '0';
  189.             rlsr <= '1';
  190.              alsr <= '0';
  191.              glsr <= '0';
  192.              reset3 <= '1';
  193.              if ( count3='1' ) THEN
  194.                 next_state <= rmrs2;
  195.              else
  196.                 next_state <= amrs;
  197.              end if;
  198.  
  199.           --Green main; red side road
  200.           when gmrs=>
  201.              reset2 <= '0';
  202.              reset2b <= '0';
  203.              reset3 <= '0';
  204.              reset3b <= '0';
  205.              reset10 <= '0';
  206.              reset20b <= '0';
  207.             rlmr <= '0';
  208.              almr <= '0';
  209.             glmr <= '1';
  210.             rlsr <= '1';
  211.              alsr <= '0';
  212.              glsr <= '0';
  213.              reset20 <= '1';
  214.              next_state <= gmrs;
  215.                
  216.           --Green main; red side road; car waiting
  217.           when gmrcs=>
  218.              reset2 <= '0';
  219.              reset2b <= '0';
  220.              reset3 <= '0';
  221.              reset3b <= '0';
  222.              reset10 <= '0';
  223.              reset20 <= '0';
  224.             rlmr <= '0';
  225.              almr <= '0';
  226.             glmr <= '1';
  227.             rlsr <= '1';
  228.              alsr <= '0';
  229.              glsr <= '0';
  230.              reset20 <= '1';
  231.              if ( count20='1' ) THEN
  232.                 next_state <= amrs;
  233.              else
  234.                 next_state <= gmrcs;
  235.              end if;
  236.                      
  237.          --Red main; amber side road; car waiting
  238.          when rmacs=>
  239.              reset2 <= '0';
  240.              reset2b <= '0';
  241.              reset3 <= '0';
  242.              reset10 <= '0';
  243.              reset20 <= '0';
  244.              reset20b <= '0';
  245.             rlmr <= '1';
  246.              almr <= '0';
  247.             glmr <= '0';
  248.             rlsr <= '0';
  249.              alsr <= '1';
  250.              glsr <= '0';
  251.              reset3 <= '1';
  252.              if ( count3='1' ) THEN
  253.                 next_state <= rmrcs;
  254.             else
  255.                 next_state <= rmacs;
  256.             end if;
  257.        
  258.         --Red main; red side road; car waiting
  259.         when rmrcs=>
  260.              reset2 <= '0';
  261.              reset2b <= '0';
  262.              reset3b <= '0';
  263.              reset10 <= '0';
  264.              reset20 <= '0';
  265.              reset20b <= '0';
  266.              rlmr <= '1';
  267.              almr <= '0';
  268.             glmr <= '0';
  269.             rlsr <= '1';
  270.              alsr <= '0';
  271.              glsr <= '0';
  272.              reset3b <= '1';
  273.              if ( count3b='1' ) THEN
  274.                 next_state <= ramrcs;
  275.              else
  276.                 next_state <= rmrcs;
  277.              end if;
  278.        
  279.         --Red + amber main; red side road; car waiting
  280.         when ramrcs=>
  281.              reset2 <= '0';
  282.              reset3 <= '0';
  283.              reset3b <= '0';
  284.              reset10 <= '0';
  285.              reset20 <= '0';
  286.              reset20b <= '0';
  287.              rlmr <= '1';
  288.              almr <= '1';
  289.             glmr <= '0';
  290.             rlsr <= '1';
  291.              alsr <= '0';
  292.              glsr <= '0';
  293.              reset2 <= '1';
  294.              if ( count2='1' ) THEN
  295.                 next_state <= gmrcs;
  296.              else
  297.                 next_state <= ramrcs;
  298.              end if;
  299.        
  300.         --Red + amber main; red side road
  301.         when ramrs=>
  302.              reset2b <= '0';
  303.              reset3 <= '0';
  304.              reset3b <= '0';
  305.              reset10 <= '0';
  306.              reset20 <= '0';
  307.              reset20b <= '0';
  308.              rlmr <= '1';
  309.              almr <= '1';
  310.             glmr <= '0';
  311.             rlsr <= '1';
  312.              alsr <= '0';
  313.              glsr <= '0';
  314.              reset2 <= '1';
  315.              if ( count2='1' ) THEN
  316.                 next_state <= gmrs;
  317.              else
  318.                 next_state <= ramrs;
  319.              end if;
  320.              
  321.         --Red main; red + amber side road
  322.         when rmras=>
  323.              reset2b <= '0';
  324.              reset3 <= '0';
  325.              reset3b <= '0';
  326.              reset10 <= '0';
  327.              reset20 <= '0';
  328.              reset20b <= '0';
  329.              rlmr <= '1';
  330.              almr <= '0';
  331.             glmr <= '0';
  332.             rlsr <= '1';
  333.              alsr <= '1';
  334.              glsr <= '0';
  335.              reset2 <= '1';
  336.              if ( count2='1' ) THEN
  337.                 next_state <= rmgs;
  338.              else
  339.                 next_state <= rmras;
  340.              end if;
  341.              
  342.         --Red main; red side road
  343.         --Used for changeover between green on main and green on side road
  344.         when rmrs2=>
  345.              reset2 <= '0';
  346.              reset3 <= '0';
  347.              reset10 <= '0';
  348.              reset20 <= '0';
  349.              reset20b <= '0';
  350.              rlmr <= '1';
  351.              almr <= '0';
  352.             glmr <= '0';
  353.             rlsr <= '1';
  354.              alsr <= '0';
  355.              glsr <= '0';
  356.              reset3b <= '1';
  357.              if ( count3b='1' ) THEN
  358.                 next_state <= rmras;
  359.              else
  360.                 next_state <= rmrs2;
  361.              end if;
  362.              
  363.       end case;
  364.     end if;
  365.   end process;
  366.  
  367.   --Every clock tick, the next state is selected as the present state.
  368.   state_clocked: process(clk)
  369.   begin
  370.      if ( rising_edge( clk ) ) THEN
  371.         present_state <= next_state;
  372.      end if;
  373. end process state_clocked;
  374.  
  375. end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement