名称:基于Basys2开发板的交通灯控制器verilog红绿灯倒计时(代码在文末下载)
软件:ISE
语言:Verilog
代码功能:
1、实现一个十字路口交通灯,每条路有红绿黄三色信号灯。
2、使用数码管显示倒计时。
3、可通过代码修改通行时间。
本代码的通行时间通过以下代码修改:
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在Basys2开发板验证,开发板如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
管脚约束
3. 程序编译
4. Testbench
5. 仿真图
整体仿真
代码中定义了主路红灯35秒,绿灯30秒,黄灯5秒
支路红灯35秒,绿灯30秒,黄灯5秒
仿真图对应如下,下图中用不同颜色标记了不同灯
分频模块仿真
红绿灯控制模块
倒计时控制模块
显示模块
部分代码展示:
/* 红->绿 绿->黄 黄->红 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'd1; parameter main_yellow_state=3'd2; parameter branch_green_state=3'd3; parameter branch_yellow_state=3'd4; //定义路口个灯持续时间,修改此处时间 //主路绿灯+主路黄灯=支路红灯时间 //支路绿灯+支路黄灯=主路红灯时间 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 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 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
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=280
阅读全文
1124