名称:交通灯控制系统仿真 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
功能介绍
本设计实现一个基于 Verilog 的交通灯控制系统,面向 FPGA 数字逻辑课程设计、状态机实验和 Vivado 仿真验证场景。系统以 A、B 两个方向的车流输入作为控制条件,输出两组红、黄、绿交通灯信号,并配合数码管显示倒计时信息,便于观察交通灯状态切换和剩余时间变化。 交通灯逻辑支持多种交通场景:无车、仅 B 方向有车、双向有车、仅 A 方向有车等。仿真激励中对不同车流输入进行了分段测试,可观察主路绿灯保持、黄灯过渡、支路放行以及双向交替控制过程。通过这种输入场景安排,可以较完整地验证控制状态机在不同交通需求下的响应。 工程适合作为 Verilog 时序逻辑、有限状态机、分频计时、动态数码管显示和 Vivado 仿真流程的参考案例。整体结构清晰,模块划分明确,便于在现有逻辑基础上继续扩展倒计时时长、灯色策略、传感器输入或显示方式。
运行环境
开发软件:Vivado 设计语言:Verilog 工程形式:Vivado 工程,包含 Verilog 源码、仿真 Testbench、行为仿真相关文件和设计文档。
设计思路
系统采用模块化设计思路,将时钟分频、交通灯控制、数码管扫描显示和顶层连接分开实现。顶层模块负责连接外部时钟、复位、车流输入、交通灯输出以及数码管显示信号;控制模块根据 A、B 两路车流输入和计时信号进行状态切换;分频模块把系统时钟转换为控制逻辑需要的节拍;显示模块负责将倒计时信息通过数码管动态扫描输出。 交通灯控制核心以状态机为主,围绕红灯、黄灯、绿灯的组合关系进行切换。A、B 两个方向不会同时放行,黄灯阶段作为方向切换前的过渡状态。仿真中通过调整分频参数,将实际较长的秒级计时压缩为更快的仿真节拍,从而在较短仿真时间内观察完整状态转换过程。 测试文件设置了多组典型车流输入:先复位并进入无车状态,再依次测试支路有车、双向有车、主路有车、支路再次有车等场景。监视语句输出灯色状态和内部倒计时数值,便于结合波形或控制台信息判断交通灯逻辑是否按预期运行。
模块结构
主要模块包括: 1. top:系统顶层模块,连接时钟、复位、车流输入、交通灯输出和数码管显示接口。 2. traffic_ctrl:交通灯控制模块,根据 AS、BS 车流输入和计时节拍生成 A、B 两方向红黄绿灯控制信号,并维护倒计时状态。 3. clk_div:时钟分频模块,为交通灯控制提供计时节拍;仿真中可通过参数调整加快验证速度。 4. seg_scan:数码管扫描显示模块,用于输出位选和段选信号,显示交通灯倒计时信息。 5. top_tb:仿真测试模块,产生 50MHz 时钟、复位和多组车流输入激励,并监视灯色与倒计时变化。
演示视频
包含交通灯控制系统演示视频,可用于直观看到工程仿真或运行展示效果,辅助理解不同车流条件下红、黄、绿灯状态以及倒计时显示的变化过程。
演示视频请关注公众号后获取对应资料查看。
仿真图/仿真说明/设计文档图片
设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、仿真图、Testbench、顶层仿真、分频模块、控制模块和显示模块等部分。文档配套多张设计与仿真相关图片,适合结合 Vivado 工程查看模块层次、仿真过程和关键逻辑结构。
部分代码
以下展示顶层模块top_tb的部分代码,完整代码可关注下方公众号卡片获取。
module top_tb; // 时钟与复位 reg clk; reg rst_n; // 车流输入 reg AS; reg BS; // 顶层输出 wire AR, AY, AG; wire BR, BY, BG; wire [3:0] an; wire [7:0] seg; // 实例化被测顶层 top DUT ( .clk(clk), .rst_n(rst_n), .AS(AS), .BS(BS), .AR(AR), .AY(AY), .AG(AG), .BR(BR), .BY(BY), .BG(BG), .an(an), .seg(seg) ); // 将分频系数设小:例如1000(配合50MHz时钟,相当于每1000个clk出一次tick_1hz脉冲) // 这会让"1秒"在仿真中非常快(1000*20ns = 20us) defparam DUT.u_div.DIV_1HZ = 1000; // 50MHz 时钟:周期20ns initial begin clk = 1'b0; forever #10 clk = ~clk; end // 复位过程 initial begin rst_n = 1'b0; AS = 1'b0; BS = 1'b0; repeat(10) @(posedge clk); // 200ns 复位 rst_n = 1'b1; end // 任务:等待N个"秒"脉冲(由参数化分频产生的tick_1hz) task wait_secs(input integer n); integer i; begin for (i=0; i
代码获取:点击下方公众号卡片