Quartus II 21.1 交通灯状态机设计:4状态转换与60s/20s计时器实现
📅 2026/7/11 10:08:08
👁️ 阅读次数
📝 编程学习
Quartus II 21.1 交通灯状态机设计:四状态转换与动态计时器实现
十字路口的交通信号控制是数字逻辑设计的经典案例。本文将基于Quartus II 21.1开发环境,使用Verilog HDL实现一个具备车辆感应功能的智能交通灯控制器。该系统采用有限状态机(FSM)架构,包含四个核心状态,并集成60秒/20秒可配置计时器,能够根据实时交通需求动态调整信号时序。
1. 系统架构与设计原理
现代交通灯控制系统需要平衡通行效率与安全性。我们的设计采用分层架构:
- 控制层:四状态有限状态机(MGCR, MYCR, MRCG, MRCY)
- 时序层:可配置的倒计时模块(主干道60秒/支路20秒)
- 感应层:车辆检测传感器信号处理
- 显示层:LED信号灯与数码管倒计时显示
module traffic_controller( input clk, // 50MHz系统时钟 input rst_n, // 低电平复位 input sensor_s, // 支路车辆检测信号 output reg [5:0] lights, // [MG,MY,MR,CG,CY,CR] output [7:0] display // 数码管倒计时显示 );状态转移逻辑遵循以下规则:
- 默认状态MGCR(主干道绿灯,支路红灯)
- 当sensor_s激活且主干道通行≥60秒,转入MYCR状态(黄灯过渡)
- 无论sensor_s是否持续,MRCG状态最长维持20秒
- 退出MRCG状态后进入MRCY状态(黄灯过渡)
2. 四状态机详细实现
2.1 状态编码与定义
采用独热码(one-hot)编码方案,提高状态机的可读性和可靠性:
localparam [3:0] MGCR = 4'b0001, // 主绿乡红 MYCR = 4'b0010, // 主黄乡红 MRCG = 4'b0100, // 主红乡绿 MRCY = 4'b1000; // 主红乡黄 reg [3:0] current_state, next_state;2.2 状态转移条件
状态转移由组合逻辑实现,关键转移条件如下表所示:
| 当前状态 | 转移条件 | 下一状态 |
|---|---|---|
| MGCR | sensor_s & timer≥60s | MYCR |
| MYCR | 黄灯计时结束(4s) | MRCG |
| MRCG | timer≥20s | ~sensor_s | MRCY |
| MRCY | 黄灯计时结束(4s) | MGCR |
对应的Verilog实现:
always @(*) begin case(current_state) MGCR: next_state = (sensor_s && main_timer >= 60) ? MYCR : MGCR; MYCR: next_state = (yellow_timer == 0) ? MRCG : MYCR; MRCG: next_state = (sub_timer >= 20 || !sensor_s) ? MRCY : MRCG; MRCY: next_state = (yellow_timer == 0) ? MGCR : MRCY; default: next_state = MGCR; endcase end3. 可配置计时器模块
3.1 计时器架构设计
系统包含三个独立计时器:
- 主干道计时器(60秒可调)
- 支路计时器(20秒可调)
- 黄灯计时器(固定4秒)
reg [7:0] main_timer; // 主干道计时 0-255秒 reg [7:0] sub_timer; // 支路计时 0-255秒 reg [3:0] yellow_timer; // 黄灯计时 0-15秒3.2 计时器控制逻辑
每个时钟周期递减计时器,并在状态切换时重置:
always @(posedge clk or negedge rst_n) begin if(!rst_n) begin main_timer <= 8'd60; sub_timer <= 8'd20; yellow_timer <= 4'd4; end else begin case(current_state) MGCR: if(main_timer > 0) main_timer <= main_timer - 1; MYCR: if(yellow_timer > 0) yellow_timer <= yellow_timer - 1; MRCG: if(sub_timer > 0) sub_timer <= sub_timer - 1; MRCY: if(yellow_timer > 0) yellow_timer <= yellow_timer - 1; endcase // 状态切换时的计时器重置 if(current_state != next_state) begin case(next_state) MGCR: begin main_timer <= 8'd60; yellow_timer <= 4'd4; end MYCR: yellow_timer <= 4'd4; MRCG: begin sub_timer <= 8'd20; yellow_timer <= 4'd4; end MRCY: yellow_timer <= 4'd4; endcase end end end4. 车辆检测与响应机制
4.1 传感器信号处理
为避免噪声干扰,对传感器信号进行消抖处理:
reg [2:0] sensor_sync; always @(posedge clk) begin sensor_sync <= {sensor_sync[1:0], sensor_s}; end wire sensor_clean = (sensor_sync[2] & sensor_sync[1]);4.2 优先权控制逻辑
系统设置两种优先权模式:
- 时间优先:强制主干道最小通行60秒
- 需求优先:支路有车时最大通行20秒
reg priority_mode; // 0=时间优先,1=需求优先 // 在MRCG状态下的特殊处理 always @(posedge clk) begin if(current_state == MRCG) begin if(priority_mode && sensor_clean) sub_timer <= (sub_timer < 20) ? sub_timer + 1 : 20; end end5. 显示驱动与输出控制
5.1 信号灯输出编码
always @(*) begin case(current_state) MGCR: lights = 6'b100_001; // MG+CR MYCR: lights = 6'b010_001; // MY+CR MRCG: lights = 6'b001_100; // MR+CG MRCY: lights = 6'b001_010; // MR+CY default: lights = 6'b100_001; endcase end5.2 数码管倒计时显示
采用BCD编码驱动两位共阳极数码管:
wire [7:0] current_time = (current_state == MGCR || current_state == MYCR) ? main_timer : (current_state == MRCG || current_state == MRCY) ? sub_timer : 8'd0; segment_driver seg_disp( .clk(clk), .value(current_time), .display(display) );6. 仿真验证与调试技巧
6.1 Testbench设计要点
initial begin // 初始化 rst_n = 0; sensor_s = 0; #100 rst_n = 1; // 测试正常状态转换 #100000 sensor_s = 1; // 触发支路请求 #200000 sensor_s = 0; // 取消请求 // 测试最小通行时间 #100000 sensor_s = 1; #50000 sensor_s = 0; // 在60秒前取消 end6.2 常见问题排查
- 状态锁死:检查所有状态转移条件是否完备
- 计时异常:验证时钟分频是否正确
- 显示乱码:确认数码管译码逻辑
- 信号抖动:增加传感器消抖时间
调试提示:使用SignalTap II嵌入式逻辑分析仪实时抓取状态信号和计时器值,可以快速定位时序问题。
7. 硬件实现与优化
7.1 FPGA资源利用
设计在Cyclone V 5CSEMA5F31C6器件上的资源占用:
| 资源类型 | 使用量 | 总量 | 利用率 |
|---|---|---|---|
| 逻辑单元 | 320 | 32K | <1% |
| 寄存器 | 48 | 32K | <1% |
| 存储器比特 | 0 | 4M | 0% |
7.2 时序约束与优化
# Quartus II SDC约束示例 create_clock -name clk -period 20 [get_ports clk] set_input_delay -clock clk 5 [get_ports sensor_s] set_output_delay -clock clk 3 [get_ports lights[*]]通过上述设计,我们实现了一个响应灵敏、运行可靠的智能交通灯控制系统。该系统可根据实际交通流量动态调整信号配时,在保证主干道通行效率的同时,兼顾支路的通行需求。
编程学习
技术分享
实战经验