09 呼吸灯

news2024/10/5 17:15:47

呼吸灯简介

呼吸灯实际展示的效果就是一个 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 / 1ns

module 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) begin
	if(!sys_rst_n)
		count <= 0;
	else if(count < (period - 1))
		count = count + 1;
	else
		count <= 0;
end

endmodule

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 begin
	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
	duty_cycle = 0;
	#200
	sys_rst_n = 1'b1;

	//占空比为1
	#1000
	duty_cycle = 1;

	//占空比为2
	#1000
	duty_cycle = 2;

	//占空比为3
	#1000
	duty_cycle = 3;

	//占空比为4
	#1000
	duty_cycle = 4;

	//占空比为5
	#1000
	duty_cycle = 5;

	//占空比为6
	#1000
	duty_cycle = 6;

	//占空比为7
	#1000
	duty_cycle = 7;

	//占空比为8
	#1000
	duty_cycle = 8;

	//占空比为9
	#1000
	duty_cycle = 9;

	//占空比为10
	#1000
	duty_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 / 1ns

module 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) begin
	if(!sys_rst_n)
		period_count <= 0;
	else if(period_count < (STEP_INTERVAL - 1))
		period_count <= period_count + 1;
	else
		period_count <= 0;
end

//根据占空比调节方向标志进行占空比调节,控制LED亮度
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		duty_cycle <= 0;
	else if(period_count == (STEP_INTERVAL - 1)) begin
		if((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) begin
	if(!sys_rst_n)
		step_count <= 0;
	else if(period_count == (STEP_INTERVAL - 1)) begin
		if(step_count < (BRIGHT_LEVEL - 1))
			step_count <= step_count + 1;
		else
			step_count <= 0;
	end
end

//占空比调节方向控制,为0占空比加,为1占空比减
//当占空比连续递增(递减)到指定次数时说明占空比达到最大(最小),此时改变占空比调节方向标志
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		inc_dec_flag <= 0;
	else if(period_count == (STEP_INTERVAL - 1)) begin
		if(step_count == (BRIGHT_LEVEL - 1))
			inc_dec_flag <= ~inc_dec_flag;
	end
end

endmodule

呼吸灯模块仿真激励代码

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

`timescale 1ns / 1ns	//仿真单位/仿真精度

module tb_breath_led();

reg sys_clk;					//时钟
reg sys_rst_n;					//复位
wire [31:0] duty_cycle;			//占空比

initial begin
	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
	#200
	sys_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 / 1ns

module 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;						//LED

initial begin
	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
	#200
	sys_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.coloradmin.cn/o/1469156.html

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

相关文章

超强随机短视频源码自带视频带支付源码

1.开启是否连续自动播放 2.支持手动点击看下一个 3.支持引流跳官方地址&#xff0c;产品地址&#xff0c;可以设置跳转地址 4.简洁大气&#xff0c;支持网站基础信息设置 5.支持设置定时多少时间弹广告 6.支持PC手机设置弹广告图片与点击后跳转链接 源码免费下载地址专业…

【Unity】双击C#脚本文件以单个文件打开(Visual Studio)、父类找不到、引用找不到、无法跳转等问题

问题&#xff1a;新安装一个Unity后&#xff0c;突然发现在工程里双击C#脚本&#xff0c;会一个一个打开&#xff0c;虽然也是用VS软件打开了&#xff0c;但是它无法被正确识别为Unity工程的C#脚本&#xff0c;也就是说所有命名空间无效&#xff0c;因为没关联上整个工程的解决…

OSCP靶场--Slort

OSCP靶场–Slort 考点(1.php 远程文件包含 2.定时任务提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.178.53 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-24 04:37 EST Nmap scan report for 192.168.178.53 …

Windows安装PHP及在VScode中配置插件,使用PHP输出HelloWorld

安装PHP PHP官网下载地址(8.3版本)&#xff1a;PHP For Windows&#xff1a;二进制文件和源代码发布 点击下载.zip格式压缩包&#xff1a; 历史版本在Old archives中下载。推荐在Documentation download中下载官方文档&#xff0c;方便学习。 下载完成后在一个顺眼的地方解压压…

Spring Boot 项目集成camunda流程引擎

使用camunda开源工作流引擎有&#xff1a;通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 其中&#xff0c;通过源代码编译运行的方式最为复杂&#xff0c;具体参考&#xff1a;https://lowcode.blog.csdn.net/article/details/1362…

vivado VHDL Objects、VHDL实体描述

VHDL对象包括&#xff1a;信号、变量、常量和运算符。 信号 在中声明VHDL信号&#xff1a; •体系结构声明部分&#xff1a;在该体系结构内的任何位置使用VHDL信号。 •一个块&#xff1a;在该块中使用VHDL信号。 使用<信号分配运算符分配VHDL信号。 signal sig1 : std…

企业计算机服务器中了malloxx勒索病毒怎么办?Malloxx勒索病毒解密数据恢复

网络技术的不断更新与发展&#xff0c;为企业的发展提供了强有力数据支撑&#xff0c;在企业的生产运营过程中&#xff0c;企业数据扮演着重要的角色&#xff0c;通过企业数据可以更好地总结调整企业的规划发展方向与日常数据统计&#xff0c;但利用网络技术的支撑就要防范网络…

软考41-上午题-【数据库】-关系代数运算3-外连接

一、外连接 连接的拓展&#xff0c;处理由于连接运算而缺失的信息。 1-1、回顾自然连接 1-2、左外连接 示例&#xff1a; 左边的表&#xff0c;数值是全的 1-3、右外连接 示例&#xff1a; 右边的表&#xff0c;数值是全的 1-4、全外连接 示例&#xff1a; 自然连接左外连接…

Sora:颠覆性AI视频生成工具

Sora是一款基于人工智能&#xff08;AI&#xff09;技术的视频生成工具&#xff0c;它彻底改变了传统视频制作的模式&#xff0c;为创作者提供了高效、便捷、高质量的视频内容生成方式。通过深度学习和自然语言处理等先进技术&#xff0c;Sora实现了从文字描述到视频画面的自动…

备考2024年汉字小达人:历年考题练一练-18道选择题

今天为大家分享汉字小达人的备考学习资源&#xff0c;通过参加没有报名费、人人可参加的汉字小达人比赛&#xff0c;激发孩子学习语文的兴趣&#xff0c;并且提升语文学习成绩。 汉字小达人的两轮比赛&#xff08;区级自由报名活动、市级活动&#xff09;的选择题主要有六种题型…

Mean Teacher的调研与学习

Mean Teacher的调研与学习 0 FQA:1 Mean Teacher1.1 Mean Teacher简介1.2 回顾Π-Model 和 Temporal Ensembling1.3 Mean Teacher 0 FQA: Q1&#xff0c;什么是Mean Teacher&#xff1f; MT的训练方式是怎样的&#xff1f;A1: Mean Teacher是一种基于一致性正则化的半监督学习…

【web】nginx+php环境搭建-关键点(简版)

一、nginx和php常用命令 命令功能Nginxphp-fpm启动systemctl start nginxsystemctl start php-fpm停止systemctl stop nginxsystemctl stop php-fpm重启systemctl restart nginxsystemctl restart php-fpm查看启动状态systemctl status nginxsystemctl status php-fpm开机自启…

读书笔记之《大加速》:为什么我们的生活节奏越来越快?

《大加速—为什么我们的生活越来越快》作者是 [英] 罗伯特科尔维尔&#xff0c;原作名: The Great Acceleration:How the World is getting Faster,Faster&#xff0c;2019年出版。 罗伯特科尔维尔(Robert Colvile),是一位政治评论员、作家、资深互联网媒体人。作品刊登在英国《…

《C++面向对象程序设计》✍学习笔记

C的学习重点 C 这块&#xff0c;重点需要学习的就是一些关键字、面向对象以及 STL 容器的知识&#xff0c;特别是 STL&#xff0c;还得研究下他们的一些源码&#xff0c;下面是一些比较重要的知识&#xff1a; 指针与引用的区别&#xff0c;C 与 C 的区别&#xff0c;struct 与…

【Spring MVC】处理器映射器:AbstractHandlerMethodMapping源码分析

目录 一、继承体系 二、HandlerMapping 三、AbstractHandlerMapping 四、AbstractHandlerMethodMapping 4.1 成员属性 4.1.1 MappingRegistry内部类 4.2 AbstractHandlerMethodMapping的初始化 4.3 getHandlerInternal()方法&#xff1a;根据当前的请求url&#xff0c;…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列&#xff08;定时消息&#xff09;6.重试队列7.死信队列8.消息语…

智慧城市与数字孪生:共创未来城市新篇章

一、引言 随着科技的飞速发展&#xff0c;智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接&#xff0c;为城市管理、规划…

接近于pi的程序

在一个平静的午后&#xff0c;两个神秘的数字悄然相遇了。它们分别是-1031158223和-328227871。这两个数字看起来普普通通&#xff0c;但谁知它们背后隐藏着一段令人惊叹的奇幻之旅。 这两个数字其实是π的两位探险家&#xff0c;它们决定通过一次除法运算来探索π的奥秘。它们…

浅谈密码学

文章目录 每日一句正能量前言什么是密码学对称加密简述加密语法Kerckhoffs原则常用的加密算法现代密码学的原则威胁模型&#xff08;按强度增加的顺序&#xff09; 密码学的应用领域后记 每日一句正能量 人生在世&#xff0c;谁也不能做到让任何人都喜欢&#xff0c;所以没必要…

Vue+SpringBoot打造快递管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …