呼吸灯原理简介 + FPGA实现呼吸灯
所谓呼吸灯,就是是指灯光在微电脑的控制之下完成由亮到暗再由暗到亮的逐渐变化,感觉好像是人在呼吸,主要用于起通知提醒的作用。
本文简要介绍一下呼吸灯的原理,最后附上FPGA的呼吸灯Verilog HDL代码。希望能给各位读者些许帮助。
呼吸灯的效果是灯逐渐由暗变亮再逐渐由亮变暗周而复始像人在呼吸一样。大家可能会想到如果能实现逐渐增加电压再逐渐减小电压就能轻松实现。但是FPGA的引脚电压只有“0”和“1”两个等级。因此通过FPGA引脚实现“正弦波式”信号输出是不现实的。所以事实上都是通过改变引脚单位时间内高电平的输出时间来实现呼吸灯,也就是让FPGA引脚输出一系列PWM波信号并不断改变PWM波的占空比。
呼吸灯分为两个阶段:
第一阶段:由暗到亮。就是输出的一系列PWM波占空比由0%到100%以1%为间隔递增,共100个周期PWM波。
第二阶段:由亮到暗。就是输出的一系列PWM波占空比由100%到0%以1%为间隔递减,共100个周期PWM波。
注意:
有两个100:一个100为占空比100%;另一个100为由0%到100%或100%到0%需要100个周期PWM波。
FPGA呼吸灯代码Breath_LED.v:
/*************************************************
// 文件说明: led呼吸灯代码
// 创 建 人: mnWu522
// 日期: 2020-2-11
// 修 改 人:
// 修改日期: 20xx-xx-xx
*************************************************/
module Breath_LED(
input clk,
output reg led
);
reg [12:0]cnt1;
reg [8:0]cnt2;
reg [8:0]cnt3;
reg flag;
initial flag <= 0;
initial cnt1 <= 0;
initial cnt2 <= 0;
initial cnt3 <= 0;
always @(posedge clk)
begin
if(cnt1 == 5000)begin
cnt2 <= cnt2 + 1;
cnt1 <= 0;
end else begin
cnt1 <= cnt1 +1;
end
if(cnt2 == 99)begin
cnt3 <= cnt3 + 1;
cnt2 <= 0;
end
if(cnt3 == 99)begin
flag <= ~flag;
cnt3 <= 0;
end
if(cnt2 >= cnt3 && flag == 0)begin
led <= 1;
end else if(cnt2 <= cnt3 && flag == 0)begin
led <= 0;
end else if(cnt2 >= cnt3 && flag == 1)begin
led <= 0;
end else if(cnt2 <= cnt3 && flag == 1)begin
led <= 1;
end
end
endmodule
代码讲解:
该代码实现一个2s的呼吸灯,1s由暗到亮,1s由亮到暗。
由第二个100得一个PWM波周期为1s/100=10ms;
由第一个100得1%占空比为10ms/100=100us;
cnt1加到5000是因为本代码默认时钟为50MHz,5000/50000000Hz=100us,可根据FPGA实际情况自行修改。