呼吸灯——FPGA

news2025/1/11 19:52:22

文章目录

  • 前言
  • 一、呼吸灯是什么?
    • 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 , //时钟信号 50Mhz
    input   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
 //*****************************************************
 
 //根据占空比和计数值之间的大小关系来输出 LED
 assign led = (period_cnt >= duty_cycle) ? 4'b1111 : 4'b0000;
 
 //周期计数器
 always @(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
    period_cnt <= 16'd0;
 else if(period_cnt == 16'd50000)
    period_cnt <= 16'd0;
 else
    period_cnt <= period_cnt + 1'b1;
 end
 
 //在周期计数器的节拍下递增或递减占空比
 always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        duty_cycle <= 16'd0;
        inc_dec_flag <= 1'b0;
    end
 else begin
    if(period_cnt == 16'd50000) begin //计满 1ms
        if(inc_dec_flag == 1'b0) begin //占空比递增状态
            if(duty_cycle == 16'd50000) //如果占空比已递增至最大
                inc_dec_flag <= 1'b1; //则占空比开始递减 else //否则占空比以 25 为单位递增
                
            else
                duty_cycle <= duty_cycle + 16'd25;
        end
        else begin //占空比递减状态
            if(duty_cycle == 16'd0) //如果占空比已递减至 0
                inc_dec_flag <= 1'b0; //则占空比开始递增
            else //否则占空比以 25 为单位递减
                duty_cycle <= duty_cycle - 16'd25;
        end
    end
  end
 end
 endmodule
  • 方法二:
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)begin
    if(!rst_n)begin
        cnt_us <= 6'd0;
    end
    else if(add_cnt_us)begin
        if(end_cnt_us)begin
            cnt_us <= 6'd0;
        end
        else begin
            cnt_us <= cnt_us + 1'd1;
        end
    end
    else begin
        cnt_us <= cnt_us;
    end
end

assign add_cnt_us = 1'b1;
assign end_cnt_us = add_cnt_us && cnt_us == TIME_US;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_ms <= 10'd0;
    end
    else if(add_cnt_ms)begin
        if(end_cnt_ms)begin
            cnt_ms <= 10'd0;
        end
        else begin
            cnt_ms <= cnt_ms + 1'd1;
        end
    end
    else begin
        cnt_ms <= cnt_ms ;
    end
end

assign add_cnt_ms = end_cnt_us;
assign end_cnt_ms = add_cnt_ms && cnt_ms == TIME_MS;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_s <= 10'd0;
    end
    else if(add_cnt_s)begin
        if(end_cnt_s)begin
            cnt_s <= 10'd0;
        end
        else begin
            cnt_s <= cnt_s + 1'd1;
        end
    end
    else begin
        cnt_s <= cnt_s ;
    end
end

assign add_cnt_s = end_cnt_ms;
assign end_cnt_s = add_cnt_s && cnt_s == TIME_S;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        flag <= 1'b0;
    end
    else if(end_cnt_s)begin
        flag <= ~flag;
    end
    else begin
        flag <= flag;
    end
end
//通过比较秒与毫秒的计数大小实现占空比的变化
//因为毫秒在秒每加一后,都会重新开始,使得高低电平的占比不同
//实际上呼吸灯周期就是秒计数周期,变换的占空比大小就是循环加1或减一
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        led <= 4'b0000;
    end
    else if(!flag)begin
        led <= (cnt_s > cnt_ms)?4'b0000:4'b1111;
    end
    else if(flag)begin
        led <= (cnt_s > cnt_ms)?4'b1111:4'b0000;
    end
    else
        led <= led;
end
endmodule

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

四、效果

呼吸灯


五、总结

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

六、参考资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我伴随HarmonyOS一起成长

大家好&#xff0c;我是waylau&#xff08;老卫&#xff09;&#xff0c;是一名80后程序员&#xff0c;华为开发者联盟社区认证讲师&#xff0c;HarmonyOS技术达人&#xff0c;曾获2021、2022年度牛人之星、2022年度OpenHarmony开源贡献之星。著有《跟老卫学HarmonyOS开发》开源…

jmeter 入门到精通

目录 一、jmeter 安装 二、jmeter 介绍 1、jmeter是什么&#xff1f; 2、jmeter 用来做什么&#xff1f; 3、优点 4、缺点 5、jmeter 目录介绍 ①_bin 目录介绍 ② docs 目录 — — 接口文档目录 ③ extras目录 — — 扩展插件目录 ④ lib 目录 — — 所用到的插件…

网络通信原理系统的认知(NEBASE第十四课)

1 物理层 第一层 物理层&#xff1a;建立、维护、断开物理连接&#xff0c;定义了接口及介质&#xff0c;实现了比特流的传输。 1.1传输层介质分类 有线介质&#xff1a;网线 &#xff08;双绞线&#xff09;光纤 无线: 无线电 1.2 双绞线 五类线 cat5 &#xff1a;适用 10…

[论文分享]ConvMAE:Masked Convolution Meets Masked Autoencoders

论文题目&#xff1a;ConvMAE: Masked Convolution Meets Masked Autoencoders 论文地址&#xff1a;https://arxiv.org/abs/2205.03892 代码地址&#xff1a;https://github.com/Alpha-VL/ConvMAE 摘要 视觉变压器(Vision transformer, ViT)已成为广泛应用于各种视觉任务的架…

如何使用 SVG 作为占位符和其他图像加载技术

从图像生成 SVG 可用于占位符。 一、说明 我们对图像性能优化和使图像在网络上快速加载充满热情。最有趣的探索领域之一是占位符&#xff1a;当图像尚未加载时要显示的内容。 在过去&#xff0c;我遇到了一些使用 SVG 的加载技术&#xff0c;我想在这篇文章中描述它们。 在这…

代码随想录算法训练营第52天 | 动态规划 part13 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

#300.最长递增子序列 自己想了20min没想出来。但没关系因为没接触过该题型。我想不出来的点就是&#xff0c;如果i-1的最后一个不要的话&#xff0c;我怎么找到上一个结束点。解决方案是&#xff1a;再搞一个循环&#xff0c;一个个找&#xff08;下面的 j &#xff09; 下面…

性能测试 Linux 环境下模拟延时和丢包实现

在性能测试过程中&#xff0c;我们还需要模拟网络异常的情况下&#xff0c;是否会出现一些异常数据。最常见的就是写库操作&#xff0c;比如说我们下单的场景&#xff0c;如果出现网络异常的时候是否会出现数据对不上这种情况。 如我们JMeter发送成功的请求数量和最终数据库表…

龙蜥白皮书精选:面向 HTTP 3.0 时代的高性能网络协议栈

文/高性能网络 SIG 01 背景概述 随着互联网特别是移动互联网的快速发展&#xff0c;对互联网通信协议提出了新的诉求。经过多年的发展&#xff0c;QUIC 协议在 2021 年正式被 IEFT 标准化&#xff0c;成为 HTTP 3 的标准传输层协议。QUIC 是基于 UDP 实现的面向连接可靠有序…

基于虚拟同步发电机控制的双机并联MATLAB仿真模型

使用MATLAB2021b打开 主要内容&#xff1a; 功率计算模块、虚拟同步发电机控制模块、电压合成模块、电压电流双环控制模块&#xff01; 1.两台VSG并联&#xff0c;开始各自带负载10KW&#xff0c;在0.3秒的时候加入公共负载10KW&#xff0c;稳定后两台VSG可以均分公共负载的…

大模型时代Embedding技术简介

Embeddings技术简介及其历史概要 在机器学习和自然语言处理中&#xff0c;embedding是指将高维度的数据&#xff08;例如文字、图片、音频&#xff09;映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量&#xff0c;它将输入的数据表示成一个连续的数值空间中…

SciencePub学术 | 区块链类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 区块链类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; SCI-01 【期刊简介】IF&#xff1a;4.0-4.5&#xff0c;JCR2区&#xff0c;中科院3区&#xff1b; 【检索情况】SCIE&EI双检&…

另一个流行漏洞。

Microsoft Office 和 Windows HTML 中的 CVE-2023-36884 漏洞。该漏洞由供应商公开披露&#xff0c;但尚未修补。Microsoft 意识到利用该漏洞的针对性攻击。据了解&#xff0c;RomCom 组织曾在此类攻击中使用勒索软件 Industrial Spy 和 Cuba。 可能导致什么后果&#xff1f; …

奇迹MU架设教程:SQL Server 2008数据库的安装教程

不管是搭建什么游戏&#xff0c;都是有数据库的&#xff0c;奇迹MU用的是SQL 数据库&#xff0c;根据服务器系统选择SQL server版本&#xff0c;我比较喜欢用Windows server 2008R2系统&#xff0c;所以我安装的是SQL server 2008。作为架设奇迹很重要的数据库程序&#xff0c;…

python中文版下载安装教程,python中文版下载官网

大家好&#xff0c;本文将围绕python中文版软件下载百度网盘展开说明&#xff0c;python中文版下载安装教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python中文最新版下载需要先了解以下几个事情。 1、python下载安装教程_百度知道 python下载安装教程&#xff1a;自…

Linux中ssh登陆慢的两种原因

useDNS配置导致登陆慢 如果ssh server的配置文件&#xff08;通常是 /etc/ssh/sshd_config &#xff09;中设置 useDNS yes &#xff0c;可能会导致 ssh 登陆卡住几十秒。将该配置项设为 no&#xff0c;然后重启 ssh 服务&#xff0c;再次登陆就恢复正常。将useDND配置为yes会…

Effective Java笔记(7)消除过期的对象引用

当你从手工管理内存的语言&#xff08;比如 C 或 C&#xff0b;&#xff0b;&#xff09;转换到具有垃圾回收功能的比如 Java 语言时&#xff0c;程序员的工作会变得更加容易&#xff0c;因为当你用完了对象之后&#xff0c;它们会被自动回收 。 当你第一次经历对象回收功能的时…

中国人民大学与加拿大女王大学金融硕士——引领你走在金融行业前沿

金融是现代经济的血脉&#xff0c;而金融行业高质量发展取决于金融人才。新常态下&#xff0c;中国经济进入新的阶段&#xff0c;同时也对金融人才培养提出了新的要求。针对在金融行业沉淀多年的在职人士而言&#xff0c;是否需要更加系统化的学习金融知识呢&#xff0c;中国人…

Python自动化之win32利器pywin32

文章目录 前言一、GUI1.1 获取、关闭窗口1.2 窗口截图1.3 创建窗口 二、文件、目录2.1 查找2.2 创建2.3 复制/移动2.4 删除2.5 读取/写入 三、服务3.1 查找3.2 安装 四、案例4.1 自动发送微信消息4.2 Excel 操作4.3 监控文件夹 参考 前言 PyWin32 是一个Python库&#xff0c;用…

【vue】路由的搭建以及嵌套路由

目的&#xff1a;学习搭建vue2项目基础的vue路由和嵌套路由 1.npm 安装 router npm install vue-router3.6.52.src下新建文件夹router文件夹以及文件index.js index.js import Vue from vue import VueRouter from "vue-router" import Home from ../views/Home.…

【Linux】- 组管理和权限管理

组管理和权限管理 1.1 Linux 组基本介绍1.2 权限的基本介绍 1.1 Linux 组基本介绍 在 linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 所有者所在组其它组改变用户所在的组 文件/目录 所有者 一般为文…