Quartus交通灯控制器Verilog代码远程云端验证

名称:Quartus交通灯控制器Verilog代码远程云端平台(文末获取)

软件:Quartus

语言:Verilog

代码功能:

设计要求

由一条主干道和一条支干道汇合成十字路口,在每个人口处设置红,绿、黄,左拐允许

四盏信号灯,红灯亮禁止通行,绿灯亮允许迪行,黄灯亮则给行驶中的车辆有时间停在禁行

线外,左拐灯亮允许车转向左拐弯。信号订丁变换次字为:主支干道交替通行,主干行亮5s黄灯让行驶中的车辆有时间停到共行线外,左拐应行15,亮5s黄灯,支30s,亮5s黄灯,左拐放行15s,亮5黄订、各计时电路为倒计时显示

本代码已在远程云端平台验证,远程云端平台如下,其他远程云端平台可以修改管脚适配:

远程平台照片.png

1. 工程文件

2. 程序文件

3. 程序编译

4. 管脚分配

5. 仿真图

分频模块

控制模块

显示模块

部分代码展示:

//状态机控制模块
module state_machine(
input clk_1Hz,//1Hz
input key,//复位
output reg main_red,//主干道红灯
output reg main_green,//主干道绿灯
output reg main_yellow,//主干道黄灯
output reg main_left,//主干道左转灯
output reg branch_red,//支干道红灯
output reg branch_green,//支干道绿灯
output reg branch_yellow,//支干道黄灯
output reg branch_left,//支干道左转灯
output reg [7:0] main_cnt,//主路倒计时
output reg [7:0] branch_cnt//支路倒计时
);
//状态机控制模块
reg [3:0] state=4'd0;
//定义5个状态
parameter S0=4'd0;
parameter S1=4'd1;
parameter S2=4'd2;
parameter S3=4'd3;
parameter S4=4'd4;
parameter S5=4'd5;
parameter S6=4'd6;
parameter S7=4'd7;
parameter S8=4'd8;
reg [7:0] count_S0=8'd0;//定义计数器
reg [7:0] count_S1=8'd0;//定义计数器
reg [7:0] count_S2=8'd0;//定义计数器
reg [7:0] count_S3=8'd0;//定义计数器
reg [7:0] count_S4=8'd0;//定义计数器
reg [7:0] count_S5=8'd0;//定义计数器
reg [7:0] count_S6=8'd0;//定义计数器
reg [7:0] count_S7=8'd0;//定义计数器
wire [7:0] main_red_time;//主干道红灯
wire [7:0] main_green_time;//主干道绿灯
wire [7:0] main_yellow_time;//主干道黄灯
wire [7:0] main_left_time;//主干道左转灯
wire [7:0] branch_red_time;//主干道红灯
wire [7:0] branch_green_time;//主干道绿灯
wire [7:0] branch_yellow_time;//主干道黄灯
wire [7:0] branch_left_time;//主干道左转灯
assign main_red_time=8'd55;//主干道红灯
assign main_green_time=8'd40;//主干道绿灯
assign main_yellow_time=8'd5;//主干道黄灯
assign main_left_time=8'd15;//主干道左转灯
assign branch_red_time=8'd65;//支干道红灯
assign branch_green_time=8'd30;//支干道绿灯
assign branch_yellow_time=8'd5;//支干道黄灯
assign branch_left_time=8'd15;//支干道左转灯
//状态机控制
always@(posedge clk_1Hz or posedge key)
if(key==1)
state<=S8;//复位
else
case(state)
S8:
state<=S0;
S0://主干道绿灯
if(count_S0>=main_green_time-1)//40s
state<=S1;
else
state<=S0;
S1://主干道黄灯
if(count_S1>=main_yellow_time-1)//5s
state<=S2;
else
state<=S1;
S2://主干道左转灯
if(count_S2>=main_left_time-1)//15s
state<=S3;
else
state<=S2;
S3://主干道黄灯
if(count_S3>=main_yellow_time-1)//5s
state<=S4;
else
state<=S3;
S4://支干道绿灯
if(count_S4>=branch_green_time-1)//30s
state<=S5;
else
state<=S4;
S5://支干道黄灯
if(count_S5>=branch_yellow_time-1)//5s
state<=S6;
else
state<=S5;
S6://支干道左转灯
if(count_S6>=branch_left_time-1)//15s
state<=S7;
else
state<=S6;
S7://支干道黄灯
if(count_S7>=branch_yellow_time-1)//5s
state<=S0;
else
state<=S7;
default:;
endcase
//主干道绿灯计时
always@(posedge clk_1Hz)
if(state==S0)
count_S0<=count_S0+1;//计时
else
count_S0<=8'd0;
//主干道黄灯计时
always@(posedge clk_1Hz)
if(state==S1)
count_S1<=count_S1+1;//计时
else
count_S1<=8'd0;
//主干道左转灯计时
always@(posedge clk_1Hz)
if(state==S2)
count_S2<=count_S2+1;//计时
else
count_S2<=8'd0;
//主干道黄灯计时
always@(posedge clk_1Hz)
if(state==S3)
count_S3<=count_S3+1;//计时
else
count_S3<=8'd0;
//支干道绿灯计时
always@(posedge clk_1Hz)
if(state==S4)
count_S4<=count_S4+1;//计时
else
count_S4<=8'd0;
//支干道黄灯计时
always@(posedge clk_1Hz)
if(state==S5) 
count_S5<=count_S5+1;//计时
else
count_S5<=8'd0;
//支干道左转灯计时
always@(posedge clk_1Hz)
if(state==S6)
count_S6<=count_S6+1;//计时
else
count_S6<=8'd0;
//支干道黄灯计时
always@(posedge clk_1Hz)
if(state==S7)
count_S7<=count_S7+1;//计时
else
count_S7<=8'd0;
//控制红绿灯
always@(posedge clk_1Hz)
case(state)
S0://主干道绿灯
begin
main_red<=0;
main_green<=1;
main_yellow<=0;
main_left<=0;
branch_red<=1;
branch_green<=0;
branch_yellow<=0;
branch_left<=0;
end
S1://主干道黄灯
begin
main_red<=0;
main_green<=0;
main_yellow<=1;
main_left<=0;
branch_red<=1;
branch_green<=0;
branch_yellow<=0;
branch_left<=0;
end
S2://主干道左转灯
begin
main_red<=0;
main_green<=0;
main_yellow<=0;
main_left<=1;
branch_red<=1;
branch_green<=0;
branch_yellow<=0;
branch_left<=0;
end
S3://主干道黄灯
begin
main_red<=0;
main_green<=0;
main_yellow<=1;
main_left<=0;
branch_red<=1;
branch_green<=0;
branch_yellow<=0;
branch_left<=0;
end
S4://支干道绿灯
begin
main_red<=1;
main_green<=0;
main_yellow<=0;
main_left<=0;
branch_red<=0;
branch_green<=1;
branch_yellow<=0;
branch_left<=0;
end
S5://支干道黄灯
begin
main_red<=1;
main_green<=0;
main_yellow<=0;
main_left<=0;
branch_red<=0;
branch_green<=0;
branch_yellow<=1;
branch_left<=0;
end
S6://支干道左转灯
begin
main_red<=1;
main_green<=0;
main_yellow<=0;
main_left<=0;
branch_red<=0;
branch_green<=0;
branch_yellow<=0;
branch_left<=1;
end
S7://支干道黄灯
begin
main_red<=1;
main_green<=0;
main_yellow<=0;
main_left<=0;
branch_red<=0;
branch_green<=0;
branch_yellow<=1;
branch_left<=0;
end
S8://复位
begin
main_red<=1;
main_green<=0;
main_yellow<=0;
main_left<=0;
branch_red<=1;
branch_green<=0;
branch_yellow<=0;
branch_left<=0;
end
default:;
endcase
//倒计时控制
always@(posedge clk_1Hz)
if(state==S0)begin//主干道绿灯
main_cnt=main_green_time-count_S0;
branch_cnt=branch_red_time-count_S0;
end
else if(state==S1)begin//主干道黄灯
main_cnt=main_yellow_time-count_S1;
branch_cnt=branch_red_time-(main_green_time+count_S1);
end
else if(state==S2)begin//主干道左转灯
main_cnt=main_left_time-count_S2;
branch_cnt=branch_red_time-(main_green_time+main_yellow_time+count_S2);
end
else if(state==S3)begin//主干道黄灯
main_cnt=main_yellow_time-count_S3;
branch_cnt=branch_red_time-(main_green_time+main_yellow_time+main_left_time+count_S3);
end
else if(state==S4)begin//支干道绿灯
branch_cnt=branch_green_time-count_S4;
main_cnt=main_red_time-count_S4;
end
else if(state==S5)begin//支干道黄灯
branch_cnt=branch_yellow_time-count_S5;
main_cnt=main_red_time-(branch_green_time+count_S5);
end
else if(state==S6)begin//支干道左转灯
branch_cnt=branch_left_time-count_S6;
main_cnt=main_red_time-(branch_green_time+branch_yellow_time+count_S6);
end
else if(state==S7)begin//支干道黄灯
branch_cnt=branch_yellow_time-count_S7;
main_cnt=main_red_time-(branch_green_time+branch_yellow_time+branch_left_time+count_S7);
end
else begin
branch_cnt=8'd88;
main_cnt=8'd88;
end
endmodule
源代码

 扫描文章末尾的公众号二维码

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值