二、15【FPGA】呼吸灯实现

article/2025/10/27 21:53:05

前言

学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。

学习视频:是根据野火FPGA视频教程——第十八讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3

实战演练

一、设计规划

1.1 实验目标

在开发板上实现LED灯实现呼吸灯效果,工作原理是利用PWM来控制小灯在相同的时间段内的不同占空比,即在同样小时间段内,小灯亮的时间依次增加到最大后再依次减少,从而实现渐亮到渐灭的“呼吸”效果。

1.2 硬件资源

这里采用野火的升腾mini板进行实验

led灯原理图

二、程序设计

2.1 波形图绘制 

PWM占空比控制灯亮的程度,假设led灯亮1s灭1s,实现渐亮与渐灭,由于两者类似只说渐亮。

为使渐亮的更细腻,这里将1s分为1000份,即1ms为一个时间周期,控制1ms时间内的导通时间即可以控制led灯的亮度,这里将1ms分为1000个小段(即1us),控制渐亮如:第一个1ms内让其导通1us;第二个1ms内导通2us;第三个1ms内导通3us;......;第1000个1ms内导通999us。逐渐,变灭与之相反。为区分渐亮与渐灭的时间,这里添加1s的时间标志cnt_en,1s后标志进行取反,当高电平时执行渐亮,当低电平时执行渐灭

2.2 代码编写

为了便于仿真代码对程序进行仿真,这里将计数器最大常数用parameter在模块前定义

module breath_led
#(parameter CNT_1US_MAX = 6'd49 ,parameter CNT_1MS_MAX = 10'd999 ,parameter CNT_1S_MAX  = 10'd999
)
(   input wire  sys_clk  ,input wire  sys_rst_n,output reg  led_out  );reg [5:0] cnt_1us;reg [9:0] cnt_1ms;reg [9:0] cnt_1s;reg       cnt_en;
//us计数器    always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_1us <= 6'd0;else if(cnt_1us == CNT_1US_MAX)cnt_1us <= 6'd0;else cnt_1us <= cnt_1us + 6'd1;
//ms计数器always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_1ms <= 10'd0;else if((cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))cnt_1ms <= 10'd0;else if(cnt_1us == CNT_1US_MAX)cnt_1ms <= cnt_1ms + 10'd1;elsecnt_1ms <= cnt_1ms;
//s计数器always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_1s <= 10'd0;else if((cnt_1us == CNT_1US_MAX)&& (cnt_1ms == CNT_1MS_MAX)&& (cnt_1s  == CNT_1S_MAX))cnt_1s <= 10'd0;else if((cnt_1us == CNT_1US_MAX) && (cnt_1ms == CNT_1MS_MAX))cnt_1s <= cnt_1s + 10'd1;else    cnt_1s <= cnt_1s;
//添加渐亮与渐灭标志always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_en <= 1'b1;else if((cnt_1us == CNT_1US_MAX)&&(cnt_1ms == CNT_1MS_MAX)&&(cnt_1s  == CNT_1S_MAX))cnt_en <= ~cnt_en;else cnt_en <= cnt_en;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)led_out <= 1'b0;           //led灯熄灭else if((cnt_en == 1'b1) && (cnt_1ms <= cnt_1s)||(cnt_en == 1'b0) && (cnt_1ms > cnt_1s))led_out <= 1'b1;elseled_out <= 1'b0;       
endmodule

在编写代码时遇到的问题: cnt_1us <= cnt_1us + 6'd1;            cnt_1us = cnt_1us + 6'd1;  

将代码中的阻塞赋值错写成了非阻塞赋值,“cnt_1us = cnt_1us + 6'd1;”该语句只有在执行完后才能执行后面的其他赋值语句,这样就会导致cnt_1us在最大时刻的前面和后面都会出现cnt_1ms出现跳变的现象,阻塞赋值判断的并不是该时刻的前状态,而是执行完的后状态。

三、逻辑仿真

3.1 仿真代码

为了方便仿真代码的实现,这里修改最大值常数变为2,5,5

