// Super simple pwm generator
// Fixed frequency and duty cycle upon synthesis
// 16-bit timer, so maximum clock division is 2^-16 (1/65536)
// Uses parameters to set the maximum count (aka frequency)
// and duty cycle

module pwm_generator
#(
    parameter RELOAD_VALUE = 16'd2399   // 24MHz/2400 = 10kHz
//    parameter RELOAD_VALUE = 16'd479   // 24MHz/480 = 50kHz
//,   parameter DUTY_CYCLE = 16'd960       // 960 / 4800 = 20% duty
//,   parameter DUTY_CYCLE = 16'd1920       // 1920 / 4800 = 40% duty
)
(
    input CLK
,   input RESET
,   input [15:0] DUTY_CYCLE
,   output PWM
);

reg [15:0]  pwm_counter; // 16 bit up counter

// increments pwm_counter on every cycle
// when pwm_counter is less than DUTY_CYCLE, 
// output is high
assign PWM = (pwm_counter < DUTY_CYCLE);
// when pwm_counter is at or above reload value, resets to zero
always @(posedge CLK or posedge RESET) begin
    if(RESET) begin
        pwm_counter <= 16'd0;
    end else begin
        if(pwm_counter < RELOAD_VALUE) begin
            pwm_counter <= pwm_counter + 16'd1;
        end else begin
            pwm_counter <= 16'd0;
        end
    end
end


endmodule
