FPGA开发——呼吸灯的另一种实现方式

一、概述

关于呼吸灯的设计其实在前面的文章中就已经提到过,这篇文章更多的针对前面的实现方式进行一个改良。在前面的呼吸灯的设计使用的是us、ms、s的三级计数器进行功能实现,这种实现方法应该是我们最后理解也是最常用的方式。但经过蜂鸣器的音乐播放器的设计之后突然一想,既然呼吸灯也用的PWM进行设计,为什么不直接使用调制占空比的方式进行实现呢。经过系统的总结,其实前面文章实现的方式虽然通俗易懂,但严格来说不算是PWM调制,只能说刚好踩在了点上,所以也能实现。

        在本次的呼吸灯设计中,我们直接采取改变占空比的方式,对于呼吸灯进行一个实现。

二、工程实现

1、基本思路

这里和前面实现的时间一样也采用2s完成LED呼吸灯的全部过程,私用ms的计数器对于计数器进行1000次技术,接着对于这1000个m计数周期进行占空比的一个调试。在呼吸灯有灭——亮变为亮——灭的状态切换时使用一个一秒计数器对状态标志位进行一个划分,最后对于LED进行一个输出就实现了呼吸灯的设计。

2、设计文件的编写

见闻思意,新建一个breath_led.v文件,如下:

//实现2s呼吸灯,1s呼,1s吸。
module breath_led (input           clk             ,input           rst_n           ,output reg      led             
);
//
parameter TIME_1MS = 50000;
//
reg  [15:0]             cnt_1ms         ;//1个pwm周期计数器
wire                    add_cnt_1ms     ;
wire                    end_cnt_1ms     ;reg  [9:0]              cnt_1s          ;//以1ms为基准,计数1000次
wire                    add_cnt_1s      ;
wire                    end_cnt_1s      ;reg                     state_flag      ;//状态标志位reg  [15:0]             duty            ;//占空比//1ms计数器
always@(posedge clk or negedge rst_n)if(!rst_n)begincnt_1ms <= 'd0;endelse if(add_cnt_1ms)beginif(end_cnt_1ms)begincnt_1ms <= 'd0;endelse begincnt_1ms <= cnt_1ms + 1'b1;endend
assign add_cnt_1ms = 1'b1;
assign end_cnt_1ms = add_cnt_1ms && (cnt_1ms ==  (TIME_1MS - 1));//1s计数器
always@(posedge clk or negedge rst_n)if(!rst_n)begincnt_1s <= 'd0;endelse if(add_cnt_1s)beginif(end_cnt_1s)begincnt_1s <= 'd0;endelse begincnt_1s <= cnt_1s + 1'b1;endend
assign add_cnt_1s = end_cnt_1ms;
assign end_cnt_1s = add_cnt_1s && (cnt_1s ==  (1000 - 1));//LED呼吸灯状态切换
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginstate_flag <= 0;//表示从渐灭到渐亮的状态endelse if(end_cnt_1s)beginstate_flag <= ~state_flag;//当1s时间到来 状态翻转end
end//占空比改变
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginduty <= 0;endelse if(end_cnt_1ms && (!state_flag))begin//在从渐灭到渐亮的状态下, 占空比比较值每1ms加1/1000个pwmduty <= duty + TIME_1MS/1000;endelse if(end_cnt_1ms && (state_flag))begin//在从渐亮到渐灭的状态下, 占空比比较值每1ms减1/1000个pwmduty <= duty - TIME_1MS/1000; end
endalways@(posedge clk or negedge rst_n)beginif(!rst_n)beginled <= 0;endelse if(cnt_1ms >= duty)beginled <= 0;endelse beginled <= 1; end
endendmodule

3、测试文件的编写

