📄 state_machine.vhd
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--该程序利用状态机完成交通灯各状态的循环控制。一共分了五个状态:s1状态表示交通灯处于初始状态,所有灯都灭;
--s2状态表示主干道绿灯和支干道红灯同时亮44秒;s3状态表示黄灯闪6秒;s4状态表示支干道绿灯和主干道红灯同时亮14秒;
--s5状态表示黄灯闪6秒
entity state_machine is
Port ( clk:in std_logic; -- 系统时钟的输入
reset : in std_logic; --复位信号,高电平有效。拨盘开关拨上去是低电平
clk_1hz:out std_logic; --分频得到1hz的频率输出
dataout1,dataout2: out std_logic_vector(3 downto 0);--倒计时的数据输出
data_ledfa : out std_logic_vector(7 downto 0 )); --交通灯亮灭的信号输出
end state_machine;
architecture Behavioral of state_machine is
type STATE_TYPE is (S1, S2, S3, S4, S5);
signal Current_State: STATE_TYPE; --状态机的状态定义
signal sign1: std_logic_vector(5 downto 0);
signal clock:std_logic;
begin
process (clk,reset) --分频
variable cnt:integer range 0 to 25000000;
begin
if (reset='1') then
cnt:=0; clock<='0';
elsif clk'event and clk='1' then
cnt:=cnt+1;
if cnt=25000000 then
clock<= not clock;
cnt:=0;
end if;
clk_1hz<=clock;
end if;
end process;
process (clock, RESET) --状态控制
variable cnt21,cnt22,cnt3,cnt41,cnt42,cnt5: std_logic_vector(3 downto 0); --定义一个4位的二进制变量
begin
if RESET='1' then
Current_State <= S4; --初始状态下赋植
cnt21:="0100";
cnt22:="0100";
cnt3:="0110";
cnt42:="0001";
cnt41:="0100";
cnt5:="0110";
elsif (CLOCK'event and CLOCK = '1') then
case current_state is
when s1=> --交通灯处于初始状态,所有灯都灭;
sign1<="111111";
current_state<=s2;
when s2=> --s2状态表示主干道绿灯和支干道红灯同时亮44秒;
dataout1<=cnt21;
dataout2<=cnt22;
sign1<="101011";
if (cnt22="0000"and cnt21="0001")then
current_state<=S3;
cnt22:="0100";cnt21:="0100";
elsif cnt21="0000"then
cnt22:=cnt22-1;
cnt21:="1001";
else cnt21:=cnt21-1;
current_state<=S2;
end if;
when s3=> --s3状态表示黄灯闪6秒;
dataout1<=cnt3;
dataout2<="0000";
sign1<="110110";
if (cnt3="0001")then
current_state<=S4;
cnt3:="0110";
else
cnt3:=cnt3-1;
current_state<=S3;
end if;
when s4=> --s4状态表示支干道绿灯和主干道红灯同时亮14秒;
dataout1<=cnt41;
dataout2<=cnt42;
sign1<="011101";
if cnt41&cnt42="00000000" then
current_state<=S5;
cnt41:="0100";cnt42:="0001";
elsif cnt41="0000"then
cnt42:="0000";
cnt41:="1001";
else cnt41:=cnt41-1;
current_state<=S4;
end if;
when s5=> --s5状态表示黄灯闪6秒
dataout1<=cnt5;
dataout2<="0000";
sign1<="110110";
if (cnt5="0001")then
current_state<=S2;
cnt5:="0110";
else
cnt5:=cnt5-1;
current_state<=S5;
end if;
end case;
end if;
data_ledfa<="11"&sign1;
end process;
end behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -