Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PCI в ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Katrisha
Здравствуйте.
мне необходимо реализовать интерфейс PCI в ПЛИС. Все вроде как работает, но очень медленно. Передается только по одному слову. Не подскажете ли, в чем может быть причина, что PCI не читает более одного слова за одну передачу?
Заранее спасибо.
eugen_pcad_ru
1 Почитайте про интерфейс (хотя бы в википедии), там указаны предельные скорости
2 "Прикрутите" готовое ядро к своему проекту
3 Объясните программисту, как написать программу быстрого обмена (или сами напишитеsm.gif)

P.S.: Иногда большие скорости и не нужны. Может имеющегося достаточно?sm.gif
P.P.S.: Да, и есть еще настройки биоса.
P.P.P.S.: Причина медленного обмена может быть в медленном драйвере. Драйвер обрабатывает массивы?
Boris_TS
Опишите более подробно:
1. Какой именно PCI вы реализовываете (точную ревизию стандарта, разрядность, частота, напряжение питания) ?
2. Вид транзакций, которые вызываются вопросы ?
3. Каким образом инициируется транзакция (кто Master, кто Target) ?
4. В куда вставлено Ваше устройство (с чем оно обменивается данными) ?
Katrisha
Цитата(eugen_pcad_ru @ May 3 2012, 22:22) *
1 Почитайте про интерфейс (хотя бы в википедии), там указаны предельные скорости
2 "Прикрутите" готовое ядро к своему проекту
3 Объясните программисту, как написать программу быстрого обмена (или сами напишитеsm.gif)

P.S.: Иногда большие скорости и не нужны. Может имеющегося достаточно?sm.gif
P.P.S.: Да, и есть еще настройки биоса.
P.P.P.S.: Причина медленного обмена может быть в медленном драйвере. Драйвер обрабатывает массивы?


Согласно википедии sm.gif при частоте 33.33 МГц - пиковая проходная способность 133Мбайт/с.
Данной скорости было бы за глаза и за уши, но имеющейся, к сожалению не хватает (
Мне необходимо за 40мс передать 367500 слов (необходимо передать данные кадра по пиксельно, 700х525 пикселей) - это значительно медленнее, чем возможно, но пока только передается за это время примерно шестая - седьмая часть.
(Вообще устройство должно принимать RGB сигнал, и еще по другому интерфейсу общаться с другими устройствами, принимая/отдавая служебные команды. Все это должно быть передано по PCI на ПК)

Не совсем понятно, что нужно сделать с ядром. sm.gif

Драйвер сначала был написан мной с помощью Windriver, потом когда это не заработало как надо программисты написали с помощью Numega. И там и там одинаковая скорость обмена получалась.
Внутри драйвера использованы функции для передачи блоков, но как то оно все равно работает по одному слову.

А про настройки биоса можно поподроблнее? sm.gif
Вроде все осмотрено но не найдено ничего подходящего.

Цитата(Boris_TS @ May 3 2012, 22:26) *
Опишите более подробно:
1. Какой именно PCI вы реализовываете (точную ревизию стандарта, разрядность, частота, напряжение питания) ?
2. Вид транзакций, которые вызываются вопросы ?
3. Каким образом инициируется транзакция (кто Master, кто Target) ?
4. В куда вставлено Ваше устройство (с чем оно обменивается данными) ?


1. PCI 2.2, разрядность 32, частота 33.33 МГц, напряжение 3.3В
2. Чтение/запись в память.
3. Мое устройство не может быть мастером. Все инициирует ПК.
4. Мое устройство вставлено в ПК )
Boris_TS
Цитата(Katrisha @ May 4 2012, 18:29) *
Согласно википедии sm.gif при частоте 33.33 МГц - пиковая проходная способность 133Мбайт/с.

Да, есть такое дело... но подобная скорость достижима только в режиме Bus Master, да еще и при работе крупными пакетиками...

Цитата(Katrisha @ May 4 2012, 18:29) *
1. PCI 2.2, разрядность 32, частота 33.33 МГц, напряжение 3.3В
2. Чтение/запись в память.
3. Мое устройство не может быть мастером. Все инициирует ПК.
4. Мое устройство вставлено в ПК )

