呼吸灯:
控制八个LED灯在1s内从灭慢慢到亮,下一秒内从亮慢慢到灭。循环往复。
提示:LED的亮度可以由点亮时间与熄灭时间长度来控制。比如一个毫秒里,亮0us,灭1000us,下一毫秒亮
1us灭999us,下一下毫秒里,亮2us灭998us,在下一毫秒里,亮3us灭997us,依次进行下去,直到1000us
亮,0us灭。
module breathing_light_top(
input clk,
input rst,
output reg [7:0] led
);
reg [15:0] i = 0 ;
reg [15:0] cnt ;
parameter [15:0] t = 50_000 ;
reg cstate ;
always @(posedge clk or posedge rst)
if (rst) begin
cstate = 0 ;
i <= 0 ;
cnt <= 0 ;
led <= 8'b0000_0000 ;
end
else case (cstate)
0 : begin
if (i == t && cnt == t-1) begin
cstate = 1 ;
cnt <= 0 ;
end
else if (cnt == t-1) begin
cnt <= 0 ;
i <= i + 50 ;
end
else cnt <= cnt + 1 ;
if (cnt < i)
led <= 8'b1111_1111 ;
else if (cnt >= i)
led <= 8'b0000_0000 ;
else led <= led ;
end
1 : begin
if (i == 0 && cnt == t-1) begin
cstate = 0 ;
cnt <= 0 ;
end
else if (cnt == t-1) begin
cnt <= 0 ;
i <= i - 50 ;
end
else cnt <= cnt + 1 ;
if (cnt < i)
led <= 8'b1111_1111 ;
else if (cnt >= i)
led <= 8'b0000_0000 ;
else led <= led ;
end
default : begin
cstate = 0 ;
i <= 0 ;
cnt <= 0 ;
led <= 8'b0000_0000 ;
end
endcase
endmodule