PWM呼吸灯

一、设计文件

//======================================================================
// --- 名称 : breathing_led
// --- 作者 : 又菜又爱玩
// --- 日期 : 2024-4-5
// --- 描述 : PWM频率调制实现呼吸灯的效果,4秒1次循环,
//            每2ms秒变化1次,前2秒亮度增大,后2秒亮度减小
//======================================================================

  module breathing_led
  (
        input          clk ,
        input          rst ,
        output  reg    led 
  );

  reg   [16:0]  cnt_2ms;
  reg   [10:0]  cnt_2ms22s;
  reg   [16:0]  pwm;
  reg      s;

  always @(posedge clk or negedge rst)
    if (~rst)
        cnt_2ms <= 17'b0;
    else if (cnt_2ms == 17'd99999)
            cnt_2ms <= 17'd0;
        else 
            cnt_2ms <= cnt_2ms + 1'b1;

  always @ (posedge clk or negedge rst)
    if (!rst)
        cnt_2ms22s <= 10'b0;
        else if (cnt_2ms22s == 11'd1999)
            cnt_2ms22s <= 10'b0;
        else if (cnt_2ms    == 17'd99999)
            cnt_2ms22s <= cnt_2ms22s + 1'b1;
            else
                cnt_2ms22s <= cnt_2ms22s;

always @(posedge clk or negedge rst  )
if(~rst)
    s  <= 'b0;
    else if (cnt_2ms == 17'd99999)
    s <= 1'b1;
    else
    s <= 1'b0;

    always @(posedge clk or negedge rst)
    if (~rst)
        pwm <= 17'd0;
        else if(s==1'b1 & cnt_2ms22s < 1000)
        pwm <= pwm + 7'd100;
        else if(s==1'b1 & cnt_2ms22s > 999)      
        pwm <= pwm - 100;

always @(posedge clk or negedge rst)
if (~rst)
    led <= 1'b0;
    else if(cnt_2ms < pwm)
    led <= 1'b1;
    else 
    led <= 1'b0;
    
    endmodule

二、仿真文件

`timescale 1ns/1ps  //时间精度
`define    Clock 20
module breathing_led_tb;

//---------------------<端口定义>---------------------------------------
reg                     clk                 ; //时钟,50Mhz
reg                     rst                ; //复位,低电平有效
wire                    led                 ;

//----------------------------------------------------------------------
//--   模块例化
//----------------------------------------------------------------------
breathing_led
u_breathing_led
(
    .clk                (clk                ),
    .rst                (rst                ),
    .led                (led                )
);

//----------------------------------------------------------------------
//--   时钟信号和复位信号
//----------------------------------------------------------------------
initial begin
    rst = 0; #(`Clock*20+1);
    rst = 1;
end

initial begin
    clk = 1;
    forever
#(`Clock/2) clk = ~clk;
end



endmodule

三、仿真波形

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值