首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于CPLD/FPGA的呼吸灯效果实现

基于CPLD/FPGA的呼吸灯效果实现

例化时,仅需要按您的需求修改代码中带★号的参数   ps. 只有一处需要修改哦亲

/***************************************** Declaration ***************************************************
File Name: breathe_led.v
Function:  实现呼吸灯功能
Author:  Bob Liu
E-mail:  shuangfeiyanworld@163.com

Version: V1.0
Update:  2013-04-07
**********************************************************************************************************/
module breathe_led
(
input   clk,
output reg  led
);
parameter FREQUENCE=50_000_000; //★此默认值是基于50MHZ的系统时钟设置的,当您调用此呼吸灯模块的时候,
         //  仅仅需要将此值改为连接到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
the king of nerds
共同学习探讨
the king of nerds
返回列表