一 .原理概述
PWM,Pulse Width Modulation,脉冲宽度调制,也就是说脉冲波形的占空比是可以调节。
呼吸灯顾名思义,随着呼吸的节奏,灯也是逐步变亮和变灭,这是两个步骤。
我们将开始点亮和最亮这段时间,无限等分,可以推导在单位时长内,控制变亮的电路所占的比重逐渐增加,到最后是全份额;变灭也是同等过程。
同上原理,因此我们可以设计相关的实现。
二 .代码实现
FPGA逻辑控制本身就3种东西:状态机,计数器,RAM
module LED
#(
parameter DELAY_us = 125,
parameter DELAY_ms = 1000,
parameter DELAY_s = 1000
)(
input sclk,
input rst_n,
output wire led
);
//-----------------------------------------------------------
reg [9:0] cnt_1;
reg [9:0] cnt_2;
reg [9:0] cnt_3;
reg delay_mode;
reg power;
wire [9:0] en = cnt_2;
wire [9:0] light = cnt_3;
//-----------------------------------------------------------
wire delay_1us = (cnt_1==DELAY_us-1'b1)?1'b1:1'b0;
wire delay_1ms = (delay_1us&&cnt_2==DELAY_ms-1'b1)?1'b1:1'b0;
wire delay_1s = (delay_1ms&&cnt_3==DELAY_s-1'b1)?1'b1:1'b0;
//-----------------------------------------------------------
always@(posedge sclk or negedge rst_n)
begin
if (!rst_n)
cnt_1 <= 10'd0;
else if (cnt_1==DELAY_us-1'b1)
cnt_1 <= 10'd0;
else
cnt_1 <= cnt_1+1'b1;
if (!rst_n)
cnt_2 <= 10'd0;
else if (delay_1us&&cnt_2==DELAY_ms-1'b1)
cnt_2 <= 10'd0;
else if (delay_1us)
cnt_2 <= cnt_2+1'b1;
if (!rst_n)
cnt_3 <= 10'd0;
else if (delay_1ms&&cnt_3==DELAY_s-1'b1)
cnt_3 <= 10'd0;
else if (delay_1ms)
cnt_3 <= cnt_3+1'b1;
if (!rst_n)
delay_mode <= 1'b0;
else if (delay_1s)
delay_mode <=~delay_mode;
else ;
end
always@(posedge sclk or negedge rst_n)
if (!rst_n)
power <= 1'b0;
else case (delay_mode)
1'b0:power <= (en<light)? 1'b1:1'b0;
1'b1:power <= (en<light)? 1'b0:1'b1;
endcase
//-----------------------------------------------------------
assign led = power ;
endmodule
/*
led
#(
.DELAY_us(1),
.DELAY_ms(100),
.DELAY_s(100)
) led_inst
( .sclk(sclk),
.rst_n(s_rst_n),
.led(led)
);
*/
没有回复内容