传统PWM普遍受到系统时钟频率的影响,以下方法通过使用锁相环之间的相位关系可以将PWM精度提升Nbit,其中N是由锁相环个数所决定的,下面介绍一下使用四个锁相环实现提升2bit的PWM精度。
设定频率为50M,选择同步状态,其中PLL lock可以取消。
设定4个400M时钟,然后相位依次相移90°,然后next直到完成。
module TOP(
input clk,
output pwm,
output oQ5
);
parameter wave = 3200;
parameter Freq = 1600;
wire clk0_out,clk1_out, clk2_out,clk3_out,extlock;
wire [10:0]a;
wire [3:0]b;
assign a=wave/4;
assign b=wave%4;
wire oQ1,oQ2,oQ3,oQ4,oQ5;
reg[31:0]Cnt1;
reg[31:0]Cnt2;
reg[31:0]Cnt3;
reg[31:0]Cnt4;
reg [31:0]Cnt5;
assign pwm=(b==1)?oQ1|oQ2:
(b==2)?oQ1|oQ3:
(b==3)?oQ1|oQ4:oQ1;
always@(posedge clk)
if(Cnt5<Freq-1)Cnt5 <= Cnt5+1;
else Cnt5 <= 1'b0;
assign oQ5 = oQ1;
always@(posedge clk0_out)
if(Cnt1<Freq-1)Cnt1 <= Cnt1+1;
else Cnt1 <= 1'b0;
assign oQ1 = (Cnt1<a)? 1'b1:1'b0;
always@(posedge clk1_out)
if(Cnt2<Freq-1)Cnt2 <= Cnt2+1;
else Cnt2 <= 1'b0;
assign oQ2 = (Cnt2<a)? 1'b1:1'b0;
always@(posedge clk2_out)
if(Cnt3<Freq-1)Cnt3 <= Cnt3+1;
else Cnt3 <= 1'b0;
assign oQ3 = (Cnt3<a)? 1'b1:1'b0;
always@(posedge clk3_out)
if(Cnt4<Freq-1)Cnt4 <= Cnt4+1;
else Cnt4 <= 1'b0;
assign oQ4 = (Cnt4<a)? 1'b1:1'b0;
PLL PLL_inst(
.refclk (clk) ,
.reset (1'b0) ,
.extlock (extlock) ,
.clk0_out(clk0_out),
.clk1_out(clk1_out),
.clk2_out(clk2_out),
.clk3_out(clk3_out)
);
endmodule