EDA实验(Quartus Ⅱ+fpga) (四)---交通灯设计

交通灯控制器设计
本文介绍了一个基于FPGA的交通灯控制器的设计与实现。该控制器能够根据来自乡间公路的请求信号调整交通灯的状态,确保主干道和乡间公路的安全通行。设计中包含了状态机的应用及计时模块。
该文章已生成可运行项目,

前言:
本文主要介绍了EDA原理与应用这门课程的相关实验及代码。使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cycloneⅤ 5CSEMA5F31C6。
(一)实验目的
(1)熟悉交通灯控制器的工作原理;
(2)了解设计中的优化方案;
(3)进一步掌握状态机的设计;
(4)学习较复杂数字系统设计。
(二)设计要求
实现一个由一条主干道和一条乡间公路形成的十字路口的交通灯控制器功能:
(1)有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;
(2)交通灯由绿转红前有4秒亮黄灯的间隔时间,由红转绿没有间隔时间;
(3)乡间公路右侧各埋有一个串连传感器,当有车辆准备通过乡间公路时,发出请求信号S=1,其余时间S=0;
(4)平时系统停留在主干道通行(MGCR)状态,一旦S信号有效,经主道黄灯4秒(MYCR)状态后转入乡间公路通行(MRCG)状态,但要保证主干60s后才能转换;
(5)一旦S信号消失,系统脱离MRCG状态,即经乡道黄灯4秒(MRCY)状态进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟;
(三)实验代码

module jiaotongdeng(clk,s,rst,MG,CR,MY,MR,CG,CY,SG0,SG1,sw,gw,clk1,c);
   input clk,rst,s;
	output reg MG,CR,MY,MR,CG,CY;		//主绿黄红,乡绿黄红
	output gw,sw,clk1;
	output reg [6:0] SG0,SG1;
	output reg [5:0] c;
	parameter s0=0,s1=1,s2=2,s3=3;
	reg clk1;
	reg [7:0] timCG,timMG,timY;
	reg [7:0] tim;
	reg [1:0] cs;
	reg [1:0] next_state;
	reg [30:0] cnt;
	reg [7:0] a;
   reg [3:0]gw,sw;
	
//分频器
	//仿真
	always @(posedge clk)
       begin 
		   cnt=cnt+1;
         if(cnt>1) begin clk1=1'b1;  cnt=0;  end
         else clk1=1'b0;  
		        gw<=tim[3:0];
		        sw<=tim[7:4];
				  c[0]<=CY;c[1]<=CG;c[2]<=CR;
				  c[3]<=MY;c[4]<=MG;c[5]<=MR;			  
         end
	//跑板子,50MHZ-49999999
