📄 statemachine.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 + -