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

相关推荐
敬往事一杯酒哈3 小时前
海康 AGV 导航读码器学习
学习
qq_284274055 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_284274056 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan20247 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
小雪崩8 小时前
嵌入式学习 day64:字符设备驱动
学习
个 人 练 习 生8 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
坤坤子吖9 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
奋斗的阿狸_19869 小时前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
hahaha60169 小时前
FPGA+ARM实现AWB的全流程
人工智能·嵌入式硬件·算法·计算机视觉·fpga开发
词却10 小时前
OpenCV学习:MediaPipe 人脸网格检测
opencv·学习