Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размер транзакции в SGDMA Altera
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
edren_baton
Всем доброго времени суток!

Учусь работать с модулем SGDMA MM-ST. Для начала просто вывожу квадрат инфы из памяти.

Учитывая тот факт, что для формирования нормального кадра Avalon-ST необходимо перед кадром с информацией сначала отправить пакет Contol Packet, а потом в кадре с информацией первый байт выставить в 0, т.е:

SOP -> Control Packet -> EOP -> SOP -> 1s_byte = 0 + Frame_data -> EOP

для реализации пытаюсь в SGDMA сформировать три транзакции:
1. Control Packet
2. Один байт = 0
3. Сам кадр

Инициализация и запуск SGDMA (часть)
Код
void init_and_start_framebuffer(alt_sgdma_dev *dma)
{
    // frame buffer A
    alt_u8* buff;
    alt_u16 size;
    int i;

    for(i = 0; i < 3; ++i) {

    switch ( i ) {
            case 0:
                size = 0xa;
                buff = (alt_u8*)frameBufferA;
                break;
            case 1:
                size = 0x1;
                buff = (alt_u8*)frameBufferA + 0x10;
                break;
            case 2:
                size = 0x6400;
                buff = (alt_u8*)frameBufferA + 0x8 + 0x10;
                break;
        }

        alt_avalon_sgdma_construct_mem_to_stream_desc(
                                                        &dmaDescA[i],
                                                        (i<3) ? (&dmaDescA[i+1]) : &dmaDescEND,
                                                        (alt_u32*)buff,
                                                        size,
                                                        0,
                                                        i==0 | i==1, // sop
                                                        i==0 | i==2, // eop
                                                        0);

    }


Байты для первых двух транзакций.
Код
int main()
{
    IOWR(frameBufferA, 0, 0x0a00000f);
    IOWR(frameBufferA+1, 0, 0x0a000000);
    IOWR(frameBufferA+2, 0, 0x00000200);
    IOWR(frameBufferA+3, 0, 0x00000000);


В первой транзакции (для Control Packet) ее размер (size) получается задать произвольно с кратностью 1 байт. Проблема заключается в том, что во второй транзакции не получается задать ее размер = 1 байту. Если задать size меньше 4, то считывается всегда 4 байта, если больше 4, то 8 байт и т.д.

В текущей ситуации кадр формируется нормально, но первые три байта кадра оказываются равными нулю (т.к. в начале второй транзакции считывается 0х00000000).

Подскажите, пожалуйста, как мне сформировать этот 0 в начале кадра? Или, может быть, я изобретаю велосипед и есть модуль, который можно поставить после SGDMA?

P.S. Про существование Clocked Video Output, Frame Reader и Frame Buffer в курсе, работал с ними, нужен именно SGDMA =)
doom13
Цитата(edren_baton @ Feb 21 2015, 17:21) *
Учитывая тот факт, что для формирования нормального кадра Avalon-ST необходимо перед кадром с информацией сначала отправить пакет Contol Packet, а потом в кадре с информацией первый байт выставить в 0, т.е:

SOP -> Control Packet -> EOP -> SOP -> 1s_byte = 0 + Frame_data -> EOP

для реализации пытаюсь в SGDMA сформировать три транзакции:
1. Control Packet
2. Один байт = 0
3. Сам кадр

Это какая-то надстройка над Avalon-ST? При пакетной передаче длина пакета определяется SOP и EOP, зачем всё остальное?

Цитата(edren_baton @ Feb 21 2015, 17:21) *
В первой транзакции (для Control Packet) ее размер (size) получается задать произвольно с кратностью 1 байт. Проблема заключается в том, что во второй транзакции не получается задать ее размер = 1 байту. Если задать size меньше 4, то считывается всегда 4 байта, если больше 4, то 8 байт и т.д.

А какой размер шины данных в Вашем Avalon-ST? Может быть необходимо учитывать сигнал empty?
edren_baton
Цитата(doom13 @ Feb 21 2015, 21:24) *
Это какая-то надстройка над Avalon-ST? При пакетной передаче длина пакета определяется SOP и EOP, зачем всё остальное?


Т.е. все модули Avalon-ST Sink должны сами распознавать размер и тип пакета?

Если посмотреть сигналтапом, например, соединение Frame Buffer - Alpha Blending Mixer, то состав данных будет такой как я описал.
doom13
В моём случае SgDMA MM to ST используется для передачи Ethernet пакетов на TSE MAC, шина данных Avalon-ST там 8-бит, проблем с длиной отправляемых пакетов не наблюдал (может быть всё же надо учитывать empty, если шина отлична от 8-бит?). Такой параметр, как тип Avalon ST пакета, отсутствует.
С приведёнными ядрами не работал, видимо, это реализация какого-то протокола поверх Avalon-ST.
edren_baton
По поводу Mixera. Так как в этом блоке нет изначально заданных размеров отдельных потоков, то перед основным пакетом с данными надо все-таки отправлять Control Packet.

Попробовал в качестве эксперимента подключить сгдма к Clocked Video Output и к Video Sync Generator (между sgdma и блоком вывода еще avalon-st fifo).
За основу брал рабочий проект.
Так теперь блок sgdma или не заводится (открывается, но никакие данные не идут, смотрел через сигналтап) или заводится по какому-то непонятному алгоритму.
В чем разница между подключениями к миксеру и синк генератору?
edren_baton
Итак, разобрался я что у меня не работало - не объявил где лежат дескрипторы на SGDMA.

Привожу рабочий вариант кода в надежде на то, что кому-то он поможет разобраться и не совершать моих ошибок. Догадываюсь, что он ни разу не оптимизирован (кое-что можно вынести в отдельную функцию), зато работает ))) Если кто-то из форумчан сделает его "по уму" - будет здорово.

