做服装必须看的十大网站,怎么查网站icp,网站制作需要多少钱官网,wordpress文章中添加音乐参考野火例程
实现呼吸灯即要调整led亮的占比时间#xff0c;完成视觉上看起来由灭到亮或者由亮到灭的过程。
如果主频为50MHz#xff0c;理论上一秒钟我们可以控制50_000_000次led的亮和灭#xff0c;肉眼不可能分辨出来每一次亮灭#xff0c;如果这50M我们设定为间隔一…参考野火例程
实现呼吸灯即要调整led亮的占比时间完成视觉上看起来由灭到亮或者由亮到灭的过程。
如果主频为50MHz理论上一秒钟我们可以控制50_000_000次led的亮和灭肉眼不可能分辨出来每一次亮灭如果这50M我们设定为间隔一次亮一次那么看起来led应该是常亮的且亮度应该只有全亮的一半。通过这两种设定的比较其实我们已经实现了pwm控制输出比接下来需要考虑的是如何实现变化的过程。上文所述的亮灭最小控制时间是1s/50_000_000时间除以主频下文所述方法把单次亮灭的持续时间设定为1us也就是1us内灯是全亮或全灭的。将led单次由灭到亮或由亮到灭的变换时间设定为1s。那么接下来就是设定亮的占比。1s1000ms1000_000us也即1s我们可以控制1_000_000次亮灭。我们把1s分为1000个阶段每个阶段可以控制1000次亮灭那么只需要让第一个阶段亮1次第二个阶段亮2次第三个阶段亮3次·····第999个阶段亮999次第1000各阶段亮1000次那么这个过程就完成了从全灭到全亮的变化。也即1s的变化中第1ms亮1us第2ms亮2us······
design code
timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/04/13 09:31:22
// Design Name:
// Module Name: breath_led
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module breath_led#(parameter CNT_1US 6d49,parameter CNT_1MS 10d999,parameter CNT_1S 10d999
)
(input sys_clk,input sys_rst_n,output reg led
);reg [5:0] cnt_1us;//1us内灯全灭或全亮
reg [9:0] cnt_1ms;//1ms的1000个uscnt_1s是多少就有多少个us亮
reg [9:0] cnt_1s;//1s内的第几个msreg led_state;//0从灭到亮1从亮到灭用于计算cnt_1s是加还是减//us计数
always (posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n 1b0)cnt_1us 6b0;else if(cnt_1us CNT_1US)cnt_1us 6b0;elsecnt_1us cnt_1us 1b1;
end
//ms计数
always (posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n 1b0)cnt_1ms 10b0;else if(cnt_1us CNT_1US cnt_1ms CNT_1MS)//这里注意一定是同时满足才清零下面的判定条件同理cnt_1ms 10b0;else if(cnt_1us CNT_1US)cnt_1ms cnt_1ms 1b1;
end
//s计数
always (posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n 1b0)cnt_1s 10b0;else if(cnt_1us CNT_1US cnt_1ms CNT_1MS led_state 1b0)cnt_1s cnt_1s 1b1;else if(cnt_1us CNT_1US cnt_1ms CNT_1MS led_state 1b1)cnt_1s cnt_1s - 1b1;
end
//state转换
always (posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n 1b0)led_state 1b0;else if(cnt_1us CNT_1US cnt_1ms CNT_1MS cnt_1s CNT_1S)led_state 1b1;else if(cnt_1us 6b0 cnt_1ms 10b0 cnt_1s 10b0)led_state 1b0;elseled_state led_state;
end
//led输出逻辑
always (posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n 1b0)led 1b1;else if(cnt_1ms cnt_1s)//当前是第几个ms则该ms内就有多少个us是亮的led 1b0;elseled 1b1;
endendmodule
simulation code
timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/04/13 10:17:13
// Design Name:
// Module Name: vtf_breath_led_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vtf_breath_led_test();reg sys_clk;
reg sys_rst_n;
wire led;initial beginsys_clk 1b0;sys_rst_n 1b0;
#20sys_rst_n 1b1;
endalways #10 sys_clk ~sys_clk;breath_led #(.CNT_1US(1b1),.CNT_1MS(5d19),.CNT_1S(5d19)
) bled(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.led(led)
);
endmodule