我是自动化专业的,所以对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