任务目标
实现呼吸灯效果。
实现代码
`timescale 1ns / 1ps
module breathled(
input sysclk ,
input rst_n ,
output led
);
reg [31:0] cnt_ms;
reg [31:0] cnt_us;
reg [31:0] cnt_ns;
reg cnt_s;
always@(posedge sysclk)
if(!rst_n)begin
cnt_ms <= 32'd0;
cnt_us <= 32'd0;
cnt_ns <= 32'd0;
cnt_s <= 32'd0;
end
else if(cnt_ms >= 999 && cnt_us >= 999 && cnt_ns >= 124)begin
cnt_ms <= 32'd0;
cnt_us <= 32'd0;
cnt_ns <= 32'd0;
cnt_s <= cnt_s + 32'd1;
end
else if(cnt_us >= 999 && cnt_ns >= 124)begin
cnt_ms <= cnt_ms + 32'd1;
cnt_us <= 32'd0;
cnt_ns <= 32'd0;
cnt_s <= cnt_s;
end
else if(cnt_ns >= 124)begin
cnt_ms <= cnt_ms;
cnt_us <= cnt_us + 32'd1;
cnt_ns <= 32'd0;
cnt_s <= cnt_s;
end
else begin
cnt_ms <= cnt_ms;
cnt_us <= cnt_us;
cnt_ns <= cnt_ns + 32'd1;
cnt_s <= cnt_s;
end
assign led = (!cnt_s) ? ((cnt_ms >= cnt_us) ? 1:0) : ((cnt_ms >= cnt_us) ? 0:1);
endmodule
结语
呼吸灯最根本的原理也就是PWM占空比的变化,导致LED单位时间实际平均电压变化。