基于FPGA的交通灯设计
摘要
本设计采用FPGA技术实现了一个智能交通灯控制系统。系统以Verilog HDL为设计语言,在FPGA平台上实现了交通灯的自动控制、数码管倒计时显示、紧急情况处理等功能。通过合理的状态机设计和模块化编程,系统具有良好的实时性、可靠性和可扩展性,能够有效管理十字路口的交通流量。
关键词:FPGA;交通灯;Verilog HDL;状态机;数码管显示
Abstract: This design implements an intelligent traffic light control system using FPGA technology. The system uses Verilog HDL as the design language and realizes automatic traffic light control, digital tube countdown display, emergency handling and other functions on the FPGA platform. Through reasonable state machine design and modular programming, the system has good real-time performance, reliability and scalability, and can effectively manage traffic flow at intersections.
Keywords: FPGA; Traffic Light; Verilog HDL; State Machine; Digital Display
- FPGA交通灯设计-vivado2018.3工程
工程代码也可以私信获取,本人工程基于vivado2018.3设计。
目录
- 设计目标与要求
- 1.1 设计目的
- 1.2 功能要求
- 方案论证与选择
- 2.1 系统方案
- 2.2 设计思路
- 系统设计
- 3.1 系统总体框图
- 3.2 各模块功能
- 3.3 状态转换图
- 3.4 源程序
- 3.5 管脚锁定
- 3.6 仿真波形
- 3.7 元器件清单
- 测试验证与实物展示
- 4.1 测试验证
- 4.2 实物展示
- 总结与心得体会
1. 设计目标与要求
1.1 设计目的
随着城市化进程的加快和汽车保有量的急剧增长,城市交通拥堵问题日益严重。智能交通灯控制系统作为城市交通管理的重要组成部分,对缓解交通压力、提高道路通行效率具有重要意义。
FPGA(现场可编程门阵列)作为一种可重构的数字电路平台,具有并行处理能力强、响应速度快、可靠性高等优点,非常适合用于实时性要求较高的交通控制系统。本设计基于FPGA平台,采用Verilog HDL硬件描述语言,设计并实现了一套完整的智能交通灯控制系统。
1.2 功能要求
本交通灯控制系统需要实现以下功能要求:
基本功能要求:
-
交通灯控制:实现标准的四相位交通灯控制逻辑
- 东西方向:绿灯16秒 → 黄灯4秒 → 红灯20秒
- 南北方向:红灯20秒 → 绿灯16秒 → 黄灯4秒
- 循环执行上述时序
-
数码管显示:提供实时的倒计时显示功能
- 通过8位数码管显示各方向剩余通行时间
- 显示格式:东西方向时间 | 南北方向时间
-
紧急处理:支持紧急情况处理
- 当检测到紧急按键时,立即切换到紧急状态
- 紧急状态下,所有方向显示红灯20秒
- 紧急状态结束后,恢复正常循环
-
系统复位:支持异步复位功能
- 确保系统能够可靠启动和重新初始化
性能要求:
- 系统响应时间:≤1ms
- 时间精度:±0.1秒
- 工作温度:-40℃~+85℃
- 可靠性:MTBF≥10000小时
2. 方案论证与选择
2.1 系统方案
方案一:基于单片机的控制方案
优点:
- 成本较低
- 开发工具成熟
- 程序设计相对简单
缺点:
- 响应速度较慢
- 实时性不够好
- 扩展性有限
- 抗干扰能力较弱
方案二:基于FPGA的控制方案(本设计采用)
优点:
- 响应速度快,实时性好
- 并行处理能力强
- 可重构性好,便于升级
- 抗干扰能力强
- 可靠性高
缺点:
- 成本相对较高
- 开发难度较大
方案三:基于PLC的控制方案
优点:
- 可靠性高
- 抗干扰能力强
- 编程简单
缺点:
- 成本高
- 体积大
- 响应速度一般
方案选择:综合考虑性能、成本和技术要求,本设计选择基于FPGA的控制方案。
2.2 设计思路
本设计采用模块化、层次化的设计思想:
- 顶层设计:采用自顶向下的设计方法,将系统分解为若干功能模块
- 状态机设计:使用有限状态机实现交通灯控制逻辑
- 时序设计:合理设计时钟域和时序约束
- 接口设计:标准化各模块间的接口
- 验证策略:采用仿真验证和硬件测试相结合的方法
3.1 系统总体框图
系统采用模块化设计思想,主要包括以下模块:
系统总体框图如上所示,主要包括:
- 时钟模块:提供系统时钟信号
- 复位模块:提供系统复位信号
- 交通灯逻辑控制模块:系统核心,实现状态机控制
- LED控制模块:控制交通灯LED显示
- 数码管显示模块:实现倒计时显示
- 按键输入模块:处理紧急按键输入
3.2 各模块功能
1. 顶层模块(jtd_test)
- 系统的顶层封装模块
- 负责各子模块的例化和信号连接
- 处理输入输出信号的分配和数据格式转换
2. 交通灯逻辑控制模块(jtd_logic)
- 系统的核心控制模块
- 实现交通灯状态机逻辑
- 处理时间计数和状态转换
- 响应紧急按键输入
- 输出当前状态和倒计时信息
3. LED控制模块(led_ctl)
- 负责控制交通灯LED的显示
- 根据当前状态输出相应的LED控制信号
- 支持12路LED输出(东西南北各3路)
4. 数码管显示模块(smg)
- 实现8位数码管的动态扫描显示
- 显示东西和南北方向的倒计时
- 支持位选和段选信号输出
3.3 状态转换图
系统采用四状态有限状态机实现交通灯控制逻辑:
- IDLE状态(5’b00001):东西绿灯,南北红灯(16秒)
- STAGE_1状态(5’b00010):东西黄灯,南北红灯(4秒)
- STAGE_2状态(5’b00100):东西红灯,南北绿灯(16秒)
- STAGE_3状态(5’b01000):东西红灯,南北黄灯(4秒)
- EMERGENT_LED状态(5’b10000):紧急状态,所有方向红灯(20秒)
状态转换条件:
- 正常状态按时间顺序循环转换:IDLE → STAGE_1 → STAGE_2 → STAGE_3 → IDLE
- 任何状态下检测到紧急按键都会跳转到紧急状态
- 紧急状态结束后返回IDLE状态重新开始循环
3.4 源程序
系统源程序采用Verilog HDL语言编写,主要包括以下文件:
1. 顶层模块(jtd_test.v)
module jtd_test(input clk, // 系统时钟input rst_n, // 异步复位信号input key, // 紧急按键output [7:0] sm_bit, // 数码管位选output [7:0] sm_seg, // 数码管段选output [11:0] led // LED控制信号
);// 内部信号定义
wire [4:0] c_state;
wire [5:0] time_second_cnt_dx, time_second_cnt_nb;
wire [3:0] ge1, shi1, ge0, shi0;// 例化交通灯逻辑控制模块
jtd_logic u_jtd_logic(.clk(clk),.rst_n(rst_n),.key(key),.c_state(c_state),.time_second_cnt_dx(time_second_cnt_dx),.time_second_cnt_nb(time_second_cnt_nb)
);// 例化LED控制模块
led_ctl u_led_ctl(.clk(clk),.rst_n(rst_n),.c_state(c_state),.led(led)
);// 数码管显示数据处理
assign ge1 = time_second_cnt_dx%10; // 东西方向个位
assign shi1 = time_second_cnt_dx/10; // 东西方向十位
assign ge0 = time_second_cnt_nb%10; // 南北方向个位
assign shi0 = time_second_cnt_nb/10; // 南北方向十位// 例化数码管显示模块
smg u_smg(.clk(clk),.rst_n(rst_n),.ge1(ge1), .shi1(shi1),.ge0(ge0), .shi0(shi0),.sm_bit(sm_bit),.sm_seg(sm_seg)
);endmodule
2. 交通灯逻辑控制模块(jtd_logic.v)
该模块是系统的核心,实现了完整的状态机控制逻辑。主要功能包括:
- 按键检测与消抖
- 1秒时钟生成
- 状态机控制
- 时间计数管理
详细代码请参见附录A。
3. LED控制模块(led_ctl.v)
module led_ctl(input clk,input rst_n,input [4:0] c_state,output reg [11:0] led
);// 状态参数定义
parameter idle = 5'b00001,stage_1 = 5'b00010,stage_2 = 5'b00100,stage_3 = 5'b01000,emergent_led = 5'b10000;// LED控制逻辑
always@(posedge clk or negedge rst_n)beginif(!rst_n)led <= 12'b0;else if(c_state == idle)led <= 12'b0111_1001_1110; // 东西绿,南北红else if(c_state == stage_1)led <= 12'b0111_0101_1101; // 南北红,东西黄else if(c_state == stage_2)led <= 12'b1100_1111_0011; // 东西红,南北绿else if(c_state == stage_3)led <= 12'b1010_1110_1011; // 东西红,南北黄else if(c_state == emergent_led)led <= 12'b0110_1101_1011; // 东西红,南北红elseled <= led;
endendmodule
4. 数码管显示模块(smg.v)
该模块实现8位数码管的动态扫描显示,详细代码请参见附录B。
3.5 管脚锁定
系统的管脚分配通过约束文件(jtd_test.xdc)进行定义:
# 时钟约束
create_clock -period 20.000 -name sys_clk [get_ports clk]
set_property PACKAGE_PIN Y18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]# 复位信号约束
set_property PACKAGE_PIN F15 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]# 按键约束
set_property PACKAGE_PIN A20 [get_ports key]
set_property IOSTANDARD LVCMOS33 [get_ports key]# LED控制信号约束
set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property PACKAGE_PIN M15 [get_ports {led[1]}]
# ... 其他LED引脚约束# 数码管约束
set_property PACKAGE_PIN K2 [get_ports {sm_bit[0]}]
set_property PACKAGE_PIN J2 [get_ports {sm_bit[1]}]
# ... 其他数码管引脚约束
3.6 仿真波形