流水灯原理:
控制led,依次让led进行亮灭,实现流水灯效果
实验目的:用一个按键可以开关控制流水灯的流动与停止
模块框图:
wat_led 模块代码
module wat_led(
input wire clk_50mhz ,//系统时钟50Mhz
input wire rst_n ,//全局复位
input wire wat_led_flag ,//输入信号,一个高电平周期
output reg [3:0] led //输出信号
);
parameter S_MAX = 26'd49_999_999; //计时1s
reg [25:0] sum_s; //计数器
reg [1:0] qs; //控制灯的亮灭状态
reg wat_led_flag_h ;//把输入信号wat_led_flag处理为电平反转信号
always@( posedge clk_50mhz or negedge rst_n) begin
if (rst_n==1'b0) begin
wat_led_flag_h <= 1'b0;
end
else if (wat_led_flag == 1'b1) begin
wat_led_flag_h <= ~wat_led_flag_h;
end
else begin
wat_led_flag_h <= wat_led_flag_h;
end
end
always@( posedge clk_50mhz or negedge rst_n) begin
if (rst_n==1'b0) begin
sum_s <= 26'd0;
end
else if (sum_s == S_MAX) begin
sum_s <= 26'd0;
end
else begin
sum_s <=sum_s+ 26'd1;
end
end
always@( posedge clk_50mhz or negedge rst_n) begin
if (rst_n==1'b0) begin
qs <= 3'd0;
end
else if (sum_s == S_MAX) begin
qs <= qs+ 3'd1;
end
else begin
qs <= qs;
end
end
always@( posedge clk_50mhz or negedge rst_n)
begin
if (rst_n==1'b0) begin
led <= 4'b0000;
end
else if(wat_led_flag_h==1'b1) begin
case(qs)
2'b00: led <= 4'b0001;
2'b01: led <= 4'b0010;
2'b10: led <= 4'b0100;
2'b11: led <= 4'b1000;
default: led <= 4'b0000;
endcase
end
end
endmodule
key_filter模块代码,见我的这一篇文章 :用FPGA设计软件按键消抖-CSDN博客
key_wat_led模块代码,如下:
module key_wat_led (
input wire clk_50mhz , //系统时钟50Mhz
input wire rst_n , //全局复位
input wire key_in , //按键输入信号
output wire [3:0] led //输出信号
);
wire key_flag;
key_filter key_filter_inst
(
.clk_50mhz (clk_50mhz) , //系统时钟50Mhz
.rst_n (rst_n ) , //全局复位
.key_in (key_in ) , //按键输入信号
.key_flag (key_flag ) //key_flag为1时表示消抖后检测到按键被按下
//key_flag为0时表示没有检测到按键被按下
);
wat_led wat_led_inst
(
.clk_50mhz (clk_50mhz ) ,//系统时钟50Mhz
.rst_n (rst_n ) ,//全局复位
.wat_led_flag (key_flag ) ,//输入信号,一个高电平周期
.led (led ) //输出信号
);
endmodule //key_wat_led