- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
001_雾盈FPGA笔记之一呼吸灯简单实验(Verilog)概论
基于FPGA的呼吸灯简单实验程序(Verilog)
2016-07-27 雾盈
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拍。
错误的代码如下:
修改后的代码:
加入那部分代码的意思是当(count2 == 9 count1 == 9)时,count2 才计入下一拍。
正确的波形如下:
同理,在count3 归零时也应如此。
Q 2:flag_1ms 和flag_1s 两个尖峰脉冲信号,高电平保持时间不是一个时钟周期。如下图所示:
这里介绍一个老师讲的技巧,让flag_1ms 的波形与flag_1us 的波形相与,就可以得到flag_1ms 的波形为一个时钟周期的尖峰脉冲。代码如下:
关于呼吸灯的问题,我遇到的就是这些了,还有其他问题欢迎童鞋们补充交流。
附:仿真波形图
全局图
附:源代码
module breathe_led(
input clk,
input rst_n,
output reg [3:0] led
);
parameter COUNT_MAX = 10d999; //
parameter COUNT_LIT = 6d45;
// parameter COUNT_LIT = 6d9;
// parameter COUNT_MAX = 10d9;
//
reg [5:0] count1;
reg [9:0] count2;
reg [9:0] count3;
wire flag_1ms;
wire flag_1s;
wire flag_1us;
reg state;
reg clk_out;
//count1
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
count1 = 1
您可能关注的文档
- .生命只有一次A概论.ppt
- 0-博弈论趣味例子概论.ppt
- 天花疫苗接种方法介绍讲解.ppt
- 天津初中1年级第15单元第15课_《美猴王》讲解.ppt
- 天津大学版化工原理上下册习题答案(2005夏清)讲解.doc
- 0-中国民生银行2014年招聘考试笔试试卷真题及答案解析概论.doc
- 0.25,0.5T反渗透说明书概论.doc
- 0-003-002形状补间动画课件9月16日概论.ppt
- 0.5吨生活污水方案概论.doc
- .铁代谢障碍性贫血20161124概论.ppt
- 吉安县公开招聘专职文明实践员笔试备考试题及答案解析.docx
- 2025重庆枫叶国际学校招聘教师笔试备考试题及答案解析.docx
- 游机队电玩自制联网教程-tplink.pdf
- 2025重庆新华出版集团招聘1人笔试模拟试题及答案解析.docx
- 2025宜宾高新丽雅城市产业发展有限公司公开招聘笔试模拟试题及答案解析.docx
- 2025云南保山市龙陵县勐糯镇人民政府招聘合同制专职消防员1人笔试模拟试题及答案解析.docx
- 11.1生活中常见的盐 九年级化学人教版下册.pptx
- 6.1法律保护下的婚姻 高二政治《法律与生活》课件(统编版选择性必修2)(新版).pptx
- 文昌市中小学教师校园招聘29人笔试模拟试题及答案解析.docx
- 10.1.5 常见的酸和碱(第5课时)课件-九年级化学人教版下册.pptx
文档评论(0)