PWM技术控制LED灯逐渐亮灭

     我是自动化专业的,所以对PWM技术并不陌生,但都停留在理论知识上面,没有实际写过程序来实现PWM技术,直到这几天因为要用PWM技术来控制直流电机,所以才潜心研究PWM技术,今天小试牛刀,来用PWM技术控制LED灯逐渐亮灭。

//程序实现的功能:利用PWM技术来控制LED的逐渐亮灭;
module led_pwm
     (
      clk,
      rst_n,
      key,
      led_out
     );
     
input   clk;      //系统时钟:50MHZ
input   rst_n;    //复位信号:低电平有效;
input   key;      //按键:控制占空比;
output  led_out;  //LED灯;


//键盘消抖
reg   key_r1;
always @ (posedge clk or negedge rst_n)
  begin
         if(!rst_n)
           key_r1<=1'b1;
         else 
           key_r1<=key;  
  end  

reg  key_r2; 
 always @ (posedge clk or negedge rst_n)
  begin
         if(!rst_n)
           key_r2<=1'b1;
         else 
           key_r2<=key_r1;  
  end  
  
wire  neg_key1;
assign  neg_key1=(~key_r1)&&(key_r2);

reg[19:0] cnt;

always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
           cnt<=20'd0;
         else if(neg_key1)
           cnt<=20'd0;
         else  
           cnt<=cnt+1'b1;      
  end
  
reg   key_r3;
always @ (posedge clk or negedge rst_n)
  begin
         if(!rst_n)
           key_r3<=1'b1;
         else if(cnt==20'hfffff)     //当有按键按下时,延时20ms,再次读入按键值;
           key_r3<=key;
           
  end  

reg  key_r4;
always @ (posedge clk or negedge rst_n)
 begin
      if(!rst_n)
        key_r4<=1'b1;
       else
        key_r4<=key_r3; 
 end 

wire neg_key2;
assign neg_key2=(~key_r3)&&key_r4 ;

reg[3:0] duty_ratio;              //占空比;
always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
           duty_ratio<=4'd0;
        else if(neg_key2)       //有按键按下时,占空比加1;
           duty_ratio<=duty_ratio+1'b1;
          
  end

reg[15:0]  counter;             // PWM内部计数器;  
always @ (posedge clk or negedge rst_n)
  begin
       if(!rst_n)
         counter<=16'd0;
        else 
         counter<=counter+1'b1; 
  end
  
reg pwm_out;                  //PWM输出;
always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
          pwm_out<=1'b1;
        else if(counter[15:12]<=duty_ratio)
          pwm_out<=1'b0;
        else 
          pwm_out<=1'b1;  
          
  end 
   
assign   led_out=pwm_out;
endmodule
  

 

转载于:https://www.cnblogs.com/tphust/archive/2012/09/16/2687250.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值