§ Код verilog

module pwm
(
    input        clock,
    input [15:0] duty,
    output  reg  en
);

reg [15:0] cnt;
always @(posedge clock) begin

    ena <= cnt < duty;
    cnt <= cnt + 1;

end

endmodule
Поскольку тут ширина cnt 16 бит, то частота будет рассчитана так: 100000000 / 2^16 = 762 Гц.
pwm Pwm1
(
    .duty  (1024),
    .clock (CLK100MHZ),
    .en    (LED_en)
);
Объявление на toplevel.

§ Более короткий вариант

reg [15:0] pwm_led;                  // Частота 50'000'000 / 65536 = 762 Гц
wire       pwm_en = 1024 < pwm_duty; // Например 1024/65536 = 1.5%
always @(posedge clock_50) pwm_led <= pwm_led + 1;
9 окт, 2020
© 2007-2022 Лиственная мышь хреначит