⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statemachine.vhd

📁 自动打铃系统的VHDL设计中的状态机
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;

ENTITY Statemachine IS
PORT
(Clock:IN Std_Logic;
 ChangeMode:IN Std_logic;
 AdjPosition:IN Std_Logic;
 AdjVal:IN Std_Logic;
 Command:BUFFER Std_Logic_Vector(4 DOWNTO 0);  ---用以指示当前所处状态
 AdjBotton:OUT Std_Logic_Vector(2 DOWNTO 0);   ---AdjBotton(2)为调时信号
                                               ---AdjBotton(1)为调分信号
                                               ---AdjBotton(0)为调秒信号
 Flash:OUT Std_Logic_Vector(2 DOWNTO 0)        ---指示七段数码管进行闪烁的信号
                                               ---Flash(2)指示时位闪烁
                                               ---Flash(1)指示分位闪烁
                                               ---Flash(0)指示秒位闪烁



);
 END;



ARCHITECTURE Mealymachine OF Statemachine IS
TYPE State_type IS (Timer,Adj_Timer,Adj_MorningTime,Adj_EveningTime,
                   Adj_RingLength,Adj_12or24);
SIGNAL State:State_type;
SIGNAL Pos:Integer RANGE 0 TO 3;

BEGIN
  PROCESS(Clock)
 BEGIN
    IF rising_edge(Clock) THEN
       CASE State IS
         WHEN Timer=>
           IF ChangeMode='1' THEN
              State<=Adj_Timer;
              END IF;
     WHEN Adj_Timer=>
      IF ChangeMode='1' THEN
        State<=Adj_MorningTime;
       END IF;
    WHEN Adj_MorningTime=>
      IF ChangeMode='1' THEN
        State<=Adj_EveningTime;
       END IF;
    WHEN Adj_EveningTime=>
      IF ChangeMode='1' THEN
        State<=Adj_RingLength;
     END IF;
    WHEN Adj_RingLength=>
      IF ChangeMode='1' THEN
        State<=Adj_12or24;
      END IF;
    WHEN Adj_12or24=>
      IF ChangeMode='1' THEN
        State<=Timer;
      END IF;
    WHEN Others=>
      State<=Timer;
      END CASE;
    END IF;
  END PROCESS;


PROCESS(Clock)
BEGIN
   IF rising_edge(Clock) THEN
    CASE State IS
      WHEN Timer=>
       Command<="00000";

       Pos<=0;
      WHEN Adj_Timer=>
       IF Command<="00000" THEN
       Pos<=1;
       ELSE
        IF AdjPosition='1' THEN
          IF Pos=3 THEN
             Pos<=1;
        ELSE
          Pos<=Pos+1;
          END IF;
        END IF;
       END IF;
      Command<="00001";
       WHEN Adj_MorningTime=>
          IF Command<="00001" THEN
            Pos<=1;
          ELSE
            IF AdjPosition='1' THEN
               IF Pos=1 THEN
                  Pos<=2;
               ELSE
                 Pos<=1;
               END IF;
            END IF;
          END IF;
          Command<="00010";
         WHEN Adj_EveningTime=>
           IF Command="00010" THEN
             Pos<=1;
            ELSE
             IF AdjPosition='1'THEN
               IF Pos=1 THEN
                 Pos<=2;
               ELSE
                 Pos<=1;
               END IF;
             END IF;
           END IF;
          Command<="00100";
         WHEN Adj_RingLength=>
             IF Command="00100" THEN
                 Pos<=1;
             ELSE
              IF AdjPosition='1' THEN
                 IF Pos=1 THEN
                   Pos<=3;
                 ELSE
                   Pos<=1;
                 END IF;
              END IF;
             END IF;
            Command<="01000";
         WHEN Adj_12or24=>
            Pos<=2;
          Command<="10000";
         WHEN OTHERS=>
           Pos<=0;
             Command<="00000";
        END CASE;


        CASE Pos IS
            WHEN 0=>
             Flash<="000";
             AdjBotton<="000";
            WHEN 1=>
             Flash<="100";
             IF AdjVal='1' THEN
             AdjBotton<="100";
             ELSE
               AdjBotton<="000";
             END IF;
            WHEN 2=>
             Flash<="010";
                IF AdjVal = '1' THEN
                 AdjBotton<="010";
                ELSE
                 AdjBotton<="000";
                END IF;
            WHEN 3=>
             Flash<="001";
              IF AdjVal='1' THEN
                  AdjBotton<="001";
              ELSE
                  AdjBotton<="000";
              END IF;
            WHEN OTHERS=>
              Flash<="000";
              AdjBotton<="000";
              END CASE;

           END IF;
         END PROCESS;
       END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -