|
- module pwm_16bit( //1路16位PWM发生器模块 要几路调用几个
- input clk, //时钟输入 PWM频率:时钟频率/65535
- input cache, //PWM缓存更新方式:0:时钟周期更新 1:PWM周期更新
- input [15:0] pwm, //16位PWM占空比输入 0~65535
- output reg out //PWM信号输出 占空比越高 高电平时间越高 (0或65535 无PWM,只输出高电平,0为低电平)
- );
- reg [15:0] i; //PWM计数 0~65534
- reg [15:0] j; //PWM占空比缓存
- always @(posedge clk) begin //CLK上升沿
- if(i == 0 || cache == 0) begin
- j = pwm;
- end
- out <= (i < j);
- i = i + 1'b1;
- if(&i) begin
- i = 0;
- end
- end
- endmodule
- module main(
- input clk, //50Mhz Pin17
- output led //LED Pin3 (低电平点亮)
- );
- wire out;
- pwm_16bit u1(
- .clk(clk),
- .cache(1'b1),
- .pwm(pwm),
- .out(out)
- );
- assign led = ~out;
- reg [15:0] i;
- reg [15:0] pwm; //当前占空比
- reg j = 1; //0:PWM减小 1:PWM增加
- always @(posedge clk) begin
- i = i + 1'b1;
- if(i >= 5000) begin
- i = 0;
- if(j) begin
- pwm = pwm + 1'b1;
- end else begin
- pwm = pwm - 1'b1;
- end
-
- if(!pwm || &pwm) begin
- j <= !j;
- end
- end
- end
- endmodule
复制代码 |
|