FPGA——实现LED流水灯
文章目录
- 一、Quartusll_18.1和VS Code软件的关联
- 二、DE2-115的时钟电路
- 三、流水灯的分层次设计
- 四、总结
一、Quartusll_18.1和VS Code软件的关联
1.先打开Quartus II 软件,然后选择菜单栏“Tools”下的“Options…”。
2.点击“Options…”,在弹出的对话框中,选择“General”选项卡下的“Preferred Text Editor”,默认使用的编 辑器是“QuartusII Test Editor”。
在“Text editor:”栏选择“Custom”选项并在“Command-line”栏通过路径浏览按钮选择 VS Code的路径。路径定位到“Code. exe”启动文件,再在后缀上加入-g %f:%l,路径根据自己的VS Code路径修改(就是-g前面冒号中的路径)。然后再点击“OK”完成 Quartus II 18.1 与VS Code的关联。
二、DE2-115的时钟电路
DE2-115 包含一个生成 50MHz 频率时钟信号的有源晶体振荡器,另有一个时钟缓冲器用来将缓冲后的低抖动 50MHz 时钟信号分配给 FPGA。这些时钟信号用来驱动 FPGA 内的用户逻辑电路。开发板还包含两个 SMA 连接头,用来接收外部时钟输入信号到 FPGA 或者将 FPGA的时钟信号输出到外部。另外,所有这些时钟输入都连接到 FPGA 内部的 PLL 模块上,用户可以将这些时钟信号作为 PLL 电路的时钟输入。
DE2-115 板子上的时钟分配信息和 FPGA 芯片相关的引脚配置信息如下图所示。
所以1秒所需的时钟周期数为50000000次。
三、流水灯的分层次设计
在DE2-115开发板上,用Verilog设计一个LED流水灯实验:用6个LED完成周期为1秒的跑马灯效果。
top顶层模块
module led_top(
input clk,
input reset_n,
input pause,
output [5:0] led
);
// 顶层模块:实例化各子模块
wire clk_1hz; // 分频时钟信号
clock_divider divider_inst(
.clk(clk),
.reset_n(reset_n),
.clk_1hz(clk_1hz)
);
led_display display_inst(
.clk(clk),
.reset_n(reset_n),
.pause(pause),
.clk_1hz_en(clk_1hz),
.led(led)
);
endmodule
分频模块
module clock_divider(
input clk,
input reset_n,
output reg clk_1hz
);
// 分频模块:50MHz -> 1Hz
parameter MAX_COUNT = 26'd49_999_999; // 50MHz时钟分频
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
clk_1hz <= 1'b0;
end else begin
if (counter >= MAX_COUNT) begin
counter <= 26'd0;
clk_1hz <= ~clk_1hz;
end else begin
counter <= counter + 1;
end
end
end
reg [25:0] counter;
endmodule
显示模块
module led_display(
input clk,
input reset_n,
input pause,
input clk_1hz_en, // 来自分频模块的使能信号
output reg [5:0] led
);
// 显示模块:包含状态机和输出控制
reg [2:0] state;
reg running;
// 状态机控制
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
state <= 3'd0;
running <= 1'b1;
end else begin
// 处理暂停按键
if (pause) running <= ~running;
// 状态转移(使用分频后的时钟使能)
if (running && clk_1hz_en) begin
state <= (state == 3'd5) ? 3'd0 : state + 1;
end
end
end
// LED输出控制(保持不变)
always @(*) begin
case(state)
3'd0: led = 6'b000001;
3'd1: led = 6'b000010;
3'd2: led = 6'b000100;
3'd3: led = 6'b001000;
3'd4: led = 6'b010000;
3'd5: led = 6'b100000;
3'd5: led = 6'b100000;
default: led = 6'b000000;
endcase
end
endmodule
引脚连接配置图
烧录结果
FPGA——流水灯
四、总结
通过本次实验,初步了解到了计数器的思想,而且通过分层次化设计使实验更具有可视性。但是在本次实验中也存在不足,需要一直按着暂停键才能达到暂停的效果。所以,接下来我需要取研究如何实现按下一次实现暂停,再次按下又恢复流水灯效果。
参考资料
https://blog.csdn.net/Lee_tr/article/details/122487570
https://blog.csdn.net/crrrd/article/details/136227780
https://blog.csdn.net/LX567567/article/details/138727302