名称:交通灯控制 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
功能介绍
本设计实现一个主路与支路交叉口交通灯控制系统,使用 Verilog 编写并在 Vivado 工程中组织。系统以 50MHz 时钟作为输入,通过分频得到 1Hz 计时节拍,用于驱动红、黄、绿灯状态切换以及剩余时间倒计时显示。
交通灯输出包含主路红灯、绿灯、黄灯以及支路红灯、绿灯、黄灯六路控制信号。主路绿灯时间设置为 60 秒,支路绿灯时间设置为 40 秒,主路和支路黄灯时间均设置为 3 秒,适合用于 FPGA 交通灯课程设计、数字逻辑实验和 Verilog 状态机控制练习。
显示部分通过数码管位选和段选信号输出倒计时数据,使主路与支路当前通行状态及剩余时间能够同步显示。顶层模块将灯控、倒计时数据生成、数码管动态扫描和时钟分频模块连接起来,结构清晰,便于修改不同路口的通行时间参数。
运行环境
开发语言:Verilog
开发软件:Vivado
顶层模块:traffic_light
工程文件:traffic_light.xpr
主要源码目录:traffic_light/scr
约束文件:traffic_light/scr/pins.xdc
设计思路
系统设计以顶层 traffic_light 模块为核心,将 50MHz 系统时钟送入分频模块生成 1Hz 计时信号,再由交通灯控制模块按照设定的绿灯、黄灯时间完成主支路红黄绿状态切换。主路和支路采用互斥通行逻辑:一侧处于绿灯或黄灯阶段时,另一侧保持红灯,并通过倒计时信号反映当前阶段剩余时间。
交通灯控制模块负责产生六路灯信号以及各阶段 BCD 倒计时数据。顶层中将主路绿灯时间设置为 8\'d60,支路绿灯时间设置为 8\'d40,黄灯时间固定为 8\'d3。这样的参数写法便于在源码中直接调整通行周期,适合实验中比较不同配时方案对状态切换和显示结果的影响。
数码管显示采用数据生成与动态扫描分离的方式:shumaguan_data 模块根据当前灯色状态选择主路或支路对应的倒计时数据,display 模块负责位选、段选输出。该划分方式降低了顶层逻辑复杂度,也便于单独调试显示编码、扫描刷新和交通灯状态控制。
模块结构
traffic_light:顶层模块,连接分频、交通灯控制、显示数据生成和数码管显示模块。
div:时钟分频模块,将输入时钟分频为交通灯计时使用的 1Hz 时钟。
led:交通灯控制模块,产生主路、支路红黄绿灯输出及各阶段倒计时 BCD 数据。
shumaguan_data:数码管显示数据生成模块,根据当前灯状态选择主路、支路倒计时显示内容。
display:数码管动态显示模块,输出位选 weixuan 和段选 duanxian。
edge_check:边沿检测相关模块,可用于按键信号或控制信号边沿处理。
time_ctrl:时间控制相关模块,用于交通灯计时控制逻辑扩展。
开发板验证
工程提供 Vivado 管脚约束文件 pins.xdc,并已生成实现阶段文件与 bit 文件,可用于按约束连接的 FPGA 开发板进行红黄绿灯输出和数码管倒计时显示验证。约束文件覆盖顶层端口的物理引脚分配,便于将 main_red、main_green、main_yellow、branch_red、branch_green、branch_yellow、weixuan、duanxian 等信号映射到开发板外设。
仿真图/仿真说明/设计文档图片
配有交通灯设计要求图片,可用于核对系统功能需求、主支路灯色切换关系和倒计时显示目标。工程还包含 Vivado 综合、实现、时序、功耗、资源利用率等报告文件,便于查看工程构建结果和 FPGA 实现情况。
部分代码
以下展示顶层模块 traffic_light 的部分代码,完整源码请下载压缩包查看。
module traffic_light( input clk,//50Mhz output main_red,//主路灯 output main_green,//主路灯 output main_yellow,//主路灯 output branch_red,//支路灯 output branch_green,//支路灯 output branch_yellow,//支路灯 output [3:0] weixuan,//数码管位选 output [7:0] duanxian//数码管段选 ); 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) ); //按键调整时间 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\'d3;//主路黄灯时间设置为3秒 assign branch_yellow_time=8\'d3;//支路黄灯时间设置为3秒 assign main_green_time=8\'d60; assign branch_green_time=8\'d40; /////////////////////////////// reg [7:0] display_main; reg [7:0] display_branch; //////////////////////////////// //交通灯控制模块 led led( . clk_1Hz(clk_1Hz), . lock_key(1\'b0),//紧急按键,为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)//支路数码管数据显示 ); display display ( . clk(clk), . lock_key(lock_key), // ... 以下代码略,完整源码请下载压缩包查看
193