使用列举类型的状态机.vhd
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:3k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. ----------------------------------------------------------------
  2. --
  3. -- Copyright (c) 1992,1993,1994, Exemplar Logic Inc. All rights reserved.
  4. -- 
  5. ----------------------------------------------------------------
  6. --
  7. -- State machine description using enumerated types
  8. --
  9. -- This is a typical example of a state machine description.
  10. --   Two processes, one to update the state on a clock plus
  11. --   handles reset, and one to calculate the next state and
  12. --   the outputs in a case statement
  13. --
  14. -- State encoding on state_t will be done by CORE. Binary encoding is the
  15. -- default, option -encoding provides alternatives (onehot, gray, random)
  16. -- 
  17. -- This description implements a traffic light controller
  18. --
  19. --     Version 1.1 : Original Creation 
  20. --     Version 1.2 : Modified to std_logic types
  21. --     Version 2.1 : Improved design with CASE instead of if-then-else
  22. --
  23. -- download from: www.pld.com.cn & www.fpga.com.cn 
  24. ----------------------------------------------------------------
  25. LIBRARY ieee;
  26. USE ieee.std_logic_1164.all;
  27. ENTITY traffic IS
  28.     PORT (clock, sensor1, sensor2, reset : IN std_logic;
  29.   red1, yellow1, green1, red2, yellow2, green2 : OUT std_logic);
  30. END ;
  31. ARCHITECTURE eXemplar OF traffic IS
  32.     TYPE state_t IS ( ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7 );
  33.     SIGNAL state, nxstate : state_t;
  34. BEGIN
  35. update_state : -- Update the state on the clock edge
  36.     PROCESS (reset, clock)
  37.     BEGIN
  38.         IF (reset='1') THEN
  39.     state <= ST0 ;
  40.         ELSIF clock'event and clock='1' THEN
  41.     state <= nxstate ;
  42. END IF ;
  43.     END PROCESS;
  44. transitions : -- set the outputs and next state
  45.     PROCESS (state, sensor1, sensor2)
  46.     BEGIN
  47.         -- Default values for the outputs
  48.         red1 <= '0'; yellow1 <= '0'; green1 <= '0';
  49.         red2 <= '0'; yellow2 <= '0'; green2 <= '0';
  50.         -- Make sure to always set a value for nxstate, 
  51.         -- or unwanted latches will occur.
  52. CASE state IS
  53.     WHEN ST0 =>
  54.         green1 <= '1';
  55.         red2 <= '1';
  56.         IF sensor2 = sensor1 THEN
  57.     nxstate <= ST1;
  58.         ELSIF (sensor1 = '0' AND sensor2 = '1') THEN
  59.     nxstate <= ST2;
  60.         ELSE
  61.     nxstate <= ST0;
  62.         END IF;
  63.     WHEN ST1 =>       
  64.         green1 <= '1';
  65.         red2 <= '1';
  66.         nxstate <= ST2;
  67.     WHEN ST2 =>       
  68.         green1 <= '1';
  69.         red2 <= '1';
  70.         nxstate <= ST3;
  71.     WHEN ST3 =>       
  72.         yellow1 <= '1';
  73.         red2 <= '1';
  74.         nxstate <= ST4;
  75.     WHEN ST4 =>       
  76.         red1 <= '1';
  77.         green2 <= '1';
  78.         IF (sensor1 = '0' AND sensor2 = '0') THEN
  79.     nxstate <= ST5;
  80.         ELSIF (sensor1 = '1' AND sensor2 = '0') THEN
  81.     nxstate <= ST6;
  82.         ELSE
  83.     nxstate <= ST4;
  84.         END IF;
  85.     WHEN ST5 =>       
  86.         red1 <= '1';
  87.         green2 <= '1';
  88.         nxstate <= ST6;
  89.     WHEN ST6 =>       
  90.         red1 <= '1';
  91.         green2 <= '1';
  92.         nxstate <= ST7;
  93.     WHEN ST7 =>       
  94.         red1 <= '1';
  95.         yellow2 <= '1';
  96.         nxstate <= ST0;
  97. END CASE;
  98.     END PROCESS;
  99. END eXemplar;