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

📄 state_machine.vhd

📁 FPGA基础性试验交通灯设计
💻 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 + -