• 正文
  • 相关推荐
申请入驻 产业图谱

汽车转向灯与交通灯控制 FPGA设计 Verilog Quartus

9小时前
82
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:汽车转向灯与交通灯控制 FPGA 设计 Verilog Quartus

软件:Quartus

语言:Verilog

功能介绍

本设计包含汽车转向灯控制和交通灯控制两个 FPGA 实验工程,适合用于 Verilog 数字逻辑课程设计、EDA 实验和 FPGA 入门项目参考。汽车转向灯部分通过按键输入控制左转、右转和紧急双闪状态,输出端连接 LED,用于模拟车辆转向灯在不同操作状态下的闪烁效果。

汽车转向灯控制模块以时钟 cp 作为系统节拍输入,z、y、j 分别作为左转、右转和紧急状态控制键。系统空闲时左右灯均熄灭;左转状态下左灯按节拍闪烁;右转状态下右灯按节拍闪烁;紧急状态下左右灯同步闪烁。模块内部设置可调整的 CLK_FREQ_HZ 参数,便于根据实际输入时钟频率修改分频计数,使闪烁节奏适配不同实验环境。

交通灯控制部分围绕红绿灯时序控制展开,配套包含红绿灯控制模块、数码管显示模块等内容,可用于展示交通信号灯状态切换和倒计时显示逻辑。工程包含 Quartus 项目文件、Verilog 程序、仿真波形和设计文档图片,便于学习者从代码、RTL结构、仿真结果和工程配置多个角度理解设计。

运行环境

开发语言:Verilog

开发软件:Quartus

工程类型:FPGA/EDA 数字逻辑设计工程

主要工程文件包括汽车转向灯 controlwd 工程和交通灯 Traffic_Light_Control 工程,工程中包含 .qpf、.qsf、.vwf、Verilog 源码及仿真相关文件。

设计思路

汽车转向灯控制采用有限状态机实现,状态划分为 QA、QB、QC、QD 四种工作模式。QA 表示左右灯均灭的空闲状态;QB 表示左转闪烁状态;QC 表示右转闪烁状态;QD 表示紧急双闪状态。状态转移由 z、y、j 三个按键信号控制,其中紧急状态 j 具有较高优先级,能够从空闲状态进入双闪模式。

为了实现周期性闪烁,模块内部加入分频计数器 tick_cnt,根据 CLK_FREQ_HZ 参数产生 second_tick 节拍信号。进入闪烁状态时,blink_phase 首先置为亮;之后在状态保持期间,每到一个节拍翻转一次,从而形成 LED 亮灭交替的效果。返回空闲状态时,blink_phase 清零,左右输出均保持熄灭。

输出逻辑根据当前状态和 blink_phase 组合生成 LD、RD 两路 LED 控制信号。QA 状态下 LD、RD 均为 0;QB 状态下 LD 随 blink_phase 闪烁、RD 熄灭;QC 状态下 RD 随 blink_phase 闪烁、LD 熄灭;QD 状态下 LD、RD 同步随 blink_phase 闪烁。这样的结构将状态转移、节拍产生和输出控制分开,代码层次清晰,便于修改闪烁频率和扩展控制条件。

交通灯控制工程采用模块化方式组织,包含红绿灯控制模块和数码管显示模块。红绿灯控制逻辑负责信号灯状态切换,数码管显示模块用于显示相关计时或状态信息,整体适合作为状态机设计、分频计数、显示译码和交通信号控制实验的综合参考。

模块结构

主要模块包括:

1. controlwd:汽车转向灯顶层控制模块,输入时钟和左转、右转、紧急控制信号,输出左右转向灯 LED 控制信号。

2. Traffic_Light_Control:交通灯控制工程主模块,用于实现交通信号灯控制相关逻辑。

3. RGY:红绿灯控制相关模块,用于交通灯红、绿、黄灯状态控制。

4. HEX:数码管显示模块,用于交通灯工程中的数码管显示译码。

工程文件包含 Verilog 源码、Quartus 工程配置、仿真波形文件和编译输出文件,便于直接打开工程查看模块连接、RTL 图和仿真波形。

开发板验证

工程包含 Quartus 管脚约束/分配文件,可用于开发板引脚分配和硬件下载验证。汽车转向灯工程可将 LD、RD 连接至开发板 LED,通过 z、y、j 控制键观察左转闪烁、右转闪烁和紧急双闪效果;交通灯工程可结合红绿灯输出和数码管显示进行板级验证。

演示视频

包含汽车转向灯演示视频和交通灯演示视频,可直观看到转向灯闪烁控制以及交通灯控制效果。

演示视频请点击左下角阅读原文查看。

