Перейти к содержанию
    

Здравствуйте.

мне необходимо реализовать интерфейс PCI в ПЛИС. Все вроде как работает, но очень медленно. Передается только по одному слову. Не подскажете ли, в чем может быть причина, что PCI не читает более одного слова за одну передачу?

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 Почитайте про интерфейс (хотя бы в википедии), там указаны предельные скорости

2 "Прикрутите" готовое ядро к своему проекту

3 Объясните программисту, как написать программу быстрого обмена (или сами напишите:))

 

P.S.: Иногда большие скорости и не нужны. Может имеющегося достаточно?:)

P.P.S.: Да, и есть еще настройки биоса.

P.P.P.S.: Причина медленного обмена может быть в медленном драйвере. Драйвер обрабатывает массивы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опишите более подробно:

1. Какой именно PCI вы реализовываете (точную ревизию стандарта, разрядность, частота, напряжение питания) ?

2. Вид транзакций, которые вызываются вопросы ?

3. Каким образом инициируется транзакция (кто Master, кто Target) ?

4. В куда вставлено Ваше устройство (с чем оно обменивается данными) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Мое устройство вставлено в ПК )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласно википедии :) при частоте 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, поэтому в современных ПЛИС не должно вызывать особых проблем).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще дешевый способ - попробовать использовать DMA. Там обычно блочные обмены, а не одиночные. Плюс в мостах обычно есть FIFO, хоть и маленькое. Если его начать использовать, то тоже можно ускорить. Плюс есть регистры Latency. Там тоже можно покрутить. Если не поможет, то тогда уже и мастера делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На разных РС пробовалось, везде одно и тоже, где то даже медленее.

Что Вас именно интересует про РС.

 

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

 

ВМ, конечно, можно организовать. Но ПЛИС не сильно современная, не сильно хорошая, и так уже загружена донельзя. Так что это будет крайний вариант. Хотелось бы, чтобы ПК сам начал читать блоками )

Главное что между самими транзакциями большой кусок времени просто непонятно куда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На разных РС пробовалось, везде одно и тоже, где то даже медленее.

Что Вас именно интересует про РС.

Марки 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы, чтобы ПК сам начал читать блоками )
Не умеет он. Максимум - 16 байт (обмен с 128 битным SSE регистром), и то, если повезет :rolleyes:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не умеет он. Максимум - 16 байт (обмен с 128 битным SSE регистром), и то, если повезет :rolleyes:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Вы так и не написали PCI Bus Master у вас или PCI-slave. Я так понимаю, PCI-slave. Так вот, c PCI Slave не получится выжать скорость - проверено всеми начиная с появления (вернее, широкого распространения) первых чипсетов с PCI-шиной (это 1995 г.) Нужен PCI Bus Master.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скажу по своему опыту (правда было давно).

при использовании PCI slave на запись мне удавалось передавать около 40Mb/sec

при использовании PCI master на запись удавалось прокачать 105Mb/sec

У меня задача была другая - в основном запись в плату.

Возможно при чтении ситуация будет другая. но врядли.

PCI реализовывал сам, не использовал никаких сторонних IP core.

 

Имхо нужно посмотреть с помощью SignalTap (если Altera) на сигналы PCI.

Сколько там DWORDs реально передается за пакет (#FRAME)?

Посмотрите не появляется ли сигнал #STOP, если появляется, то откуда.

Доступаться к плате естественно нужно DWORDами по последовательным адресам, тогда burst будет длинный.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сигнал STOP не появляется.

За frame передается один dword.

Доступ к плате так и идет dwordами по последовательным адресам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сигнал 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня memory space.

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...