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

《FPGA学习》->呼吸灯

🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。

呼吸灯,简而言之就像人类呼吸一样,有节奏的让LED灯从:灭->微微亮->微亮->亮->高亮,然后再从:高亮->亮->微亮->微微亮->灭的这样一个过程。

而LED的亮暗程度取决与电压的高低,在安全范围内,电压越高LED亮度越大,电压越低LED亮度越小。但是我们没办法去自动控制电压的高低,所以我们采用通过改变其占空比的方式来调节,即PWM(脉冲宽度调制)技术。简单来说就是在一定的时间周期内,改变高电平所占用的时间。

呼吸灯框架图如下:

PWM调制原理如下图所示:

对PWM有了了解以后,我们开始画波形图,然后对照波形图编写代码,波形图如下:

①sys_clk:时钟信号;

②sys_rst_n:复位信号,低电平有效;

③cnt_1us:因为开发板为50MHz,所以一个时钟周期为20ns,那1us秒即50个时钟周期;

④cnt_1ms:1000个1us进1;

⑤cnt_1s:1000个1ms进1;

⑥cnt_en:使能信号标志位,用来判断LED状态是否到了反转时刻;

⑦led_out:LED状态输出。

源代码如下:

module breath_led          //模块开始,定义名称为waterfall_light
#(parameter CNT_1US_MAX = 6'd49   ,  //定义全局变量CNT_1US_MAX,时间周期为1us parameter CNT_1MS_MAX = 10'd999 ,  //定义全局变量CNT_1MS_MAX,时间周期为1ms parameter CNT_1S_MAX  = 10'd999    //定义全局变量CNT_1S_MAX,时间周期为1s 
)
(input    wire    sys_clk   ,     //定义sys_clk为输入模式   (时钟)input    wire    sys_rst_n ,     //定义sys_rst_n为输入模式 (复位)output    reg        led_out          //定义led_out为寄存器类型的输出模式
);reg  [5:0]    cnt_1us;           //定义cnt_1us为6位宽的寄存器类型reg  [9:0]    cnt_1ms;           //定义cnt_1ms为10位宽的寄存器类型reg  [9:0]    cnt_1s ;           //定义cnt_1s为10位宽的寄存器类型reg          cnt_en ;           //定义cnt_en为寄存器类型always@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)               //复位信号到来begincnt_1us <= 6'd0;            //使cnt_1us清零endelse    if(cnt_1us == CNT_1US_MAX)  //判断cnt_1us是否计数到最大值begincnt_1us <= 6'd0;            //使cnt_1us清零endelse cnt_1us <= cnt_1us + 6'd1;        //使cnt_1us + 1endalways@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)               //复位信号到来begincnt_1ms <= 10'd0;           //使cnt_1ms清零endelse    if((cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us和cnt_1ms是否同时计数到最大值 begincnt_1ms <= 10'd0;           //使cnt_1ms清零endelse    if(cnt_1us == CNT_1US_MAX)  //判断cnt_1us是否计数到最大值begincnt_1ms <= cnt_1ms + 10'd1;   //使cnt_1ms + 1endelse cnt_1ms <= cnt_1ms;endalways@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)               //复位信号到来begincnt_1s <= 10'd0;           //使cnt_1s清零endelse    if((cnt_1s  == CNT_1S_MAX)&& (cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us,cnt_1ms,cnt_1s是否同时计数到最大值 begincnt_1s <= 10'd0;           //使cnt_1s清零endelse    if((cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us和cnt_1ms是否同时计数到最大值 begincnt_1s <= cnt_1s + 10'd1;  //使cnt_1s + 1endelse cnt_1s <= cnt_1s;              //使cnt_1s保持不变endalways@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)              //复位信号到来begincnt_en <= 1'b0;            //使cnt_1s清零endelse    if((cnt_1s  == CNT_1S_MAX)&& (cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us,cnt_1ms,cnt_1s是否同时计数到最大值 begincnt_en <= ~cnt_en;         //使cnt_en取反endelse cnt_en <= cnt_en;              //使cnt_en保持不变    endalways@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)              //复位信号到来beginled_out <= 1'b1;            //使led_out置1endelse    if(((cnt_en  == 1'b0)&&(cnt_1ms <= cnt_1s)) || ((cnt_en  == 1'b1)&&(cnt_1ms > cnt_1s))) //判断cnt_en为0且cnt_1ms计数值小于等于cnt_1sbegin                                                                                       //或者判断cnt_en为1且cnt_1ms计数值大于cnt_1s执行led_out <= 1'b0;            //使led_out置0endelse led_out <= 1'b1;                //使led_out置1endendmodule         //模块结束

