📄 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秒
--s1:特殊状态,东西南北全红;s2:东西绿灯亮50s,南北红灯亮50s;s3:东西黄灯亮5s,南北红灯亮5s;
--s4:东西红灯亮50s,南北绿灯亮50s;s5:东西红灯亮5s,南北黄灯亮5s;
entity state_machine is
Port ( clk:in std_logic; -- 系统时钟的输入
reset : in std_logic; --复位信号,高电平有效。拨盘开关拨上去是低电平
clk_1hz:out std_logic; --分频得到1hz的频率输出
dataout1a,dataout2a: out std_logic_vector(3 downto 0);--倒计时的数据输出
dataout1b,dataout2b: 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 40000000;
begin
if (reset='1') then
cnt:=0; clock<='0';
elsif clk'event and clk='1' then
cnt:=cnt+1;
if cnt=40000000 then
clock<= not clock;
cnt:=0;
end if;
clk_1hz<=clock;
end if;
end process;
process (clock, RESET) --状态控制
variable cnt21a,cnt21b,cnt22,cnt31,cnt32,cnt41a,cnt41b,cnt42,cnt51,cnt52: std_logic_vector(3 downto 0); --定义一个4位的二进制变量
begin
if RESET='1' then
Current_State <= S2; --初始状态下赋值
cnt22:="0101";
cnt21a:="0000"; --东西绿灯
cnt21b:="0101"; --南北红灯
cnt32:="0000";
cnt31:="0101";
cnt42:="0101";
cnt41a:="0000";
cnt41b:="0101";
cnt52:="0000";
cnt51:="0101";
elsif (CLOCK'event and CLOCK = '1') then
case current_state is
when s1=> --交通灯处于初始状态,所有红灯都亮;
sign1<="100100";
current_state<=s2;
when s2=> --s2状态表示东西绿灯和南北红灯同时亮50秒;
dataout1a<=cnt21a;
dataout1b<=cnt21b;
dataout2a<=cnt22;
dataout2b<=cnt22;
sign1<="010100";
if (cnt22="0000" and cnt21a="0000")then
current_state<=S3;
cnt22:="0101";cnt21a:="0000";cnt21b:="0101";
elsif cnt21a="0000"then
cnt22:=cnt22-1;
cnt21a:="1001";cnt21b:="1001";
else cnt21a:=cnt21a-1;
cnt21b:=cnt21b-1;
current_state<=S2;
end if;
when s3=> --s3状态表示南北红灯和东西黄灯亮5秒;
dataout1a<=cnt31; dataout1b<=cnt31;
dataout2a<=cnt32;dataout2b<=cnt32;
sign1<="001100";
if (cnt32="0000"and cnt31="0001")then
current_state<=S4;
cnt32:="0000";
cnt31:="0101";
else
cnt31:=cnt31-1;
current_state<=S3;
end if;
when s4=> --s4状态表示南北绿灯和东西红灯同时亮50秒;
dataout1a<=cnt41a;
dataout1b<=cnt41b;
dataout2a<=cnt42; dataout2b<=cnt42;
sign1<="100010";
if cnt41a&cnt42="00000000" then
current_state<=S5;
cnt41a:="0000";cnt41a:="0101";cnt42:="0101";
elsif cnt41a="0000"then
cnt42:=cnt42-1;
cnt41a:="1001";cnt41b:="1001";
else cnt41a:=cnt41a-1;cnt41b:=cnt41b-1;
current_state<=S4;
end if;
when s5=> --s5状态表示南北黄灯和东西红灯亮5秒;
dataout1a<=cnt51;
dataout2a<=cnt52;
dataout1b<=cnt51;
dataout2b<=cnt52;
sign1<="100001";
if (cnt52="0000"and cnt51="0000")then
current_state<=S2;
cnt52:="0000";
cnt51:="0101";
else
cnt51:=cnt51-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 + -