Проект

Общее

Профиль

Генерация синуса и косинуса

`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