实验五 十字路口交通灯控制器的综合设计1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五十字路口交通灯控制器的综合设计
一、设计任务
1、对十字路口交通灯控制器的综合设计,进行仿真验证,并画出十字路口交通灯控制器电路设计的仿真波形;
2、对十字路口交通灯控制器的综合设计,进行硬件验证。
具体设计:设计一个能够对十字路口交通灯进行红、绿、黄灯控制的电路,并通过数码管显示倒计时时间。
①按照A、B两个方向循环显示:
(1)A方向先显示绿灯25秒(B方向现红灯);
(2)A方向显示黄灯5秒(B方向现红灯);
(3)B方向显示绿灯25秒(A方向现红灯);
(4)B方向显示黄灯5秒(A方向现红灯)。
②按reset键可以使系统回到①状态。
③能够在动态数码管上进行倒计时显示。
注意一个方向的红灯时间应和另外一个方向的绿黄灯时间总和相等。
二、整体设计
1.原理框图
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东西方向为主干道方向(A方向),根据交通灯的亮的规则,在初始状态下四个方向的都没有灯亮起,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续25s后,主干道上的黄灯亮启,持续5s,同时支干道继续亮红灯,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后支干道上的黄灯亮启5s,主干道仍为红灯,一个循环完成。
循环往复的直行这个过程。
其过程如下图所示:
绿灯25s 黄灯5s 红灯30s
主干道
红灯30s 绿灯25s 黄灯5s 支干道
其状态图如下:
2. 设计方案
本次采用文本编辑法,即利用Verilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED 模拟两个方向上的交通灯,用2个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
三、模块设计
1.设计程序
module traffic(clk,clk_scan,reset,seg,dig,pout);
input clk,clk_scan,reset;
output [7:0] seg;
output [7:0] dig;
output [5:0] pout; //交通灯两个方向红绿黄灯,共六个灯
reg[7:0] seg;//数码管段选通
reg [7:0] dig;//数码管位选通
reg [5:0] pout;
parameter s0=0,s1=1,s2=2,s3=3;
reg[2:0] ps,ns;//次态、现态
reg time_out_short;// 25秒溢出标志
reg time_out_longer;// 5秒溢出标志
reg [6:0]cnt30;//计时寄存器
reg [3:0]num; //四位BCD码
reg [6:0]numt; //七位BCD码
reg [1:0]count; //两位数码管动态扫描选通
always@( posedge clk or negedge reset)
begin
if (reset==0) begin ps<=s0;cnt30<=7'b0101001;end //为了译码显示,对于计数采用四位二进制数代表对应的一位十进制数29
else
case (ns)
s0: begin ps<=ns;numt<=cnt30;time_out_short<=0;
if (cnt30==5) begin time_out_longer <=1;cnt30<=7'b0000100; end// 4秒
else if(cnt30[3:0]>0) cnt30<=cnt30-1;
else begin cnt30[6:4]<=cnt30[6:4]-1;cnt30[3:0]<=4'b1001; end
end
s1:begin ps<=ns;numt<=cnt30; time_out_longer<=0;
if (cnt30==0) begin time_out_short <=1; cnt30<=7'b0101001; end
else cnt30<=cnt30-1;
end
s2:begin ps<=ns;numt<=cnt30;time_out_short<=0;
if (cnt30==5) begin time_out_longer <=1;cnt30<=7'b0000100; end// 4秒
else if(cnt30[3:0]>0) cnt30<=cnt30-1;
else begin cnt30[6:4]<=cnt30[6:4]-1;cnt30[3:0]<=4'b1001; end
end
s3:begin ps<=ns;numt<=cnt30; time_out_longer<=0;
if (cnt30==0) begin time_out_short <=1; cnt30<=7'b0101001; end
else cnt30<=cnt30-1;
end
default:ps<=s0;
endcase
end
always@(ps,time_out_short, time_out_longer) //主控组合进程:负责状态的转换及输出
begin
case (ps)
s0:begin pout<=6'b011011; //从高位到低位依次代表R方向的绿黄红、C方向的红黄绿,低电平有效
if (time_out_longer==1 ) ns<=s1;
else ns<=s0;
end
s1: begin pout<=6'b101011;
if (time_out_short==1 ) ns<=s2;
else ns<=s1;
end
s2: begin pout<=6'b110110;
if (time_out_longer==1 ) ns<=s3;
else ns<=s2;
end
s3:begin pout<=6'b110101;
if (time_out_short==1 ) ns<=s0;
else ns<=s3;
end
default:pout<=6'b000000;
endcase
end
always@(posedge clk_scan)
begin
if (count<1)
count<=count+1;
else count<=2'b00;
end
always@(count)
begin case(count)
0:begin dig=8'b11111110;num<=numt[3:0];end //选通位,同时将相应位显示的数据传给num
1:begin dig=8'b11111101;num<=numt[6:4];end //填写完整
default:dig=8'b11111111;
endcase
end
//pgfedcba
always@(num)
begin case(num)
4'h0:seg = 8'hc0; //显示0
4'h1:seg = 8'hf9; //显示1
4'h2:seg = 8'ha4; //显示2
4'h3:seg = 8'hb0; //显示3
4'h4:seg = 8'h99; //显示4
4'h5:seg = 8'h92; //显示5
4'h6:seg = 8'h82; //显示6
4'h7:seg = 8'hf8; //显示7
4'h8:seg = 8'h80; //显示8
4'h9:seg = 8'h90; //显示9
4'ha:seg = 8'h88; //显示a
4'hb:seg = 8'h83; //显示b
4'hc:seg = 8'hc6; //显示c
4'hd:seg = 8'ha1; //显示d
4'he:seg = 8'h86; //显示e
4'hf:seg = 8'h8e; //显示f
default:seg = 8'hc0;
endcase
end
endmodule
2.仿真波形
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。
设置仿真时间,时钟周期,输入输出端口,进行波形仿真。
具体仿真波形图及说明如下所示:
图形说明:
clk:此时钟信号是用于计时的,频率为1HZ。
clk_scan:用于数码管显示,为了数码管能同时显示两个数,频率设置为1024HZ dig:是位选信号,因为只需显示两个数码管,因此选择低两位的数码管,由于是低电频有效,所以dig变化只是在11111101与11111110之间,并且两种交错出现。
seg:段选信号,用于显示7段数码管。
reset:复位信号,只有当reset是高电平时电路正常工作,一旦reset变为低电平则复位,从(1)开始。
pout:是六位二进制数,用于表示红绿灯的显示情况。
四、结论
1.测试效果(A方向为上下方向)
A方向先显示绿灯25秒(B方向现红灯);A方向显示黄灯5秒(B方向现红灯);B方向显示绿灯25秒(A方向现红灯);B方向显示黄灯5秒(A方向现红灯)。
以此循环。
按下reset键,重新变回A方向显示绿灯(B方向红灯)。
2.实验总结
老师在进行操作之前先将程序为我们讲解了一遍,所以在做实验时我也就没有遇到什么难解决的问题。
进行波形仿真时,只要注重认真仔细,结果就会很理想。
在实验时,要根据所分析的系统的ASM图,结合系统的设计要求,在MAX 和PLUS II环境下进行元器件之间的连线和编译与仿真,及时检查元器件的放置、连线是否有错误。
程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行
查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
进行试验箱上的硬件调试过程时,该步骤主要是要求细心,按照引脚清单,逐一完成锁定。
为了保护芯片,一定要记得锁三态。
还有就是试验箱上的频率帽一定要插在对的地方,不然将导致实验现象不正确。
五、心得体会
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力。
某条语句漏掉或者错了都会影响实验进程,所以细心非常重要。
这次实验收获颇多,为以后的更深层次的学习奠定了基础。
这实验跟实际生活切近,因此我对这门课程也更感兴趣了,期待下一个实验。