基于Verilog实现呼吸灯

news/2024/12/23 1:09:47/

时间的单位换算

首先掌握秒的单位换算,这里总结一些。因为笔者目前用的大多为50MHz,所以介绍以此为例。但关于秒的转换全世界都是一样的。

1MHz = 1,000kHz = 1,000,000Hz

频率:是用单位时间内完成的周期性变化的次数,是描述周期运动频繁程度的量。

因此结合以上内容,50MHz,就是说,(两个相邻时钟上升沿算一个周期)1s内有50,000,000Hz个时钟上升沿。所以一个周期有多久就可以计算出来了1/50,000,000 = 0.000,000,02s

而常见的时间单位换算

1s = 1,000ms毫秒

1s = 1,000ms = 1,000,000us 微秒      1ms = 1,000us

1s = 1,000ms = 1,000,000us = 1,000,000,000ns 纳秒   1us = 1,000ns

下面还有皮秒和飞秒。进制都是1,000

0,000,000,02s = 0,000,02ms = 0,02us = 20ns

所以可得,50MHz时钟频率下的一个周期是20ns!!!

呼吸灯设计原理

原理就我理解,总的来说,就是先分频,再控制占空比。通过控制led的亮灯时间来实现呼吸功能。

功能就是让led灯2s为从暗到亮,下一个2s从亮到暗。

具体实现为将2s分为1000份。在这1000份里边,依次增加亮灯的时间。2s的1000份就是2ms

所以将2ms再分为1000份,就是2us。第一个2ms,亮led2us 第二个2ms,亮led4us......

然后依次增加。

仿真截图

由于分的太细,,可能看的不是很清楚。

代码

module pwm_led(clk,rst_n,pwm_led);
input clk;
input rst_n;output pwm_led;//两秒计时器
reg time_2s;
reg [27:0] cnt_2s;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)begin cnt_2s <= 28'd0;time_2s  <= 1'b0;endelse if(cnt_2s == 28'd50_000_000 - 1'b1)begincnt_2s <= 28'd0;time_2s <= 1'b1;endelse begincnt_2s <= cnt_2s + 1'b1;time_2s <= 1'b0;end
end//2ms计时器
reg time_2ms;
reg [16:0] cnt_2ms;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)begin cnt_2ms <= 17'd0;time_2ms  <= 1'b0;endelse if(cnt_2ms == 17'd100_000 - 1'b1)begincnt_2ms <= 17'd0;time_2ms <= 1'b1;endelse begincnt_2ms <= cnt_2ms + 1'b1;time_2ms <= 1'b0;end
end
//计数是第几个2ms
reg [9:0] number_2ms;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)number_2ms <= 10'd0;else if( number_2ms == 10'd999 )number_2ms <= 10'd0;else if(time_2ms)number_2ms <= number_2ms + 1'b1;else number_2ms <= number_2ms;
end//2us计时器
reg time_2us;
reg [6:0] cnt_2us;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)begin cnt_2us <= 7'd0;time_2us  <= 1'b0;endelse if(cnt_2us == 7'd100 - 1'b1)begincnt_2us <= 7'd0;time_2us <= 1'b1;endelse begincnt_2us <= cnt_2us + 1'b1;time_2us <= 1'b0;end
end//计数2us,数是第几个2us
reg [9:0] number_2us;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)number_2us <= 10'd0;else if(number_2us == 10'd999 )number_2us <= 10'd0;else if(time_2us)number_2us <= number_2us + 1'b1;else number_2us <= number_2us;
endwire led_flag0;//暗到亮
wire led_flag1;//亮到暗
assign led_flag0 = (number_2us < number_2ms) ? 1 : 0;  
assign led_flag1 = (number_2us < number_2ms) ? 0 : 1;reg led_flag;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)led_flag <= 1'b1;else if(time_2s)led_flag <= ~led_flag;else led_flag <= led_flag;
endassign pwm_led = (led_flag) ? led_flag0 : led_flag1;endmodule

代码经验证可以实现功能,还是很好玩的。


http://www.ppmy.cn/news/701096.html

相关文章

led实现呼吸灯

1.呼吸灯原理就是要让led灯的亮灭时间不同&#xff0c;需要多个计数器实现。从1us到1s钟&#xff0c;改变led呼吸灯的触发条件。 2.依旧把程序写出来&#xff0c;这次在写计数器的时候&#xff0c;发现自己很大问题&#xff0c;就是计数器条件写不全。要不就是只写计数不清零&a…

通过PWM实现呼吸灯

文章目录 前言一、PWM是什么&#xff1f;二、配置项目三、配置代码四、效果五、总结六、参考资料 前言 硬件&#xff1a;stm32f103c8t6 核心板软件&#xff1a;STM32CubeMX 6.4.0软件&#xff1a;keil5 mdk软件&#xff1a;野火串口调试助手 一、PWM是什么&#xff1f; 脉冲宽…

jQuery+js+css实现键盘按键呼吸灯效果

#直接上效果图&#xff1a; ##说明&#xff1a;需要引入jQuery文件&#xff0c;图片地址自选本地即可 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

呼吸灯程序

#nclude //51头文件 //《B_无级亮度变化》 #define DY_PORT P1 //设置LED连接的I/O组 #define DY_SPEED 1 //设置每一个明亮级的停留时间&#xff08;值域&#xff1a;0~65535&#xff09; #define DY_PWM 500 //设置明亮的总级数&#xff08;级数过大会出现闪烁&a…

FPGA 双按键控制LED呼吸灯实现

FPGA &&双按键控制&&LED呼吸灯实现 文章目录 FPGA &&双按键控制&&LED呼吸灯实现1.按键脉冲设计1.1按键脉冲信号代码1.2.按键脉冲Testbench代码1.3.仿真波形&#xff1a; 2. pwm脉宽调制1.1PWM信号简介&#xff1a;1.2时间比例换算&#xff1a;…

呼吸灯

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

Arduino(五)——呼吸灯

这节的主要内容为AO模拟输出&#xff0c;内容是比较简单的&#xff0c;我们只要注意一个函数 也就是 analogWrite(pin,value) - PWM ,数字IO口PWM输出函数&#xff0c;Arduino 数字IO口标注了PWM的IO口可使用该函数&#xff0c;pin 表示 3&#xff0c;5&#xff0c;6&#xff…

呼吸灯按钮的实现

前几天浏览网页是时候&#xff0c;发现一个特效&#xff0c;感觉很不错&#xff0c;博主仿照它的样子写了一下&#xff0c;下面直接见代码吧。 在页面中添加一个提交按钮 <body> <div class"submit_style"><input type"submit" class&quo…