Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программирование обмена между ПК и ПЛИС по PICE
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
novartis
Добрый день!
Имеется плата 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;//чтение из плис

При выполнении программы smile3046.gif в памяти в плисе мы видим следующее:
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;//чтение из плис

В памяти в плисе мы видим следующее:
четыре 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 информативных бит данных.

Буду благодарен за любые ответы, советы, комментарии.(извините что многа букф)
dsmv
Цитата(novartis @ May 28 2010, 18:10) *
Куда стоит копать? В программе на Си? Или мегафункцию ковырять? Или нужно DMA организовывать (как это делать представления не имею)?


Мои эксперименты с Intel показали что даже при использовании MMX регистров, на шине происходят 32-х разрядные обращения. 64-х разрядных обращений мне получить не удалось.

Для реализации скоростного обмена необходимо реализовать контроллер DMA. Причём в режиме SCATER-GATHER. А что такое DMA можно прочитать у PLDA : http://plda.com/prodetail.php?pid=152
AsJohnAs
Это так устроенно. Если пишешь или читаешь регистры через PCI-E, т.е. разовые транзакции по шине, то ширина слова будет только 32 бита.
Я работал с Xilinx - поэтому смотрел реализацию xapp1052.zip - там это видно.

При использовании DMA можно передавать 64-битные слова.
novartis
Спасибо за ответы!

Зашел на http://plda.com/prodetail.php?pid=152 - жму на кнопку FREE DOWNLOAD, вылазит формы для заполнения данными о себе и компании, а после заполнения письмо прислали с просьбой подтвердить данные путем сообщения корпоративного мыла - вообщем, free download не получилось.

вот еще один вопрос на ту же тему:
на стороне плис мы например поставим DMA. Этот DMA будет быстро складывать/забирать данные из плис-памяти в общую шину ПК. А на стороне ПК тоже нужно задействовать DMA-контроллер, чтобы брать данные из общей шины и кидать их например на жеский диск? Как этот DMA контроллер на стороне ПК задействовать?
AsJohnAs
Так чего-то непонятно из вашего поста кто будет являться мастером DMA?
serebr
Цитата(novartis @ Jun 3 2010, 23:26) *
на стороне плис мы например поставим DMA. Этот DMA будет быстро складывать/забирать данные из плис-памяти в общую шину ПК. А на стороне ПК тоже нужно задействовать DMA-контроллер, чтобы брать данные из общей шины и кидать их например на жеский диск? Как этот DMA контроллер на стороне ПК задействовать?

На стороне ПК контроллера DMA не бывает, насколько я знаю. Все DMA-контроллеры располагаются во внешних устройствах. В том числе, такой контроллер имеется и в электронике жёсткого диска. Собственно он и выполняет пересылки с жёсткого диска в память и обратно. Причём "памятью" в данном случае может являться и буферная память вашего разработанного устройства.

Если же сильно хочется, то можно научить DMA-контроллер ПЛИС работать в режиме "внешняя память <-> внешняя память". Этот контроллер сможет пересылать данные из жёсткого диска в системную память, т.к. буферная память жёсткого диска также отображается в пространстве адресов памяти ПК.
AsJohnAs
Цитата(serebr @ Jun 4 2010, 06:09) *
На стороне ПК контроллера DMA не бывает, насколько я знаю. Все DMA-контроллеры располагаются во внешних устройствах. В том числе, такой контроллер имеется и в электронике жёсткого диска. Собственно он и выполняет пересылки с жёсткого диска в память и обратно. Причём "памятью" в данном случае может являться и буферная память вашего разработанного устройства.

Если же сильно хочется, то можно научить DMA-контроллер ПЛИС работать в режиме "внешняя память <-> внешняя память". Этот контроллер сможет пересылать данные из жёсткого диска в системную память, т.к. буферная память жёсткого диска также отображается в пространстве адресов памяти ПК.


