FPGA学习(二)——基于DE2-115开发板的LED流水灯设计

基于DE2-115开发板的LED流水灯设计

设计目标:实现6个LED周期为1秒的跑马灯效果,支持按键暂停/恢复。

一、实验环境
  • 硬件平台:DE2-115 FPGA开发板
  • 开发工具
    • VScode + Verilog-HDL插件
    • Quartus Prime Lite Edition
    • ModelSim
二、模块化设计

采用层次化设计,分为以下模块:

  1. 分频模块(fenpin.v):将50MHz时钟分频至1Hz。
  2. 显示模块(display.v):控制LED流水灯状态机。
  3. 按键检测模块(key_debounce.v):按键去抖动与状态切换。
  4. 顶层模块(LedBlink.v):模块互联与引脚分配。
三、代码实现
1. 分频模块(fenpin.v)
bash 复制代码
module fenpin(
    input clk_50M,      // 50MHz时钟输入
    input rst_n,        // 复位信号(低有效)
    output reg clk_1Hz  // 1Hz分频输出
);
reg [25:0] cnt;         // 50MHz→1Hz需计数50,000,000次(26位计数器)

always @(posedge clk_50M or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= 26'd0;
        clk_1Hz <= 1'b0;
    end
    else if (cnt == 26'd49_999_999) begin // 计数满50,000,000次
        cnt <= 26'd0;
        clk_1Hz <= ~clk_1Hz;             // 输出翻转
    end
    else begin
        cnt <= cnt + 1'b1;
    end
end
endmodule
2. 显示模块(display.v)
bash 复制代码
module display(
    input clk_1Hz,      // 1Hz时钟输入
    input rst_n,        // 复位信号
    input pause,        // 暂停信号(选做)
    output reg [5:0] led // LED输出
);
reg [2:0] state;        // 状态机(6种状态)

always @(posedge clk_1Hz or negedge rst_n) begin
    if (!rst_n) begin
        state <= 3'd0;
        led <= 6'b000001; // 初始状态:第1个LED亮
    end
    else if (!pause) begin // 非暂停状态时切换
        case(state)
            3'd0: led <= 6'b000001; // 状态0: LED0亮
            3'd1: led <= 6'b000010; // 状态1: LED1亮
            3'd2: led <= 6'b000100; // ...依次类推
            3'd3: led <= 6'b001000;
            3'd4: led <= 6'b010000;
            3'd5: led <= 6'b100000;
            default: led <= 6'b000000;
        endcase
        state <= (state == 3'd5) ? 3'd0 : state + 1; // 循环状态
    end
end
endmodule
3. 按键检测模块(key_debounce.v)(选做)
bash 复制代码
module key_debounce(
    input clk_50M,
    input key_in,       // 原始按键输入
    output reg key_out  // 去抖后输出
);
reg [19:0] cnt;         // 20ms去抖计数器(50MHz→20ms需计数1,000,000次)

always @(posedge clk_50M) begin
    if (key_in != key_out) begin
        if (cnt == 20'd999_999) begin
            key_out <= key_in; // 稳定后更新
            cnt <= 20'd0;
        end
        else cnt <= cnt + 1;
    end
    else cnt <= 20'd0;
end
endmodule
4. 顶层模块(LedBlink.v)
bash 复制代码
module LedBlink(
    input clk_50M,      // 开发板50MHz时钟
    input rst_n,        // 复位按键(KEY0)
    input pause_key,    // 暂停按键(KEY1,选做)
    output [5:0] led    // LED[5:0]
);
wire clk_1Hz;
wire pause_clean;

// 分频模块实例化
fenpin u_fenpin(
    .clk_50M(clk_50M),
    .rst_n(rst_n),
    .clk_1Hz(clk_1Hz)
);

// 按键去抖动实例化(选做)
key_debounce u_key(
    .clk_50M(clk_50M),
    .key_in(pause_key),
    .key_out(pause_clean)
);

// 显示模块实例化
display u_display(
    .clk_1Hz(clk_1Hz),
    .rst_n(rst_n),
    .pause(pause_clean),
    .led(led)
);
endmodule
四、引脚分配(DE2-115)
五、实际效果
  • 上电后,LED从右至左依次点亮,周期1秒。
  • 按下KEY1可暂停流水灯,再次按下恢复。

fpga2

相关推荐
wanzhong233314 分钟前
ArcGIS学习-20 实战-地形研究
学习
wanzhong233320 分钟前
ArcGIS学习-20 实战-县域水文分析
学习·arcgis
小马学嵌入式~29 分钟前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite
索迪迈科技33 分钟前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
武文斌771 小时前
arm启动代码总结
arm开发·嵌入式硬件·学习
我怕是好2 小时前
学习stm32 蓝牙
stm32·嵌入式硬件·学习
索迪迈科技2 小时前
STM32F103C8T6开发板入门学习——点亮LED灯2
stm32·嵌入式硬件·学习
Learn Beyond Limits3 小时前
The learning process of Decision Tree Model|决策树模型学习过程
人工智能·深度学习·神经网络·学习·决策树·机器学习·ai
凯尔萨厮4 小时前
Java学习笔记三(封装)
java·笔记·学习
YoungUpUp4 小时前
【文件快速搜索神器Everything】实用工具强推——文件快速搜索神器Everything详细图文下载安装教程 办公学习必备软件
学习·everything·文件搜索·实用办公软件·everything 工具·文件快速搜索·搜索神器