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

相关推荐
Lester_110127 分钟前
嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
笔记·stm32·单片机·学习·freertos
jackson凌28 分钟前
【Java学习笔记】Math方法
java·笔记·学习
Humbunklung33 分钟前
PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)
笔记·python·学习·pyqt
sealaugh321 小时前
aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain
笔记·学习·aws
阿超爱嵌入式1 小时前
STM32学习之I2C(理论篇)
stm32·嵌入式硬件·学习
qq_454175792 小时前
c++学习-this指针
开发语言·c++·学习
恰薯条的屑海鸥2 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
网络·学习·安全·web安全·渗透测试·csrf·网络安全学习
哆啦A梦的口袋呀2 小时前
基于Python学习《Head First设计模式》第六章 命令模式
python·学习·设计模式
程序猿tu4 小时前
Axios学习笔记
笔记·学习
有谁看见我的剑了?4 小时前
stress 服务器压力测试的工具学习
服务器·学习·压力测试