交通灯控制系统仿真 FPGA 设计 Verilog Vivado

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 名称交通灯控制系统仿真 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 1b0; forever #10 clk ~clk; end // 复位过程 initial begin rst_n 1b0; AS 1b0; BS 1b0; repeat(10) (posedge clk); // 200ns 复位 rst_n 1b1; end // 任务等待N个秒脉冲由参数化分频产生的tick_1hz task wait_secs(input integer n); integer i; begin for (i0; i代码获取点击下方公众号卡片