По краям, конечно, выигрыша не будет. Но в основном диапазоне выигрыш заметный. Всё получилось, вот исходник на AHDL:
CONSTANT PWM_TOP_F = 10; -- PWM TOP fine
CONSTANT PWM_TOP_C = 10; -- PWM TOP coarse
SUBDESIGN S2PWM
(
Clk : INPUT;
PowerL[3..0] : INPUT;
PowerH[3..0] : INPUT;
PWM : OUTPUT;
)
VARIABLE
CntH[3..0] : DFFE;
CntL[4..0] : DFFE;
PWMH, PWML : NODE;
BEGIN
CntH[].(clk, ena) = (Clk, vcc);
CntL[].clk = Clk; PWML = CntL[4];
IF CntH[] == PWM_TOP_C - 1
THEN CntH[] = 0; CntL[].ena = vcc;
ELSE CntH[] = CntH[] + 1; CntL[].ena = gnd;
END IF;
IF(PWML)
THEN CntL[] = CntL[] + (0,PowerL[]) - PWM_TOP_F;
PWMH = PowerH[] + 1 > CntH[];
ELSE CntL[] = CntL[] + (0,PowerL[]);
PWMH = PowerH[] > CntH[];
END IF;
PWM = DFF(PWMH, Clk, , );
END;