Код формирует три транзакции и выставляет SOP и EOP для каждой транзакции, т.е. получается три пакета. Отправка непрерывная.

Код
#include <stdio.h>
#include "sys/alt_stdio.h"
#include "io.h"
#include "system.h"
#include "unistd.h"
#include <math.h>
#include <altera_avalon_sgdma.h>
#include <altera_avalon_sgdma_descriptor.h>
#include <altera_avalon_sgdma_regs.h>


// DMA descriptors
alt_sgdma_descriptor* dmaDescA;
alt_sgdma_descriptor* dmaDescEND;

alt_sgdma_dev *dma; //DMA device

// we locate our first framebuffer at the beginning of the SDRAM
alt_u32* frameBufferA = (alt_u32*)ONCHIP_MEMORY2_0_BASE;


void my_dma_callback(void *data)
{
    // reset the OWNED_BY_HW bit in the descriptors to reuse the chain
    int i;
    for(i = 0; i < 3;++i)
        dmaDescA[i].control |= 1<<ALTERA_AVALON_SGDMA_DESCRIPTOR_CONTROL_OWNED_BY_HW_OFST;

    // trigger another transfer all over again
    alt_avalon_sgdma_do_async_transfer((alt_sgdma_dev*)data, dmaDescA);
}



int main()
{
    dmaDescA = (alt_sgdma_descriptor*) ONCHIP_MEMORY2_BASE + 0xf00;
    dmaDescEND = (alt_sgdma_descriptor*) ONCHIP_MEMORY2_BASE;


    dma = alt_avalon_sgdma_open(SGDMA_0_NAME);


    // frame buffer
    alt_u8* buff;
    alt_u16 size;
    int i;

    for(i = 0; i < 3; ++i)
    {
    switch ( i ) {
            case 0:
                size = 0xa;
                buff = (alt_u8*)frameBufferA;
                break;
            case 1:
                size = 0x1;
                buff = (alt_u8*)frameBufferA;
                break;
            case 2:
                size = 0xff;
                buff = (alt_u8*)frameBufferA;
                break;
        }


        alt_avalon_sgdma_construct_mem_to_stream_desc(
                &dmaDescA[i],
                (i<3) ? (&dmaDescA[i+1]) : &dmaDescEND,
                (alt_u32*)buff,
                size,
                0,
                1, // sop
                1, // eop
                0);
    }



alt_avalon_sgdma_register_callback(
            dma, my_dma_callback,
            ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK
            |ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK,
            (void*)dma);


    alt_avalon_sgdma_do_async_transfer(dma, dmaDescA);//start DMA transfer

;
return 0;
}


edren_baton
По ходу освоения SGDMA возникают все новые вопросы =)

Подцепил к своему проекту SGDMA ST-MM для записи видео в память.
Есть желание сделать аналог Alpha Blending Mixer, а именно:

задан некоторый буфер в sdram, который выполняет роль фона (размер 1000х1000). Через SGDMA ST-MM приходит видео поток (размер кадра 200х200) и его нужно разместить в левом верхнем углу.

Как лучше сделать:
- для каждой строки делать отдельный дескриптор с указанием размера транзакции и нужного начального адреса?
- или создать новый малый буфер внутри первого с соответствующим переназначением адресов?

Если второй вариант предпочтительнее, прошу немного пояснить синтаксис такого задания, ибо с указателями пока еще путаюсь =(
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.