Ну это просто не правда. Это доказать очень легко если вы в ОС Windows посмотрите в диспетчере устройств на винчестеры - там видно что указан канал - так этот канал DMA. Вообще на более старых вариантах Windows даже можно было выбирать режим работы DMA или не DMA. Для CDROM и сейчас можно переключиться в работу без DMA, но тогда про 52 скорости мечтать не придется smile.gif
DMA - это такой сопроцессор который облегчает жизнь при работе с внешним устройством.
-Al-
Цитата(AsJohnAs @ Jun 4 2010, 21:54) *
Ну это просто не правда. Это доказать очень легко если вы в ОС Windows посмотрите в диспетчере устройств на винчестеры - там видно что указан канал - так этот канал DMA. Вообще на более старых вариантах Windows даже можно было выбирать режим работы DMA или не DMA. Для CDROM и сейчас можно переключиться в работу без DMA, но тогда про 52 скорости мечтать не придется smile.gif
DMA - это такой сопроцессор который облегчает жизнь при работе с внешним устройством.

DMA умерло вместе с шиной ISA. В PCI и т.д. это называется Bus Master, т.е. само устройство является ведущим на шине без всякого дополнительного контроллера как было с шиной ISA. Так что не пудрите людям мозги....
AsJohnAs
Цитата
DMA умерло вместе с шиной ISA. В PCI и т.д. это называется Bus Master, т.е. само устройство является ведущим на шине без всякого дополнительного контроллера как было с шиной ISA. Так что не пудрите людям мозги....

Ну если вы за чистоту речи то это называется "Bus Master DMA". И вы сами сказали что устройство является ведущим т.е. есть такой блок который работает с шиной. Ну а я и не спорил с этим я говорил что оно есть а где оно в устройстве, в мосте, или в Африке - главное что оно есть.
-Al-
Цитата(AsJohnAs @ Jun 7 2010, 16:15) *
Ну если вы за чистоту речи то это называется "Bus Master DMA". И вы сами сказали что устройство является ведущим т.е. есть такой блок который работает с шиной. Ну а я и не спорил с этим я говорил что оно есть а где оно в устройстве, в мосте, или в Африке - главное что оно есть.

Тогда я неправильно понял эту фразу:
Цитата(AsJohnAs @ Jun 4 2010, 21:54) *
...DMA - это такой сопроцессор который облегчает жизнь при работе с внешним устройством.

Звучит она так, как будто речь о ISA системах, коих уже практически нет. Да и DMA к Bus Mastering прилепили непонятно зачем (видимо для сохранения преемственности), поскольку Bus master это Bus master, а Direct Memory Access это Direct Memory Access....
AsJohnAs
Согласен - не очень корректно получилось. Но теперь точно поставлены все точки над "i" smile.gif
novartis
Вот непонятки у меня.
Персональный компьютер - root устройство. Плата с ПЛИС - endpoint устройство. Может ли Endpoint устройство послать по PCI Express запрос Write Memory Request, или же это обязанность и привелегия только root устройств.
Если может, то как практически потом считать на ПК данные из этой памяти. Ведь когда я считываю data = *ptr, ПК посылает запрос в ПЛИС Memory Read Request и на него я должен ответить Completion With Data.
AsJohnAs
Endpoint устройство может послать запрос на чтение и может послать квитанцию за которой пойдут данные.
dmitry-tomsk
Цитата(novartis @ Jun 9 2010, 04:49) *
Вот непонятки у меня.
Персональный компьютер - root устройство. Плата с ПЛИС - endpoint устройство. Может ли Endpoint устройство послать по PCI Express запрос Write Memory Request, или же это обязанность и привелегия только root устройств.
Если может, то как практически потом считать на ПК данные из этой памяти. Ведь когда я считываю data = *ptr, ПК посылает запрос в ПЛИС Memory Read Request и на него я должен ответить Completion With Data.

зайдите на xilinx.com там в xapp1052 и xapp859 всё написано
novartis
Цитата
Endpoint устройство может послать запрос на чтение и может послать квитанцию за которой пойдут данные.

Что значит квитанция? В спецификации PCI Express по английски как эта квитанция называется?
AsJohnAs
извиняюсь - не квитанция а Message Request.
Как я уже говорил посмотрите пример xapp1052.zip от Xilinx там стейт машины чтения и записи реализованы.
novartis
спасибо, Message Request более понятно)
xapp1052.zip - щас скачаю, завтра на работе буду изучать, спасибо.
Suzeren
Здравствуйте. Надеюсь тема еще жива. Помогите разобраться, если не сложно.
Имеется плата c Xilinx в PC.
Когда я пишу данные в плату из PC, т.е. memory write - все данные принимаются корректно. А вот если я хочу прочитать данные из платы в PC, т.е. отправляю запрос memory read - ни черта не получается sad.gif
Комп после секундной задержки читает FFF.....
Что я должен ответить-то на запрос PC о чтении памяти? Т.е. какой формат ответа? Completion with Data? Пробовал.
В заголовке memory read содержится поле Address[31:2]. В заголовке ответа в этом поле должно быть такое же значение адреса?
Спасибо за помощь.
serebr
В стандарте PCI Express все поля пакетов подробно описаны. В том числе и поля "Completion with data".
Voiceц
Цитата(Suzeren @ Jul 8 2010, 13:12) *
Что я должен ответить-то на запрос PC о чтении памяти? Т.е. какой формат ответа? Completion with Data? Пробовал.
В заголовке memory read содержится поле Address[31:2]. В заголовке ответа в этом поле должно быть такое же значение адреса?
Спасибо за помощь.

