文章目录
- verilog实现pwm呼吸灯
- 一、简介
- 二、代码设计
- 三、仿真代码编写
- 四、仿真结果
- 五、总结
verilog实现pwm呼吸灯
一、简介
呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。其广泛应用于手机之上,并成为各大品牌新款手机的卖点之一,起到一个通知提醒的作用。今天我们就用开发板实现一个呼吸灯。
二、代码设计
module pwm(
input wire clk,
input wire rst_n,
output wire led
);
parameter COUNT1 = 6'd50;
parameter COUNT2 = 10'd1000;
parameter COUNT3 = 10'd1000;
reg[5:0] cnt1;
reg[9:0] cnt2;
reg[9:0] cnt3;
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
cnt1 <=6'd0;
end
else if(cnt1 == COUNT1 - 1)begin
cnt1 <= 6'd0;
end
else begin
cnt1 <= cnt1 + 1;
end
end
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
cnt2 <= 10'd0;
end
else if(cnt1 == COUNT1 - 1)begin
if(cnt2 == COUNT2 - 1)
cnt2 <= 10'd0;
else begin
cnt2 <= cnt2 + 1;
end
end
else begin
cnt2 <= cnt2;
end
end
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
cnt3 <= 10'd0;
end
else if(cnt2 == COUNT2 - 1 && cnt1 == COUNT1 - 1)begin
if(cnt3 == COUNT3 - 1)
cnt3 <= 10'd0;
else begin
cnt3 <= cnt3 + 1;
end
end
else begin
cnt3 <= cnt3;
end
end
assign led = cnt3>cnt2?1:0;
endmodule
三、仿真代码编写
module pwm_tb();
reg clk;
reg rst_n;
wire led;
parameter SYS_CLK = 20;
parameter TIME_US = 5;
parameter TIME_MS = 10;
parameter TIME_S = 10;
always #(SYS_CLK/2) clk = ~clk;
initial begin
clk<=1'b0;
rst_n<=1'b0;
#(SYS_CLK*2);
rst_n<=1'b1;
#(2*(TIME_S+1)*(TIME_MS+1)*(TIME_US+1)*SYS_CLK);
$stop;
end
pwm #(
.COUNT1(TIME_US),
.COUNT2(TIME_MS),
.COUNT3(TIME_S)
) inst_pwm (
.clk (clk),
.rst_n (rst_n),
.led (led)
);
endmodule
四、仿真结果
五、总结
verilog实现呼吸灯需要三个计数器来控制,达到呼吸灯的效果,总体来说不难