|
|
  |
OpenSource DMA for Virtex 5, проект на www.ds-dev.ru |
|
|
|
Jul 14 2011, 15:32
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Всем доброго времени суток. Я открыл исходный код для проекта контроллера PCI Express на ПЛИС Virtex 5; Проект доступен по адресу: http://www.ds-dev.ruПроект ещё не завершён. Сейчас мне пришлось опять его отложить. Но ознакомится с ним уже можно. Работает полная модель системы. В железе есть недостатки: 1. Не работает прерывание. 2. Есть сбои при частых обращениях к регистрам BAR1 3. Есть сбой при одновременной работе двух каналов DMA Это всё исправимо. Меня интересует критический разбор проекта.
|
|
|
|
|
Jul 15 2011, 09:40
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(SFx @ Jul 14 2011, 21:17)  добавьте скрипт сборки хотя бы, и туда старт моделирования. просто читать сырцы не очень интересно. example design тоже не повредит. Добавил полный архив проекта. http://ds-dev.ru/projects/ds-dma/filesОн под Active-HDL 8.3; В него включены скомпилированные библиотеки проекта. Так что он должен просто запуститься. В нем также есть несколько временных диаграмм и лог файл. Файл верхнего уровня: stend_ambpex5_core_m2 Example design есть, это проект ambpex5_v20_sx50t_core
|
|
|
|
|
Aug 17 2011, 07:37
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Bad0512 @ Aug 17 2011, 06:33)  Под двумя каналами ДМА понимается два потока в противоположных направлениях (один - на запись и один - на чтение), или два канала - это два логических устройства, шарящих шину и работающих в произвольных (возможно совпадающих) направлениях) ? Реализовано два независимых двунаправленных канала DMA. Они могут работать оба в одну сторону или в разные стороны. Естественно, они разделяют шину. Контроллер заканчивается 64-х разрядной параллельной шиной. С сигналами запроса DMA.
|
|
|
|
|
Aug 17 2011, 15:38
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(dsmv @ Aug 17 2011, 14:37)  Реализовано два независимых двунаправленных канала DMA. Они могут работать оба в одну сторону или в разные стороны. Естественно, они разделяют шину. Контроллер заканчивается 64-х разрядной параллельной шиной. С сигналами запроса DMA. Никогда не понимал смысла в построении многоканальных контроллеров. Если контроллер построен правильно, то он утилизирует шину почти на 100%. Соответственно когда один из каналов загружает шину, второй в любом случае ждёт пока шина освободится. Есть смысл распараллеливать лишь те операции, которые могут в одно и то же время независимо работать не мешая друг другу. Например, чтение и запись. В остальных случаях вместо многоканальных движков логичнее будет навернуть сверху над движком управляющий автомат, а не дублировать логику движка. Цитата(dsmv @ Aug 17 2011, 21:05)  Есть хорошие новости: прошло успешное тестирование одновременной работы двух каналов DMA.
1. Два канала на приём. Время тестирования 6 часов. Средняя скорость по каждому каналу 809.1 Мбайт/с 2. Один канал на приём, второй на передачу. Время тестирования 6 часов. Средняя скорость по каждому каналу 574.2 Мбайт/с
На сайте выложил описание управляющих регистров. Поглядите документы на IP для бриджа GN4121/GN4124. Там есть некоторые интересные идеи, часть из них я реализовал в своём контроллере. А кое-что наоборот убрал. В общем, довольно интересно наблюдать как одну и ту же задачу решают разные люди. Бридж геннумовский в общем и целом не сильно от коры Ксайлинкса отличается - также торчат в обе стороны две шины данных (в данном случае они 16 бит ДДР, но это не важно). К ним кое-какие сигналы управления. Всё очень похоже. Кстати, всё забываю спросить... Откуда ваш контроллер берёт данные на плате и куда их складывает? Наиболее часто ДМА машины цепляют к ДДР контроллеру. На этом стыке, кстати тоже есть возможность потерять производительность.
|
|
|
|
|
Aug 17 2011, 15:52
|
Знающий
   
Группа: Свой
Сообщений: 672
Регистрация: 18-02-05
Пользователь №: 2 741

