module avalon_st_interface (
    input wire src_reset,      // Асинхронный сброс
    input wire src_clock,      // Тактовый сигнал
    input wire w_export,       // Внешний сигнал начала считывания из памяти
    output wire src_valid,     // Сигнал валидности данных на шине Avalon-ST
    output wire src_sop,       // Сигнал начала пакетной передачи
    output wire src_eop,       // Сигнал окончания пакетной передачи
    output wire [31:0] src_data // Данные на шине Avalon-ST
);

reg [31:0] memory [0:1023];   // Синхронная память
reg [9:0] src_addr_counter;    // Счётчик адреса

// Сброс счётчика адреса и сигналов при сбросе системы
always @(posedge src_clock or posedge src_reset)
begin
    if (src_reset)
    begin
        src_addr_counter <= 0;
        src_valid <= 0;
        src_sop <= 0;
        src_eop <= 0;
    end
end

// Логика чтения данных из памяти и передачи на шину Avalon-ST
always @(posedge src_clock)
begin
    if (w_export)
    begin
        // Передача начинается при обнаружении внешнего сигнала
        if (src_addr_counter == 0)
            src_sop <= 1;
        else
            src_sop <= 0;
        
        // Чтение данных из памяти и передача на шину Avalon-ST
        if (src_addr_counter < 1024)
        begin
            src_data <= memory[src_addr_counter];
            src_valid <= 1;
            src_addr_counter <= src_addr_counter + 1;
        end
        else
        begin
            src_data <= 0;
            src_valid <= 0;
            src_addr_counter <= 0;
            src_sop <= 0;
            src_eop <= 1; // Передача завершается после передачи последнего слова
        end
    end
    else
    begin
        // Если внешний сигнал неактивен, сбрасываем сигналы
        src_valid <= 0;
        src_sop <= 0;
        src_eop <= 0;
    end
end

endmodule