交通灯控制系统 FPGA 设计 Verilog Quartus(2)

📅 2026/6/30 17:36:56
交通灯控制系统 FPGA 设计 Verilog Quartus(2)
名称交通灯控制系统 FPGA 设计 Verilog Quartus2软件Quartus语言Verilog功能介绍本设计实现了一个双向路口交通灯控制系统使用 Verilog 编写工程环境为 Quartus。系统面向主路与支路的交通信号控制能够完成红、黄、绿三色信号灯的周期切换并通过 4 位七段数码管显示主路和支路当前状态的倒计时。 正常运行时交通灯按照固定相位循环主路绿灯25秒、主路黄灯5秒、支路绿灯25秒、支路黄灯5秒。主路绿灯和黄灯期间支路保持红灯支路绿灯和黄灯期间主路保持红灯符合双向路口互斥放行的基本控制要求。 系统带有紧急按键输入 lock_key。当紧急信号有效时主路与支路均进入红灯状态适合模拟紧急车辆通行、异常路况处理等场景。紧急状态解除后系统恢复正常相位运行。 显示功能使用 HEX0、HEX1、HEX2、HEX3 四个 8 位段码输出接口分别显示主干道和支干道的倒计时信息。整体设计结构清晰适合作为 FPGA 课程设计、Verilog 状态机练习、交通灯控制实验和数码管显示综合实验参考。运行环境开发语言Verilog 开发软件Quartus 仿真环境ModelSim 工程顶层模块traffic_light 主要文件traffic_light.v、led.v、shumaguan.v、display.v、div.v、traffic_light.qsf 工程输出包含 SOF、POF、编译报告、时序分析报告、引脚报告等 Quartus 生成文件。设计思路系统采用分层模块化设计将双向路口交通灯控制拆分为时钟分频、交通灯状态控制、倒计时数据处理和七段数码管显示几个部分。顶层 traffic_light 模块负责统一管理外部接口并把 50MHz 系统时钟、紧急按键、主支路灯输出以及 HEX0-HEX3 数码管输出连接到各个功能模块。 核心控制思路基于有限状态机。正常模式下系统按“主路绿灯25秒、主路黄灯5秒、支路绿灯25秒、支路黄灯5秒”的顺序循环运行主路通行时支路保持红灯支路通行时主路保持红灯从而保证两个方向不会同时放行。每个阶段通过秒脉冲推进计数并输出对应的 BCD 计时数据供后级倒计时显示使用。 紧急处理由 lock_key 输入控制。当 lock_key 为高电平时系统进入紧急状态主路和支路均切换为红灯计时过程暂停避免继续执行正常相位切换紧急状态解除后系统从安全状态重新进入正常交通灯流程。 显示部分将主路和支路的剩余时间转换为数码管显示数据。shumaguan_data 模块根据当前灯色和对应计时值计算倒计时display 模块再将 BCD 数据转换为 HEX0-HEX3 的七段段码实现四位数码管的实时显示。模块结构工程主要由 traffic_light、led、div、shumaguan_data、display 等模块组成。 traffic_light顶层模块连接系统时钟、紧急按键、主支路红黄绿灯输出和四位数码管输出并完成各子模块实例化。 led交通灯核心控制模块负责主路与支路的红、黄、绿灯状态切换、倒计时计数以及紧急状态处理。 div时钟分频模块将 50MHz 系统时钟分频为 1Hz 秒脉冲为交通灯相位切换和倒计时提供时间基准。 shumaguan_data倒计时数据处理模块根据当前交通灯状态和计时数据生成主路、支路的 BCD 倒计时显示值。 display七段数码管显示模块将 BCD 数据转换为 HEX0-HEX3 的段码输出实现主路和支路倒计时显示。演示视频演示视频展示了交通灯控制系统的运行效果可用于直观看到主路、支路信号灯切换以及倒计时显示的联动过程。结合工程仿真结果适合在下载前了解系统功能表现和交互效果。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片配套设计文档包含工程文件说明、程序文件说明、编译结果、RTL 图、Testbench、整体仿真图以及分频模块、控制模块、倒计时模块、显示模块的仿真说明。 整体仿真覆盖 clk、lock_key、主路红绿黄灯、支路红绿黄灯以及 HEX0-HEX3 数码管输出。仿真中可以观察到主路与支路按设定相位交替通行数码管实时显示剩余时间当 lock_key 为高电平时系统进入紧急模式主路和支路均显示红灯。 分频模块仿真验证了 50MHz 输入时钟到 1Hz 秒脉冲的转换。控制模块仿真展示了主路绿灯、主路黄灯、支路绿灯、支路黄灯的循环过程以及主路红灯时间与支路绿灯加黄灯时间、支路红灯时间与主路绿灯加黄灯时间之间的对应关系。 倒计时模块仿真说明了主路和支路在红灯、绿灯、黄灯不同状态下的剩余时间计算方式。显示模块仿真展示了 BCD 数据到七段数码管段码的转换支持数字 0-9 的显示HEX3HEX2 与 HEX1HEX0 分别用于两路倒计时显示。部分代码以下展示顶层模块traffic_light的部分代码完整代码可关注下方公众号卡片获取。module traffic_light( input clk,//50Mhz input lock_key,//紧急按键--按下均为红灯,为1紧急状态为0正常状态 output main_red,//主路灯 output main_green,//主路灯 output main_yellow,//主路灯 output branch_red,//支路灯 output branch_green,//支路灯 output branch_yellow,//支路灯 output [7:0] HEX0,//主干道数码管0 output [7:0] HEX1,//主干道数码管1 output [7:0] HEX2,//支干道数码管2 output [7:0] HEX3//支干道数码管3 ); wire clk_1Hz; wire [7:0] main_green_BCD; wire [7:0] main_yellow_BCD; wire [7:0] main_red_BCD; wire [7:0] branch_green_BCD; wire [7:0] branch_yellow_BCD; wire [7:0] branch_red_BCD; wire [7:0] main_data_out; wire [7:0] branch_data_out; wire main_red_led;//主路灯 wire main_green_led;//主路灯 wire main_yellow_led;//主路灯 wire branch_red_led;//支路灯 wire branch_green_led;//支路灯 wire branch_yellow_led;//支路灯 assign main_redmain_red_led;//主路灯 assign main_greenmain_green_led;//主路灯 assign main_yellowmain_yellow_led ;//主路灯 assign branch_redbranch_red_led;//支路灯 assign branch_greenbranch_green_led;//支路灯 assign branch_yellowbranch_yellow_led ;//支路灯 //分频模块 div div100 ( . clk(clk), . clk_out(clk_1Hz) ); //红灯时间30秒绿灯时间25秒黄灯时间5秒 //按键调整时间 wire [7:0]main_green_time;//由外部控制 wire [7:0]main_yellow_time; wire [7:0]branch_green_time;//由外部控制 wire [7:0]branch_yellow_time; assign main_yellow_time8d5;//主路黄灯时间设置为5秒 assign branch_yellow_time8d5;//支路黄灯时间设置为5秒 assign main_green_time8d25;//默认绿灯25秒 assign branch_green_time8d25;//默认绿灯25秒 /////////////////////////////// reg [7:0] display_main; reg [7:0] display_branch; //////////////////////////////// //交通灯控制模块 led led( . clk_1Hz(clk_1Hz), . lock_key(lock_key),//紧急按键,为1紧急状态为0正常状态 . main_red(main_red_led),//主路灯 . main_green(main_green_led),//主路灯 . main_yellow(main_yellow_led),//主路灯 . branch_red(branch_red_led),//支路灯 . branch_green(branch_green_led),//支路灯 . branch_yellow(branch_yellow_led),//支路灯 . main_green_time(main_green_time), . main_yellow_time(main_yellow_time), . branch_green_time(branch_green_time), . branch_yellow_time(branch_yellow_time), . main_green_BCD(main_green_BCD),//绿灯时间计数 . main_yellow_BCD(main_yellow_BCD),//黄灯时间计数 . main_red_BCD(main_red_BCD),//红灯时间计数 . branch_green_BCD(branch_green_BCD),//绿灯时间计数 . branch_yellow_BCD(branch_yellow_BCD),//黄灯时间计数 . branch_red_BCD(branch_red_BCD)//红灯时间计数 ); //显示数据生成模块倒计时 shumaguan_data shumaguan_data( . clk(clk), . main_red(main_red_led),//主路灯 . main_green(main_green_led),//主路灯 . main_yellow(main_yellow_led),//主路灯 . branch_red(branch_red_led),//支路灯 . branch_green(branch_green_led),//支路灯 . branch_yellow(branch_yellow_led),//支路灯 . main_green_BCD(main_green_BCD),//绿灯时间计数 . main_yellow_BCD(main_yellow_BCD),//黄灯时间计数 . main_red_BCD(main_red_BCD),//红灯时间计数 . branch_green_BCD(branch_green_BCD),//绿灯时间计数 . branch_yellow_BCD(branch_yellow_BCD),//黄灯时间计数 . branch_red_BCD(branch_red_BCD),//红灯时间计数 . main_green_time(main_green_time), . main_yellow_time(main_yellow_time), . branch_green_time(branch_green_time), . branch_yellow_time(branch_yellow_time), . main_data_out(main_data_out),//主路数码管数据显示 . branch_data_out(branch_data_out)//支路数码管数据显示 ); // ... 以下代码略完整源码请下载压缩包查看代码获取下方公众号“FPGA代码设计学习资料”