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

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

软件:Quartus

语言:Verilog

功能介绍

本设计实现一个汽车转向灯控制逻辑,核心功能包括正常状态、左转向灯闪烁、右转向灯闪烁以及紧急双闪。输入端包含时钟 cp、左转按键 z、右转按键 y 和紧急按键 j,输出端为左转向灯 LD 与右转向灯 RD,适合用于 FPGA 数字逻辑、有限状态机和交通/车辆控制类课程设计。 系统在正常状态下左右灯均熄灭;按下左转按键后,左灯按照节拍闪烁,松开后返回正常状态;按下右转按键后,右灯按照节拍闪烁,松开后返回正常状态;按下紧急按键后,左右灯同步闪烁,松开后退出紧急模式。状态切换逻辑中设置了按键优先级,紧急信号优先于左转信号,左转信号优先于右转信号。 工程采用 Verilog 编写,顶层模块为 controlwd,并配套 tb_controlwd 测试文件。设计中包含 1 秒节拍分频、状态寄存、下一状态组合逻辑、闪烁相位控制和输出控制等部分,逻辑结构清晰,便于学习 FPGA 状态机设计方法,也便于根据实际硬件时钟频率调整闪烁节拍。

运行环境

开发软件:Quartus。 仿真环境:Modelsim、Quartus VWF 仿真。 设计语言:Verilog。 顶层模块:controlwd。 主要工程文件包括 controlwd.qpf、controlwd.qsf、controlwd.v 和 tb_controlwd.v。

设计思路

整体设计采用有限状态机实现汽车转向灯的工作模式管理。状态编码使用独热编码方式,定义正常状态 S_QA、左转状态 S_QB、右转状态 S_QC 和紧急状态 S_QD。独热编码使状态判断条件直观,适合教学和调试场景,也便于从 RTL 图和状态图中观察控制流程。 输入按键首先进入下一状态组合逻辑进行判断。在正常状态下,控制逻辑按照 j > z > y 的优先级选择进入紧急双闪、左转闪烁或右转闪烁状态;在左转、右转、紧急状态下,对应按键释放后返回正常状态。这样的设计能够明确区分保持状态和退出状态,避免输出在按键持续期间频繁切换模式。 闪烁功能由分频计数器和 phase 相位寄存器共同完成。参数 INPUT_FREQ_HZ 用于设置输入时钟频率,SEC_DIV 用于产生 1 秒节拍;当状态进入左转、右转或紧急模式时,phase 先置为亮,随后每过 1 秒翻转一次,从而形成灯光闪烁效果。返回正常状态时 phase 清零,使左右灯保持熄灭。 输出部分根据当前状态生成 left_en 和 right_en 使能信号。左转状态仅 LD 跟随 phase,右转状态仅 RD 跟随 phase,紧急状态下 LD 与 RD 同步跟随 phase。该结构把状态判断、节拍控制和输出映射分开处理,便于后续扩展更多灯光模式或修改闪烁频率。

模块结构

工程主要由 controlwd 顶层控制模块和 tb_controlwd 测试模块组成。 controlwd:汽车转向灯核心控制模块,包含时钟分频、状态机、闪烁相位控制和左右灯输出逻辑。输入信号为 cp、z、y、j,输出信号为 LD、RD。 tb_controlwd:测试激励模块,用于对左转、右转、紧急双闪等典型输入场景进行仿真验证。 状态划分:S_QA 表示正常熄灭状态,S_QB 表示左转闪烁状态,S_QC 表示右转闪烁状态,S_QD 表示紧急双闪状态。

演示视频

演示视频用于查看汽车转向灯控制效果,可配合工程仿真结果理解左转、右转和紧急双闪三类工作状态的输出变化。

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

设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、状态图、仿真图、Modelsim 仿真图、Testbench 以及 VWF 仿真图。仿真部分可用于观察按键输入变化时 LD、RD 两路输出的响应过程,适合对照状态机逻辑检查左转、右转和紧急双闪模式是否符合设计要求。

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image1.png

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image2.png

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image3.png

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image4.png

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image5.png

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image6.png