Нужно еще одно уточнение: какой у Вас используется PC ?
Но общая суть проблемы мне ясна - сам с подобным мучился.
Как я понял, суть проблемы приблизительно следующая:
1. Дам 90%, что Вы используете PC с PCI-E... а PCI находится после PCI-E->PCI Bridge
2. В этом случае необходимо учесть особенности работы PCI-E. А вот тут есть одна неприятная особенность.
PCI-E - очень похож на full duplex Ethernet; соответственно, на низком уровне, каналы TX и RX практически никак не связаны, поэтому допускается огромная (по меркам PCI) задержка на ответ: пока к Target дойдёт пакетик, пока Target его переварит, пока обратно прийдёт пакетик... - куча времени проходит.
3. С другой стороны у Вас явно используется non-prefetchable BAR (и это, почти наверняка, правильно для Вашего случая), что не позволяет PCI-E->PCI Bridge зачитать наперёд данные (а вдруг они изменятся - prefetch же не просто так выключен)... Процессор, по каким-то причинам, не может сделать блочное чтение. Поэтому его одиночные операции чтения и доходят до Вашего устройства в неизменном виде...

Я нашел следующие пути решения этой проблемы:
1. Переход на Bus Master режим. Т.к. BM реализуете именно Вы, то достаточно реализовать только те Mem Read/Write команды которые Вам необходимы (т.е. 0111 - Memory Write и, может быть, 0110 - Memory Read, если она необходима). PC RAM прекрасно кэшируется, поэтому блочные операции работают весьма быстро. Правда с BM Mem Write есть одна мелкая заморочка: прерывание к CPU может обогнать данные, которые были отправлены в ОЗУ, лечится I/O Read'ом CPU->Ваше устройство (как описано в PCI спецификации), либо использованием MSI, но вот за MSI не уверен, поэтому это необходимо уточнить.
2. Мелкое ускорение: CPU может генерировать сдвоенные операции чтения, если использовать MMX инструкции.
3. Крохотное ускорение: можно поддержать Fast Back-to-Back (5 лет назад мне это удалось сделать в убогоньком Spartan-2, поэтому в современных ПЛИС не должно вызывать особых проблем).
vitan
Еще дешевый способ - попробовать использовать DMA. Там обычно блочные обмены, а не одиночные. Плюс в мостах обычно есть FIFO, хоть и маленькое. Если его начать использовать, то тоже можно ускорить. Плюс есть регистры Latency. Там тоже можно покрутить. Если не поможет, то тогда уже и мастера делать.
Katrisha
На разных РС пробовалось, везде одно и тоже, где то даже медленее.
Что Вас именно интересует про РС.

не PCI-E. обычный PCI )

ВМ, конечно, можно организовать. Но ПЛИС не сильно современная, не сильно хорошая, и так уже загружена донельзя. Так что это будет крайний вариант. Хотелось бы, чтобы ПК сам начал читать блоками )
Главное что между самими транзакциями большой кусок времени просто непонятно куда.
Boris_TS
Цитата(Katrisha @ May 4 2012, 22:03) *
На разных РС пробовалось, везде одно и тоже, где то даже медленее.
Что Вас именно интересует про РС.

Марки CPU + Chipset на которых пробовалось, ибо, считаю, что тормозят именно они.
Сам был свидетелем, как моя плата работавшая на древних машинах давала сначала 16МБ/с по I/O Read, затем приупало до 12МБ/с, а теперь и 8МБ/с не на каждой мамке получается выжать... Но I/O Read раком ставит все cache'и в направлении Device->PC RAM(Host Bridge), поэтому и первоначальный результат был не очень... только 16МБ/с.

Цитата(Katrisha @ May 4 2012, 22:03) *
не PCI-E. обычный PCI )
У Вас да,.. а в машинах на которых Вы тестировали, его (PCI-E) что - нету ? А link к процессору... он же в современных PC по тому же принципы построен, что и PCI-E... и с теми же самыми проблемами. Посему и прошу маркировки CPU + Chipset (как те на которых тестировалось, так и те, на которых хочется чтобы работало) - чтобы прикинуть какие ухищрения еще стоит пробовать, а где лучше сразу пересесть на BM.

Цитата(Katrisha @ May 4 2012, 22:03) *
ВМ, конечно, можно организовать. Но ПЛИС не сильно современная, не сильно хорошая, и так уже загружена донельзя. Так что это будет крайний вариант. Хотелось бы, чтобы ПК сам начал читать блоками )
Главное что между самими транзакциями большой кусок времени просто непонятно куда.

Так я и писал, откуда он, этот "кусок", берётся (non-prefetchable Memory BAR, весьма вероятно отягощённый заморочками PCI-E сегментов, лежащих между CPU и Вашим устройством). И почему он Вам станет до фенеков, если Вы перейдёте на BM.
XVR
Цитата(Katrisha @ May 4 2012, 22:03) *
Хотелось бы, чтобы ПК сам начал читать блоками )
Не умеет он. Максимум - 16 байт (обмен с 128 битным SSE регистром), и то, если повезет rolleyes.gif