生成的RTL电路图如下:

仿真代码如下:

`timescale 1ns/1ns               //时间尺度预编译指令      时间单位/时间精度module tb_breath_led ();     //定义模块名称为tb_breath_ledreg        sys_clk   ;     //定义sys_clk为reg型
reg        sys_rst_n ;     //定义sys_rst_n为reg型
wire    led_out   ;     //定义led_out为reg型breath_led                  //例化对象名称
#(.CNT_1US_MAX (6'd4)    ,            //改变parameter定义的参数.CNT_1MS_MAX (10'd9)   ,            //改变parameter定义的参数.CNT_1S_MAX  (10'd9)                //改变parameter定义的参数
)
breath_led_inst            //实例化名称
(.sys_clk      (sys_clk),       //使sys_clk信号端口例化为sys_clk.sys_rst_n    (sys_rst_n),     //使sys_rst_n信号端口例化为sys_rst_n.led_out      (led_out)        //使led_out信号端口例化为led_out
);initial                          //初始化begin                        sys_clk   = 1'b1  ;      //使sys_clk初始化为高电平状态sys_rst_n = 1'b0  ;      //使sys_clk初始化为低电平状态#20                      //延时20nssys_rst_n = 1'b1  ;      //使sys_rst_n电平拉高end                          always #10 sys_clk = ~sys_clk;   //使sys_clk电平10ns电平状态反转一次endmodule            //模块结束

仿真波形如下:

从图中可以看出,运行后的仿真波形与设计需求保持一致,任务完成。

🔥🔥🔥本系列文章持续更新,喜欢的话可以关注收藏~🔥🔥🔥

相关文章:

《FPGA学习》->呼吸灯

&#x1f34e;与其担心未来&#xff0c;不如现在好好努力。在这条路上&#xff0c;只有奋斗才能给你安全感。你若努力&#xff0c;全世界都会为你让路。呼吸灯&#xff0c;简而言之就像人类呼吸一样&#xff0c;有节奏的让LED灯从&#xff1a;灭->微微亮->微亮->亮-&g…...

【大数据离线开发】7.4 HBase数据保存和过滤器

7.4 数据保存的过程 注意&#xff1a;数据的存储&#xff0c;都需要注意Region的分裂 HDFS&#xff1a;数据的平衡 ——> 数据的移动&#xff08;拷贝&#xff09;HBase&#xff1a;数据越来越多 ——> Region的分裂 ——> 数据的移动&#xff08;拷贝&#xff09; …...

CentOS7安装MariaDB步骤

文章目录1.配置MariaDB yum源2.安装MariaDBMariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可。 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。 CentOS 6 或早期的版…...

软件测试13个最容易犯的错误

目录 一、 输入框测试 二、 搜索功能测试 三、 添加/修改功能 四、 删除功能 五、 上传图片功能测试 六、 查询结果列表 七、 返回键检查 八、 回车键检查 九、 刷新键检查 十、 直接URL链接检查&#xff08;盗链问题&#xff09; 十一、并发问题 十二、 业务流程测…...

华为OD机试真题Java实现【5键键盘的输出】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述:示例1:示例2:解题思路代码实现运行结果:版权说明:题目...

化解射频和微波设计挑战的六个技巧

即使是最自信的设计人员&#xff0c;对于射频电路也往往望而却步&#xff0c;因为它会带来巨大的设计挑战&#xff0c;并且需要专业的设计和分析工具。这里将为您介绍六条技巧&#xff0c;来帮助您简化任何射频PCB 设计任务和减轻工作压力&#xff01; 1、保持完好、精确的射频…...

linux内核—进程调度(核心)

目录 核心函数__schedule() 处理过程 1、选择下一个进程 2、切换线程 1&#xff09;切换进程的虚拟地址空间 2&#xff09;切换寄存器 3&#xff09;执行清理工作 核心函数__schedule() 主要的调度程序 进入次函数的主要方法是&#xff1a; 1、显示阻塞&#xff1a;互…...

【STM32笔记】__WFI();进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

【STM32笔记】__WFI()&#xff1b;进入不了休眠的可能原因&#xff08;系统定时器SysTick一直产生中断&#xff09; 【STM32笔记】低功耗模式配置及避坑汇总 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&am…...

【期末复习】例题讲解Dijkstra算法

使用场景Dijkstra算法用于解决单源点最短路径问题&#xff0c;即给一个顶点作为源点&#xff0c;依次求它到图中其他n-1个顶点的最短距离。例题讲解Dijkstra算法将图中所有顶点分成两部分&#xff0c;第一部分是已知到源点最短距离的顶点Known(K)&#xff0c;第二部分是不知道到…...

Pytorch 基础之张量索引

本次将介绍一下 Tensor 张量常用的索引与切片的方法&#xff1a; 1. index 索引 index 索引值表示相应维度值的对应索引 a torch.rand(4, 3, 28, 28) print(a[0].shape) # 返回维度一的第 0 索引 tensor print(a[0, 0].shape) # 返回维度一 0 索引位置…...

JVM系统优化实践(1):JVM概览

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;这是多年之前做过的学习笔记&#xff0c;今天再翻出来&#xff0c;觉得仍然是记忆犹新。「独乐乐不如众乐乐」&#xff0c;就拿出来分享给「众乐乐」吧。目前大多…...

优秀!19年后,它再次成为TIOBE年度编程语言

新年伊始&#xff0c;TIOBE发布了2022年度编程语言&#xff0c;C时隔19年再度登顶&#xff0c;成为2022年最受欢迎的编程语言。TIOBE在2003年首次统计编程语言的流行指数时&#xff0c;C便成为年度编程语言。2022年&#xff0c;C获得了最高的人气4.62%&#xff0c;紧随其后的是…...

剑指 Offer 26. 树的子结构

摘要 剑指 Offer 26. 树的子结构 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构)&#xff0c;B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 一、子树解析 思路解析&#xff1a;若树B是树A的子结构&#xff0c;则…...

他是00年的,我们卷不过他...

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…...

C#开发的OpenRA的OpenGL创建纹理流程

C#开发的OpenRA的OpenGL创建纹理流程 由于OpenRA采用的是OpenGL来显示游戏画面, 那么它就必然采用纹理来显示了。 并且由于它是2D的游戏,所以3D的模型是没有的,只要使用纹理贴图,就可以完全实现了游戏的功能。 OpenGL的纹理要起作用,需要经过一系列的动作。 先要使用glGen…...

3D目标检测(一)—— 基于Point-Based方法的PointNet系列

3D目标检测&#xff08;一&#xff09;—— PointNet&#xff0c;PointNet&#xff0c;PointNeXt&#xff0c; PointMLP 目录 3D目标检测&#xff08;一&#xff09;—— PointNet&#xff0c;PointNet&#xff0c;PointNeXt&#xff0c; PointMLP 前言 零、网络使用算法 …...

《设计模式》策略模式

策略模式 前言 先了解一下设计模式的几种类似&#xff1a; 行为型设计模式&#xff08;Behavioral Design Pattern&#xff09;是指一组设计模式&#xff0c;它们关注的是对象之间的通信和协作。行为型设计模式描述了对象之间的职责分配和算法的封装&#xff0c;以及如何在运…...

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学&#xff1a;研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑&#xff1a;研究推理的科学 数学方法&#xff1a;引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学&#xff0c;即使用符号化…...

Java8新特性学习

Java8新特性学习为啥使用Lambda表达式Lambda表达式的基础语法无参无返回有参无返回一个参数多参单个语句体类型推断四大内置核心函数式接口其他接口方法引用与构造器引用Stream简介什么是StreamStream操作步骤创建Stream中间操作终止操作(终端操作&#xff09;归约与收集并行流…...

SPARK outputDeterministicLevel的作用--任务全部重试或者部分重试

背景 目前spark的repartition()方法是随机分配数据到下游&#xff0c;这会导致一个问题&#xff0c;有时候如果我们用repartition方法的时候&#xff0c;如果任务发生了重试&#xff0c;就有可能导致任务的数据不准确&#xff0c;那这个时候改怎么解决这个问题呢&#xff1f; …...

Windows运行库终极解决方案:VisualCppRedist AIO完全指南

Windows运行库终极解决方案&#xff1a;VisualCppRedist AIO完全指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这种情况&#xff1a;满怀…...

1.3 装饰器与上下文管理器

&#x1f4d8; 第一阶段 1.3 装饰器与上下文管理器学习目标&#xff1a;彻底掌握 Python 中用于代码复用和资源管理的高级特性&#xff0c;理解它们在 FastAPI 中的底层应用。 预计用时&#xff1a;2 天&#xff08;每天约 3 小时&#xff09; 重要程度&#xff1a;⭐⭐⭐⭐&a…...

Linux source命令详解与应用场景解析

说得好&#xff01;这是一个非常核心且常见的Linux/Unix命令。简单直接的回答是&#xff1a;不&#xff0c;source 命令远不止是加载环境变量&#xff0c;虽然这是它最常用的场景之一。它的核心功能是&#xff1a;在当前Shell环境中读取并执行指定文件中的命令。让我们来深入分…...

SMUDebugTool系统调试实战指南:从问题诊断到性能优化的进阶之路

SMUDebugTool系统调试实战指南&#xff1a;从问题诊断到性能优化的进阶之路 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: h…...

Ardyno库:Dynamixel伺服电机的嵌入式底层通信框架

1. Ardyno库概述&#xff1a;面向Dynamixel伺服电机的嵌入式控制框架Ardyno是一个专为嵌入式平台设计的轻量级C/C库&#xff0c;用于精确、可靠地控制Robotis公司系列Dynamixel智能伺服电机&#xff08;如AX-12A、MX-28、XL-320、XH430、XM430等&#xff09;。其核心价值不在于…...

告别GitHub访问难题:Fast-GitHub让开发效率提升300%

告别GitHub访问难题&#xff1a;Fast-GitHub让开发效率提升300% 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否也曾经历过这…...

RobotStudio 仿真软件学习分享02 —— 仿真

目录一、本次学习内容总结二、学习经历&#xff08;实操操作过程&#xff09;2.1 机器人模型导入2.2 机器人工具加载与周边设备导入2.3 创建机器人控制系统2.4 创建工件坐标系&#xff08;Workobject_1&#xff09;2.5 创建并仿真机器人运动轨迹2.6 仿真视频录制三、补充关键注…...

ComfyUI插件管理工具:构建稳定高效的AI创作环境

ComfyUI插件管理工具&#xff1a;构建稳定高效的AI创作环境 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom node…...

HeidiSQL连接池管理终极指南:优化数据库性能的10个关键技巧

HeidiSQL连接池管理终极指南&#xff1a;优化数据库性能的10个关键技巧 【免费下载链接】HeidiSQL A lightweight client for managing MariaDB, MySQL, SQL Server, PostgreSQL, SQLite, Interbase and Firebird, written in Delphi and Lazarus/FreePascal 项目地址: https…...

3分钟掌握Umi-OCR:让文字识别变得如此简单的免费离线工具

3分钟掌握Umi-OCR&#xff1a;让文字识别变得如此简单的免费离线工具 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国…...