Katrisha 0 3 мая, 2012 Опубликовано 3 мая, 2012 · Жалоба Здравствуйте. мне необходимо реализовать интерфейс PCI в ПЛИС. Все вроде как работает, но очень медленно. Передается только по одному слову. Не подскажете ли, в чем может быть причина, что PCI не читает более одного слова за одну передачу? Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eugen_pcad_ru 0 3 мая, 2012 Опубликовано 3 мая, 2012 · Жалоба 1 Почитайте про интерфейс (хотя бы в википедии), там указаны предельные скорости 2 "Прикрутите" готовое ядро к своему проекту 3 Объясните программисту, как написать программу быстрого обмена (или сами напишите:)) P.S.: Иногда большие скорости и не нужны. Может имеющегося достаточно?:) P.P.S.: Да, и есть еще настройки биоса. P.P.P.S.: Причина медленного обмена может быть в медленном драйвере. Драйвер обрабатывает массивы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 3 мая, 2012 Опубликовано 3 мая, 2012 · Жалоба Опишите более подробно: 1. Какой именно PCI вы реализовываете (точную ревизию стандарта, разрядность, частота, напряжение питания) ? 2. Вид транзакций, которые вызываются вопросы ? 3. Каким образом инициируется транзакция (кто Master, кто Target) ? 4. В куда вставлено Ваше устройство (с чем оно обменивается данными) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Katrisha 0 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба 1 Почитайте про интерфейс (хотя бы в википедии), там указаны предельные скорости 2 "Прикрутите" готовое ядро к своему проекту 3 Объясните программисту, как написать программу быстрого обмена (или сами напишите:)) P.S.: Иногда большие скорости и не нужны. Может имеющегося достаточно?:) P.P.S.: Да, и есть еще настройки биоса. P.P.P.S.: Причина медленного обмена может быть в медленном драйвере. Драйвер обрабатывает массивы? Согласно википедии :) при частоте 33.33 МГц - пиковая проходная способность 133Мбайт/с. Данной скорости было бы за глаза и за уши, но имеющейся, к сожалению не хватает ( Мне необходимо за 40мс передать 367500 слов (необходимо передать данные кадра по пиксельно, 700х525 пикселей) - это значительно медленнее, чем возможно, но пока только передается за это время примерно шестая - седьмая часть. (Вообще устройство должно принимать RGB сигнал, и еще по другому интерфейсу общаться с другими устройствами, принимая/отдавая служебные команды. Все это должно быть передано по PCI на ПК) Не совсем понятно, что нужно сделать с ядром. :) Драйвер сначала был написан мной с помощью Windriver, потом когда это не заработало как надо программисты написали с помощью Numega. И там и там одинаковая скорость обмена получалась. Внутри драйвера использованы функции для передачи блоков, но как то оно все равно работает по одному слову. А про настройки биоса можно поподроблнее? :) Вроде все осмотрено но не найдено ничего подходящего. Опишите более подробно: 1. Какой именно PCI вы реализовываете (точную ревизию стандарта, разрядность, частота, напряжение питания) ? 2. Вид транзакций, которые вызываются вопросы ? 3. Каким образом инициируется транзакция (кто Master, кто Target) ? 4. В куда вставлено Ваше устройство (с чем оно обменивается данными) ? 1. PCI 2.2, разрядность 32, частота 33.33 МГц, напряжение 3.3В 2. Чтение/запись в память. 3. Мое устройство не может быть мастером. Все инициирует ПК. 4. Мое устройство вставлено в ПК ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба Согласно википедии :) при частоте 33.33 МГц - пиковая проходная способность 133Мбайт/с. Да, есть такое дело... но подобная скорость достижима только в режиме Bus Master, да еще и при работе крупными пакетиками... 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 2 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба Еще дешевый способ - попробовать использовать DMA. Там обычно блочные обмены, а не одиночные. Плюс в мостах обычно есть FIFO, хоть и маленькое. Если его начать использовать, то тоже можно ускорить. Плюс есть регистры Latency. Там тоже можно покрутить. Если не поможет, то тогда уже и мастера делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Katrisha 0 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба На разных РС пробовалось, везде одно и тоже, где то даже медленее. Что Вас именно интересует про РС. не PCI-E. обычный PCI ) ВМ, конечно, можно организовать. Но ПЛИС не сильно современная, не сильно хорошая, и так уже загружена донельзя. Так что это будет крайний вариант. Хотелось бы, чтобы ПК сам начал читать блоками ) Главное что между самими транзакциями большой кусок времени просто непонятно куда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба На разных РС пробовалось, везде одно и тоже, где то даже медленее. Что Вас именно интересует про РС. Марки CPU + Chipset на которых пробовалось, ибо, считаю, что тормозят именно они. Сам был свидетелем, как моя плата работавшая на древних машинах давала сначала 16МБ/с по I/O Read, затем приупало до 12МБ/с, а теперь и 8МБ/с не на каждой мамке получается выжать... Но I/O Read раком ставит все cache'и в направлении Device->PC RAM(Host Bridge), поэтому и первоначальный результат был не очень... только 16МБ/с. не PCI-E. обычный PCI )У Вас да,.. а в машинах на которых Вы тестировали, его (PCI-E) что - нету ? А link к процессору... он же в современных PC по тому же принципы построен, что и PCI-E... и с теми же самыми проблемами. Посему и прошу маркировки CPU + Chipset (как те на которых тестировалось, так и те, на которых хочется чтобы работало) - чтобы прикинуть какие ухищрения еще стоит пробовать, а где лучше сразу пересесть на BM. ВМ, конечно, можно организовать. Но ПЛИС не сильно современная, не сильно хорошая, и так уже загружена донельзя. Так что это будет крайний вариант. Хотелось бы, чтобы ПК сам начал читать блоками ) Главное что между самими транзакциями большой кусок времени просто непонятно куда. Так я и писал, откуда он, этот "кусок", берётся (non-prefetchable Memory BAR, весьма вероятно отягощённый заморочками PCI-E сегментов, лежащих между CPU и Вашим устройством). И почему он Вам станет до фенеков, если Вы перейдёте на BM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба Хотелось бы, чтобы ПК сам начал читать блоками )Не умеет он. Максимум - 16 байт (обмен с 128 битным SSE регистром), и то, если повезет :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Katrisha 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба Не умеет он. Максимум - 16 байт (обмен с 128 битным SSE регистром), и то, если повезет :rolleyes: если бы хоть так бы повезло, может быть даже этого хватило )) А про ПК посмотрю в будни ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба если бы хоть так бы повезло, может быть даже этого хватило )) А про ПК посмотрю в будни ) Вы так и не написали PCI Bus Master у вас или PCI-slave. Я так понимаю, PCI-slave. Так вот, c PCI Slave не получится выжать скорость - проверено всеми начиная с появления (вернее, широкого распространения) первых чипсетов с PCI-шиной (это 1995 г.) Нужен PCI Bus Master. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nckkm 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба скажу по своему опыту (правда было давно). при использовании PCI slave на запись мне удавалось передавать около 40Mb/sec при использовании PCI master на запись удавалось прокачать 105Mb/sec У меня задача была другая - в основном запись в плату. Возможно при чтении ситуация будет другая. но врядли. PCI реализовывал сам, не использовал никаких сторонних IP core. Имхо нужно посмотреть с помощью SignalTap (если Altera) на сигналы PCI. Сколько там DWORDs реально передается за пакет (#FRAME)? Посмотрите не появляется ли сигнал #STOP, если появляется, то откуда. Доступаться к плате естественно нужно DWORDами по последовательным адресам, тогда burst будет длинный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Katrisha 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба Сигнал STOP не появляется. За frame передается один dword. Доступ к плате так и идет dwordами по последовательным адресам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nckkm 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба Сигнал 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 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба У меня memory space. Что конкретно в конфигурации сейчас не скажу, смогу посмотреть позже. Драйвер написан с помощью NUMEGA, и какую функцию использует нумега сложно сказать. Когда драйвер был написан через WinDriver, там использовались функции WDC_ReadAddrBlock() - для чтения и WDC_WriteAddrBlock() - для записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться