|
Программирование обмена между ПК и ПЛИС по PICE, PCI Express + Cи + Stratix IV GX Dev Kit |
|
|
|
May 28 2010, 14:10
|

Местный
  
Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845

|
Добрый день! Имеется плата 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;//чтение из плис При выполнении программы  в памяти в плисе мы видим следующее: 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 информативных бит данных. Буду благодарен за любые ответы, советы, комментарии.(извините что многа букф)
|
|
|
|
|
Jun 1 2010, 13:02
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(novartis @ May 28 2010, 18:10)  Куда стоит копать? В программе на Си? Или мегафункцию ковырять? Или нужно DMA организовывать (как это делать представления не имею)? Мои эксперименты с Intel показали что даже при использовании MMX регистров, на шине происходят 32-х разрядные обращения. 64-х разрядных обращений мне получить не удалось. Для реализации скоростного обмена необходимо реализовать контроллер DMA. Причём в режиме SCATER-GATHER. А что такое DMA можно прочитать у PLDA : http://plda.com/prodetail.php?pid=152
|
|
|
|
|
Jun 3 2010, 16:26
|

Местный
  
Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845

|
Спасибо за ответы! Зашел на http://plda.com/prodetail.php?pid=152 - жму на кнопку FREE DOWNLOAD, вылазит формы для заполнения данными о себе и компании, а после заполнения письмо прислали с просьбой подтвердить данные путем сообщения корпоративного мыла - вообщем, free download не получилось. вот еще один вопрос на ту же тему: на стороне плис мы например поставим DMA. Этот DMA будет быстро складывать/забирать данные из плис-памяти в общую шину ПК. А на стороне ПК тоже нужно задействовать DMA-контроллер, чтобы брать данные из общей шины и кидать их например на жеский диск? Как этот DMA контроллер на стороне ПК задействовать?
|
|
|
|
|
Jun 4 2010, 02:09
|

Частый гость
 
Группа: Свой
Сообщений: 191
Регистрация: 10-01-05
Из: San Francisco Bay, Silicon Valley
Пользователь №: 1 869

|
Цитата(novartis @ Jun 3 2010, 23:26)  на стороне плис мы например поставим DMA. Этот DMA будет быстро складывать/забирать данные из плис-памяти в общую шину ПК. А на стороне ПК тоже нужно задействовать DMA-контроллер, чтобы брать данные из общей шины и кидать их например на жеский диск? Как этот DMA контроллер на стороне ПК задействовать? На стороне ПК контроллера DMA не бывает, насколько я знаю. Все DMA-контроллеры располагаются во внешних устройствах. В том числе, такой контроллер имеется и в электронике жёсткого диска. Собственно он и выполняет пересылки с жёсткого диска в память и обратно. Причём "памятью" в данном случае может являться и буферная память вашего разработанного устройства. Если же сильно хочется, то можно научить DMA-контроллер ПЛИС работать в режиме "внешняя память <-> внешняя память". Этот контроллер сможет пересылать данные из жёсткого диска в системную память, т.к. буферная память жёсткого диска также отображается в пространстве адресов памяти ПК.
|
|
|
|
|
Jun 4 2010, 17:54
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 14-07-05
Из: Санкт-Петербург
Пользователь №: 6 793

|
Цитата(serebr @ Jun 4 2010, 06:09)  На стороне ПК контроллера DMA не бывает, насколько я знаю. Все DMA-контроллеры располагаются во внешних устройствах. В том числе, такой контроллер имеется и в электронике жёсткого диска. Собственно он и выполняет пересылки с жёсткого диска в память и обратно. Причём "памятью" в данном случае может являться и буферная память вашего разработанного устройства.
Если же сильно хочется, то можно научить DMA-контроллер ПЛИС работать в режиме "внешняя память <-> внешняя память". Этот контроллер сможет пересылать данные из жёсткого диска в системную память, т.к. буферная память жёсткого диска также отображается в пространстве адресов памяти ПК. Ну это просто не правда. Это доказать очень легко если вы в ОС Windows посмотрите в диспетчере устройств на винчестеры - там видно что указан канал - так этот канал DMA. Вообще на более старых вариантах Windows даже можно было выбирать режим работы DMA или не DMA. Для CDROM и сейчас можно переключиться в работу без DMA, но тогда про 52 скорости мечтать не придется  DMA - это такой сопроцессор который облегчает жизнь при работе с внешним устройством.
|
|
|
|
|
Jun 7 2010, 12:15
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 14-07-05
Из: Санкт-Петербург
Пользователь №: 6 793

|
Цитата DMA умерло вместе с шиной ISA. В PCI и т.д. это называется Bus Master, т.е. само устройство является ведущим на шине без всякого дополнительного контроллера как было с шиной ISA. Так что не пудрите людям мозги.... Ну если вы за чистоту речи то это называется "Bus Master DMA". И вы сами сказали что устройство является ведущим т.е. есть такой блок который работает с шиной. Ну а я и не спорил с этим я говорил что оно есть а где оно в устройстве, в мосте, или в Африке - главное что оно есть.
|
|
|
|
|
Jun 7 2010, 12:29
|

Местный
  
Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894

|
Цитата(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....
|
|
|
|
|
Jun 9 2010, 11:56
|

Местный
  
Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845

|
Цитата Endpoint устройство может послать запрос на чтение и может послать квитанцию за которой пойдут данные. Что значит квитанция? В спецификации PCI Express по английски как эта квитанция называется?
|
|
|
|
|
Jul 8 2010, 09:12
|
Группа: Участник
Сообщений: 9
Регистрация: 28-10-08
Пользователь №: 41 247

|
Здравствуйте. Надеюсь тема еще жива. Помогите разобраться, если не сложно. Имеется плата c Xilinx в PC. Когда я пишу данные в плату из PC, т.е. memory write - все данные принимаются корректно. А вот если я хочу прочитать данные из платы в PC, т.е. отправляю запрос memory read - ни черта не получается  Комп после секундной задержки читает FFF..... Что я должен ответить-то на запрос PC о чтении памяти? Т.е. какой формат ответа? Completion with Data? Пробовал. В заголовке memory read содержится поле Address[31:2]. В заголовке ответа в этом поле должно быть такое же значение адреса? Спасибо за помощь.
|
|
|
|
|
Jul 8 2010, 13:10
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 29-09-06
Пользователь №: 20 798

|
Цитата(Suzeren @ Jul 8 2010, 13:12)  Что я должен ответить-то на запрос PC о чтении памяти? Т.е. какой формат ответа? Completion with Data? Пробовал. В заголовке memory read содержится поле Address[31:2]. В заголовке ответа в этом поле должно быть такое же значение адреса? Спасибо за помощь. В заголовке ответа содержится только часть начального адреса запроса. В заголовке ответа есть ещё много полей, которые необходимо правильно создать. В сети в свободном распространении книга PCI express system architecture. Там эти вопросы подробно расписаны, с цветными картинками.
|
|
|
|
|
Jul 26 2010, 07:32
|
Группа: Участник
Сообщений: 9
Регистрация: 28-10-08
Пользователь №: 41 247

|
Цитата(novartis @ Jun 3 2010, 20:26)  вот еще один вопрос на ту же тему: на стороне плис мы например поставим DMA. Этот DMA будет быстро складывать/забирать данные из плис-памяти в общую шину ПК. А на стороне ПК тоже нужно задействовать DMA-контроллер, чтобы брать данные из общей шины и кидать их например на жеский диск? Как этот DMA контроллер на стороне ПК задействовать? Столько было сказано после этого сообщения, но ничего по существу я так и не нашёл. Где можно узнать, как по PCI-E быстро складывать данные из DDR-ки на плате с ПЛИС, в оперативу ПК? Спасибо.
|
|
|
|
|
Jul 26 2010, 07:55
|

Частый гость
 
Группа: Свой
Сообщений: 191
Регистрация: 10-01-05
Из: San Francisco Bay, Silicon Valley
Пользователь №: 1 869

|
Цитата(Suzeren @ Jul 26 2010, 14:32)  Столько было сказано после этого сообщения, но ничего по существу я так и не нашёл. Где можно узнать, как по PCI-E быстро складывать данные из DDR-ки на плате с ПЛИС, в оперативу ПК? Спасибо. Чтобы по PCI-E быстро складывать данные из DDR-ки на плате с ПЛИС, в оперативу ПК надо купить ядро PCI-E от PLDA. Там вся работа с PCI-E спрятана внутри ядра, наружу к пользователю торчат только DMA-каналы. Вам даже не понадобится знать, что Completion существуют в природе, также вас минует необходимость изучения ещё огромной массы вещей, реализованных в PCI-E. Если же надо быстро и без денег - то только вооружённым грабежом тех, кто имеет либо деньги, либо купленное ядро от PLDA.
|
|
|
|
|
Aug 13 2010, 11:34
|

Местный
  
Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845

|
Цитата(dmitry-tomsk @ Aug 6 2010, 11:54)  Переходите на virtex-5, поделимся своим котроллером (недорого  ) После того как купили три альтеровские платы по 150 тыс рублей, глупо было бы переходить на ксайлинкс). Кстати вы из Томска? А где работаете, если не секрет, то есть где в Томске используют, применяют dma/pci-e на virtex-5? Может знакомые у меня там есть)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|