基于CPLD/FPGA的呼吸灯效果实现(附全部verilog源码)

一、功能介绍

此设计可以让你的FPGA板子上那颗LED具有呼吸效果,像智能手机上的呼吸灯一样。以下源码已上板验证通过,大家可直接使用。

二、呼吸灯Verilog源码

ps1. 带★号处可根据需要进行修改.

ps2. 有需要的话可自行添加rst复位信号.

 

/***************************************** Declaration ***************************************************
File Name:    breathe_led.v
Function:     实现呼吸灯功能
**********************************************************************************************************/

module    breathe_led
(
    input            clk,
    output    reg        led
);
parameter    FREQUENCE=50_000_000;    //★调用的时候仅仅需要将此值改为连接到clk端口上的实际频率值即可(此时呼吸一次为2s),以下所有参数均不需改动; 如果想加快呼吸速度,可减小此值,反之增大此值


parameter        WIDTH=9;
reg    [WIDTH:0]    state0;
reg    [WIDTH-1:0]    state1;


//=============================================
//控制每个占空比的持续时间
//=============================================
reg    [31:0]    cnt0;
always @ (posedge clk)
begin
    if(cnt0==(FREQUENCE/(2**WIDTH)))
        begin
            cnt0<=0;
            state0<=state0+1'b1;
        end
    else
        begin
            cnt0<=cnt0+1'b1;
        end
end


//=============================================
//控制占空比增大与减小
//=============================================
always @ (posedge clk)
begin
    if(state0[WIDTH])
        state1<=state0[WIDTH-1:0];
    else
        state1<=~state0[WIDTH-1:0];    
end


//=============================================
//生成与state1进行大小比较的计数器cnt1
//=============================================
wire [WIDTH-1:0]    time_over;
assign    time_over={WIDTH{1'b1}};

reg [WIDTH-1:0]    cnt1;
always @ (posedge clk)
begin 
    if(cnt1==time_over)
        begin
            cnt1<=0;
        end
    else
        begin
            cnt1<=cnt1+1'b1;
        end
end


//=============================================
//计数器cnt1与state1进行大小比较,以使led脉冲的占空比实现渐变
//=============================================
always @ (posedge clk)
begin
    if((cnt1+time_over/3)<=state1)    //其实写成if(cnt1<=state1)即可实现led的渐亮与渐灭,但为了真实的模拟呼吸灯(可参考手机上的呼吸灯),在此增加了time_over/3这个量,是为了使led呼吸一次之后保持1/3时间的熄灭状态
        led<=0;        //led亮; 如果led高电平亮,此处改为led<=1;
    else
        led<=1;        //led灭; 如果led低电平灭,此处改为led<=0;
end


endmodule

三、各种呼吸灯效果演示

  

 

  

  

 

 


 

 

如您有此功能的定制开发或其他的FPGA设计需求,请查看下面这篇文章了解我们的业务范围和联系方式,我们将竭诚为您服务。

精橙FPGA,一个承接FPGA代码设计的资深工程师团队。

 

posted @ 2024-12-06 21:33  精橙FPGA刘工  阅读(22)  评论(0编辑  收藏  举报