Katrisha
Цитата(XVR @ May 7 2012, 11:47) *
Не умеет он. Максимум - 16 байт (обмен с 128 битным SSE регистром), и то, если повезет rolleyes.gif

если бы хоть так бы повезло, может быть даже этого хватило ))

А про ПК посмотрю в будни )
Джеймс
Цитата(Katrisha @ May 7 2012, 12:12) *
если бы хоть так бы повезло, может быть даже этого хватило ))

А про ПК посмотрю в будни )


Вы так и не написали PCI Bus Master у вас или PCI-slave. Я так понимаю, PCI-slave. Так вот, c PCI Slave не получится выжать скорость - проверено всеми начиная с появления (вернее, широкого распространения) первых чипсетов с PCI-шиной (это 1995 г.) Нужен PCI Bus Master.
nckkm
скажу по своему опыту (правда было давно).
при использовании PCI slave на запись мне удавалось передавать около 40Mb/sec
при использовании PCI master на запись удавалось прокачать 105Mb/sec
У меня задача была другая - в основном запись в плату.
Возможно при чтении ситуация будет другая. но врядли.
PCI реализовывал сам, не использовал никаких сторонних IP core.

Имхо нужно посмотреть с помощью SignalTap (если Altera) на сигналы PCI.
Сколько там DWORDs реально передается за пакет (#FRAME)?
Посмотрите не появляется ли сигнал #STOP, если появляется, то откуда.
Доступаться к плате естественно нужно DWORDами по последовательным адресам, тогда burst будет длинный.
Katrisha
Сигнал STOP не появляется.
За frame передается один dword.
Доступ к плате так и идет dwordами по последовательным адресам.
nckkm
Цитата(Katrisha @ May 8 2012, 15:11) *
Сигнал STOP не появляется.
За frame передается один dword.
Доступ к плате так и идет dwordами по последовательным адресам.


а у вас i/o space или memory space?
должно быть memory space.
Там в Configuration Table много всяких регистров которые влияют на работу устройства. Может здесь что не так?
Кажется есть там CacheLineSize- тут что у вас?, в регистре Control что-то типа Fast-Back-to-Back. опять же в Control определяется поддержка i/o и memory.
какой функцией читаете из устройства?
Кажется нужно READ_REGISTER_BUFFER_ULONG

Katrisha
У меня memory space.
Что конкретно в конфигурации сейчас не скажу, смогу посмотреть позже.

Драйвер написан с помощью NUMEGA, и какую функцию использует нумега сложно сказать.

Когда драйвер был написан через WinDriver, там использовались функции WDC_ReadAddrBlock() - для чтения и WDC_WriteAddrBlock() - для записи.
nckkm
Цитата(Katrisha @ May 8 2012, 16:14) *
У меня memory space.
Что конкретно в конфигурации сейчас не скажу, смогу посмотреть позже.

Драйвер написан с помощью NUMEGA, и какую функцию использует нумега сложно сказать.

Когда драйвер был написан через WinDriver, там использовались функции WDC_ReadAddrBlock() - для чтения и WDC_WriteAddrBlock() - для записи.


еще одна фишка.
для отладки оборудования гораздо удобнее пользоваться linux.
вот как в виндовсе посмотреть configuration space устройств? это целое дело.
а в linux - консольная команда "sudo lspci -x"
в виндовс нужно писать драйвер для доступа к памяти.
в линукс можно легко обойтись без драйвера.
можно написать простую C-программу которая откроет файл
int fd = open("/dev/mem",O_RDWR|O_SYNC);
потом сделает mmap и сразу получает указатель на память устройства.
потом сам пишешь цикл for(int i=0; i<16; i++) который читает из устройства.
20 строчек С кода делают все что нужно для отладки.
в интернете полно примеров. только запускать с правами администратора.

Что хорошо в этом случае - точно знаешь "как" идет доступ к оборудованию.
А в случае с windriver или numega - кто его знает что там скрыто в его функциях врапперах.
Katrisha
Это можно будет попробовать, только, боюсь, linux не отыщится ни на одном из компов )
Завтра пойду на поиски )
Victor®
Цитата(Katrisha @ May 9 2012, 08:45) *
Это можно будет попробовать, только, боюсь, linux не отыщится ни на одном из компов )
Завтра пойду на поиски )


