09 呼吸灯

呼吸灯简介

呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗,再由暗到亮的变化过程,并且该过程是循环往复的,像呼吸一样那么有节奏。 呼吸灯通常是采用 PWM(Pulse Width Modulation,即脉冲宽度调制) 的方式实现,在 PWM 频率固定的情况下,通过调整其占空比来控制 LED 灯亮度的变化。
在固定周期的 PWM 信号下,如果其占空比为 0,则 LED 灯不亮;如果其占空比为100%,则 LED 灯最亮。将占空比从 0 到 100%,再从 100%到 0 不断变化,就可以实现 LED 灯的“呼吸”效果,PWM 占空比调节示意图如下所示:
在这里插入图片描述

PWM信号的产生

可以使用1个寄存器和一个比较值来控制 PWM 信号的产生,寄存器进行周期计数,控制 PWM 的周期,在计数器周期计数过程中同时将计数值与比较值比较,当周期计数器的值小于比较寄存器时输出低电平,否则输出高电平,此时通过调节比较值便可调节 PWM 占空比,调节周期计数器的最大计数值便可调节 PWM 的周期,PWM 信号产生原理如下图所示:
在这里插入图片描述

原理图

LED0 到 LED3 这 4 个发光二极管的阴极分别连到 S8050(NPN 三极管)的集电极上,阳极都与 3.3V 电压相连,三极管的基极分别与 FPGA 相连,这是由于 FPGA 的 IO 口的电压只有 1.5V,电压较低,所以此处连接三极管是为了起到放大电压的作用。这样就可以通过改变三极管的状态来控制 LED 的亮灭。当 FPGA 输出到为高电平时,三极管导通,LED 灯亮;当 FPGA 输出到为低电平时,三极管截止,LED 灯灭。
在这里插入图片描述
在这里插入图片描述
此实验中只用到了LED0

系统框图

系统框图如下,包括两部分,分别是产生PWM信号的PWM模块和控制PWM占空比的呼吸灯模块
在这里插入图片描述

编写代码

PWM信号生成模块

PWM信号生成模块包含一个周期计数器和一个比较值,比较值通过模块外部输入的占空比结合PWM周期转换得到(这里由呼吸灯模块进行占空比控制),模块代码如下:

`timescale 1ns / 1nsmodule pwm_generate
(input sys_clk,							//系统时钟input sys_rst_n,						//系统复位,低电平有效input [31:0] period,					//PWM周期input [31:0] duty_cycle,				//PWM占空比output pwm_out							//输出的PWM信号
);//PWM周期
wire [31:0] pwm_period;
//PWM比较值
wire [31:0] pwm_compare;
//周期计数器,用于控制PWM周期
reg [31:0] count;//PWM周期,不能小于1
assign pwm_period = (period < 1) ? 1 : period;
//将PWM占空比转换为比较值
assign pwm_compare = (duty_cycle < period) ? (period - duty_cycle) : 0;//周期计数器的值小于比较寄存器时输出低电平,否则输出高电平
assign pwm_out = (count < pwm_compare) ? 0 : 1;//进行周期计数,用于控制PWM输出周期
always @(posedge sys_clk) beginif(!sys_rst_n)count <= 0;else if(count < (period - 1))count = count + 1;elsecount <= 0;
endendmodule

PWM信号生成模块仿真激励代码

PWM信号生成模块仿真激励代码很简单,就是在周期产生时钟信号的同时调整PWM占空比即可,代码如下:

`timescale 1ns / 1ns	//仿真单位/仿真精度module tb_pwm_generate();reg sys_clk;					//时钟
reg sys_rst_n;					//复位
reg [31:0] duty_cycle;			//占空比
wire pwm_out;					//PWWM信号initial beginsys_clk = 1'b0;sys_rst_n = 1'b0;duty_cycle = 0;#200sys_rst_n = 1'b1;//占空比为1#1000duty_cycle = 1;//占空比为2#1000duty_cycle = 2;//占空比为3#1000duty_cycle = 3;//占空比为4#1000duty_cycle = 4;//占空比为5#1000duty_cycle = 5;//占空比为6#1000duty_cycle = 6;//占空比为7#1000duty_cycle = 7;//占空比为8#1000duty_cycle = 8;//占空比为9#1000duty_cycle = 9;//占空比为10#1000duty_cycle = 10;
end//产生时钟
always #10 sys_clk = ~sys_clk;pwm_generate u_tb_pwm_generate_inst (.sys_clk(sys_clk),					//系统时钟.sys_rst_n(sys_rst_n),				//系统复位,低电平有效.period(10),						//PWM周期.duty_cycle(duty_cycle),			//PWM占空比.pwm_out(pwm_out)					//输出的PWM信号
);endmodule

