【资料图】
呼吸灯在我们的生活中很常见,在手机上多作为消息提醒指示灯而被广泛使用,其效果是小灯在一段时间内从完全熄灭的状态逐渐变到最亮,再在同样的时间段内逐渐达到完全熄灭的状态,并循环往复。这种效果就像“呼吸”一样,有张有弛,而且给人一种很舒服的感觉。其工作原理是利用 PWM 来控制小灯在相同时间段内的不同占空比,即在同样小时间段内,小灯亮的时间依次增加到最大后再依次减小,从而实现渐亮到渐灭的“呼吸”效果。
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
如何在1ms内控制低电平时间不断增加?
cnt_1s 1 2 3cnt_1ms 0 1 .... 999 0 1 .... 999 0 1 2 ... 999第1个周期cnt_1ms有1个周期的数值小于cnt_1s第2个周期cnt_1ms有2个周期的数值小于cnt_1s第3个周期cnt_1ms有3个周期的数值小于cnt_1s.............第999个周期cnt_1ms有999个周期的数值小于cnt_1s
module breath_led#(parameter CNT_1US_MAX = 6"d49 ,parameter CNT_1MS_MAX = 10"d999 ,parameter CNT_1S_MAX = 10"d999)(input wire sys_clk , //系统时钟 50MHzinput wire sys_rst_n , //全局复位 output reg led_out //输出信号,控制 led 灯 ); //reg define reg [5:0] cnt_1us ;reg [9:0] cnt_1ms ;reg [9:0] cnt_1s ;reg cnt_1s_en ;//cnt_1us:1us 计数器always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1"b0)cnt_1us <= 6"b0;else if(cnt_1us == CNT_1US_MAX)cnt_1us <= 6"b0;elsecnt_1us <= cnt_1us + 1"b1;//cnt_1ms:1ms 计数器always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1"b0)cnt_1ms <= 10"b0;else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)cnt_1ms <= 10"b0;else if(cnt_1us == CNT_1US_MAX)cnt_1ms <= cnt_1ms + 1"b1;//cnt_1s:1s 计数器always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1"b0)cnt_1s <= 10"b0;else if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)cnt_1s <= 10"b0;else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)cnt_1s <= cnt_1s + 1"b1;//cnt_1s_en:1s 计数器标志信号always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1"b0)cnt_1s_en <= 1"b0;else if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)cnt_1s_en <= ~cnt_1s_en;//led_out:输出信号连接到外部的 led 灯always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1"b0)led_out <= 1"b0;else if((cnt_1s_en == 1"b1 && cnt_1ms < cnt_1s) || (cnt_1s_en == 1"b0 && cnt_1ms > cnt_1s))led_out <= 1"b0;elseled_out <= 1"b1;endmodule
`timescale 1ns/1nsmodule tb_breath_led();//wire definewire led_out ; //reg definereg sys_clk ;reg sys_rst_n ; //********************************************************************/ //***************************** Main Code ****************************// //********************************************************************// //初始化系统时钟、全局复位initial beginsys_clk = 1"b1;sys_rst_n <= 1"b0;#20sys_rst_n <= 1"b1;end //sys_clk:模拟系统时钟,每 10ns 电平翻转一次,周期为 20ns,频率为 50MHzalways #10 sys_clk = ~sys_clk;breath_led#(.CNT_1US_MAX(6"d4 ),.CNT_1MS_MAX(10"d9 ),.CNT_1S_MAX (10"d9 ))breath_led_inst(.sys_clk (sys_clk ), //input sys_clk.sys_rst_n (sys_rst_n ), //input sys_rst_n.led_out (led_out ) //output led_out); endmodule
标签:
Copyright © 2015-2022 北冰洋经营网版权所有 备案号:沪ICP备2020036824号-3 联系邮箱:562 66 29@qq.com