Генерация синуса и косинуса¶
`timescale 1ns/1ps
module tb_sine();
reg clk;
reg signed [15:0] sine_out; // 16-битный выход
real amplitude = 32767.0; // Макс. значение для 16 бит (signed)
real freq = 1000000.0; // Частота синуса 1 МГц
real phase = 0.0;
real pi = 3.1415926535;
real sampling_period = 10.0; // Период дискретизации 10нс (100 МГц)
initial begin
clk = 0;
forever #5 clk = ~clk; // Генерация тактов 100 МГц
end
always @(posedge clk) begin
// Вычисляем значение синуса
// Формула: A * sin(2 * pi * f * t)
sine_out <= $rtoi(amplitude * $sin(2.0 * pi * freq * phase));
// Увеличиваем время (фазу)
phase <= phase + (sampling_period / 1_000_000_000.0);
end
// Для записи волн и просмотра в GTKWave
initial begin
$dumpfile("waveform.vcd");
$dumpvars(0, tb_sine);
#10000 $finish; // Симуляция на 10 мкс
end
endmodule