35 lines
608 B
Verilog
35 lines
608 B
Verilog
`timescale 1us/100ns
|
|
|
|
//`include "constants.vams"
|
|
`define M_TWO_PI 6.28318530717958647652
|
|
|
|
module pwm(out);
|
|
output reg out;
|
|
parameter Cycles = 1000, Samples = 1000;
|
|
integer i, j, width;
|
|
real sine;
|
|
|
|
initial begin
|
|
i = 0;
|
|
j = 0;
|
|
width = Cycles / 2;
|
|
out = 0;
|
|
end
|
|
|
|
always begin
|
|
#1;
|
|
++i;
|
|
if (i == width)
|
|
out = 0;
|
|
if (i == Cycles) begin
|
|
i = 0;
|
|
++j;
|
|
if (j == Samples)
|
|
j = 0;
|
|
sine = $sin(j * `M_TWO_PI / Samples);
|
|
width = $rtoi(Samples * (1.0 + sine) / 2.0);
|
|
out = (width == 0) ? 0 : 1;
|
|
end
|
|
end
|
|
endmodule // pwm
|