名称:交通灯控制器Basys3开发板红绿灯数码管倒计时verilog
软件:VIVADO
语言:Verilog
代码功能:
交通灯是一种交通设施,用于控制机动车、非机动车和行人的通行。交通灯通常设置在道路交叉口、人行横道等交通要道上,通过红、黄、绿三种颜色的交替闪烁来指挥交通,保证交通的秩序,防止交通事故的发生。红灯表示停止,绿灯表示通行,黄灯表示准备停止。交通灯的发明改变了城市交通的面貌,提高了交通效率,保障了行人和车辆的安全。
交通灯控制器
实现一个十字路口交通灯,每条路有红绿黄三色信号灯,使用数码管显示倒计时。
本代码可通过代码参数修改通行时间
本代码已在Basys3开发板验证,开发板如下,其他开发板可以修改管脚适配:
代码下载:交通灯控制器Basys3开发板红绿灯数码管倒计时verilog
工程文件
程序文件
RTL图
管脚分配
testbench
仿真图
部分代码展示:
/* 红->绿 绿->黄 黄->红 1、红--计时main_red_times------------------------绿--计时main_green_times---main_yellow_times黄灯---------------红 2、绿--计时branch_green_times---branch_yellow_times黄灯--------------------红--计时branch_reg_times-------------------绿 */ //控制模块 module led( input clk_1Hz, input [7:0] main_green_time, input [7:0] main_yellow_time, input [7:0] branch_green_time, input [7:0] branch_yellow_time, output reg main_red,//主路灯 output reg main_green,// output reg main_yellow,// output reg branch_red,//支路灯 output reg branch_green,// output reg branch_yellow, output reg [7:0] main_green_BCD, output reg [7:0] main_yellow_BCD, output reg [7:0] main_red_BCD, output reg [7:0] branch_green_BCD, output reg [7:0] branch_yellow_BCD, output reg [7:0] branch_red_BCD ); // parameter main_green_state=3'd0;//红绿 parameter main_yellow_state=3'd1;//红黄 parameter main_red_state=3'd2;//红红 parameter branch_green_state=3'd3;//绿红 parameter branch_yellow_state=3'd4;//黄红 parameter branch_red_state=3'd5;//红红 //定义路口个灯持续时间,修改此处时间 //主路绿灯+主路黄灯=支路红灯时间 //支路绿灯+支路黄灯=主路红灯时间 reg [2:0] state=3'd0; reg [7:0] main_green_cnt=8'd1; reg [7:0] main_yellow_cnt=8'd1; reg [7:0] branch_green_cnt=8'd1; reg [7:0] branch_yellow_cnt=8'd1; //主路绿灯+主路黄灯=支路红灯时间 //支路绿灯+支路黄灯=主路红灯时间 always@(posedge clk_1Hz) case(state) main_green_state://红绿 if(main_green_cnt<main_green_time) begin//主路绿灯 state<=main_green_state; main_green_cnt<=main_green_cnt+'d1; end else begin state<=main_yellow_state;//计数到后到下一状态 main_green_cnt<='d1; end main_yellow_state://红黄 if(main_yellow_cnt<main_yellow_time) begin//主路黄灯 state<=main_yellow_state; main_yellow_cnt<=main_yellow_cnt+'d1; end else begin state<=branch_green_state;//计数到后到下一状态 main_yellow_cnt<='d1; end main_red_state://红红 state<=branch_green_state; branch_green_state://绿红 if(branch_green_cnt<branch_green_time) begin//支路绿灯 state<=branch_green_state; branch_green_cnt<=branch_green_cnt+'d1; end else begin state<=branch_yellow_state;//计数到后到下一状态 branch_green_cnt<='d1; end branch_yellow_state://黄红 if(branch_yellow_cnt<branch_yellow_time) begin//支路3s黄灯 state<=branch_yellow_state; branch_yellow_cnt<=branch_yellow_cnt+'d1; end else begin state<=main_green_state;//计数到后到下一状态 branch_yellow_cnt<='d1; end branch_red_state://红红 state<=main_green_state ; default:state<=main_green_state; endcase //交通灯状态控制,state为相应状态时亮相应灯 always@(posedge clk_1Hz ) begin if(state==main_green_state) main_green<=1; else main_green<=0; if(state==main_yellow_state ) main_yellow<=1; else main_yellow<=0; if(state==branch_green_state | state==branch_yellow_state) main_red<=1; else main_red<=0; end //交通灯状态控制,state为相应状态时亮相应灯 always@(posedge clk_1Hz ) begin if(state==branch_green_state) branch_green<=1; else branch_green<=0; if(state==branch_yellow_state ) branch_yellow<=1; else branch_yellow<=0; if(state==main_green_state | state==main_yellow_state) branch_red<=1; else branch_red<=0; end //计数 //主路绿灯+主路黄灯=支路红灯时间 //支路绿灯+支路黄灯=主路红灯时间 //采用BCD码计数 always@(posedge clk_1Hz )// begin if(state==branch_green_state) main_red_BCD<=branch_green_cnt; else if(state==branch_yellow_state) main_red_BCD<=branch_yellow_cnt+branch_green_time;//支路绿灯+支路黄灯=主路红灯时间 else main_red_BCD<='d0; if(state==main_green_state) branch_red_BCD<=main_green_cnt; else if(state==main_yellow_state) branch_red_BCD<=main_yellow_cnt+main_green_time;//主路绿灯+主路黄灯=支路红灯时间 else branch_red_BCD<='d0; main_green_BCD<=main_green_cnt; main_yellow_BCD<=main_yellow_cnt; branch_green_BCD<=branch_green_cnt; branch_yellow_BCD<=branch_yellow_cnt; end endmodule