名称:Quartus交通灯控制器Verilog代码远程云端平台(文末获取)
软件:Quartus
语言:Verilog
代码功能:
设计要求
由一条主干道和一条支干道汇合成十字路口,在每个人口处设置红,绿、黄,左拐允许
四盏信号灯,红灯亮禁止通行,绿灯亮允许迪行,黄灯亮则给行驶中的车辆有时间停在禁行
线外,左拐灯亮允许车转向左拐弯。信号订丁变换次字为:主支干道交替通行,主干行亮5s黄灯让行驶中的车辆有时间停到共行线外,左拐应行15,亮5s黄灯,支30s,亮5s黄灯,左拐放行15s,亮5黄订、各计时电路为倒计时显示
本代码已在远程云端平台验证,远程云端平台如下,其他远程云端平台可以修改管脚适配:
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
源代码
扫描文章末尾的公众号二维码