verilog交通灯控制器设计_fpga交通灯控制器课程设计

verilog交通灯控制器设计_fpga交通灯控制器课程设计交通信号灯控制系统的Verilog实现作为数字系统设计入门案例,下面简单介绍最简单的交通控制系统,说明设计思路。首先给出要求:设计一个主干道和支干道十字路口的交通信号灯控制电路(1)一般情况下保持主干道通畅,主干道绿灯亮、支干道红灯亮,并且主干道绿灯亮时间不少于60秒。(2)主干道绿灯亮超过60秒,且支干道有车时,主干道红灯亮,支干道绿灯亮,但支干道亮灯时间不超过30秒。(3)每次主干道或支干道绿灯变红灯时,黄灯先亮5秒。1.逻辑抽象,明确输入输出。主干道和支干道的十字路口交通灯系统求优先保证


Jetbrains全系列IDE稳定放心使用

交通信号灯控制系统的Verilog实现
作为数字系统设计入门案例,下面简单介绍最简单的交通控制系统,说明设计思路。
首先给出要求:设计一个主干道和支干道十字路口的交通信号灯控制电路
(1)一般情况下保持主干道通畅,主干道绿灯亮、支干道红灯亮,并且主干道绿灯亮时间不少于60秒。
(2)主干道绿灯亮超过60秒,且支干道有车时,主干道红灯亮,支干道绿灯亮,但支干道亮灯时间不超过30秒。
(3)每次主干道或支干道绿灯变红灯时,黄灯先亮5秒。
1.逻辑抽象,明确输入输出。
主干道和支干道的十字路口交通灯系统求优先保证主干道的畅通。平时处于主干道绿灯、支干道红灯的状态。当支干道有车时,传感器发出信号S=1,主干道绿灯先转换成黄灯、再变成红灯,支干道由红灯变成绿灯。如果支干道继续有车通过时,则传感器继续有信号,使支干道保持绿灯亮,但支干道绿灯持续亮的时间不得超过30s,否则支干道绿灯先转换成黄灯再变成红灯,同时主干道由红灯变成绿灯。主干道每次通行时间不得短于60s,在此期间,即使支干道S有信号,也不能中止主干道的绿灯亮。
输入信号有时钟、复位、传感器信号;输出有主干道红黄绿灯和支干道红黄绿灯。
2.确定系统框图
首先用状态机作为主控制,状态机转换条件根据计时器信息判断转换条件,译码电路中根据所在状态输出对应干道信号灯状态。
控制单元根据时钟和传感信号向计数器发出信号,计时器向控制单元发出60s(t1)、30s(t2)、5s(t3)计时信号。主干道红黄绿用h_r,h_y,h_g表示,支干道红黄绿用f_r,f_y,f_g表示。
在这里插入图片描述
因此,用计时分别产生三个持续的时间段后,向控制单元发出时间已到信号,控制单元根据计时器及传感器的信号,决定是否进行状态转换。如果肯定,则控制单元发出状态转换信号St,计时器开始清零,准备重新计时。

交通灯控制单元的控制过程分为四个阶段,对应的输出有四种状态,分别用S0、S1、S2和S3表示:
S0状态 主干道绿灯亮支干道红灯亮,此时若支干道有车等待通过,而且主干道绿灯已亮足规定的时间t1,控制器发出状态转换信号St,输出从状态S0转换到S1 (转换条件:绿灯亮够60s且检测到支干道有车即 t1&&s=1)

S1状态 主干道黄灯亮,支干道红灯亮,进人此状态,黄灯亮足规定的时间t3时,控制器发出状态转换信号St,输出从状态S1转换到S2。 (转换条件:黄灯亮够5s就转换状态即 t3=1)

S2状态 支干道绿灯亮,主干道红灯亮,若此时支干道继续有车,则继续保持此状态,但支干道绿灯亮的时间不得超过t2,否则控制单元发出状态转换信号St,使输出转换到S3状态。若此时支干道没有车,则控制单元立即发出状态转换信号St,使输出转换到S3状态。
(转换条件:支干道绿灯亮够30s或者检测到支干道没车即 t2+(~s)=1)

S3状态 支干道黄灯亮,主干道红灯亮,此时状态与S1状态持续的时间相同均为t3,时间到时,控制器发出St信号,输出从状态S3回到S0状态。对上述S0、S1、S2和S3四种状态按照格雷码进行编码分别为00,01,11和10。
/控制状态机/
always@(posedge clk or negedge rst)
begin
if(!rst)
current_state<=2’d0;
else
current_state<=next_state;
end