|
Цитата(Bad0512 @ Aug 17 2011, 18:09)  Никогда не понимал смысла в построении многоканальных контроллеров. Если контроллер построен правильно, то он утилизирует шину почти на 100%. Соответственно когда один из каналов загружает шину, второй в любом случае ждёт пока шина освободится. Есть смысл распараллеливать лишь те операции, которые могут в одно и то же время независимо работать не мешая друг другу. Например, чтение и запись. В остальных случаях вместо многоканальных движков логичнее будет навернуть сверху над движком управляющий автомат, а не дублировать логику движка. В pcie линия запросов одна - на чтение и на запись. Для чтения (памяти ПК) вторая линия. Минимум два канала формирования запросов. При правильном построении контроллера логика не дублируется, формирователь запросов один для всех каналов чтения/записи, приёмник один для всех каналов чтения. В формирователе добавляется только арбитр и мультиплексор по сравнению с одноканальным вариантом, в приёмнике не добавляется ничего, разве что декодер номера канала. Попробуйте сформировать чтение нескольких потоков данных с разной скоростью имея один канал. Думаю, Вас никакой автомат не спасёт. Простой пример такой необходимости - размещение памяти дескрипторов страниц данных в памяти ПК для sgdma передач (размер буфера больше 1 мбайт winda позволяет сделать только так, бесконечное копирование с задействованием цпу во временный буфер не в счёт).
|
|
|
|
|
Aug 18 2011, 04:40
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Bad0512 @ Aug 17 2011, 18:38)  Никогда не понимал смысла в построении многоканальных контроллеров. Если контроллер построен правильно, то он утилизирует шину почти на 100%. Соответственно когда один из каналов загружает шину, второй в любом случае ждёт пока шина освободится. Есть смысл распараллеливать лишь те операции, которые могут в одно и то же время независимо работать не мешая друг другу. Например, чтение и запись. В остальных случаях вместо многоканальных движков логичнее будет навернуть сверху над движком управляющий автомат, а не дублировать логику движка. Смысл есть. Контроллер разрабатывается под специфику нашей компании - а именно подключение АЦП и ЦАП. Двухканальный и двунаправленный контроллер позволяет закрыть большинство задач. В частности одновременный ввод из АЦП и вывод в ЦАП, или ввод двух независимых потоков от АЦП. Цитата(Bad0512 @ Aug 17 2011, 18:38)  Поглядите документы на IP для бриджа GN4121/GN4124. Там есть некоторые интересные идеи, часть из них я реализовал в своём контроллере. А кое-что наоборот убрал. В общем, довольно интересно наблюдать как одну и ту же задачу решают разные люди. Бридж геннумовский в общем и целом не сильно от коры Ксайлинкса отличается - также торчат в обе стороны две шины данных (в данном случае они 16 бит ДДР, но это не важно). К ним кое-какие сигналы управления. Всё очень похоже. Документы посмотрел. У них, также как и остальных разработчиков DMA, используется одиночные дескрипторы для DMA. Это резко ограничивает скорость обмена при работе с фрагментированной памятью. Цитата(Bad0512 @ Aug 17 2011, 18:38)  Кстати, всё забываю спросить... Откуда ваш контроллер берёт данные на плате и куда их складывает? Наиболее часто ДМА машины цепляют к ДДР контроллеру. На этом стыке, кстати тоже есть возможность потерять производительность. Потерять производительность можно везде. По поводу подключения, есть компонент pcie_core64_m1 - http://src.ds-dev.ru/projects/ds_dma/core/...core64__m1.htmlЭто собственно контроллер, он имеет пакетную шину PB_BUS, которая реализована на двух сигналах pb_master и pb_slave; Выше по иерархии компонент pcie_core64_m2 - http://src.ds-dev.ru/projects/ds_dma/core/...core64__m2.htmlОн уже имеет нормальную 64-х разрядную синхронную параллельную шину. Тестовый проект выполнен как проект ADMPRO. В нём реализован узел подключения к тетрадам cl_ambpex5_m2 - http://src.ds-dev.ru/projects/ds_dma/ambpe...mbpex5__m5.htmlи собственно тетрады: TRD_MAIN TRD_DIO64_IN TRD_DIO64_OUT TRD_TEST_CTRL Подробнее о интерфейсе ADMPRO можно прочитать на сайте "ИнСиС" - http://insys.ru/docВ тетраде TRD_TEST_CTRL реализован узел формирования тестовой последовательности- cl_test_generate и узел проверки тестовой последовательности - cl_test_checkВ итоге cl_test_generate формирует тестовую последовательность, программа на компьютере её проверяет. Или наоборот, программа формирует тестовую последовательность, а узел cl_test_check её проверяет. В тетраде MAIN также есть узел формирования псевдослучайной последовательности. В тесте двух каналов на приём используется два источника - тетрада MAIN и тетрада TEST_CTRL
|
|
|
|
|
Aug 18 2011, 14:13
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(dsmv @ Aug 18 2011, 11:40)  Документы посмотрел. У них, также как и остальных разработчиков DMA, используется одиночные дескрипторы для DMA. Это резко ограничивает скорость обмена при работе с фрагментированной памятью. Если Вы имеете ввиду со стороны памяти хоста, то там - честный scatter-gather, с листами страничек и размером одного ДМА пакета до 4 мегабайт (как раз размер HD картинки). Если речь идёт о непрерывности со стороны интерфейса в локальную память, то в родном геннумовском интерфейсе всё даже хуже - там не то что адрес менять нельзя, его просто нет, интерфейс заточен на ФИФО. Кстати для ЦАП-АЦП вполне подходит такой вариант. Именно потому, что при обращении к локальной памяти нельзя выставить, а потом на ходу и поменять адрес, я и взялся этот дизайн переписывать. Приделал небольшой списочек дескрипторов для локальной памяти, в моём случае было важно за одну операцию забирать до 8 разных кусков видео-аудио, которые уже лежат в локальной памяти, но имеют разный размер (от 0 до 4 мегабайт) и естественно расположены по почти случайным адресам.
|
|
|
|
|
Aug 19 2011, 11:03
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(Bad0512 @ Aug 17 2011, 19:38)  Поглядите документы на IP для бриджа GN4121/GN4124. В документах от Gennum ( в отличии от Xilinx и Altera, которые приводят результаты даже для конкретных материнских плат ) нигде не указаны достижимые скорости передачи данных для GN4121/GN4124. Если Вы имели дело с GN4121/GN4124, то что можете сказать по поводу достижимых скоростей? Или же я всё же не заметил, и есть документ , где эти скорости приведены?
|
|
|
|
|
Aug 22 2011, 04:46
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Bad0512 @ Aug 18 2011, 17:13)  Если Вы имеете ввиду со стороны памяти хоста, то там - честный scatter-gather, с листами страничек и размером одного ДМА пакета до 4 мегабайт (как раз размер HD картинки). Я хочу обратить внимание как раз на честный scatter-gather. Во всех известных мне IP Core, а именно Xilinx, PLDA, Northwest Logic, Synopsys, Intensys, а также в микросхемах PLX используются одиночные дескрипторы. Т.е. для одного блока памяти используется один дескриптор. Алгоритм работы: DMA читает один дескриптор и производит обмен с одним блоком. Если размер блока большой, например 1 Мбайт, то всё замечательно. Но проблема в том, что выделить 1.5 Гбайта можно только в USER MEMORY. А там память выделяется страницами по 4 килобайта. И получаются большие потери, так как дескриптор читается для блока в 4 килобайта. В моём контроллере дескрипторы объеденены в блок, за одну операцию происходит чтение блока в котором 63 дескриптора. Потери производительности на чтение дескрипторов минимальны. А если дескрипторов меньше 63 - то всё работает из памяти и потерь нет. Интересное решение в DMA от Intensys. Там дескрипторы расположены в локальной памяти ПЛИС. Потерь на чтение нет, но большой блок в фрагментированной памяти разместить нельзя - не хватит памяти ПЛИС. Со стороны локальной шины у меня DMA работает по фиксированному адресу, предполагается что там расположено FIFO.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|