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

📄 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秒
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 + -