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