呼吸灯模块

呼吸灯模块用于向PWM模块输出一个占空比,内部包含以下几个部分:

  • 一个周期计数器,用于控制PWM占空比调节的间隔
  • 根据占空比调节方向调节占空比
  • 记录占空比调节次数
  • 当占空比连续递增(递减)到指定次数时说明占空比达到最大(最小),此时改变占空比调节方向标志
    完整的代码如下:
`timescale 1ns / 1nsmodule breath_led #(parameter PWM_PERIOD = 100_000,				//pwm信号的周期parameter BREATH_PERIOD = 100_000_000,		//呼吸灯周期parameter BRIGHT_LEVEL = 100				//亮度等级
)
(input sys_clk,								//系统时钟input sys_rst_n,							//系统复位,低电平有效output reg [31:0] duty_cycle				//PWM占空比
);//PWM占空比调节步进,分100个亮度等级进行占空比调节
localparam DUTY_CYCLE_STEP = PWM_PERIOD / BRIGHT_LEVEL;
//PWM占空比调节间隔,分100个亮度等级进行占空比调节
localparam STEP_INTERVAL = BREATH_PERIOD / BRIGHT_LEVEL;//周期计数器,用于控制PWM占空比调节间隔
reg [31:0] period_count;
//占空比调节次数计数器,用于记录调节占空比的次数
reg [31:0] step_count;
//占空比调节方向控制,为0占空比加,为1占空比减
reg inc_dec_flag;//进行周期计数,用于控制PWM占空比调节间隔
always @(posedge sys_clk) beginif(!sys_rst_n)period_count <= 0;else if(period_count < (STEP_INTERVAL - 1))period_count <= period_count + 1;elseperiod_count <= 0;
end//根据占空比调节方向标志进行占空比调节,控制LED亮度
always @(posedge sys_clk) beginif(!sys_rst_n)duty_cycle <= 0;else if(period_count == (STEP_INTERVAL - 1)) beginif((inc_dec_flag == 1'b0) && ((PWM_PERIOD - duty_cycle) >= DUTY_CYCLE_STEP))duty_cycle <= duty_cycle + DUTY_CYCLE_STEP;else if((inc_dec_flag == 1'b1) && (duty_cycle >= DUTY_CYCLE_STEP))duty_cycle <= duty_cycle - DUTY_CYCLE_STEP;end
end//记录调节占空比的次数
always @(posedge sys_clk) beginif(!sys_rst_n)step_count <= 0;else if(period_count == (STEP_INTERVAL - 1)) beginif(step_count < (BRIGHT_LEVEL - 1))step_count <= step_count + 1;elsestep_count <= 0;end
end//占空比调节方向控制,为0占空比加,为1占空比减
//当占空比连续递增(递减)到指定次数时说明占空比达到最大(最小),此时改变占空比调节方向标志
always @(posedge sys_clk) beginif(!sys_rst_n)inc_dec_flag <= 0;else if(period_count == (STEP_INTERVAL - 1)) beginif(step_count == (BRIGHT_LEVEL - 1))inc_dec_flag <= ~inc_dec_flag;end
endendmodule

呼吸灯模块仿真激励代码

呼吸灯模块仿真激励代码非常简单,只需要产生激励时钟即可,代码如下:

`timescale 1ns / 1ns	//仿真单位/仿真精度module tb_breath_led();reg sys_clk;					//时钟
reg sys_rst_n;					//复位
wire [31:0] duty_cycle;			//占空比initial beginsys_clk = 1'b0;sys_rst_n = 1'b0;#200sys_rst_n = 1'b1;
end//产生时钟
always #10 sys_clk = ~sys_clk;breath_led #(.PWM_PERIOD(100),				//pwm信号的周期.BREATH_PERIOD(10_000),			//呼吸灯周期.BRIGHT_LEVEL(10)				//亮度等级
)
u_tb_breath_led_inst(.sys_clk(sys_clk),					//系统时钟.sys_rst_n(sys_rst_n),				//系统复位,低电平有效.duty_cycle(duty_cycle)				//PWM占空比
);endmodule

顶层模块

顶层模块主要用于例化PWM生成模块和呼吸灯模块,并将两个模块进行关联,代码如下:

`timescale 1ns / 1nsmodule top_breath_led #(parameter PWM_PERIOD = 100_000,				//pwm信号的周期parameter BREATH_PERIOD = 100_000_000,		//呼吸灯周期parameter BRIGHT_LEVEL = 100				//亮度等级
)
(input sys_clk,								//系统时钟input sys_rst_n,							//系统复位,低电平有效output led									//LED
);//PWM占空比
wire [31:0] duty_cycle;//例化呼吸灯模块
breath_led #(.PWM_PERIOD(PWM_PERIOD),				//pwm信号的周期.BREATH_PERIOD(BREATH_PERIOD),			//呼吸灯周期.BRIGHT_LEVEL(BRIGHT_LEVEL)				//亮度等级
)
u_breath_led_inst (.sys_clk(sys_clk),						//系统时钟.sys_rst_n(sys_rst_n),					//系统复位,低电平有效.duty_cycle(duty_cycle)					//PWM占空比
);//例化PWM发生模块
pwm_generate u_pwm_generate_inst (.sys_clk(sys_clk),						//系统时钟.sys_rst_n(sys_rst_n),					//系统复位,低电平有效.period(PWM_PERIOD),					//PWM周期.duty_cycle(duty_cycle),				//PWM占空比.pwm_out(led)							//PWM,用于控制LED
);endmodule

顶层模块仿真激励代码

顶层模块仿真激励代码非常简单,只需要产生激励时钟即可,代码如下:

`timescale 1ns / 1ns	//仿真单位/仿真精度module tb_top_breath_led();reg sys_clk;					//时钟
reg sys_rst_n;					//复位
wire led;						//LEDinitial beginsys_clk = 1'b0;sys_rst_n = 1'b0;#200sys_rst_n = 1'b1;
end//产生时钟
always #10 sys_clk = ~sys_clk;top_breath_led #(.PWM_PERIOD(10),					//pwm信号的周期.BREATH_PERIOD(1000),				//呼吸灯周期.BRIGHT_LEVEL(10)					//亮度等级
)
u_tb_top_breath_led_inst (.sys_clk(sys_clk),					//系统时钟.sys_rst_n(sys_rst_n),				//系统复位,低电平有效.led(led)							//LED
);endmodule

约束输入

管脚分配如下:
在这里插入图片描述
XDC 约束语句如下:

#时序约束
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]#IO 管脚约束
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS15} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U7 IOSTANDARD LVCMOS15} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN V9 IOSTANDARD LVCMOS15} [get_ports led]

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

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

相关文章

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

C#与VisionPro联合开发——串口通信

串口通信 串口通信是一种常见的数据传输方式&#xff0c;通过串行接口&#xff08;串口&#xff09;将数据以串行比特流的形式进行传输。在计算机和外部设备之间&#xff0c;串口通信通常是通过串行通信标准&#xff08;如RS-232&#xff09;来实现的。串口通信可以用于连接各…

解析OOM的三大场景,原因及实战解决方案

目录 一、什么是OOM 二、堆内存溢出&#xff08;Heap OOM&#xff09; 三、方法区内存溢出&#xff08;Metaspace OOM&#xff09; 四、栈内存溢出&#xff08;Stack OOM&#xff09; 一、什么是OOM OOM 是 Out Of Memory 的缩写&#xff0c;意思是内存耗尽。在计算机领域…

每日OJ题_牛客JZ39 数组中出现次数超过一半的数字

目录 牛客JZ39 数组中出现次数超过一半的数字 解析代码 牛客JZ39 数组中出现次数超过一半的数字 数组中出现次数超过一半的数字_牛客题霸_牛客网 解析代码 摩尔投票法&#xff1a;摩尔投票法&#xff0c;时间O(N)&#xff0c;空间O(1)。 可以理解成混战极限一换一&#xff…

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

算法沉淀——动态规划之简单多状态 dp 问题上 01.按摩师02.打家劫舍 II03.删除并获得点数04.粉刷房子 01.按摩师 题目链接&#xff1a;https://leetcode.cn/problems/the-masseuse-lcci/ 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在…

神经网络系列---常用梯度下降算法

文章目录 常用梯度下降算法随机梯度下降&#xff08;Stochastic Gradient Descent&#xff0c;SGD&#xff09;&#xff1a;随机梯度下降数学公式&#xff1a;代码演示 批量梯度下降&#xff08;Batch Gradient Descent&#xff09;批量梯度下降数学公式&#xff1a;代码演示 小…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解&#xff0c;基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型&#xff0c;源代码放在GitHub上&#xff0c;地址传送点击此处。项目大纲如下&#xff1a; 文章目录 一、问题描述二、数据集处理…

[HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 上一节的课后练习

docker运行onlyoffice,并配置https访问【参考仅用】

官方说明&#xff1a; Installing ONLYOFFICE Docs for Docker on a local server - ONLYOFFICEhttps://helpcenter.onlyoffice.com/installation/docs-developer-install-docker.aspx 一、容器端口、目录卷映射 sudo docker run --name容器名称 --restartalways -i -t -d -p…

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;

零样本带解释性的医学大模型

带解释性的医学大模型 提出背景解法拆解方法的原因对比以前解法 零样本带解释性的医学大模型如何使用CLIP模型和ChatGPT来进行零样本医学图像分类用特定提示查询ChatGPT所生成的医学视觉特征描述相似性得分在不同症状上的可视化&#xff0c;用于解释模型的预测注意力图的可视化…

公众号回复idea能给出下载链接。

你可以使用字典来存储这些数据&#xff0c;然后在接收到消息时根据消息内容在字典中查找对应的回复内容。 这样做不仅可以更优雅地管理多组数据&#xff0c;还可以轻松地扩展和维护。msg parse_message(message) reply_dict {"idea": "https://pan.baidu.com/…

【数据结构】时间复杂度(加法乘法规则、渐近时间复杂度、循环时间复杂度总结

2.2 时间复杂度 什么是时间复杂度&#xff1f; 评估算法时间开销 T ( n ) O ( f ( n ) ) T(n)O(f(n)) T(n)O(f(n)) 在实际求解中&#xff0c;只留表达式中最高阶的部分&#xff0c;丢弃其他部分。 如何求解&#xff1f; 求解步骤 1.找到一个最深层的基本操作&#xff1b; 2.分…

03|分页查询优化

1. 根据自增且连续的主键排序 使用条件&#xff1a;主键连续且自增 & 结果按照主键排序 select * from employees limit 90000,5;理论上应该走主键索引, 为什么现在type是 all呢? ● 查询第9w行数据开始的5条数据时属于深度分页。 ● limit 90000 5工作原理就是先读取前面…

mac下使用jadx反编译工具

直接执行步骤&#xff1a; 1.创建 jadx目录 mkdir jadx2.将存储库克隆到目录 git clone https://github.com/skylot/jadx.git 3. 进入 jadx目录 cd jadx 4.执行编译 等待片刻 ./gradlew dist出现这个就代表安装好了。 5.最后找到 jadx-gui 可执行文件&#xff0c;双击两下…

C/C++暴力/枚举/穷举题目(刷蓝桥杯基础题的进!)

目录 前言 一、百钱买百鸡 二、百元兑钞 三、门牌号码&#xff08;蓝桥杯真题&#xff09; 四、相乘&#xff08;蓝桥杯真题&#xff09; 五、卡片拼数字&#xff08;蓝桥杯真题&#xff09; 六、货物摆放&#xff08;蓝桥杯真题&#xff09; 七、最短路径&#xff08;蓝…

Unity中URP实现水体效果(泡沫)

文章目录 前言一、给水上色1、我们在属性面板定义两个颜色2、在常量缓冲区申明这两个颜色3、在片元着色器中&#xff0c;使用深度图对这两个颜色进行线性插值&#xff0c;实现渐变的效果 二、实现泡沫效果1、采样 泡沫使用的噪波纹理2、控制噪波效果强弱3、定义_FoamRange来控制…

自定义神经网络二之模型训练推理

文章目录 前言模型概念模型是什么&#xff1f;模型参数有哪些神经网络参数案例 为什么要生成模型模型的大小什么是大模型 模型的训练和推理模型训练训练概念训练过程训练过程中的一些概念 模型推理推理概念推理过程 总结 前言 自定义神经网络一之Tensor和神经网络 通过上一篇…

yolov8添加注意力机制模块-CBAM

修改 在tasks.py&#xff08;路径&#xff1a;ultralytics-main/ultralytics-main - attention/ultralytics/nn/tasks.py&#xff09;文件中&#xff0c;引入CBAM模块。因为yolov8源码中已经包含CBAM模块&#xff0c;在conv.py文件中&#xff08;路径&#xff1a;ultralytics-…

业务流程管理系统(BPMS):一文掌握,组织业务流程优化必备。

大家好&#xff0c;我是大美B端工场&#xff0c;本期继续分享商业智能信息系统的设计&#xff0c;欢迎大家关注&#xff0c;如有B端写系统界面的设计和前端需求&#xff0c;可以联络我们。 一、什么是BPMS系统 BPMS是Business Process Management System&#xff08;业务流程管…