交通灯的基本工作状态:
① (主干道)绿灯:车辆前行;
② (次干道)红灯:禁止通行;
③ (主干道)黄灯:过渡状态;
④ (主干道)红灯:禁止车辆通行;
⑤ (次干道)绿灯:车辆前行。
注:红黄绿等均为前行方向的信号指示灯。
设计任务:
1、说明设计具体思路。
2、画出系统模块框图。
3、画出系统顶层原理图。
4、按设计技术要求编写程序。
5、画出系统功能仿真波形图。
设计代码
module jiaotong(input clk,reset,
input [4:0] C_AG,C_AY,C_BG,//设置各种灯的时间
output wire[7:0] CA,CB,//用bcd码做两位十进制
output reg AG=0,AY=0,AR=0,BG=0,BR=0 //指示灯
);
reg[4:0] state1;
reg[4:0] state2;
reg [5:0] CP_A,CP_B;
localparam s0='d0,s1='d1,s2='d2,s3='d3,s4='d4,s5='d5;
always@(posedge clk ) //主干道
begin if(reset) begin state1<=s0;end
else
casex(state1)
s0:begin
state1<=s1;CP_A<= C_AG;AG<=1;
end
s1: begin //做绿灯的倒计时
if(CP_A !=0) begin CP_A<=CP_A-1;state1<=s1;end
else begin state1<=s2;CP_A<=C_AY;AG<=0;AY<=1;end
end
s2: begin //做黄灯的倒计时
if(CP_A!=0) begin CP_A<=CP_A-1;state1<=s2;end
else begin state1<=s3; CP_A<=(C_BG);AY<=0;AR<=1;end
end
// s3: begin //做左拐的倒计时
// if(CP_A!=0) begin CP_A<=CP_A-1;state1<=s3;end
// else begin state1<=s4;CP_A<=C_AY;AL<=0;AY<=1;end
// end
// s4: begin //做黄灯的倒计时
// if(CP_A!=0) begin CP_A<=CP_A-1;state1<=s4;end
// else begin state1<=s5;CP_A<=(C_BG+C_BY+C_BL+C_BY+3);AY<=0;AR<=1;end
// end
s3:begin //做红灯的倒计时
if(CP_A!=0) begin CP_A<=CP_A-1;state1<=s3;end
else begin state1<=s1;CP_A<=C_AG;AR<=0;AG<=1;end
end
default state1<=s0;
endcase
end
always@(posedge clk ) //小路
begin if(reset) begin state2 <=s0;end
else
casex(state2)
s0:begin
CP_B<=(C_AG+C_AY+1);BR<=1;state2<=s1;
end
s1: begin //做红灯的倒计时
if(CP_B!=0) begin CP_B<=CP_B-1;state2<=s1;end
else begin state2<=s2;CP_B<=C_BG;BR<=0;BG<=1;end
end
s2: begin //做绿灯的倒计时
if(CP_B!=0) begin CP_B<=CP_B-1;state2<=s2;end
else begin state2<=s1; CP_B<=(C_AG+C_AY+1);BG<=0;BR<=1;end
end
// s3: begin //做黄灯的倒计时
// if(CP_B!=0) begin CP_B<=CP_B-1;state2<=s3;end
// else begin state2<=s4;CP_B<=C_BL;BY<=0;BL<=1;end
// end
// s4: begin //做左拐的倒计时
// if(CP_B!=0) begin CP_B<=CP_B-1;state2<=s4;end
// else begin state2<=s5;CP_B<=C_BY;BL<=0;BY<=1; end
// end
// s5:begin //做黄灯的倒计时
// if(CP_B!=0) begin CP_B<=CP_B-1;state2<=s5;end
// else begin state2<=s1;CP_B<=(C_AG+2*C_AY+C_AL+3);BY<=0;end
// end
default state2<=s0;
endcase
end
assign CA[3:0]=(CP_A%10);assign CB[3:0]=(CP_B%10);
assign CA[7:4]=(CP_A/ 10);assign CB[7:4]=(CP_B/10);
endmodule
仿真代码
module text5();
reg clk,reset;
reg [4:0] C_AG=0,C_AY=0,C_BG=0;
wire [7:0] CA,CB;
wire AG,AY,AR,BG,BR;
parameter DELAY =20;
jiaotong il(
.reset(reset), //端口的对应
.clk(clk),.C_AG(C_AG), .C_AY(C_AY),
.C_BG(C_BG), .CA(CA),
.CB(CB),.AG(AG), .AY(AY), .AR(AR),
.BG(BG), .BR(BR)
);
initial begin
clk=1;reset=1; //初始化
#(DELAY) reset=0; //复位
C_AG=5'd15;C_AY=5'd7; //设置各个倒计时时间
C_BG=5'd12;
#(DELAY*500);
end
always begin
#(DELAY/2) clk=~clk; //时钟周期为20
end
endmodule
仿真图样
框图