В заголовке ответа содержится только часть начального адреса запроса. В заголовке ответа есть ещё много полей, которые необходимо правильно создать. В сети в свободном распространении книга PCI express system architecture. Там эти вопросы подробно расписаны, с цветными картинками.
Suzeren
Цитата(novartis @ Jun 3 2010, 20:26) *
вот еще один вопрос на ту же тему:
на стороне плис мы например поставим DMA. Этот DMA будет быстро складывать/забирать данные из плис-памяти в общую шину ПК. А на стороне ПК тоже нужно задействовать DMA-контроллер, чтобы брать данные из общей шины и кидать их например на жеский диск? Как этот DMA контроллер на стороне ПК задействовать?


Столько было сказано после этого сообщения, но ничего по существу я так и не нашёл.
Где можно узнать, как по PCI-E быстро складывать данные из DDR-ки на плате с ПЛИС, в оперативу ПК?
Спасибо.
serebr
Цитата(Suzeren @ Jul 26 2010, 14:32) *
Столько было сказано после этого сообщения, но ничего по существу я так и не нашёл.
Где можно узнать, как по PCI-E быстро складывать данные из DDR-ки на плате с ПЛИС, в оперативу ПК?
Спасибо.

Чтобы по PCI-E быстро складывать данные из DDR-ки на плате с ПЛИС, в оперативу ПК надо купить ядро PCI-E от PLDA. Там вся работа с PCI-E спрятана внутри ядра, наружу к пользователю торчат только DMA-каналы. Вам даже не понадобится знать, что Completion существуют в природе, также вас минует необходимость изучения ещё огромной массы вещей, реализованных в PCI-E.

Если же надо быстро и без денег - то только вооружённым грабежом тех, кто имеет либо деньги, либо купленное ядро от PLDA.
novartis
А сколько стоит ядро PCI-E от PLDA? Кто-нибудь покупал? У кого в России его можно купить?
"Если же надо быстро и без денег" - надо в течении 3 месяцев, желательно без денег. Разве все так запутано в альтеровских примерах, что никто сам не делал DMA обмен из DDR в плисене в память ПК?
dmitry-tomsk
Цитата(novartis @ Aug 5 2010, 21:15) *
А сколько стоит ядро PCI-E от PLDA? Кто-нибудь покупал? У кого в России его можно купить?
"Если же надо быстро и без денег" - надо в течении 3 месяцев, желательно без денег. Разве все так запутано в альтеровских примерах, что никто сам не делал DMA обмен из DDR в плисене в память ПК?

Переходите на virtex-5, поделимся своим котроллером (недорого wink.gif )
novartis
Цитата(dmitry-tomsk @ Aug 6 2010, 11:54) *
Переходите на virtex-5, поделимся своим котроллером (недорого wink.gif )

После того как купили три альтеровские платы по 150 тыс рублей, глупо было бы переходить на ксайлинкс).
Кстати вы из Томска? А где работаете, если не секрет, то есть где в Томске используют, применяют dma/pci-e на virtex-5? Может знакомые у меня там есть)
dmitry-tomsk
Цитата(novartis @ Aug 13 2010, 15:34) *
После того как купили три альтеровские платы по 150 тыс рублей, глупо было бы переходить на ксайлинкс).
Кстати вы из Томска? А где работаете, если не секрет, то есть где в Томске используют, применяют dma/pci-e на virtex-5? Может знакомые у меня там есть)

Мы бы то же перенесли наш контроллер на altera, но у нас все платы на xilinx smile.gif А с учётом того, что в Томске по полгода приходится ждать каждую плату, то и желание отпадает быстро. Контроллер разрабатывал для intensys.ru.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.