TITLE "PWM";
INCLUDE "maxplus2.inc";
CONSTANT PWM_WIDTH = 16;
SUBDESIGN PWM
(
nrst :INPUT = VCC;
clock :INPUT = GND;
din[(PWM_WIDTH-1)..0] :INPUT = GND;
wr :INPUT = GND;
pwmo :OUTPUT;
)
VARIABLE
lwr :DFF;
counter :lpm_counter WITH (LPM_WIDTH = PWM_WIDTH, LPM_DIRECTION = "UP");
data[(PWM_WIDTH-1)..0] :DFFE;
pwmn[PWM_WIDTH..0] :NODE;
BEGIN
lwr.d = wr;
lwr.clk = GLOBAL(clock);
lwr.clrn = GLOBAL(nrst);
data[].d = din[];
data[].clk = GLOBAL(clock);
data[].clrn = GLOBAL(nrst);
data[].ena = lwr;
counter.sclr = lwr;
counter.clock = GLOBAL(clock);
counter.aclr = GLOBAL(!nrst);
pwmn[PWM_WIDTH] = GND;
FOR i IN 0 TO (PWM_WIDTH-2) GENERATE
pwmn[PWM_WIDTH-1-i] = pwmn[PWM_WIDTH-i] # data[i].q & counter.q[(PWM_WIDTH-1)-i] & (counter.q[((PWM_WIDTH-2)-i)..0] == 0);
END GENERATE;
pwmn[0] = pwmn[1] # data[PWM_WIDTH-1].q & counter.q[0];
pwmo = pwmn[0];
END;