演示视频请点击左下角阅读原文查看。

仿真图/仿真说明/设计文档图片

设计文档图片内容包括工程文件、程序文件、程序编译、RTL 图、状态图、仿真图、整体仿真图、红绿灯控制模块和数码管显示模块等,适合配合源码理解工程结构、状态机设计和仿真结果。

部分代码

以下展示顶层模块 controlwd 的部分代码,完整源码请下载压缩包查看。

module controlwd (
    input  wire cp,   // 时钟输入
    input  wire z,    // 左转向灯控制键
    input  wire y,    // 右转向灯控制键
    input  wire j,    // 紧急状态控制键
    output reg  LD,   // 左转向灯输出(连接到最左端LED)
    output reg  RD    // 右转向灯输出(连接到最右端LED)
);

    //========================
    // 参数与状态编码
    //========================
    // 时钟频率参数(单位Hz),用于把“cp”分频到1秒节拍
    // 若实际为1Hz,请将其改为1;若为50MHz,请改为50000000,以此类推
    parameter integer CLK_FREQ_HZ = 20;//默认20Hz

    // 状态编码:QA=00, QB=01, QC=10, QD=11
    localparam [1:0] QA = 2'b00;
    localparam [1:0] QB = 2'b01;
    localparam [1:0] QC = 2'b10;
    localparam [1:0] QD = 2'b11;

    // 当前状态与下一状态
    reg [1:0] state  = QA;  // 初始为QA:左右均灭
    reg [1:0] next_state;

    //========================
    // 1秒节拍分频器
    //========================
    // 计数到(CLK_FREQ_HZ-1)产生一次1秒到达信号second_tick
    reg [31:0] tick_cnt = 32'd0; // 计数器,初值为0
    wire second_tick = (tick_cnt == (CLK_FREQ_HZ - 1));

    always @(posedge cp) begin
        if (second_tick) begin
            tick_cnt <= 32'd0;        // 到达1秒,清零重新计数
        end else begin
            tick_cnt <= tick_cnt + 1; // 累加计数
        end
    end

    //========================
    // 闪烁相位控制
    //========================
    // blink_phase=1表示“亮”,=0表示“灭”
    // 进入闪烁状态时先置为亮;随后每过1秒翻转一次
    reg blink_phase = 1'b0;

    //========================
    // 下一状态组合逻辑(根据题目要求的跳转条件)
    //========================
    always @(*) begin
        next_state = state; // 默认保持当前状态
        case (state)
            QA: begin
                // 在QA时,按优先级处理:j(紧急) > z(左转) > y(右转)
                if (j)       next_state = QD;
                else if (z)  next_state = QB;
                else if (y)  next_state = QC;
            end
            QB: begin
                // QB:左转闪烁;当z=0时返回QA
                if (!z)      next_state = QA;
            end
            QC: begin
                // QC:右转闪烁;当y=0时返回QA
                if (!y)      next_state = QA;
            end
            QD: begin
                // QD:紧急双闪;当j=0时返回QA
                if (!j)      next_state = QA;
            end
            default: begin
                next_state = QA;
            end
        endcase
    end

    //========================
    // 状态寄存与闪烁相位更新
    //========================
    always @(posedge cp) begin
        // 状态更新
        state <= next_state;

        // 当状态发生变化时进行“起始亮/灭”设定
        if (state != next_state) begin
            if (next_state == QA) begin
                blink_phase <= 1'b0;  // 回到QA时,灭
            end else begin
                blink_phase <= 1'b1;  // 进入QB/QC/QD时,先亮起
            end
        end else begin
            // 状态未变更时,若处于闪烁类状态,每1秒翻转一次亮灭
            if (second_tick) begin
                if (state == QA) begin
                    blink_phase <= 1'b0; // 在QA保持灭
                end else begin
                    blink_phase <= ~blink_phase; // 闪烁翻转
                end
            end
        end
    end

    //========================
    // 输出控制
    //========================
    // QA:LD=0,RD=0
    // QB:LD=blink_phase,RD=0
    // QC:LD=0,RD=blink_phase
    // QD:LD=blink_phase,RD=blink_phase
    always @(*) begin
        // 默认灭
        LD = 1'b0;
        RD = 1'b0;
        case (state)
            QA: begin
                LD = 1'b0;
                RD = 1'b0;
            end
// ... 以下代码略,完整源码请下载压缩包查看

代码获取:点击【来源:www.hdlcode.com

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

本站代码库拥有大量 Verilog/VHDL的FPGA代码资源:hdlcode.com。代码有详细注释、演示视频、仿真图等资料,适合入门学习

微信公众号