FPGA实现LED流水灯
一、实验要求
在DE2-115开发板上,用Verilog设计一个LED流水灯实验:用6个LED完成周期为1秒的跑马灯效果。
规范化要求:
1)安装VScode,在其中下载安装Verilog-HDL/SystemVerilog插件(实现Verilog代码的语法高亮/自动补全);
2)采用层次化设计,分别在VScdoe编程各代码文件,如top顶层模块(比如LedBlink.v)、分频模块(fenpin.v)、显示模块(display.v);
3)尽量采用计数器、状态机思想;
4)增加流水灯的按键暂停、按键恢复功能。
二、实验内容
1.下载VScode和配置verilog编程
VScode下载就从官网上下载就行,让后在扩展里搜索verilog
下载完后可以再下载个ctags并配置,参考VSCode中Ctags配置及下载链接。配置完后就可以写程序了。
2.实现跑马灯功能,并可以通过按键中断
fenpin.v代码
module fenpin (
input clk,
input rst_n,
output reg en
);
parameter CLK_FREQ = 50_000_000; // 50MHz时钟
parameter DIV_CNT = CLK_FREQ - 1;
reg [25:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 0;
en <= 0;
end
else begin
en <= 0;
if (cnt == DIV_CNT) begin
cnt <= 0;
en <= 1;
end
else begin
cnt <= cnt + 1;
end
end
end
endmodule
display.v代码
module display (
input clk,
input rst_n,
input en,
output reg [5:0] led
);
reg [2:0] state;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= 0;
led <= 6'b000001;
end
else if (en) 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;
default: led <= 6'b000001;
endcase
state <= (state == 3'd5) ? 3'd0 : state + 1;
end
end
endmodule
LedBlink_with_pause.v
module LedBlink_with_pause (
input clk,
input rst_n,
input pause_key,
output [5:0] led
);
wire en;
wire pause;
fenpin u_fenpin (
.clk (clk),
.rst_n (rst_n),
.en (en)
);
pause_ctrl u_pause (
.clk (clk),
.rst_n (rst_n),
.key (pause_key),
.pause (pause)
);
display u_display (
.clk (clk),
.rst_n (rst_n),
.en (en & ~pause),
.led (led)
);
endmodule
module pause_ctrl (
input clk,
input rst_n,
input key,
output reg pause
);
reg [19:0] cnt;
reg [1:0] key_sync;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
key_sync <= 2'b11;
cnt <= 0;
pause <= 0;
end
else begin
key_sync <= {key_sync[0], key};
if (key_sync[1]) begin // 按键未按下
cnt <= 0;
end
else if (cnt < 20'hFFFFF) begin // 20ms消抖
cnt <= cnt + 1;
end
else begin
pause <= ~pause;
cnt <= 0;
end
end
end
endmodule
在VSCode中打开终端,在源文件目录下输入vlog *.v 编译该工作目录下的全部.v文件.(也可以输入vlog xxx.v文件单独编译对应的.v文件).
编译成功。
三、上板烧录(DE2-115)
打开quartus prime 并建立项目,选择EP4CE115F29C7,将刚才的三个.v文件复制到当前目录下,添加到工程中。
引脚配置
上板结果
流水灯+按键中断
三、总结
本次实验使用了VScode在进行verilog编程,能够更加清楚明白的显示出代码错误,好修改。也进行了流水灯的仿真,学习并使用了状态机和寄存器,也更加熟悉了FPGA开发流程,算是入门了。
参考链接:
1.如何在VSCode中优雅地书写Verilog
2.VSCode中Ctags配置及下载链接