1. 项目背景与核心价值
交通信号灯控制系统是数字电路设计的经典教学案例,也是FPGA入门的最佳练手项目之一。这个项目之所以值得深入探讨,是因为它完美融合了三个关键特性:首先,它具备明确的工程应用背景,不像某些纯理论实验那样抽象;其次,系统状态转换逻辑清晰,非常适合用硬件描述语言建模;最重要的是,通过优化设计确实可以实现极简的代码结构——正如标题所言,核心控制模块用Verilog实现仅需约100行代码。
我在实际教学中发现,许多初学者在接触FPGA时容易陷入两个极端:要么停留在理论仿真阶段,要么直接套用现成的IP核。这个项目的价值就在于它展示了如何从零开始构建一个完整的数字系统,包括状态机设计、时序控制、硬件映射等关键环节。下面我将拆解这个"极简实现"背后的设计哲学,并分享几个教科书上不会写的调试技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 状态机建模
交通信号灯本质上是一个有限状态机(FSM),典型的四相位控制包含以下状态:
- 南北方向绿灯 + 东西方向红灯
- 南北方向黄灯 + 东西方向红灯
- 东西方向绿灯 + 南北方向红灯
- 东西方向黄灯 + 南北方向红灯
在Verilog中,我用独热码(one-hot)编码这些状态,虽然会多占用一些触发器资源,但换来的是更清晰的状态转换逻辑和更低的组合逻辑复杂度。这是代码能保持简洁的关键设计选择之一。
verilog复制localparam S_NS_GREEN = 4'b0001;
localparam S_NS_YELLOW = 4'b0010;
localparam S_EW_GREEN = 4'b0100;
localparam S_EW_YELLOW = 4'b1000;
2.2 时序控制方案
每个状态的持续时间需要可配置。我采用一个32位计数器配合比较器实现,相比分频器方案更节省资源。例如,绿灯持续时间设置为25,000,000个时钟周期(对应500ms @50MHz):
verilog复制always @(posedge clk) begin
if (state_time_cnt == TIME_GREEN) begin
state_time_cnt <= 0;
// 状态转移逻辑...
end els
