当前位置: 首页 > news >正文

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)
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)
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)(选做)
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)
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

相关文章:

  • 构建下一代AI Agent:自动化开发与行业落地全解析
  • SpringBoot3+Vue3实战(Vue3快速开发登录注册页面并对接后端接口)(4)
  • <table>内有两行<tr>,第一行设定高度为60,剩余第二行,和右侧元素高度补齐。
  • Linux 锁、线程同步
  • Elasticsearch text字段检索方法
  • 各种医学方面大模型总结——自用
  • 前端调试实战指南:从入门到高阶的完整解决方案
  • 【Triton 教程】triton_language.tensor
  • 【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析
  • TDE透明加密技术:免改造实现华为云ECS中数据库和文件加密存储
  • Cool Request:可以统计任意方法耗时
  • dpkg-architecture命令详解
  • li 能否用:span=““这种样式
  • 华为云在工业数字化方面的优势
  • 《UNIX网络编程卷1:套接字联网API》第1章 简介
  • Firebase崩溃:ViewBinding not init!!
  • 零基础上手Python数据分析 (6):Python 异常处理,告别程序崩溃的烦恼!
  • 算法反转字符串
  • springBoot中myBatisPlus的使用
  • python-leetcode 48.括号生成
  • 上交所五方面落实募资新规:强化关键少数责任和股东权利保障
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • 在古老的意大利科莫歌剧院,廖昌永唱响16首中国艺术歌曲
  • “大鼻子情圣”德帕迪约因性侵被判缓刑,还有新的官司等着他
  • 耗资10亿潮汕豪宅“英之园”将强拆?区政府:非法占用集体土地
  • 哲学新书联合书单|远离苏格拉底