当前位置: 首页 > news >正文

呼吸灯——FPGA

文章目录

  • 前言
  • 一、呼吸灯是什么?
    • 1、介绍
    • 2、占空比调节示意图
  • 二、系统设计
    • 1、系统框图
    • 2、RTL视图
  • 三、源码
  • 四、效果
  • 五、总结
  • 六、参考资料


前言

环境:
1、Quartus18.0
2、vscode
3、板子型号:EP4CE6F17C8
要求:
将四个LED灯实现循环从亮到灭、灭到亮的过程。下面我使用了两种方法供大家阅读。


一、呼吸灯是什么?

呼吸灯其实是在微处理器的控制下,由暗渐亮、然后再由亮渐暗,模仿人呼吸方式的 LED 灯。

1、介绍

呼吸灯采用 PWM 的方式,在固定的频率下,通过调整占空比的方式来控制 LED 灯亮度的变化。PWM(Pulse 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/20ns=50000
reg [15:0] duty_cycle ; //占空比数值
reg inc_dec_flag ; //0 递增 1 递减//*****************************************************//** main code//*****************************************************//根据占空比和计数值之间的大小关系来输出 LEDassign led = (period_cnt >= duty_cycle) ? 4'b1111 : 4'b0000;//周期计数器always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)period_cnt <= 16'd0;else if(period_cnt == 16'd50000)period_cnt <= 16'd0;elseperiod_cnt <= period_cnt + 1'b1;end//在周期计数器的节拍下递增或递减占空比always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n) beginduty_cycle <= 16'd0;inc_dec_flag <= 1'b0;endelse beginif(period_cnt == 16'd50000) begin //计满 1msif(inc_dec_flag == 1'b0) begin //占空比递增状态if(duty_cycle == 16'd50000) //如果占空比已递增至最大inc_dec_flag <= 1'b1; //则占空比开始递减 else //否则占空比以 25 为单位递增elseduty_cycle <= duty_cycle + 16'd25;endelse begin //占空比递减状态if(duty_cycle == 16'd0) //如果占空比已递减至 0inc_dec_flag <= 1'b0; //则占空比开始递增else //否则占空比以 25 为单位递减duty_cycle <= duty_cycle - 16'd25;endendendendendmodule
  • 方法二:
module BREATH #(
parameter 
TIME_US = 6'd49,
TIME_MS = 10'd999,
TIME_S  = 10'd999)
(input  clk,input  rst_n,output reg [3:0]led
);// parameter TIME_US = 6'd49;
// parameter TIME_MS = 10'd999;
// parameter TIME_S  = 10'd999;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 <= 6'd0;endelse if(add_cnt_us)beginif(end_cnt_us)begincnt_us <= 6'd0;endelse begincnt_us <= cnt_us + 1'd1;endendelse begincnt_us <= cnt_us;end
endassign add_cnt_us = 1'b1;
assign end_cnt_us = add_cnt_us && cnt_us == TIME_US;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_ms <= 10'd0;endelse if(add_cnt_ms)beginif(end_cnt_ms)begincnt_ms <= 10'd0;endelse begincnt_ms <= cnt_ms + 1'd1;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 <= 10'd0;endelse if(add_cnt_s)beginif(end_cnt_s)begincnt_s <= 10'd0;endelse begincnt_s <= cnt_s + 1'd1;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 <= 1'b0;endelse if(end_cnt_s)beginflag <= ~flag;endelse beginflag <= flag;end
end
//通过比较秒与毫秒的计数大小实现占空比的变化
//因为毫秒在秒每加一后,都会重新开始,使得高低电平的占比不同
//实际上呼吸灯周期就是秒计数周期,变换的占空比大小就是循环加1或减一
always @(posedge clk or negedge rst_n)beginif(!rst_n)beginled <= 4'b0000;endelse if(!flag)beginled <= (cnt_s > cnt_ms)?4'b0000:4'b1111;endelse if(flag)beginled <= (cnt_s > cnt_ms)?4'b1111:4'b0000;endelseled <= led;
end
endmodule

实际上我更喜欢第一种,代码简洁易懂。

四、效果

呼吸灯


五、总结

呼吸灯的实现过程并不难,在原有的stm32实现呼吸灯的理解下更加透彻,就是通过控制周期里占空比的变化来实现。但值得一提的是第一种实现方法确实比较精简。

六、参考资料

以上资料均来自正点原子的教学视频或开拓者2开发教程:
原子官方

相关文章:

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…...

群辉用户接入vocechat的方法(附开通GPT机器人)

群辉安装聊天服务器-加入chatgpt vocechat项目简单的使用介绍集成群辉帐号系统登陆vocechat 第二章接入chatgpt这是一个机器人的演示 这是个处于发展中的不错的项目吧&#xff0c;才感觉到好神奇。有意思。 vocechat项目简单的使用介绍 昨天的找群辉文章的时候看到了vocechat&…...

flutter js交互传参

加载网页的webView WebView(initialUrl:http://test/h5atui//#/mobileMaps?lng${CommonConfig.lng}&lat${CommonConfig.lat},javascriptMode: JavascriptMode.unrestricted,onWebViewCreated: (controller) {_webViewController controller;},onProgress: (process){set…...

重磅IntelliJ IDEA 2023.2 新版本即将发布,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…...

JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos

JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos 认识微服务微服务技术对比 分布式服务架构案例远程调用 eureka注册中心原理搭建EurekaServer服务注册服务发现 Ribbon负载均衡修改负载均衡饥饿加载 nacos注册中心快速入门eureka和nacos对比 来源 认识微服务 微服务技术…...

数据科学领域常用python库

pandas Pandas 的名称源自 “ panel data ”&#xff0c;这是一个计量经济学术语&#xff0c;用于表示多维结构化数据集和 “ Python 数据分析”。众所周知&#xff0c;清理和转换数据在数据分析中非常重要&#xff0c;Pandas 提供了丰富的数据结构和功能&#xff0c;使数据处…...

【Android关键字】startActivityForResult/onActivityResult/setResult方法的使用

最近在写一个安卓程序&#xff0c;在程序里需要用到startActivityForResult这个Intent操作关键字&#xff0c;与该关键字有关的还有onActivityResult和setResult。这里对其用法进行一个总结。 三者在API中的形式 //startActivityForResult与startActivity类似&#xff0c;只不…...

PyTorch深度学习实战(5)——计算机视觉

PyTorch深度学习实战&#xff08;5&#xff09;——计算机视觉 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示 3 利用神经网络进行图像分析的优势小结系列链接 0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析&#xff0c;利…...

遥感目标检测(1)--R3Det

目录 一、概述 二、三个挑战 三、网络架构​编辑 1、旋转RetinaNet 2、精细化旋转RetinaNet 3、与RoIAlign&#xff08;感兴趣区域插值&#xff09;进行比较 4、消融实验与对比实验 一、概述 R3Det论文中提到一个端到端的精细化的单级旋转检测器&#xff0c;通过从粗到细…...

使用 vue3-tel-input电话组件时,为什么通过v-model绑定的默认值无效而 通过:value绑定有效?

问题&#xff1a; 使用第三方 vue3-tel-input电话组件时&#xff0c;通过v-model绑定具有初始值的电话变量&#xff0c;但input框内显示的初始值为空&#xff1f; 排查过程&#xff1a; 将 v-model绑定改为 :value绑定后&#xff0c;电话变量初始值竟然能够显示在vue3-tel-inp…...

【运维工程师学习二】OS系统管理

【运维工程师学习二】OS系统管理 1、操作系统管理2、进程管理3、进程的启动4、进程信息的查看4.1、STAT 进程的状态&#xff1a;进程状态使用字符表示的&#xff08;STAT的状态码&#xff09;,其状态码对应的含义&#xff1a;4.2、ps命令常用用法&#xff08;方便查看系统进程&…...

【前端技巧】CSS常用知识碎片(九)

CSS常用知识碎片&#xff08;九&#xff09; mask-image属性 带有半透明的PNG图像的遮罩效果 .mask-image {mask: no-repeat center / contain;mask-image: url(bird.png); }SVG图形遮罩效果 .mask-image {mask-image: url("data:image/svgxml,%3Csvg viewBox0 0 3232…...

SQL 上升的温度

197 上升的温度 SQL架构 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是这个表的主键 该表包含特定日期的温度信息 编写一个 SQL …...

Matlab实现最优化(附上多个完整仿真源码)

最优化是一种寻找最优解的数学方法&#xff0c;它在各个领域都有广泛的应用。在Matlab中&#xff0c;有多种工具箱和函数库可以用来实现最优化&#xff0c;下面我们来介绍一下如何用Matlab实现最优化。 1. 定义目标函数 在开始最优化之前&#xff0c;需要定义一个目标函数。目…...

es下载历史的tar文件

第一步进入官网找到历史版本 第二步复制历史版本名称组合成下面的链接 直接get访问下载。如下链接所示只需要修改7.3.0这个版本号 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz...

顺畅下载chatglm2-6b的模型文件

不管是从huggingface下&#xff0c;git下&#xff0c;wget下&#xff0c;都可能卡。 用推荐的清华源的url下&#xff0c;也卡&#xff0c;但url转换之后的&#xff0c;在windows下不了。 但是在linux上就几十兆每秒 wget https://cloud.tsinghua.edu.cn/seafhttp/files/0d8b273…...

go语言 socket: too many open files 错误分析

问题背景&#xff1a; 近期针对老的PHP接口做了迁移重构&#xff0c;用golang重新实现&#xff0c;在上线之前&#xff0c;测试进行了压测&#xff0c;压测的量级为&#xff1a;200请求/s, 连续请求10s&#xff0c;发现接口出现大量超时错误&#xff0c;查看日志发现错误信息为…...

分布式搜索--elasticsearch

一、初识 elasticsearch 1. 了解 ES ① elasticsearch 是一款非常强大的开源 搜索引擎&#xff0c;可以帮助我们从海量数据中 快速找到需要的内容 ② elasticsearch 结合 kibana、Logstash、 Beats&#xff0c;也就是 elastic stack (ELK)&#xff0c;被 广泛应用在日志数据分…...

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)

《Electric Dreams》项目中提供了一些自定义节点和子图&#xff08;文件位置:“/Content/PCG/Assets/PCGCustomNodes”&#xff09;&#xff0c;这些节点和子图在《Electric Dreams》被广泛使用&#xff0c;对于理解《Electric Dreams》非常重要&#xff0c;而且它们可以直接移…...

500万PV的网站需要多少台服务器?

1. 衡量业务量的指标 衡量业务量的指标项有很多&#xff0c;比如&#xff0c;常见Web类应用中的PV、UV、IP。而比较贴近业务的指标项就是大家通常所说的业务用户数。但这个用户数比较笼统&#xff0c;其实和真实访问量有比较大的差距&#xff0c;所以为了更贴近实际业务量及压力…...

IndexTTS 2.0情感控制效果:用自然语言描述生成对应语气语音

IndexTTS 2.0情感控制效果&#xff1a;用自然语言描述生成对应语气语音 1. 引言&#xff1a;语音合成的革命性突破 想象一下这样的场景&#xff1a;你正在制作一部动画短片&#xff0c;主角需要说一句"我受够了&#xff01;"——但你不只是想让它"说出来"…...

OpenClaw多模型混搭方案:百川2-13B-4bits与Qwen在自动化流程中的协同调用

OpenClaw多模型混搭方案&#xff1a;百川2-13B-4bits与Qwen在自动化流程中的协同调用 1. 为什么需要多模型混搭 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理周报时&#xff0c;发现一个尴尬的问题&#xff1a;用同一个模型处理文本润色和代码生成&#xff0c;效…...

如何快速使用网站历史查看器:新手完整入门教程

如何快速使用网站历史查看器&#xff1a;新手完整入门教程 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension 你是否曾经…...

保姆级教程:在mmdetection v2.x上,用SSD300训练自定义VOC数据集(附完整配置文件修改清单)

从零到一&#xff1a;基于mmdetection的SSD300自定义VOC数据集训练全流程实战 当第一次接触mmdetection框架时&#xff0c;面对复杂的配置文件体系和各种_base_目录&#xff0c;很多开发者都会感到无从下手。本文将从一个实践者的角度&#xff0c;手把手带你完成从数据集准备到…...

03 AgentSkills 生态体系与跨平台支持全景

03 AgentSkills 生态体系与跨平台支持全景 关键词&#xff1a;AgentSkills 生态、跨平台支持、Claude Code、Cursor、GitHub Copilot、VS Code、Spring AI、SkillsMP、Skill Seekers、技能共享、Symlink、官方技能库一、从标准到生态&#xff1a;一项规范的生命力 衡量一个技术…...

STM32嵌入式系统分层架构与设备驱动实现

嵌入式系统中应用层与硬件层的分层管理实现1. 项目概述在嵌入式系统开发中&#xff0c;传统的开发方式往往将硬件操作直接嵌入到应用层代码中&#xff0c;导致代码耦合度高、可维护性差。本文介绍一种基于STM32平台的硬件抽象层实现方案&#xff0c;通过设备驱动模型实现应用层…...

如何用Applite轻松管理macOS应用:告别复杂的终端命令

如何用Applite轻松管理macOS应用&#xff1a;告别复杂的终端命令 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为macOS上的应用安装和更新烦恼吗&#xff1f;Applite这款…...

RecyclerView 动态布局实战:ItemView 高宽自适应与多列切换

1. RecyclerView动态布局的核心挑战 在Android开发中&#xff0c;RecyclerView是最常用的列表控件之一。但很多开发者都会遇到这样的问题&#xff1a;如何让ItemView根据数据量动态调整高度和宽度&#xff1f;特别是在需要实现单列和多列布局自动切换的场景下&#xff0c;这个问…...

嵌入式技术学习路径与核心技能解析

嵌入式技术学习路径与资源整合指南1. 嵌入式技术体系概述嵌入式系统作为现代电子设备的核心&#xff0c;其技术栈涵盖从底层硬件到上层软件的完整知识体系。一个合格的嵌入式工程师需要掌握以下核心领域&#xff1a;1.1 基础编程能力C/C语言编程基础数据结构与算法计算机组成原…...

OpenClaw+GLM-4.7-Flash:自动化技术文档翻译系统

OpenClawGLM-4.7-Flash&#xff1a;自动化技术文档翻译系统 1. 为什么需要自动化翻译系统 作为一名经常需要阅读英文技术文档的开发者&#xff0c;我长期被两个问题困扰&#xff1a;一是专业术语翻译不统一&#xff0c;同一份文档里"pipeline"可能被翻译成"管…...