交通灯控制系统仿真 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 工程查看模块层次、仿真过程和关键逻辑结构。

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image1.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image10.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image11.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image12.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image13.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image14.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image2.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image3.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image4.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image5.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image6.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image7.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image8.png

交通灯控制系统仿真 FPGA 设计 Verilog Vivado 设计文档图片 image9.png

部分代码

以下展示顶层模块 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<n; i=i+1) begin
                @(posedge DUT.u_div.tick_1hz);
                // 再等待一个时钟,避免边沿邻近影响观测
                @(posedge clk);
            end
        end
    endtask

    // 监视:灯色与倒计时(层级访问DUT.u_ctrl的a_sec/b_sec)
    initial begin
        $display("time(us)\tAS BS | A(R,Y,G) B(R,Y,G) | A_sec B_sec");
        $monitor("%0t\t%b  %b  |  %b %b %b    %b %b %b  |  %0d    %0d",
                 $time/1000, AS, BS, AR, AY, AG, BR, BY, BG,
                 DUT.u_ctrl.a_sec, DUT.u_ctrl.b_sec);
    end

    // 场景激励:
    // 1) 上电后无车 3秒
    // 2) 仅B有车 35秒(主路最小绿30s后,A黄3s并切到B绿,可观察到切换)
    // 3) 双向有车 35秒(进入双向27绿+3黄的交替,可观察一个周期内的变化)
    // 4) 仅A有车 8秒(应尽快让回主路A)
    initial begin
        // 等待复位结束
        @(posedge rst_n);

        // 1) 无车
        AS = 1'b0; BS = 1'b0;
        wait_secs(50);

        // 2) 仅B有车
        AS = 1'b0; BS = 1'b1;
        wait_secs(100);

        // 3) 双向有车
        AS = 1'b1; BS = 1'b1;
        wait_secs(100);

        // 4) 仅A有车
        AS = 1'b1; BS = 1'b0;
        wait_secs(100);
        
        // 5) 仅B有车
        AS = 1'b0; BS = 1'b1;
        wait_secs(100);

    end

endmodule

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 交通灯控制系统仿真 FPGA 设计 Verilog Vivado

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员