FPGA学习(二)——基于DE2-115开辟板的LED流水灯计划 [复制链接]
发表于 2025-10-12 16:09:28 | 显示全部楼层 |阅读模式
基于DE2-115开辟板的LED流水灯计划

计划目标:实现6个LED周期为1秒的赛马灯效果,支持按键停息/规复。
一、实行环境



  • 硬件平台:DE2-115 FPGA开辟板
  • 开辟工具

    • VScode + Verilog-HDL插件
    • Quartus Prime Lite Edition
    • ModelSim

二、模块化计划

采取条理化计划,分为以下模块:

  • 分频模块(fenpin.v):将50MHz时钟分频至1Hz。
  • 表现模块(display.v):控制LED流水灯状态机。
  • 按键检测模块(key_debounce.v):按键去抖动与状态切换。
  • 顶层模块(LedBlink.v):模块互联与引脚分配。
三、代码实现

1. 分频模块(fenpin.v)

  1. module fenpin(
  2.     input clk_50M,      // 50MHz时钟输入
  3.     input rst_n,        // 复位信号(低有效)
  4.     output reg clk_1Hz  // 1Hz分频输出
  5. );
  6. reg [25:0] cnt;         // 50MHz→1Hz需计数50,000,000次(26位计数器)
  7. always @(posedge clk_50M or negedge rst_n) begin
  8.     if (!rst_n) begin
  9.         cnt <= 26'd0;
  10.         clk_1Hz <= 1'b0;
  11.     end
  12.     else if (cnt == 26'd49_999_999) begin // 计数满50,000,000次
  13.         cnt <= 26'd0;
  14.         clk_1Hz <= ~clk_1Hz;             // 输出翻转
  15.     end
  16.     else begin
  17.         cnt <= cnt + 1'b1;
  18.     end
  19. end
  20. endmodule
复制代码
2. 表现模块(display.v)

  1. module display(
  2.     input clk_1Hz,      // 1Hz时钟输入
  3.     input rst_n,        // 复位信号
  4.     input pause,        // 暂停信号(选做)
  5.     output reg [5:0] led // LED输出
  6. );
  7. reg [2:0] state;        // 状态机(6种状态)
  8. always @(posedge clk_1Hz or negedge rst_n) begin
  9.     if (!rst_n) begin
  10.         state <= 3'd0;
  11.         led <= 6'b000001; // 初始状态:第1个LED亮
  12.     end
  13.     else if (!pause) begin // 非暂停状态时切换
  14.         case(state)
  15.             3'd0: led <= 6'b000001; // 状态0: LED0亮
  16.             3'd1: led <= 6'b000010; // 状态1: LED1亮
  17.             3'd2: led <= 6'b000100; // ...依次类推
  18.             3'd3: led <= 6'b001000;
  19.             3'd4: led <= 6'b010000;
  20.             3'd5: led <= 6'b100000;
  21.             default: led <= 6'b000000;
  22.         endcase
  23.         state <= (state == 3'd5) ? 3'd0 : state + 1; // 循环状态
  24.     end
  25. end
  26. endmodule
复制代码
3. 按键检测模块(key_debounce.v)(选做)

  1. module key_debounce(
  2.     input clk_50M,
  3.     input key_in,       // 原始按键输入
  4.     output reg key_out  // 去抖后输出
  5. );
  6. reg [19:0] cnt;         // 20ms去抖计数器(50MHz→20ms需计数1,000,000次)
  7. always @(posedge clk_50M) begin
  8.     if (key_in != key_out) begin
  9.         if (cnt == 20'd999_999) begin
  10.             key_out <= key_in; // 稳定后更新
  11.             cnt <= 20'd0;
  12.         end
  13.         else cnt <= cnt + 1;
  14.     end
  15.     else cnt <= 20'd0;
  16. end
  17. endmodule
复制代码
4. 顶层模块(LedBlink.v)

  1. module LedBlink(
  2.     input clk_50M,      // 开发板50MHz时钟
  3.     input rst_n,        // 复位按键(KEY0)
  4.     input pause_key,    // 暂停按键(KEY1,选做)
  5.     output [5:0] led    // LED[5:0]
  6. );
  7. wire clk_1Hz;
  8. wire pause_clean;
  9. // 分频模块实例化
  10. fenpin u_fenpin(
  11.     .clk_50M(clk_50M),
  12.     .rst_n(rst_n),
  13.     .clk_1Hz(clk_1Hz)
  14. );
  15. // 按键去抖动实例化(选做)
  16. key_debounce u_key(
  17.     .clk_50M(clk_50M),
  18.     .key_in(pause_key),
  19.     .key_out(pause_clean)
  20. );
  21. // 显示模块实例化
  22. display u_display(
  23.     .clk_1Hz(clk_1Hz),
  24.     .rst_n(rst_n),
  25.     .pause(pause_clean),
  26.     .led(led)
  27. );
  28. endmodule
复制代码
四、引脚分配(DE2-115)


五、实际效果



  • 上电后,LED从右至左依次点亮,周期1秒。
  • 按下KEY1可停息流水灯,再次按下规复。

  fpga2


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表