基于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代码设计的资深工程师团队。