FPGA-DE2115开发板实现流水灯

文章目录

一、安装VScode,在其中下载安装Verilog-HDL/SystemVerilog插件;

(1)安装VScode

网上的相关教程很多我就不过多赘述了。默认安装好了。

(2)安装插件

在VScode中安装相关插件

(3)与Quartus关联

打开Quartus按照下图步骤进行关联,关联成功后在新建文件后会自动打开VScode编辑器。

二、不分模块实现流水灯

(1)新建工程






(2)添加流水灯实现代码


代码:

复制代码
module lsd #(parameter TIME_1S = 26'd49_999_999)( 
    input               sys_clk,
    input               sys_rst_n,
    output  reg [5:0]   led     
);
    reg     [25:0]      cnt;      // 修正为26位宽
    wire                add_cnt;
    wire                end_cnt;
    reg     [2:0]       cnt1;
    wire                add_cnt1;
    wire                end_cnt1;

    // 1秒定时器逻辑
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            cnt <= 26'b0;
        end else if (add_cnt) begin
            cnt <= (end_cnt) ? 26'b0 : cnt + 1'b1;
        end
    end

    // LED状态计数器逻辑
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            cnt1 <= 3'b0;
        end else if (add_cnt1) begin
            cnt1 <= (end_cnt1) ? 3'b0 : cnt1 + 1'b1;
        end
    end

    // LED显示逻辑(直接循环左移更简洁)
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            led <= 6'b000001;
        end else if (end_cnt) begin // 每秒左移一次
            led <= {led[4:0], led[5]}; // 循环左移
        end
    end

    // 控制信号定义
    assign add_cnt  = 1'b1;
    assign end_cnt  = (cnt == TIME_1S);
    assign add_cnt1 = end_cnt;
    assign end_cnt1 = (cnt1 == 3'd5);

endmodule

(3)配置引脚

(4)烧录


(5)实现效果

三、分模块实现流水灯

(1)新建工程






(2)添加流水灯实现代码


新建代码后跳转到VScode时会默认起一个名字最好另存为对应文件名否则在后面运行会报错。

新建保存完代码后将代码文件添加到工程中并将LedBlink.v设置为顶层模块

选中顶层文件右键选择Set as Top...

LedBlink.v

复制代码
module LedBlink(
    input clk,
    input sys_rst_n_raw,  // 原始复位信号(KEY0)
    input pause_key,      // 暂停按键(KEY1)
    output [5:0] led
);
    // 同步复位信号
    reg [1:0] sync_rst_n;
    wire sys_rst_n;
    always @(posedge clk) begin
        sync_rst_n <= {sync_rst_n[0], sys_rst_n_raw};
    end
    assign sys_rst_n = sync_rst_n[1];

    // 分频模块(生成1Hz使能)
    wire en_1Hz;
    fenpin u_fenpin(
        .clk(clk),
        .rst_n(sys_rst_n),
        .en(en_1Hz)
    );

    // 按键控制模块(消抖+脉冲)
    wire pause_pulse;
    key_ctrl u_key_ctrl(
        .clk(clk),
        .rst_n(sys_rst_n),
        .key_in(pause_key),
        .key_pulse(pause_pulse)
    );

    // 暂停状态标志
    reg pause_flag;
    always @(posedge clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            pause_flag <= 1'b0;
        end else if (pause_pulse) begin
            pause_flag <= ~pause_flag;
        end
    end

    // 显示模块
    display u_display(
        .clk(clk),
        .rst_n(sys_rst_n),
        .en(en_1Hz),
        .pause(pause_flag),
        .led(led)
    );
endmodule

fenpin.v

复制代码
module fenpin(
    input clk,          // 50MHz时钟
    input rst_n,        // 复位信号(低有效)
    output reg en       // 1Hz使能信号
);
    reg [25:0] cnt;     // 26位计数器(0~49,999,999)

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
            en <= 0;
        end else begin
            if (cnt == 26'd49_999_999) begin // 50MHz → 1Hz
                cnt <= 0;
                en <= 1;
            end else begin
                cnt <= cnt + 1;
                en <= 0;
            end
        end
    end
endmodule

display.v

复制代码
module display(
    input clk,
    input rst_n,        // 复位信号(低有效)
    input en,           // 1Hz使能
    input pause,        // 暂停状态(1=暂停)
    output reg [5:0] led
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            led <= 6'b000001;  // 复位时LED0亮
        end else if (en && !pause) begin
            led <= {led[4:0], led[5]};  // 循环左移
        end
    end
endmodule

key_ctrl.v

复制代码
module key_ctrl(
    input clk,          // 50MHz时钟
    input rst_n,        // 复位信号(低有效)
    input key_in,       // 原始按键输入(KEY1)
    output key_pulse    // 消抖后的按键脉冲(按下一次产生一个脉冲)
);
    reg [19:0] debounce_cnt;    // 消抖计数器(20ms)
    reg key_sync;               // 同步后的按键状态
    reg key_sync_prev;          // 前一刻按键状态(用于边沿检测)

    // 消抖逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            debounce_cnt <= 0;
            key_sync <= 1'b1;      // 复位时按键状态为高
        end else begin
            if (key_in != key_sync) begin
                debounce_cnt <= debounce_cnt + 1;
                if (debounce_cnt == 20'd1_000_000) begin // 20ms消抖
                    key_sync <= key_in;
                    debounce_cnt <= 0;
                end
            end else begin
                debounce_cnt <= 0;
            end
        end
    end

    // 边沿检测(下降沿:1→0)
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            key_sync_prev <= 1'b1;
        end else begin
            key_sync_prev <= key_sync;
        end
    end

    // 生成按键脉冲(按下时产生一个时钟周期高电平)
    assign key_pulse = (~key_sync) & key_sync_prev;
endmodule

(3)配置引脚

(4)烧录


(5)实现效果

四、总结

本次实验学会了更多关于Quartus的使用操作也学习到了更多关于FPGA的内容。

相关推荐
Rabitebla7 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
小lu飞9 小时前
2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程
前端·笔记·ai·ai编程
无心水12 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd12 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao15 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李16 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga17 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd17 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白19 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李19 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议