目录
一、呼吸灯简介
1.定义
呼吸灯是电子设备上的一种指示灯,通过周期性的亮暗变化来提示设备的状态或信息。
2.特点
- 渐变效果:灯光由亮到暗或由暗到亮逐渐变化,形成柔和的视觉效果。
- 可定制性:颜色、亮度、变化速度等可以根据需求进行设置和调整。
- 广泛应用:广泛应用于手机、音响、汽车、电脑等各个领域。
3.工作原理
PWM(脉冲宽度调制)
通过改变高电平和低电平的占空比时间来达到渐变的效果
二、实验任务
使用开发板上的LED灯来实现呼吸灯的效果,由灭渐亮,然后由亮渐灭(渐亮和渐灭的时间为2s)
三、PVM(Pulse Width Modulation)简介
3.1工作原理
PWM信号是一种方波信号,其占空比(即高电平时间占整个周期时间的比例)可以调整。通过改变占空比,PWM信号可以模拟出不同的电压或电流水平,尽管实际上PWM信号只包含高电平和低电平两种状态。接收端通过滤波电路将PWM信号转换成平滑的直流电压或电流,从而达到模拟控制的效果。
3.2 优点
- 高效能:PWM技术允许在开关模式下工作,减少了功耗,提高了效率。
- 灵活性:通过调整占空比,可以轻松改变输出电压或电流,实现精确控制。
- 简单性:PWM信号的产生和控制相对简单,易于通过微控制器等数字设备实现。
- 低噪声:相比传统的模拟控制方法,PWM控制可以减少电磁干扰和噪声。
3.3 应用领域
- 电机控制:PWM广泛应用于直流电机、步进电机和伺服电机的速度控制和方向控制。
- LED照明:通过调节PWM信号的占空比,可以控制LED灯的亮度,实现调光功能。
- 电源管理:在电源转换和稳压电路中,PWM技术被用于提高效率和稳定性。
- 音频放大:在音频放大器中,PWM技术可以用来驱动扬声器,提高音质和效率。
四、程序设计
1、思路整理
2、系统框图
3、波形图
4、呼吸原理
五、RTL代码
module breath_led(
input sys_clk , //系统时钟 50MHz
input sys_rst_n , //系统复位,低电平有效
output reg led //LED灯
);
//parameter define
parameter CNT_2US_MAX = 7'd100;
parameter CNT_2MS_MAX = 10'd1000;
parameter CNT_2S_MAX = 10'd1000;
//reg define
reg [6:0] cnt_2us;
reg [9:0] cnt_2ms;
reg [9:0] cnt_2s;
reg inc_dec_flag; //亮度递增/递减 0:递增 1:递减
//cnt_2us:计数2us
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt_2us <= 7'b0;
else if(cnt_2us == (CNT_2US_MAX - 7'b1 ))
cnt_2us <= 7'b0;
else
cnt_2us <= cnt_2us + 7'b1;
end
//cnt_2ms:计数2ms
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt_2ms <= 10'b0;
else if(cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))
cnt_2ms <= 10'b0;
else if(cnt_2us == CNT_2US_MAX - 7'b1)
cnt_2ms <= cnt_2ms + 10'b1;
else
cnt_2ms <= cnt_2ms;
end
//cnt_2s:计数2s
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt_2s <= 10'b0;
else if(cnt_2s == (CNT_2S_MAX - 10'b1) && cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))
cnt_2s <= 10'b0;
else if(cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))
cnt_2s <= cnt_2s + 10'b1;
else
cnt_2s <= cnt_2s;
end
//inc_dec_flag为低电平,led灯由暗变亮,inc_dec_flag为高电平,led灯由亮变暗
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
inc_dec_flag <= 1'b0;
else if(cnt_2s == (CNT_2S_MAX - 10'b1) && cnt_2ms ==( CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))
inc_dec_flag <= ~inc_dec_flag;
else
inc_dec_flag <= inc_dec_flag;
end
//led:输出信号连接到外部的led灯
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led <= 1'b0;
else if((inc_dec_flag == 1'b1 && cnt_2ms >= cnt_2s) || (inc_dec_flag == 1'b0 && cnt_2ms <= cnt_2s))
led <= 1'b1;
else
led <= 1'b0;
end
endmodule
六、仿真分析
6.1 Testbench代码
`timescale 1ns / 1ns //仿真单位/仿真精度
module tb_breath_led();
//parameter define
parameter CLK_PERIOD = 20; //时钟周期 20ns
parameter CNT_2US_MAX = 7'd2;
parameter CNT_2MS_MAX = 10'd10;
parameter CNT_2S_MAX = 10'd10;
//reg define
reg sys_clk;
reg sys_rst_n;
//wire define
wire led;
//信号初始化
initial begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#200
sys_rst_n <= 1'b1;
end
//产生时钟
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
//例化待测设计
breath_led #(
.CNT_2US_MAX (CNT_2US_MAX),
.CNT_2MS_MAX (CNT_2MS_MAX),
.CNT_2S_MAX (CNT_2S_MAX)
)u_breath_led(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.led (led)
);
endmodule
6.2 Modelsim仿真波形分析
七、上板验证
7.1 RTL原理图
因为引脚过多,笔者仅选取了输入输出两部分进行验证
7.2 XDC管教约束文件
#时序约束
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
#IO引脚约束
#------------------------------系统时钟和复位-----------------------------------
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U2 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
#-----------------------------------LED-----------------------------------------
set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} [get_ports {led}]
7.3 综合
因为引脚过多,笔者仅选取了输入输出两部分进行验证
标签:sys,cnt,FPGA,clk,呼吸,---,PWM,parameter,reg From: https://blog.csdn.net/2301_76707170/article/details/140766629