汽车转向灯控制 FPGA 设计 Verilog Quartus 设计文档图片 image7.png

部分代码

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

module controlwd (
    input  wire cp,   // 时钟输入
    input  wire z,    // 左转按键
    input  wire y,    // 右转按键
    input  wire j,    // 紧急按键
    output reg  LD,   // 左转向灯输出
    output reg  RD    // 右转向灯输出
);

    //========================
    // 参数与状态编码(采用独热编码)
    //========================
    // 将输入时钟频率设置为100Hz(每秒100个周期),可按实际硬件修改
    parameter integer INPUT_FREQ_HZ = 100;
    localparam integer SEC_DIV = INPUT_FREQ_HZ; // 每数到100产生1秒脉冲

    // 一热状态:仅有一个比特为1表示当前状态
    localparam [3:0] S_QA = 4'b0001; // 正常:左右灯灭
    localparam [3:0] S_QB = 4'b0010; // 左转:左灯闪
    localparam [3:0] S_QC = 4'b0100; // 右转:右灯闪
    localparam [3:0] S_QD = 4'b1000; // 紧急:左右双闪

    // 当前状态与下一状态寄存器
    reg [3:0] st_cur = S_QA; // 初始为QA
    reg [3:0] st_nxt;

    //========================
    // 1秒节拍分频器
    //========================
    // 每当sec_cnt计到SEC_DIV-1,产生sec_pulse(1秒一次)
    reg [31:0] sec_cnt = 32'd0;
    wire sec_pulse = (sec_cnt == (SEC_DIV - 1));

    always @(posedge cp) begin
        // 计满产生1秒脉冲,然后清零重新计数
        sec_cnt <= sec_pulse ? 32'd0 : (sec_cnt + 1);
    end

    //========================
    // 闪烁相位控制(phase=1亮,phase=0灭)
    //========================
    // 进入QB/QC/QD时,先置为亮;随后每过1秒翻转
    reg phase = 1'b0;

    //========================
    // 下一状态组合逻辑(含优先级:j > z > y)
    //========================
    always @(*) begin
        st_nxt = st_cur; // 默认不变
        if (st_cur == S_QA) begin
            // QA下按优先级进入闪烁状态
            if (j)       st_nxt = S_QD;
            else if (z)  st_nxt = S_QB;
            else if (y)  st_nxt = S_QC;
        end else if (st_cur == S_QB) begin
            // 左转:松开z返回QA
            if (!z)      st_nxt = S_QA;
        end else if (st_cur == S_QC) begin
            // 右转:松开y返回QA
            if (!y)      st_nxt = S_QA;
        end else if (st_cur == S_QD) begin
            // 紧急:松开j返回QA
            if (!j)      st_nxt = S_QA;
        end else begin
            // 异常保护
            st_nxt = S_QA;
        end
    end

    //========================
    // 状态寄存与闪烁相位更新(保证进入时先亮)
    //========================
    always @(posedge cp) begin
        // 状态更新
        st_cur <= st_nxt;

        // 进入闪烁状态先亮;返回QA则灭
        if (st_cur != st_nxt) begin
            phase <= (st_nxt == S_QA) ? 1'b0 : 1'b1;
        end else begin
            // 状态未变时,每秒按需翻转
            if (sec_pulse) begin
                phase <= (st_cur == S_QA) ? 1'b0 : ~phase;
            end
        end
    end

    //========================
    // 输出控制
    //========================
    // 左、右输出根据当前状态选择是否跟随phase
    wire left_en  = (st_cur == S_QB) || (st_cur == S_QD);
    wire right_en = (st_cur == S_QC) || (st_cur == S_QD);

    always @(*) begin
        LD = left_en  ? phase : 1'b0;
        RD = right_en ? phase : 1'b0;
    end

endmodule

代码文件(付费下载)

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

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

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