module water_led
#(
parameter CNT_MAX = 25'd24_999_999
)
(
input wire sys_clk,
input wire sys_rst_n,
output wire [3:0] led_out1
);
reg [24:0] cnt;
reg cnt_flag;
reg [4:0] led_out;
always @(posedge sys_clk or negedge sys_rst_n)
begin
if (sys_rst_n == 1'b0)
begin
cnt <= 25'd0;
end
else if(cnt == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt +25'd1;
end
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_flag <= 1'b0;
else if(cnt == (CNT_MAX - 25'd1))
cnt_flag <= 1'b1;
else
cnt_flag <= 1'b0;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
led_out <= 4'b0001;
else if((led_out == 4'b1000)&&(cnt_flag == 1'b1))
led_out <= 4'b0001;
else if(cnt_flag == 1'b1)
led_out <= led_out << 1'b1;
else
led_out <= led_out;
assign led_out1 = ~led_out;
endmodule
代码部分补充一点 移位默认都是补零的,如果达不到你想要的需求你可以取反,再取反得到你想要的数据
`timescale 1ns/1ns
module tb_water_led();
reg sys_clk;
reg sys_rst_n;
wire [3:0] led_out;
initial begin
sys_clk <= 1'b1;
sys_rst_n <= 1'b0;
#60
sys_rst_n <= 1'b1;
end
always #10 sys_clk = ~sys_clk;
water_led
#(
.CNT_MAX (25'd24)
)
water_led_inst
(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.led_out1 (led_out)
);
endmodule