FPGA交通灯实战:用Verilog在Quartus里实现可调时序的十字路口控制(附仿真代码)
十字路口交通信号控制是数字电路设计的经典案例,也是FPGA初学者掌握状态机设计的绝佳实践项目。本文将带你从零开始,用Verilog HDL在Quartus Prime开发环境中实现一个具备可调时序参数的交通灯控制器,并通过ModelSim完成功能验证。
1. 项目需求分析与设计思路
现代交通灯控制系统需要满足三个核心需求:安全性、灵活性和可扩展性。我们的设计将围绕这三点展开:
- 基础功能:东西方向绿灯30秒+黄灯2秒,南北方向红灯32秒;随后切换为南北方向绿灯30秒+黄灯2秒,东西方向红灯32秒
- 扩展功能:各方向红绿灯时间可通过参数灵活配置
- 特殊状态:紧急情况下可手动切换为全方向黄灯闪烁模式
1.1 状态机设计
采用Moore型有限状态机(FSM)作为控制核心,定义四个状态:
parameter S_EW_GREEN = 2'b00; // 东西绿灯,南北红灯
parameter S_EW_YELLOW = 2'b01; // 东西黄灯,南北红灯
parameter S_NS_GREEN = 2'b10; // 南北绿灯,东西红灯
parameter S_NS_YELLOW = 2'b11; // 南北黄灯,东西红灯
状态转移图如下:
+---------------+
| |
v |
S_EW_GREEN -> S_EW_YELLOW
^ |
| v
S_NS_YELLOW <- S_NS_GREEN
1.2 模块划分
系统由五个核心模块构成:
- 时钟分频模块:将板载高频时钟分频为1Hz基准信号
- 状态控制模块:实现状态机及定时逻辑
- 灯控输出模块:根据状态生成灯控信号
- 倒计时显示模块:驱动数码管显示剩余时间
- 参数配置模块:存储可调时间参数
2. Verilog实现详解
2.1 顶层模块设计
module traffic_light(
input clk, // 板载时钟(如50MHz)
input reset_n, // 复位信号(低有效)
input emergency, // 紧急模式开关
output reg [2:0] ew_light, // 东西方向灯控[红,黄,绿]
output reg [2:0] ns_light, // 南北方向灯控[红,黄,绿]
output [6:0] seg, // 七段数码管段选
output [3:0] an // 数码管位选
);
// 参数化设计,便于修改时序
parameter EW_GREEN_TIME = 30; // 东西绿灯时间
parameter EW_YELLOW_TIME = 2; // 东西黄灯时间
parameter NS_GREEN_TIME = 30; // 南北绿灯时间
parameter NS_YELLOW_TIME = 2; // 南北黄灯时间
wire clk_1Hz; // 1Hz时钟信号
wire [5:0] count_val; // 当前倒

1万+

被折叠的 条评论
为什么被折叠?



