FPGA学习(二)——基于DE2-115开发板的LED流水灯设计
基于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) 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