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

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
ZPC82105 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82105 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习