呼吸灯
控制一个LED灯在1s内从灭慢慢到亮,下一秒内从亮慢慢到灭。循环往复。
LED的亮度可以由点亮时间与熄灭时间长度来控制。一个毫秒里,亮0us,灭1000us,下一毫秒亮1us灭999us,下一下毫秒里,亮2us灭998us,在下一毫秒里,亮3us灭997us,依次进行下去,直到1000us亮,0us灭。
思路分析:
1、不管led灯的亮灭都是1ms,这样我们可以直接定义时间T=50_000(1ms);
2、1ms=1000us,50M时钟的的1us=50个时钟周期;
3、每增加1ms,同时也新增1us;
4、亮1ms后状态切换
module breath_led (
input wire clk,
input wire rst,
output reg [7:0] led
);
reg [1:0] cstate;
localparam s0=0;
localparam s1=1;
reg [15:0] i; //亮灯时间
reg [15:0] cnt; //计时器
localparam T=50_000; //1ms
always@(posedge clk or posedge rst) begin
if(rst) begin
cnt<=0;
led<=8'b0000_0000;
cstate<=0;
end
else
case(cstate)
s0 : begin
if(i==T && cnt==T-1) begin
cstate<=s1;
cnt<=0;
end
else if(cnt==T-1) begin
i<=i+50;
cnt<=0;
end
else begin
cstate<=s0;
cnt<=cnt+1;
end
if(cnt<i)
led<=8'b1111_1111;
else
led<=8'b0000_0000;
end
s1 : begin
if(i==0 && cnt==T-1) begin
cstate<=s0;
cnt<=0;
end
else if(cnt==T-1) begin
i<=i-50;
cnt<=0;
end
else begin
cstate<=s1;
cnt<=cnt+1;
end
if(cnt<i)
led<=8'b1111_1111;
else
led<=8'b0000_0000;
end
default : led<=8'b0000_0000;
endcase
end
endmodule