基于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)
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) beginif (!rst_n) begincnt <= 26'd0;clk_1Hz <= 1'b0;endelse if (cnt == 26'd49_999_999) begin // 计数满50,000,000次cnt <= 26'd0;clk_1Hz <= ~clk_1Hz; // 输出翻转endelse begincnt <= 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) beginif (!rst_n) beginstate <= 3'd0;led <= 6'b000001; // 初始状态:第1个LED亮endelse 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;endcasestate <= (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) beginif (key_in != key_out) beginif (cnt == 20'd999_999) beginkey_out <= key_in; // 稳定后更新cnt <= 20'd0;endelse cnt <= cnt + 1;endelse 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