• 根据野火的教程改编而来,端口信号时钟信号和复位信号,输出信号连接到板子上的LED灯。呼吸灯呼吸效果分为完全熄灭和完全点亮两个过程,通过控制PWM的占空比来控制灯的亮灭程度,将第一个状态完全熄灭的时间定义为一个周期T。接下来保持一段时间的低电平,比如十分之一周期的低电平,表示点亮一段时间(野火低电平点亮LED)。设置完全熄灭到完全点亮时间为1s故需要一个计数器cnt_1s,分成1000份将1s/1000得到T=1ms故需要一个计数器cnt_1ms,每次增加的点亮时间分为1000份得1ms/1000=1us故需要一个计数器cnt_1us,通过三个计数器变量得到输出的波形。

  • 通过cnt_1us来设置cnt_1ms和cnt_1s,cnt_1us计满一个周期cnt_1ms自加1,自加1000次得到cnt_1ms。cnt_1ms计满一个周期cnt_1s自加1,自加1000次得到cnt_1s,这样可以减少逻辑资源,cnt_1ms和cnt_1s最大值为999,如果根据时钟周期计数,cht_1s是最大的。时钟频率50MHz则周期20ns,1us就是50个时钟周期,从0开始计数最大值为49,定义参数 CNT_1US_MAX = 6'd49,方便实例化和testbench仿真。

  • 为了实现PWM,每一个T间隔内低电平时间成倍的增长,设置当1ms计数值小于等于1s的计数值保持低电平

  • 对这个过程进行取反,就能得到从完全点亮到完全熄灭的过程

  • 定义数据位宽

  • 计数器部分代码编写,采用异步复位

    • cnt_1us计数到最大值时清零而cnt_1ms只有当cnt_1ms和cnt_1us同时计数到最大值时cnt_1ms才清零
    else if( (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX) )cnt_1ms <= 10'd0;
    
    • 当cnt_1us计数到最大值时cnt_1ms才能自加1
    else if(cnt_1us == CNT_1US_MAX)cnt_1ms <= cnt_1ms + 10'd1;
    
    • 其他时刻保持值不变
    else cnt_1ms <= cnt_1ms;
    
    • cnt_1s需要等到三个计数器同时计数到最大值才清零
    else if( (cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX) )cnt_1s <= 10'd0;
    
    • 只有等到1us计数器和1ms计数器计数到最大值才能自加
    else if((cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_1s <= cnt_1s + 10'd1;
    
  • 用cnt_en区分完全熄灭到完全点亮和完全点亮到完全熄灭这两个过程,cnt_en=0表示完全熄灭到完全点亮这个过程。当1s计数器计数到最大值时对它进行取反,其他时刻保持不变

else if((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_en <= ~cnt_en;
  • 当cnt_en为0且cnt_1ms <= cnt_1s时LED亮起当cnt_en为1且cnt_1ms > cnt_1sLED亮起
else if( ((cnt_en == 1'b0) && (cnt_1ms <= cnt_1s)) || ((cnt_en == 1'b1) && (cnt_1ms > cnt_1s)))led_out <= 1'b1;
  • 这是未修改前的代码和仿真波形的测试文件
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,input wire sys_rst,output reg led_out);reg [9:0] cnt_1s = 10'd0;reg [9:0] cnt_1ms = 10'd0;reg [5:0] cnt_1us = 6'd0;reg cnt_en = 1'b0;always @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_1us <= 6'd0;else if(cnt_1us == CNT_1US_MAX)cnt_1us <= 6'd0;else cnt_1us <= cnt_1us + 6'd1;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_1ms <= 10'd0;else if( (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX) )cnt_1ms <= 10'd0;else if(cnt_1us == CNT_1US_MAX)cnt_1ms <= cnt_1ms + 10'd1;else cnt_1ms <= cnt_1ms;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_1s <= 10'd0;else if( (cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX) )cnt_1s <= 10'd0;else if((cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_1s <= cnt_1s + 10'd1;else cnt_1s <= cnt_1s;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_en <= 1'b0;else if((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_en <= ~cnt_en;elsecnt_en <= cnt_en;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)led_out <= 1'b1;else if( ((cnt_en == 1'b0) && (cnt_1ms <= cnt_1s)) || ((cnt_en == 1'b1) && (cnt_1ms > cnt_1s)))led_out <= 1'b0;elseled_out <= 1'b1;endendmodule
  • 测试代码如下所示,为了方便仿真,把CNT_1US_MAX,CNT_1MS_MAX,CNT_1S_MAX的值均改小了
module testbench();reg sys_clk;reg sys_rst;wire led_out;initial beginsys_clk = 1'b1;sys_rst <= 1'b1;#20;sys_rst <= 1'b0;endalways #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),.sys_rst(sys_rst),.led_out(led_out));
endmodule
  • 测试波形如下,可以看出LED灯输出确实为PWM波形
  • 但和野火FPGA配置不同的是,LED灯为高电平点亮且复位信号为高电平,输入时钟100MHz,计数1us最大值修改为99。
module breath_led#(parameter CNT_1US_MAX = 7'd99,parameter CNT_1MS_MAX = 10'd999,parameter CNT_1S_MAX = 10'd999)(input wire sys_clk,input wire sys_rst,output reg led_out);reg [9:0] cnt_1s = 10'd0;reg [9:0] cnt_1ms = 10'd0;reg [6:0] cnt_1us = 7'd0;reg cnt_en = 1'b0;always @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_1us <= 7'd0;else if(cnt_1us == CNT_1US_MAX)cnt_1us <= 7'd0;else cnt_1us <= cnt_1us + 7'd1;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_1ms <= 10'd0;else if( (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX) )cnt_1ms <= 10'd0;else if(cnt_1us == CNT_1US_MAX)cnt_1ms <= cnt_1ms + 10'd1;else cnt_1ms <= cnt_1ms;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_1s <= 10'd0;else if( (cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX) )cnt_1s <= 10'd0;else if((cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_1s <= cnt_1s + 10'd1;else cnt_1s <= cnt_1s;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)cnt_en <= 1'b0;else if((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_en <= ~cnt_en;elsecnt_en <= cnt_en;endalways @(posedge sys_clk or negedge sys_rst) beginif(sys_rst == 1'b1)led_out <= 1'b0;else if( ((cnt_en == 1'b0) && (cnt_1ms <= cnt_1s)) || ((cnt_en == 1'b1) && (cnt_1ms > cnt_1s)))led_out <= 1'b1;elseled_out <= 1'b0;endendmodule
  • 配置管脚文件如下。
set_property PACKAGE_PIN T22 [get_ports led_out]set_property PACKAGE_PIN P16 [get_ports sys_rst]set_property PACKAGE_PIN Y9 [get_ports sys_clk]set_property IOSTANDARD LVCMOS33 [get_ports *]
  • 仿真波形细节查看

  • 修改计数器CNT_1US_MAX参数可以呼吸灯的频率,与50M时钟相比感觉平缓很多,下图为50M

zedboard上呼吸灯的实现(第二版)相关推荐

  1. zedboard板子上呼吸灯的实现(第一版)

    这是原始代码时钟信号为50MHz module breathe_led(input clk, // 时钟信号input rst, // 复位信号output led);// reg definereg ...

  2. zedboard板子上呼吸灯的实现(第一版)仿真代码的实现

    为了便于仿真的实现,定义周期数值period_cnt缩小为50,每次改变的数值duty_cycle定义为5,这两个数值本来可以定义在参数中,懒得重写代码直接修改了数值. module breathe_ ...

  3. C语言开定时器做呼吸灯程序,简单的基于51单片机定时器上呼吸灯程序

    #include #define ufloat unsigned float #define uchar  unsigned char #define uint   unsigned int ucha ...

  4. 手机1像素线粗_小米1亿像素手机配置全曝光:史上最炫酷呼吸灯!

    小米官方已经定于11月5日发布首款1亿像素拍照手机--小米CC9 Pro. 据悉,小米CC9 Pro采用了一亿像素五摄四闪全焦段的配置,支持双光学防抖.10倍混合光学变焦.50倍数字变焦,拍照对标友商 ...

  5. 好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效button

    我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单很多. 首先是定义一个TextBlock例如以下. <Grid><TextBlock Name=&q ...

  6. step fpga上实现呼吸灯和交通灯

    呼吸灯 呼吸灯:我们将通过脉宽调制技术来实现"呼吸灯",实现LED的亮度由最暗逐渐增加到最亮,再逐渐变暗的过程. 脉冲宽度调制.它是利用微控制器的数字输出调制实现,是对模拟电路进行 ...

  7. Maltab在数学建模中的应用(第二版)——读书笔记上

    Maltab在数学建模中的应用(第二版)--读书笔记上 1.MATLAB与数据文件的交互 1.1数据拟合 1.2数据拟合实例 1.3数据可视化 1.4层次分析法 2.规划问题的MATLAB求解(多约束 ...

  8. android 呼吸灯颜色,小米8青春版呼吸灯颜色如何设置?小米8青春版呼吸灯颜色设置教程...

    小米8青春版呼吸灯颜色如何设置?小米8青春版手机已经正式的发布了,这款手机骁龙660 AIE处理器,该手机支持呼吸灯提醒功能,这项功能是用来提醒我们有未读消息,那么小米8青春版呼吸灯颜色是怎样设置的呢 ...

  9. 踏上《软件设计精要与模式》第二版的征途

    距离<软件设计精要与模式>的出版已有两年多的时间,从出版之初的热销到后来归于平淡,我也经历了从兴奋期到蛰伏期的过程.这本书的反应不算好,也不算坏.在浩瀚如大海一般的书市里,就好似一滴水珠融 ...

最新文章

  1. 数据聚集技术在mondrian中的实现
  2. openlayer 3 在layer上添加feature
  3. java compareTo() 用法注意点
  4. 数据挖掘之关联分析五(序列模式)
  5. ant的下载与安装——mybatis学习笔记之预备篇(一)
  6. Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
  7. Linux socket多进程服务器框架二
  8. python函数模块关键代码_从零开始学Python(六):函数,模块和类的使用
  9. 详细讲解32F103/MS51单片机串口ISP程序下载的方法和操作步骤
  10. 【Python】基于Python的行政区划编码字典
  11. 项目:妍妍的相册1——设计
  12. 常用LDO低压差线性稳压芯片封装型号以及基本电路
  13. @Deprecated注解功能
  14. php如何采集,php采集入门教程,教你如何写采集
  15. 传奇 定时任务(泡点、时间触发、任务活动等)
  16. 随便写的:新戏剧之王,一部广义上的烂片观后感
  17. silverlight | chrion.exe-动态语言创建silverlight
  18. Kafka教程(三):原理及存储
  19. 【C语言指针题】编写函数实现在任意行、任意列的二维数组中寻找鞍点,行、列数均有主调函数传入。
  20. matlab seawater下载,海洋要素计算工具箱seawater

热门文章

  1. Vue源码分析 - observer.js
  2. linux下docker部署redis
  3. DOM获取元素、事件基础、操作元素、节点操作
  4. html 图片使用scale,CSS scale()用法及代码示例
  5. 红帽子linux改ip命令,Linux系统下图形界面更改IP地址
  6. jQuery 查找元素节点
  7. macOS下JetBrains配置修改错误导致无法启动解决方案
  8. elementui 表格格式化
  9. Idea添加Jetty时提示JMX module is not included
  10. Win10文件夹大小分析、磁盘空间清理工具