1. 项目背景与核心价值
交通信号灯控制系统是数字电路设计的经典案例,也是FPGA初学者从理论走向实践的最佳练手项目。不同于单片机方案,基于FPGA的实现能真正锻炼硬件描述语言(HDL)的编程思维——你需要用并行的视角去描述电路行为,而非传统的顺序执行思维。
这个项目的独特之处在于同时使用VHDL和Verilog两种主流HDL语言实现相同功能。VHDL以严谨的类型系统著称,适合复杂状态机的规范描述;Verilog则因其类C的简洁语法更受工程师青睐。通过对比实现,你能深刻体会两种语言的编码风格差异,例如:
- VHDL需要严格定义实体(entity)和架构(architecture)
- Verilog的always块与VHDL的process语句对应但语法更紧凑
- 两种语言对信号赋值延迟的处理机制不同
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 交通灯状态机模型
典型的十字路口交通灯包含四个状态:
- 主干道绿灯,支路红灯(默认30秒)
- 主干道黄灯,支路红灯(过渡5秒)
- 主干道红灯,支路绿灯(次级20秒)
- 主干道红灯,支路黄灯(过渡5秒)
使用Moore型状态机建模最为合适,其输出仅取决于当前状态。在VHDL中可以用枚举类型定义状态:
vhdl复制type traffic_state is (MG_PR, MY_PR, MR_PG, MR_PY);
signal current_state : traffic_state := MG_PR;
Verilog版本则通常用参数化常量表示状态:
verilog复制parameter MG_PR = 2'b00, MY_PR = 2'b01, MR_PG = 2'b10, MR_PY = 2'b11;
reg [1:0] current_state = MG_PR;
2.2 时钟分频与计时模块
FPGA开发板通常提供50MHz主时钟,需要分频得到1Hz基准信号。两种语言实现差异明显:
VHDL分频器代码片段:
vhdl复制process(clk50M)
variable counter : integer range 0 to 24999999 := 0;
begin
if rising_edge(clk50M)
