交通灯控制系统 FPGA 设计 Verilog Quartus(2)
名称:交通灯控制系统 FPGA 设计 Verilog Quartus(2)
软件: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 的显示,HEX3+HEX2 与 HEX1+HEX0 分别用于两路倒计时显示。
部分代码
以下展示顶层模块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_red=main_red_led;//主路灯 assign main_green=main_green_led;//主路灯 assign main_yellow=main_yellow_led ;//主路灯 assign branch_red=branch_red_led;//支路灯 assign branch_green=branch_green_led;//支路灯 assign branch_yellow=branch_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_time=8'd5;//主路黄灯时间设置为5秒 assign branch_yellow_time=8'd5;//支路黄灯时间设置为5秒 assign main_green_time=8'd25;//默认绿灯25秒 assign branch_green_time=8'd25;//默认绿灯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代码设计学习资料”