always@(s,current_state,t1,t2,t3)
begin
	case(current_state)
		s0:	begin
			next_state=(t1&&s)?s1:s0;
			ST=(t1&&s)?1'b1:1'b0;			
			end
		s1:	begin
			next_state=(t3)?s2:s1;
			ST=(t3)?1'b1:1'b0;			
			end
		s2:	begin
			next_state=(t2||~s)?s3:s2;
			ST=(t2||~s)?1'b1:1'b0;			
			end
		s3:	begin
			next_state=(t3)?s0:s3;
			ST=(t3)?1'b1:1'b0;
			end
		endcase
end

在这里插入图片描述
在这里插入图片描述

计时部分采用2个寄存器代表十位(t_h)和个位(t_l)计数,同时每次检测到转换信号都要清零重新计时

always@(posedge clk or negedge rst)   //计时模块
	begin
		if(!rst)
			{ 
   t_h,t_l}<=8'd0; else if(ST) //控制信号有效说明灯的颜色改变重新计数 {t_h,t_l}<=8'd0;
		else if((t_h==4'd5)&(t_l==4'd9))   //判断是否计数到60
			begin
			{ 
   t_h,t_l}<={ 
   t_h,t_l};						
			end
		else if(t_l==4'd9) //判断个位是否计数满,是则十位加一 begin t_h<=t_h+1'b1;
			t_l<=4'd0; end else begin t_h<=t_h; t_l<=t_l+1'b1;		
		end
	end
    assign t3=(t_h==4'd0)&(t_l==4'd4);   //主干道绿灯计数时间
	assign t2=(t_h==4'd2)&(t_l==4'd9);	 //	支干道绿灯计数时间
	assign t1=(t_h==4'd5)&(t_l==4'd9);   //黄灯计数时间

译码部分根据状态机所在状态输出对应信号灯状态

always@(current_state)
	begin
		case(current_state)
			s0:	begin
				{ 
   hg,hy,hr}=3'b100; //主干道绿灯 {fg,fy,fr}=3'b001;  //支干道红灯			
				end
			s1:	begin
				{ 
   hg,hy,hr}=3'b010; //主干道黄灯 {fg,fy,fr}=3'b001;  //支干道红灯			
				end
			s2:	begin
				{ 
   hg,hy,hr}=3'b001; //主干道红灯 {fg,fy,fr}=3'b100;  //支干道绿灯			
				end		
			s3:	begin
				{ 
   hg,hy,hr}=3'b001; //主干道红灯 {fg,fy,fr}=3'b010;  //支干道黄灯			
				end	
			endcase
	end

在这里插入图片描述
仿真结果图
总结:本文设计较简单,对于复杂交通还需改善,但是能够从中慢慢建立对系统架构的认知和联系,从中理清各模块间关系。后续还需多查资料研究,如有错误不合理之处,请告知。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189744.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQLPLUS登陆命令「建议收藏」

    一.SQLPLUS登陆命令:使用sqlplus:10G之前的版本登陆时需要加引号(单、双引号皆可)如:sqlplus"/assysdba"sqlplus-prelim/assysdba&nbsp;&nbsp;&nbsp;&nbsp;从Oracle10g开始,sqlplus提供了一个参数选项-prelim,用这个参数,在系统已经hang的时候可以连接到SGA而不是数据库,也就…

    2022年4月10日
  • idea 2021.8 激活码_在线激活

    (idea 2021.8 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~BI…

    2022年3月22日
  • Python列表(list)及其常用方法

    Python列表(list)及其常用方法列表(list):也是有序的数据集合,支持增删查改。用[]来表示列表类型,数据项之间用逗号来分割,列表中的数据项可以是任何类型(Python的特点),数据项可以变化,内存地址不会改变。支持索引和切片

    2022年7月3日
  • 安卓Menu键的问题

    安卓Menu键的问题

    2022年1月30日
  • tracert跟踪路由命令_怎么进行路由跟踪

    tracert跟踪路由命令_怎么进行路由跟踪Tracert是Windows路由跟踪程序,在cmd中使用,用于确定IP数据包访问目标所采取的路径。Tracert命令使用用IP生存时间(TTL)字段和ICMP错误消息来确定从一个主机

    2022年8月5日
  • GCC编译选项_需要使用安全编译选项的语言

    GCC编译选项_需要使用安全编译选项的语言1、gcc包含的c/c++编译器gcc,cc,c++,g++gcc和cc是一样的,c++和g++是一样的。一般c程序就用gcc编译,c++程序就用g++编译  2、gcc的基本用法gcctest.c这样将编译出一个名为a.out的程序gcctest.c-otest这样将编译出一个名为test的程序,-o参数用来指…

    2022年10月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号