Поставьте PCIScope под Windows - будет Вам счастье.
Увидите всю PCI подсистему - и сможете читать\писать без драйвера.
Для отладки очень помогает.
Успехов!
Katrisha
Сейчас у меня стоит HWDirect. Может писать/читать без драйвера. Но читает и пишет точно так же по одному dwowdу, эта программа - что то подобное?
Katrisha
А если реализовывать мастер, то как узнать адрес по которому надо записыватьинформацию?
Надо каким-то образом через приложение выделить память, узнать ее физический адрес и писать, или это можно реализовать как-то проще, т.к. пока что все попытки узнать физический адрес провалились sm.gif
Kuzmi4
2 Katrisha
Если хотите мастера на PCIE - нужен физический адрес, без него никак - нужно же одному знать куда ложить данные а другому откуда их выгребать потом.
На сколько я помню, там в виндовом MSDN-е есть хорошее описание к специальной ф-ции, даже в названии "DMA" у неё присутствует. Она по идее решит все ваши траблы с буфером, физ.адресом и так далее..
Flood
Цитата(Katrisha @ Jul 31 2012, 18:09) *
А если реализовывать мастер, то как узнать адрес по которому надо записыватьинформацию?
Надо каким-то образом через приложение выделить память, узнать ее физический адрес и писать, или это можно реализовать как-то проще, т.к. пока что все попытки узнать физический адрес провалились sm.gif


Физический адрес - забота драйвера. Под Windows помочь в реализации могут как WinDriver, так и NuMega, хотя последняя уже устарела и лучше бы ею не пользоваться. Наилучший инструмент написания драйверов под Windows - родной Windows Driver Kit (WDK), но он же и самый сложный в освоении. На первых порах можно реализовать драйвер на WinDriver, затем переписать его на WDK.

Забота железа (PCI BM-а) - реализация Scatter-Gather DMA, т.к., в общем случае, непрерывный буфер в пользовательском пространстве памяти не является непрерывным в физической памяти. У WinDriver есть особые функции выделения памяти для DMA, не помню, возможно там есть опция выделения цельного физического куска. Но, в общем случае, такое предполагается невозможным, и нужно реализовывать SG DMA. Непрерывный буфер в пользовательском пространстве - это целый список адресов физических страниц памяти, который должен обрабатываться аппаратным DMA как цепочка заданий с общим завершением. Если железо не поддерживает SG DMA - можно обрабатывать этот список программно, анализируя завершение DMA после каждой страницы, но это резко отрицательно скажется на скорости.

Вот список основных проблем, с которым придется разбираться, реализуя DMA:
- трансляция адресов и реализация Scatter-Gather DMA;
- (опционально) выравнивание некратных адресов (в вашем случае, проще и лучше просто запретить работу с невыровненными адресами);
- обеспечение кэш-когерентности DMA буферов (т.е. выполнение сброса-очистки (flush и invalidate) соответствующих участков процессорного кэша в нужные моменты времени);
- обработка признаков завершения DMA-операции (обработка прерываний).

Что касается скорости, теоретические 133МБ/с на PCI 33Mhz 32bit не получатся никогда, но на цифру порядка 100 Мбайт/сек, наверное, можно рассчитывать. Пиковая пропускная способность, кроме особенностей Вашего железа, будет зависеть еще и от архитектуры ПК, в.т.ч. от того, насколько далеко (логически) от системной памяти находится PCI-слот. В современных ПК это неблизкий путь через несколько мостов, впрочем, на операцию записи (т.е. прием данных из внешнего BM-устройства в системную память) это влияет не так сильно, как на операцию чтения.
Katrisha
А в WinDriver-е нужно где-то указать что хочешь DMA?
Попыталась сегодня сделать там драйвер, но такого пункта не нашла
Kuzmi4
Цитата(Kuzmi4 @ Jul 31 2012, 17:56) *
..На сколько я помню, там в виндовом MSDN-е есть хорошее описание к специальной ф-ции..

Вот собственно статейка
Там всё просто и разжёвано - для начала самое оно думаю
Flood
Цитата(Katrisha @ Aug 2 2012, 18:03) *
А в WinDriver-е нужно где-то указать что хочешь DMA?
Попыталась сегодня сделать там драйвер, но такого пункта не нашла

Самые базовые вещи упоминаются тут:
http://www.jungo.com/st/support/tech_docs/td76.html

Подробности - в доках и примерах, устанавливаемых с WinDriver.
Там есть более-менее полное описание и готовые примеры работы с DMA.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.