Имеется плата Stratix IV GX Development Kit, выполнена в форм-факторе PCIE x8.
Создали в квартусе проект на vhdl, подцепили мегакорку PCIE, сделали простенькую обвязку этой мегафункции, мегафункция настроена на Hard IP, Avalon ST 128. К интерфейсу RX Avalon ST подцепили память шириной 128 бит, глубиной 64 слова. В память пишим данные rx_st_data по сигналу rx_st_valid = '1'.
Воткнули плату в комп под линукс. Наш спец по программированию в линуксе и в С написал драйвер, обнаружил плату, создал тестовую прогу на С, вот ее укороченный код:
Код
int af = open("dev/qwert", O+RDWR | O_SYNC); //
char *am = mmap (NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, af, 0);
volatile int *ptr = (__typeof(ptr))(am);
volatile int data = 0x0001;
*ptr = data;//запись в плис
int data1;
data1 = *ptr;//чтение из плис
char *am = mmap (NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, af, 0);
volatile int *ptr = (__typeof(ptr))(am);
volatile int data = 0x0001;
*ptr = data;//запись в плис
int data1;
data1 = *ptr;//чтение из плис
При выполнении программы

128 битная посылка на запись data [data][header2][header1][header0]
128 битная посылка на чтение data1 [мусор][header2][header1][header0]
Таким образом мы передали за один пакет (посылку) 32 бита данных.
Попросили нашего спеца по программированию послать не 32 бита (int), а больше, чтобы получилась пакетная передача данных. Он покапался в описаниях на процессор Intel, нашел там 128 разрядный регистр. Код получился таким:
Код
int af = open("dev/qwert", O+RDWR | O_SYNC); //
char *am = mmap (NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, af, 0);
volatile __v4si *ptr = (__typeof(ptr))(am);
volatile __v4si data = { 0x0001, 0x0002, 0x0003, 0x0004};
*ptr = data;//запись в плис
__v4si data1;
data1 = *ptr;//чтение из плис
char *am = mmap (NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, af, 0);
volatile __v4si *ptr = (__typeof(ptr))(am);
volatile __v4si data = { 0x0001, 0x0002, 0x0003, 0x0004};
*ptr = data;//запись в плис
__v4si data1;
data1 = *ptr;//чтение из плис
В памяти в плисе мы видим следующее:
четыре 128 битных посылки на запись data
[мусор][header2][header1][header0]
[мусор][ мусор ][ 0x0002][ 0x0001]
[мусор][header2][header1][header0]
[мусор][ мусор ][ 0x0004][ 0x0003]
128 битная посылка на чтение data1 [мусор][header2][header1][header0]
А хотелось бы увидеть три хедера и много много байт данных в одном пакете(посылке):
[ мусор ][header2][header1][header0]
[ 0x0004][ 0x0003][ 0x0002][ 0x0001]
[ 0x0008][ 0x0007][ 0x0006][ 0x0005]
...
[ 0x007F][ 0x007E][ 0x007D][ 0x007C]
Куда стоит копать? В программе на Си? Или мегафункцию ковырять? Или нужно DMA организовывать (как это делать представления не имею)?
Наш спец по программированию сказал (кстати очень граммотный и опытный специалист, оснований сомневаться в нем у меня нет), что сделал все что может, большего из процессора не выжать, так как там нет регистров больше 128 бит, хотя даже при 128 разрядном регистре у нас не получается послать посылку со 128 битами данных, а получается послать два пакета по 64 информативных бит данных.
Буду благодарен за любые ответы, советы, комментарии.(извините что многа букф)