`timescale 1ns / 1ns
//
// Company: 追逐者——桥的小作坊
// Create Date: 2022/05/13 21:26:31
// Design Name: 呼吸灯
// Module Name: tb_breath_led
//
module tb_breath_led();reg sys_clk;reg sys_rst_n;wire led_out;initial beginsys_clk = 1'b1;sys_rst_n <= 1'b0;#20sys_rst_n <= 1'b1;end always #10 sys_clk = ~sys_clk;breath_led
#(.CNT_1US_MAX(6'd2  ),.CNT_1MS_MAX(10'd5),.CNT_1S_MAX (10'd5)
)
breath_led_inst
(   .sys_clk  (sys_clk  ),.sys_rst_n(sys_rst_n),.led_out  (led_out  ));    
endmodule

3.2 波形图对比

如图可知三个计数器的计数波形是正确的,输出与绘制的原理图也相同。

四、上板验证

4.1 管脚绑定

 Ctrl+s进行保存

4.2 程序下载

生成bit流文件,连接板卡,下载程序

PFGA—呼吸灯实现

五、总结

1 、深刻体会呼吸灯的分析过程,如何把一个复杂的问题简单化,然后顺着解决问题的思路
思考下去;
2 、继续深入体会 parameter 参数化常数所带来的好处,以及用法;
3 、多体会计数器如何控制,什么时候开始计数、什么时候清零,千万要考虑全面,不要忘
记条件。  

http://chatgpt.dhexx.cn/article/r0hpse4x.shtml

相关文章

基于FPGA实践之呼吸灯(含程序)

呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;感觉好像是人在呼吸。 在单片机中我们调节PWM波的占空比可以实现一个周期内高电平占百分比&#xff0c;这个百分比固定就可以调节亮度&#xff0c;这个百分比是动态的&#xff0c;那么灯的亮度也是动态的&…

Verilog实现呼吸灯效果

呼吸灯的效果采用PWM调波的形式&#xff0c;即快速的改变每个周期的占空比&#xff08;一个周期内高电平时间占一个周期时间的比值&#xff09;来实现点亮到熄灭的效果。示意如下图 而关于整个波形图&#xff0c;用50MHz的晶振&#xff0c;从0开始计数到49则为1us。 而1ms是1u…

呼吸灯

呼吸灯 呼吸灯&#xff0c;就是控制led灯的亮度从弱变强、从强变弱的循环往复&#xff0c;从而实现像呼吸一样的效果。改变电压即可改变led灯的亮度&#xff0c;但是用代码控制led灯两端电压显然是不现实的&#xff0c;我们可以用控制脉冲宽度的方式来控制led灯点亮的时间&…

C51单片机实现呼吸灯

呼吸灯的效果是灯的亮度由暗缓慢变亮再缓慢变暗。 实现思路是改变小灯亮与暗在单位周期的占空比。如下图 具体代码如下&#xff1a; #include<reg52.h> typedef unsigned int u16; typedef unsigned char u8;sbit LEDP2^0; void delay(u16 i) {while(i--); }void ma…

Arduino程序设计(一) 流水灯+呼吸灯

LED灯程序设计 前言一、LED灯的程序设计1 —— 频闪灯二、LED灯的程序设计2 —— 流水灯三、LED灯的程序设计3 —— 呼吸灯总结参考文献 前言 本文主要介绍三种LED灯的程序设计&#xff0c;即频闪灯、流水灯和呼吸灯。本文使用的MCU芯片为ESP8266EX&#xff0c;程序编写使用Ar…

51单片机呼吸灯的实现

1.PWM介绍 PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff08;如电机&#xff1a;转5ms停1ms还是转5ms停2ms&#xff09;&#xff0c;在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行调制&#xff0c;来等效地获得所需要的模拟参量…

呼吸灯——FPGA

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

51单片机——实现呼吸灯程序代码

实现效果如图&#xff1a; 注&#xff1a;该51单片机led灯引脚为P2^ 0 - P2^7,实际代码按照引脚图实现。 代码如下&#xff1a; #include<reg52.h> typedef unsigned int uint; typedef unsigned char uchar; //--------------Delay--------------------void Delay(uin…

单片机开发—呼吸灯的三种实现方法

目录 一、前言1、什么是呼吸灯2、如何实现呼吸灯 二、利用for循环实现呼吸灯三、利用定时器实现呼吸灯1.利用定时器中断实现2.利用定时器输出PWM波实现 四、总结 一、前言 提示&#xff1a;本文使用的芯片并非STM32系列&#xff0c;利用定时器实现呼吸灯是从寄存器层面讲解的&…

【STM32】8.简单呼吸灯的制作教程,附代码、效果视频

目的&#xff1a; 实现呼吸灯。逐渐亮&#xff0c;逐渐灭。 一&#xff0e;呼吸灯原理分析 外设工作靠电流&#xff0c;因此要改变电流大小&#xff0c;所以要动电阻或电压。 电阻&#xff1a;阻值固定&#xff0c;不可更改。 电压&#xff1a;怎么改变电压大小呢&#xff1…

自适应滤波C语言实现

这里写目录标题 原理代码结果 原理 自适应滤波是近年以来发展起来的一种最佳滤波方法。它是在维纳滤波,Kalman滤波等线性滤波基础上发展起来的一种最佳滤波方法。由于它具有更强的适应性和更优的滤波性能。从而在工程实际中,尤其在信息处理技术中得到了广泛的应用。自适应滤波…

c语言实现图像滤波处理

#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include <math.h> /* 位图头结构 */ #pragma pack(1) typedef struct tagBITMAPFILEHEADER {unsigned char bfType[2];//文件格式unsigned long bfSize;//文件大小unsigned short bfReserve…

卡尔曼滤波一阶矩阵C语言实现

①估计时刻k的状态&#xff1a; ②误差相关矩阵P&#xff0c;度量估计值的精确程度 ③卡尔曼增益 ④更新误差相关矩阵 ⑤更新状态变量 ⑥最后输出 C语言代码&#xff1a; float X_pre,P_pre,X_kalman_last,P_kalman_last,X_kalman2500,P_kalman2; //赋初值 float H,Q…

卡尔曼滤波C语言实现

卡尔曼5条基本公式&#xff0c;参考https://wenku.baidu.com/view/8523cb6eaf1ffc4ffe47ac24.html #include "stdio.h" #include "stdlib.h" #include "math.h"#define kal_Q 0.001 /*过程噪声协方差,Q增大&#xff0c;动态响应变快&#xff0…

C语言实现简单卡尔曼滤波

https://www.bilibili.com/video/BV1ez4y1X7eR DR.CAN讲的真的很好 卡尔曼滤波的步骤 步骤说明Step 1计算卡尔曼增益Step 2更新本次迭代的估计值Step 3更新本次迭代的估计误差 具体请看上面DR.CAN的视频 代码 参数说明x_mea测量值x_est估计值e_mea固有的测量误差&#xf…

C语言实现双边滤波

参考博文 看不懂公式的先去看参考博文 一个3*3窗口的代码 /**双边法滤波 3*3窗口 *参数 data[][COL] 图像数据 *参数 row 图像数据行数 *参数 varD 空域核d的标准差 *参数 varR 值域核r的标准差 *需要引用头文件math.h *typedef unsi…

数字图像处理,读懂频域处理的“傅里叶变换”

转载自&#xff1a;https://blog.csdn.net/ebowtang/article/details/39004979 以下部分文字资料整合于网络&#xff0c;本文仅供自己学习用&#xff01; 这是一幅很绝的一维傅里叶变换动态图 一&#xff0c;读懂傅里叶变换 一个信号能表示成傅里叶级数的形式是有条件的&…

傅立叶变换和拉普拉斯变换

欧拉公式 证明过程如下 首先是泰勒展开 参考cosX和sinX的泰勒展开可以证明这个问题。 还有下面这个号称宇宙最美公式 “自然底数e&#xff0c;自然数1和0&#xff0c;虚数i还有圆周率pi&#xff0c;它是这么简洁&#xff0c;这么美丽啊&#xff01;” 傅立叶级数 傅立叶在…

Little’s Law 利特尔法则

1 A simple definition: Little’s Law states that the long-term average number of customers in a stable system L L L is equal to the long-term average effective arrival rate, λ \lambda λ, multiplied by the average time a customer spends in the system, …

勒让德符号的说明及作用

Legendre符号的用途 一、 二次剩余 勒让德符号的提出的意义是判断一个数是否是模n的二次剩余&#xff0c;所以研究勒让德符号之前应该了解一下二次剩余。 存在x使x的平方与a MOD (p)就称a为模p的二次剩余&#xff0c;其中p为素数&#xff0c;a>0且a<p。 通过勒让…