中心值计数PWM
中心值计数示意图,如下所示。
上PWM和下PWM最大差一个大的周期
电路实现描述:
设:从O -> A 要计数512
从 O -> B要计数1024
问:当占空比设置为30%时候,OA与OB的计算方法
此时OA的占空比为512*30%=153,因为前面一段是空的,所以0~(512-153)是低电平,并且512~512+153是高电平。高电平结束后就低电平,持续到1024,从此开始B~D的中心值计数。
参考代码
//Center Value Counter
//定义PWM分辨率
`define PWM_Resolution 10
//定义PWM的中位值
`define HalfCounter 512
module PWM (
input wire clk,
input wire rstn,
//设置输入占空比
input wire [`PWM_Resolution-1:0] duty,
//输出占空比引脚
output reg dout
);
//定义PWM_resolution的Counter
reg [`PWM_Resolution-1:0]Counter;
//Dutyl临时存放地址
reg [`PWM_Resolution-1:0]Duty_temp;
//初始化Counter和dout
initial begin
dout<=1'b0;
Counter<=0;
Duty_temp<=0;
end
//每次时钟到来Counter+1 并且将duty 赋值给DUTY_TEMP
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
Counter<=0;
Duty_temp<=0;
end
else begin
//Counter+1
Counter<=Counter+1'b1;
//Duty分成一半
Duty_temp<=duty/2;
end
end
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
Counter<=0;
end
//在Counter小于1/2时候
else if (Counter<`HalfCounter) begin
if (Counter<(`HalfCounter-Duty_temp)) begin
dout=1'b0;
end
else
dout=1'b1;
end
//在Counter大于1/2时候
else begin
if (Counter<(`HalfCounter+Duty_temp)) begin
dout=1'b1;
end
else
dout=1'b0;
end
end
endmodule //PWM