` 本帖最后由 西疆木 于 2016-8-29 10:37 编辑
基于FPGA的呼吸灯简单实验程序(Verilog)
雾盈 2016-7-26
1.呼吸灯 呼吸灯最早是由苹果公司发明并应用于笔记本睡眠提示上,一经展出,立刻吸引众多科技厂商争相效仿。将其广泛用于各种电子产品中,尤其是智能手机。 呼吸灯其实是微电脑控制下,由暗渐亮,然后再由亮渐暗,模仿人呼吸方式的LED灯
2.呼吸灯原理
LED的亮度与流过的电流成正比。在一定的频率之下,如果占空比是0,则LED不亮;如果占空比是100%,则LED最亮;如果占空比刚好是50%,则LED亮度适中。如果我们让占空比从0~100%变化,再从100%~0不断变化,就可以实现LED一呼一吸的效果。 其波形占空比示意图如下所示:
呼吸灯占空比示意图
3.呼吸灯程序设计思路
(1)首先确定PWM的频率为1Khz
(2)由频率算出周期 T = 1/f = 1ms
(3)根据每次呼1s,吸1s,算出计数值1s/1ms=1000
(4)然后将1ms分成1000份,每一份是1us
(5)写三个 1us、1ms、1s的3个计数器count1、 count2、 Count3,最后count2和count3进行比较
4.程序框图
5.状态机设计
可以将呼吸灯运行过程归为两个状态:S0:由灭渐亮;S1:由亮渐灭。
这里就会有两个问题需要我们解决,
1、 状态的翻转 2、在一个状态里如何使pwm波的占空比实现逐增或逐减。
先说第一个问题,两个状态的翻转 由下面的时序图可以看出来,两个状态的翻转只是由时间决定的,S0状态和S1状态分别持续1s, 可以将它看成周期为2s的时钟信号,每当flag_1s信号到来一次,状态就翻转一次。
然后再来说第二个问题,
在一个状态下如何实现PWM波占空比逐增逐减的过程。
以S0状态下,LED由灭渐亮,PWM波占空比由百分之百逐渐减小至零为例:
我们发现让count2与count3比较,其结果clk_out会出现这种占空比逐渐减小的结果。
此段代码如下:
于是,由反逻辑可以轻易知道在S1状态下,如何使其输出的clk_out占空比由小到大的方法,这样就可以实现LED 的由亮渐灭。
记: 整个呼吸灯程序设计主要内容大致如此,末尾附上源代码及其仿真波形,以下为程序设计中我所遇到的问题,给可能出现同样问题的童鞋提供一些参考。
Q 1:
flag_1us尖峰脉冲信号,仿真出现如下波形:
注:在用modelsim仿真波形时,我为了加快仿真速度和方便查看波形,我将所有的count的计数最大值都改为了9。
当count1 计数10拍后,count2 波形从9 跳为0 ,但是仔细一看就会发现,count2波形的9 跳为 0 时,count1 只计数了一拍,中间少了9拍。 错误的代码如下:
|
|
|
|
我说的意思是 在文章中间添加图片,这样添加图片都在末尾了,看着不方便
|
|
|
|
|
感谢楼主分项,谢谢!
|
|
|
|
|