网站建设百度推广说词,网站转app工具,网站运营与建设,html编辑器在哪里文章目录 前言一、呼吸灯是什么#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境#xff1a; 1、Quartus18.0 2、vscode 3、板子型号#xff1a;EP4CE6F17C8 要求#xff1a; 将四个LED灯实现循环… 文章目录 前言一、呼吸灯是什么1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境 1、Quartus18.0 2、vscode 3、板子型号EP4CE6F17C8 要求 将四个LED灯实现循环从亮到灭、灭到亮的过程。下面我使用了两种方法供大家阅读。 一、呼吸灯是什么
呼吸灯其实是在微处理器的控制下由暗渐亮、然后再由亮渐暗模仿人呼吸方式的 LED 灯。
1、介绍 呼吸灯采用 PWM 的方式在固定的频率下通过调整占空比的方式来控制 LED 灯亮度的变化。PWMPulse Width Modulation即脉冲宽度调制它利用微处理器输出的 PWM 信号实现对模拟电路控制的一种非常有效的技术广泛应用于测量、通信、功率控制等领域。 在由计数器产生的固定周期的 PWM 信号下如果其占空比为 0则 LED 灯不亮如果其占空比为100%则 LED 灯最亮。所以将占空比从 0 到 100%再从 100%到 0 不断变化就可以实现 LED 灯的“呼吸”效果。 2、占空比调节示意图 二、系统设计
1、系统框图 2、RTL视图
方法一 方法二
三、源码
方法一
module BREATH_LED(input sys_clk , //时钟信号 50Mhzinput sys_rst_n , //复位信号output [3:0] led //LED
);//reg define
reg [15:0] period_cnt ; //周期计数器频率1khz 周期:1ms 计数值:1ms/20ns50000
reg [15:0] duty_cycle ; //占空比数值
reg inc_dec_flag ; //0 递增 1 递减//*****************************************************//** main code//*****************************************************//根据占空比和计数值之间的大小关系来输出 LEDassign led (period_cnt duty_cycle) ? 4b1111 : 4b0000;//周期计数器always (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)period_cnt 16d0;else if(period_cnt 16d50000)period_cnt 16d0;elseperiod_cnt period_cnt 1b1;end//在周期计数器的节拍下递增或递减占空比always (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n) beginduty_cycle 16d0;inc_dec_flag 1b0;endelse beginif(period_cnt 16d50000) begin //计满 1msif(inc_dec_flag 1b0) begin //占空比递增状态if(duty_cycle 16d50000) //如果占空比已递增至最大inc_dec_flag 1b1; //则占空比开始递减 else //否则占空比以 25 为单位递增elseduty_cycle duty_cycle 16d25;endelse begin //占空比递减状态if(duty_cycle 16d0) //如果占空比已递减至 0inc_dec_flag 1b0; //则占空比开始递增else //否则占空比以 25 为单位递减duty_cycle duty_cycle - 16d25;endendendendendmodule方法二
module BREATH #(
parameter
TIME_US 6d49,
TIME_MS 10d999,
TIME_S 10d999)
(input clk,input rst_n,output reg [3:0]led
);// parameter TIME_US 6d49;
// parameter TIME_MS 10d999;
// parameter TIME_S 10d999;reg [5:0] cnt_us;
reg [9:0] cnt_ms;
reg [9:0] cnt_s;
reg flag;wire add_cnt_us;
wire end_cnt_us;wire add_cnt_ms;
wire end_cnt_ms;wire add_cnt_s;
wire end_cnt_s;always (posedge clk or negedge rst_n)beginif(!rst_n)begincnt_us 6d0;endelse if(add_cnt_us)beginif(end_cnt_us)begincnt_us 6d0;endelse begincnt_us cnt_us 1d1;endendelse begincnt_us cnt_us;end
endassign add_cnt_us 1b1;
assign end_cnt_us add_cnt_us cnt_us TIME_US;always (posedge clk or negedge rst_n)beginif(!rst_n)begincnt_ms 10d0;endelse if(add_cnt_ms)beginif(end_cnt_ms)begincnt_ms 10d0;endelse begincnt_ms cnt_ms 1d1;endendelse begincnt_ms cnt_ms ;end
endassign add_cnt_ms end_cnt_us;
assign end_cnt_ms add_cnt_ms cnt_ms TIME_MS;always (posedge clk or negedge rst_n)beginif(!rst_n)begincnt_s 10d0;endelse if(add_cnt_s)beginif(end_cnt_s)begincnt_s 10d0;endelse begincnt_s cnt_s 1d1;endendelse begincnt_s cnt_s ;end
endassign add_cnt_s end_cnt_ms;
assign end_cnt_s add_cnt_s cnt_s TIME_S;always (posedge clk or negedge rst_n)beginif(!rst_n)beginflag 1b0;endelse if(end_cnt_s)beginflag ~flag;endelse beginflag flag;end
end
//通过比较秒与毫秒的计数大小实现占空比的变化
//因为毫秒在秒每加一后都会重新开始使得高低电平的占比不同
//实际上呼吸灯周期就是秒计数周期变换的占空比大小就是循环加1或减一
always (posedge clk or negedge rst_n)beginif(!rst_n)beginled 4b0000;endelse if(!flag)beginled (cnt_s cnt_ms)?4b0000:4b1111;endelse if(flag)beginled (cnt_s cnt_ms)?4b1111:4b0000;endelseled led;
end
endmodule实际上我更喜欢第一种代码简洁易懂。 四、效果 呼吸灯 五、总结
呼吸灯的实现过程并不难在原有的stm32实现呼吸灯的理解下更加透彻就是通过控制周期里占空比的变化来实现。但值得一提的是第一种实现方法确实比较精简。
六、参考资料
以上资料均来自正点原子的教学视频或开拓者2开发教程 原子官方