全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 可编程逻辑 >

FPGA学习系列:15. 呼吸灯(pwm)设计

时间:2018-06-13 11:21

人气:

作者:admin

标签:

导读:设计背景: 呼吸灯 广泛应用于手机之上,并成为各大品牌新款手机的卖点之一。如果手机里面有未处理的通知,比如说未接来电,未查收的短信等等, 呼吸灯 就会在控制之下完成由亮...

设计背景:

呼吸灯广泛应用于手机之上,并成为各大品牌新款手机的卖点之一。如果手机里面有未处理的通知,比如说未接来电,未查收的短信等等,呼吸灯就会在控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸起到一个通知提醒的作用。

设计原理:

关于呼吸灯设计实现的理论主要是PWM有关知识。PWMPluse Width Modulation)脉冲宽度调制,是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。并广泛应用在从测量、通信、功率控制与变换及LED照明等许多领域中。顾名思义,就是占空比可调的信号,那么什么是占空比呢?

占空比(Duty Cycle or Duty Ratio),可以解释为,在一脉冲序列中(方波),正脉冲序列的持续时间与脉冲总周期的比值。也可理解为,电路释放能量的有效时间与总释放时间的比值。

PWM是怎样实现调光呢?想要调节LED的亮度变化,实则是调节控制流经LED电流。电流增大则LED亮度增强,反之减弱。但由于电流为模拟信号,所以这时就用到了PWM。正如下图所示:

image.png

使用一系列等幅不等宽的脉冲来代替一个正弦波,脉冲的宽度根据正弦波a的幅度变化,幅度高,则脉冲宽,反之。

多数负载需要的PWM调制频率都高于10Hz,要想实现呼吸灯的效果必须提高调制频率,通常调制频率为1Khz~200Khz之间。在LED控制中PWM作用于电源部分,脉宽调制的脉冲频率通常大于100Hz,人眼就不会感到闪烁。这里我们取PWM调制频率为1KHzPWM周期为1ms

脉冲频率一定时,输出脉冲的占空比越大,相当于输出的有效电平越大,随着占空比的不同,LED的亮度也将不同。如占空比为0时,则LED不亮,为100%时,则LED最量,我们让占空比从0~100%变化,再从100%~0不断变化,则就可实现呼吸灯效果。

本设计呼吸灯的一个周期为2s,分为占空比增“吸”和占空比减“呼”两种模式,每个为1s,一个PWM周期为2ms,所以每个模式包含1000PWM周期,将每个PWM周期分为1000份,即每个时间段2us

设计架构图:

时钟50M

image.png

设计代码:

设计模块

0modulehuxi_led_state(clk,led,rst_n);

1 inputclk;

2 inputrst_n;

3

4 outputregled;

5

6 parameterT =100_000;

7

8 localparams0 =1'b0;

9 localparams1 =1'b1;

10

11 reg[25:0]lw;

12 reg[25:0]hw;

13

14 reg[16:0]count;

15

16 // 产生2MS的脉冲

17 always@(posedgeclk ornegedgerst_n)

18 if(!rst_n)

19 begin

20 count <=1'b0;

21 end

22 else

23 begin

24 if(count ==T -1)

25 begin

26 count <=1'b0;

27 end

28 else

29 begin

30 count <=count +1'b1;

31 end

32 end

33

34 wireflag;

35 assignflag =(count ==T -1)?1'b1:1'b0;

36

37 regstate;

38

39 // 通过在一个周期中加减高低电平的时间来产生PWM

40 always@(posedgeclk ornegedgerst_n)

41 if(!rst_n)

42 begin

43 lw <=T -100;

44 hw <=100;

45 state <=1'b0;

46 end

47 else

48 begin

49 case(state)

50 s0:begin

51 if(flag &&(lw >100))//判断低电平的时间

52 begin

53 lw <=lw -100;

54 hw <=hw +100;

55 state <=s0;

56 end

57 elseif(flag &&(lw ==100))

58 begin

59 hw <=hw -100;

60 lw <=lw +100;

61 state <=s1;

62 end

63 else

64 begin

65 hw <=hw;

66 lw <=lw;

67 state <=s0;

68 end

69 end

70 s1:begin

71 if(flag &&(hw >100))//判断高电平的时间

72 begin

73 hw <=hw -100;

74 lw <=lw +100;

75 state <=s1;

76 end

77 elseif(flag &&(hw ==100))

78 begin

79 hw <=hw +100;

80 lw <=lw -100;

81 state <=s0;

82 end

83 else

84 begin

85 hw <=hw;

86 lw <=lw;

87 state <=s1;

88 end

89 end

90 default:state <=s0;

91 endcase

92 end

93

94 reg[25:0]cnt;

95 regsum;

96

97 //分频模块,产生不同占空比的LED亮的时间

98 always@(posedgeclk ornegedgerst_n)

99 if(!rst_n)

100 begin

101 sum <=1'b0;

102 led <=1'b1;

103 cnt <=1'b0;

104 end

105 else

106 case(sum)

107 s0:begin

108 if(cnt <hw -1)//高电平的时间

109 begin

110 led <=1'b0;

111 cnt <=cnt +1'b1;

112 end

113 else

114 begin

115 cnt <=1'b0;

116 sum <=s1;

117 end

118 end

119 s1:begin

120 if(cnt <lw -1)//低电平的时间

121 begin

122 led <=1'b1;

123 cnt <=cnt +1'b1;

124 end

125 else

126 begin

127 cnt <=1'b0;

128 sum <=s0;

129 end

130 end

131 default:sum <=s0;

132 endcase

133

134endmodule

测试模块

0`timescale1ns/1ps

1 modulehuxi_led_state_tb();

2 regclk;

3 regrst_n;

4

5 wireled;

6

7 parameterT =100_000;

8

9 initialbegin

10 clk =1'b1;

11 rst_n =1'b0;

12

13 #200.1rst_n =1'b1;

14

15

16 end

17

18 always#10clk =~clk;

19

20

21

22 huxi_led_state huxi_led_state_date(//例化设计

23 .clk(clk),

24 .led(led),

25 .rst_n(rst_n)

26 );

27 endmodule

仿真:

image.png


仿真中可以看到点亮led等高电平在不停的增高,然后会降低,通过验证我们的设计是正确的。


温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信