VHDL实现的交通灯

状态机实现的一个典型实例。

一、问题基本描述

输出六路信号,分别控制南北向和东西向的红、黄、绿灯。

WE_RED,WE_YELLOW,WE_GREEN     东西向的红、黄、绿灯信号线
NS_RED, NS_YELLOW, NW_GREEN     南北向的红、黄、绿灯信号线

控制时间暂定为: 正常行驶时间60s,黄灯等待时间3s。

二、VHDL代码:



library ieee;
use ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity jiaotongdeng is

	port(
		clk		 : in	std_logic;
		reset	 : in	std_logic;
		f1,f2	 : out	std_logic;
		WE_RED,WE_YELLOW,WE_GREEN	 : 	out std_logic;
		NS_RED,NS_YELLOW,NW_GREEN	 : 	out std_logic
	);

end entity;

architecture rtl of jiaotongdeng is
begin
	process (current_state)
	begin
			case current_state is
				when s0=>
					if flag1='1' then 
						next_state <= s1;
					else
						next_state<=s0;	
				
					end if;		
				when s1=>
					if flag2='1' then 
						next_state <= s2;
					else
						next_state<=s1;
						
					end if;		
				when s2=>
						if flag1='1' then 
						next_state <= s3;
					else
						next_state<=s2;
					
					end if;		
				when s3=>
						if flag2='1' then 
						next_state <= s0;
					else
						next_state<=s3;
					
					end if;		
				when others=>
						next_state <= s0;				
			
			end case;
		
	end process;

	
	process (current_state)
	begin
		case current_state is
			when s0 =>
				WE_RED<='1';WE_YELLOW<='0';WE_GREEN<='0';
				NS_RED<='0';NS_YELLOW<='0';NW_GREEN<='1';
			when s1 =>
				WE_RED<='1';WE_YELLOW<='0';WE_GREEN<='0';
				NS_RED<='0';NS_YELLOW<='1';NW_GREEN<='0';
			when s2 =>
				WE_RED<='0';WE_YELLOW<='0';WE_GREEN<='1';
				NS_RED<='1';NS_YELLOW<='0';NW_GREEN<='0';
			when s3 =>
				WE_RED<='0';WE_YELLOW<='1';WE_GREEN<='0';
				NS_RED<='1';NS_YELLOW<='0';NW_GREEN<='0';
		end case;
	end process;

	-- sequnce process
	process (clk)
	variable cn: integer;
	begin
		
		if (rising_edge(clk)) then
			current_state<=next_state;
		
		end if;
		
	--counter
		if (rising_edge(clk)) then
			if cn>0 then
				cn:=cn-1;
				ELSE   cn:= 62;
			end if;
			if (cn<=62 and cn>=3)  then
				flag1<='1';
				else flag1<='0';
			end if;
			if (cn<3 and cn>=0) then
				flag2<='1';
				else flag2<='0';
			end if;	
		end if;

	end process;
f1<=flag1;
f2<=flag2;	
	

end rtl;


  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
交通是一个常见的数字电路设计案例,可以使用VHDL在Quartus中实现。以下是一个简单的交通控制器的VHDL代码: ```vhdl entity traffic_light is port ( clk : in std_logic; reset : in std_logic; red : out std_logic; yellow : out std_logic; green : out std_logic ); end traffic_light; architecture behavior of traffic_light is type state_type is (stop, prepare, go, caution); signal current_state, next_state : state_type; begin process(clk, reset) begin if reset = '1' then current_state <= stop; elsif rising_edge(clk) then current_state <= next_state; end if; end process; process(current_state) begin case current_state is when stop => red <= '1'; yellow <= '0'; green <= '0'; next_state <= prepare; when prepare => red <= '1'; yellow <= '1'; green <= '0'; next_state <= go; when go => red <= '0'; yellow <= '0'; green <= '1'; next_state <= caution; when caution => red <= '0'; yellow <= '1'; green <= '0'; next_state <= stop; end case; end process; end behavior; ``` 在这个代码中,我们定义了一个名为`traffic_light`的实体,其中包含4个端口:时钟`clk`,复位`reset`,红色`red`,黄色`yellow`和绿色`green`。我们使用了两个进程,一个用于状态转移,另一个用于状态操作。在状态转移进程中,我们使用了一个状态类型`state_type`,定义了四种不同的状态:停止`stop`,准备`prepare`,前进`go`和警告`caution`。在状态操作进程中,我们根据当前状态设置红、黄、绿三种的输出,并根据当前状态计算下一个状态。在时钟上升沿时,我们将当前状态更新为下一个状态。 在Quartus中,我们可以将以上代码作为一个VHDL文件添加到项目中,并将其合成到FPGA芯片中。然后,我们可以将FPGA芯片连接到LED,以观察交通的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值