FPGA知识基础之---呼吸灯实验


一、呼吸灯简介

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 综合

在这里插入图片描述
在这里插入图片描述

因为引脚过多,笔者仅选取了输入输出两部分进行验证


  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值