`timescale 1ns/1ps
module  breath_led_tb();
reg                 clk         ;
reg                 rst_n       ;//模块例化
breath_led led_inst(/* input            */.clk             (clk             ),/* input            */.rst_n           (rst_n           ),/* output reg       */.led             ()
);//重定义
defparam led_inst.TIME_1MS = 5000;
//时钟
parameter CLK_CYCLE = 20;
initial clk = 1;
always #(CLK_CYCLE/2) clk = ~clk;
//复位
initial beginrst_n = 1'b0;#(CLK_CYCLE*2);#3;rst_n = 1'b1;
end//激励
initial beginendendmodule

三、仿真波形图

2d19beaa9fa543eba55253dfe9ee759b.png

18cbe4da15724234b39c54e412c71f20.png 

在第一章图中我们可以看到LED的占空比duty在不断增加,上面的led输出波形高电平也是在不断变大 ,实现的是LED吸的状态,而在第二章图中是1秒过后LED进行呼的状态,占空比duty在不断减小,相应的波形图高电平占空比也在不断变小。在最后进行下板验证时我们观察到LED在进行灭——亮,亮——灭的显示,呼吸灯设计完成。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/388903.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024第18届中国西部体育博览会诚邀代理招展

2024第18届中国西部体育博览会诚邀代理招展 2024第18届中国西部体育博览会诚邀全国各关联商会、协会&#xff0c;联盟、各专业会展公司、各关联产业园区、各关联网站报纸杂志及平台等资源方组团参展&#xff0c;组委会将给予最优惠的代理招展政策&#xff0c;群策群力共同把中…

2024年音频剪辑必备:五大最佳音频编辑软件精选!

在数字时代&#xff0c;音频剪辑已成为创意表达的重要工具。无论是音乐制作、播客编辑还是视频后期&#xff0c;一款优秀的音频剪辑软件都是不可或缺的。推荐五款备受推崇的音频剪辑工具。 福昕音频剪辑 链接&#xff1a;https://www.foxitsoftware.cn/audio-clip/ 福昕音频…

关于DynamoRIO处理多线程程序时候的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Java数据结构(五)——栈和队列

文章目录 栈和队列栈基本概念栈的模拟实现集合框架中的栈栈的创建栈的方法栈的遍历 栈的应用及相关练习括号匹配逆波兰表达式求值出栈入栈次序匹配最小栈 几个含"栈"概念的区分 队列基本概念队列的模拟实现循环队列双端队列集合框架中的队列队列的创建队列的方法队列…

数据结构(邓俊辉)学习笔记】词典 01—— 散列

文章目录 1. 从服务到电话2. 循值访问3. 数组4. 原理5. 散列6. 冲突 1. 从服务到电话 现在进入新的一章词典。将学习实现词典 adt 的重要技术&#xff0c;也就是散列。我们将看到散列实际上并不是一种简单的技术&#xff0c;从某种意义上讲&#xff0c;它甚至是一种思想&#x…

记录一次环境的安装

目录 新添加的代码 代码解释 为啥ubuntu用debian软件源 为啥修改sources.list.d S权限意思 php缺少和数据库连接的模块 使用root登陆数据库1698错误 字段解释 auth_socket解释 使用root登陆数据库方法 详细解释 首先在安装的时候&#xff0c;有一个dockerfile文件&a…

day 18流的定位、文件IO以及Linux系统中时间的获取

流的定位 偏移量&#xff1a;读和写都在偏移量的位置进行 文件IO 相对于标准IO来说&#xff0c;文件IO直接在Linux的内核中操作&#xff0c;也更加的简洁精炼 对文件的操作也是三个部分 1.打开文件 open 2.读写文件 read write 3.关闭文件 close 还有一些其他的函数接口…

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;

linux安装配置jdk

①下载jdk安装包&#xff0c;放在/opt/app/software/java下 cd /opt/app/software/java②进行解压操作 tar -zxvf jdk-8u251-linux-x64.tar.gz③解压完成之后&#xff0c;进行环境变量的配置&#xff0c;shell下执行 vi ~/.bash_profile根据jdk的安装目录&#xff0c;加入 …

【C++】学习笔记——智能指针

文章目录 二十一、智能指针1. 内存泄漏2. 智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器 未完待续 二十一、智能指针 1. 内存泄漏 在上一章的异常中&#xff0c;我们了解到如果出现了异常&#xff0c;会中断执行流…

LocalDateTime计算两个时间之间的间隔

LocalDateTime计算两个时间之间的间隔 嘚吧嘚LocalDateTimeLocalDateLocalTime 嘚吧嘚 自从认识了LocalDateTime之后&#xff0c;使用的频率越来越高了&#xff0c;使用多了就不可避免的涉及到日期的比较、加减以及计算日期间隔这些操作。 但是我发现自己好像不会&#x1f605…

2024年钉钉杯大学生大数据挑战赛倒计时,最后冲刺

2024第三届钉钉杯大学生大数据挑战赛倒计时&#xff0c;小编给大家带来非常实用的最后冲刺助力【A题】&#xff0c;&#xff08;看图资料预览&#xff09;&#xff1a; 中国烟草行业作为国家税收和财政收入的重要支柱&#xff0c;近年来销售收入持续增长。国家对此实行严格的专…

一键测量仪,能否彻底解决燃气灶配件缺陷问题?

燃气灶配件是指用于燃气灶的附件或零部件&#xff0c;用于安装、维护或改进燃气灶的功能和性能。这些配件通常包括各种零部件、附件和替换件&#xff0c;以确保燃气灶的正常运行和安全使用。燃气灶的火焰头是产生火焰的部件&#xff0c;通常根据不同的燃气类型和火力需求选择合…

ETL数据集成丨快速将MySQL数据迁移至Doris数据库

随着大数据技术的迅速发展&#xff0c;越来越多的企业开始寻求高效、灵活的数据存储与分析解决方案。Apache Doris&#xff08;原名 Palo&#xff09;作为一款高性能的MPP&#xff08;大规模并行处理&#xff09;分析型数据库&#xff0c;凭借其在OLAP场景下的卓越表现&#xf…

Minio多主机分布式 docker-compose 集群部署

参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能 中文地址&#xff1a;MinIO | 用于AI的S3 …

SYD88xx代码复位不成功和解决办法

原来的复位代码如下: void ota_manage(void){#ifdef _OTA_if(ota_state){switch(ota_state){case 1 : #if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)dbg_printf("start FwErase\r\n");#endifCmdFwErase();#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)db…

Spring Boot 动态数据源

目录 前言 前置环境 pom yml Entity Dao 枚举类 数据源 AOP Controller 启动类 演示 前言 大多数系统中&#xff0c;都需要数据库来持久化数据&#xff0c;在大多数情况下&#xff0c;一个系统只需要配置一个数据源便能够完成所有业务的查询&#xff0c;保存操作。…

为什么Transformer需要进行 Multi-head Attention?

目录 1. 前言 2. 基本概念 2.1. Word2Vec 2.2. Attention is all you need 2.3. Self-attention 2.3.1. 概述self-attention 2.3.2. 训练细节 2.4. Multi-head Attention 2.4.1. 多头理论细节 2.4.2. 多头代码实现 2.5. 总结 3. 讨论观点 3.1. 观点1&#xff1a; …

【工具插件类教学】vHierarchy 2工具编辑器扩展使用

目录 一、下载导入 二、使用介绍 1.便捷小工具 a.图标和颜色Icons and colors b.对象组件缩略图Component minimap c.层级线展示Hierarchy lines d.极简模式Minimal mode e.斑马条纹图案Zebra striping f.激活切换Activation toggle 2、快捷键 一、下载导入 资源官方…

二维码门楼牌管理应用平台建设:流程优化与全面考量

文章目录 前言一、工作流程优化&#xff1a;移动端采集与实时更新二、数据完整性与准确性保障三、效率提升与成本节约四、扩展性与未来发展五、数据安全与隐私保护六、用户培训与技术支持 前言 随着智慧城市建设的不断深入&#xff0c;二维码门楼牌管理应用平台作为城市管理的…