/*
		always @(posedge clk)
       begin 
		   cnt=cnt+1;
         if(cnt>49999999) begin clk1=1'b1;  cnt=0;  end
         else clk1=1'b0;  
		        gw<=tim[3:0];
		        sw<=tim[7:4];
				  c[0]<=CY;c[1]<=CG;c[2]<=CR;
				  c[3]<=MY;c[4]<=MG;c[5]<=MR;			  
         end
*/	
	//CS状态选择
	always@(cs)
	    case(cs)
	      s0:if(tim=='b0&&s=='b1) next_state<=s1; else next_state<=s0;
	      s1:if(tim=='b0) next_state <=s2; else next_state<=s1;
	      s2:if(tim=='b0||s==0) next_state<=s3; else next_state<=s2;
	      s3:if(tim=='b0) next_state<=s0; else next_state<=s3;
	      default: next_state<=s0;
	    endcase
	//复位	 
	 always@(posedge clk1 or negedge rst)
	    begin
		   if(!rst)
			  cs<=s0;
			else 
			  cs<=next_state;
		 end
	//cs-->此时状态	 
	 always@(negedge clk1)
	    case(cs)
		   s0:begin MY<='b0;MG<='b1;MR<='b0;CG<='b0;CY<='b0;CR<='b1;end		//主绿乡红
			s1:begin MY<='b1;MG<='b0;MR<='b0;CG<='b1;CY<='b0;CR<='b0;end		//主黄乡绿
			s2:begin MY<='b0;MG<='b0;MR<='b1;CG<='b1;CY<='b0;CR<='b0;end		//主红乡绿
			s3:begin MY<='b0;MG<='b0;MR<='b1;CG<='b0;CY<='b1;CR<='b0;end		//主红乡黄
			default:begin MY<='b0;MG<='b1;MR<='b1;CG<='b0;CY<='b0;CR<='b0;end
	    endcase
	//判断	 
    always@(negedge clk1,negedge rst)
        if(!rst)
	       begin timMG<=8'b01011001;timCG<=8'b00011001;timY<=8'b00000011; end	//89,25,3
		  else 
		    begin 
		      case(cs)
		        'b00:begin
				         if(timMG>0)
							  begin 
							    begin if(timMG[3:0]==0) timMG<=timMG-7;
								       else timMG<=timMG-1;
								 end 
								 tim<=timMG;
							  end 
							 else begin tim<=0;timMG<=8'b01011001;
						 end 
						 end 
				  'b01:begin
				         if(timY>0)
							  begin 
							    begin if(timY[3:0]==0) timY<=timY-7;
								       else timY<=timY-1;
								 end 
								 tim<=timY;
							  end 
							 else begin tim<=0;timY<=8'b00000011;
						 end 
						 end 
			     'b10:begin
				         if(timCG>0)
							  begin 
							    begin if(timCG[3:0]==0) timCG<=timCG-7;
								       else timCG<=timCG-1;
								 end 
								 tim<=timCG;
							  end 
							 else begin tim<=0;timCG<=8'b00011001;
						 end 
						 end 
			  	  'b11:begin
				         if(timY>0)
							  begin 
							    begin if(timY[3:0]==0) timY<=timY-7;
								       else timY<=timY-1;
								 end 
								 tim<=timY;;
							  end 
							 else begin tim<=0;timY<=8'b00000011;
						 end 
						 end 
					default:begin 
					          timMG<=8'b01011001;timCG<=8'b00011001;
								 timY<=8'b00000011;tim<=0;
							  end
					endcase 
				end 
 	//数码管显示
    always@(posedge clk1)
       begin 
			case(gw)
			   0:SG0<=7'b1000000; 1:SG0<=7'b1111001;
            2:SG0<=7'b0100100; 3:SG0<=7'b0110000;
            4:SG0<=7'b0011001; 5:SG0<=7'b0010010;
            6:SG0<=7'b0000010; 7:SG0<=7'b1111000;
            8:SG0<=7'b0000000; 9:SG0<=7'b0010000; //7段译码值
			endcase
			case(sw)
			   0:SG1<=7'b1000000; 1:SG1<=7'b1111001;
            2:SG1<=7'b0100100; 3:SG1<=7'b0110000;
            4:SG1<=7'b0011001; 5:SG1<=7'b0010010;
            6:SG1<=7'b0000010; 7:SG1<=7'b1111000;
            8:SG1<=7'b0000000; 9:SG1<=7'b0010000; //7段译码值
			endcase 	
		 end 
endmodule

(四)管脚分配
Input
Clk AF14 S AC12
Rst AB12
Output
MG,CR,MY,MR,CG,CY led9-led4
SG0,SG1; 数码管1-0

本文章已经生成可运行项目
【摘要】 EDA技术是以大规模可编程逻辑器件为设计载体,通过硬件描述语言输入给相应开发软件,经过编译和仿真最终下载到设计载体中,从而完成系统电路设计任务的一门新技术。在今后的电子产品研究开发中,EDA技术具有更好的开发手段和性价比,拥有广泛的市场应用前景 。本论文就是应用EDA技术来实现交通灯控制器的设计。 【关键词】 交通灯 VHDL 控制 设计一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制器,具体要求如下: (1) 主、支干道各设有一个绿、黄、红指示灯,两个显示数码。 (2) 主干道处于常允许通行状态,而支干道有车来才允许通行。 (3) 当主、支道均有车时,两者交替允许通行,主干道每次放行45 s,支干道每次放行25 s,在每次由亮绿灯变成亮红灯的转换过程中,要亮5 s的黄灯作为过渡,并进行减计时显示。 设计方案 交通控制器拟由单片的CPLD/FPGA来实现,经分析设计要求,拟定整个系统由9个单元电路组成。其中U1为交通灯控制器JTDKZ,它根据主,支干道传感器信号SM,SB以及时钟信号CLK,发出主,支干道指示灯的控制信号,同时向各定时单元,显示控制单元,发出使能控制信号EN1,EN2,EN3和EN4;U2,U3和U4为45S,5S,25S定时单元CNT45S,CNT05S,CNT25S;根据SM,SB,CLK及JTDKZ发出的有关使能控制信号EN1,EN2,EN3和EN4,按要求进行定时,并将其输出传送至显示控制单元;U5为显示控制单元XSKZ;根据JTSDKZ发出的有关使能控制信号EN1,EN2,EN3和EN4选择定时单元CNT45S, ,CNT05S,CNT25S的输出传送到各显示译码器YMQ:他将显示控制单元XSKZ的输出作为输入进行译码,并向有关数码显示管发出显示控制
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值