Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: OpenSource DMA for Virtex 5
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
Страницы: 1, 2
dsmv
Всем доброго времени суток.

Я открыл исходный код для проекта контроллера PCI Express на ПЛИС Virtex 5;
Проект доступен по адресу: http://www.ds-dev.ru

Проект ещё не завершён. Сейчас мне пришлось опять его отложить. Но ознакомится с ним уже можно.
Работает полная модель системы.

В железе есть недостатки:
1. Не работает прерывание.
2. Есть сбои при частых обращениях к регистрам BAR1
3. Есть сбой при одновременной работе двух каналов DMA

Это всё исправимо.
Меня интересует критический разбор проекта.
SFx
добавьте скрипт сборки хотя бы, и туда старт моделирования. просто читать сырцы не очень интересно. example design тоже не повредит.


З.Ы. За опенсурс cheers.gif
dsmv
Цитата(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
SFx
спасибо, на недельке погляжу.
dsmv

Контроллер работает всё лучше и лучше.

Работает ввод и вывод данных. Есть сбои при одновременной работе двух каналов DMA.
Bad0512
Цитата(dsmv @ Aug 12 2011, 16:58) *
Контроллер работает всё лучше и лучше.

Работает ввод и вывод данных. Есть сбои при одновременной работе двух каналов DMA.

Под двумя каналами ДМА понимается два потока в противоположных направлениях (один - на запись и один - на чтение), или два канала - это два логических устройства, шарящих шину и работающих в произвольных (возможно совпадающих) направлениях) ?
dsmv
Цитата(Bad0512 @ Aug 17 2011, 06:33) *
Под двумя каналами ДМА понимается два потока в противоположных направлениях (один - на запись и один - на чтение), или два канала - это два логических устройства, шарящих шину и работающих в произвольных (возможно совпадающих) направлениях) ?


Реализовано два независимых двунаправленных канала DMA.
Они могут работать оба в одну сторону или в разные стороны.
Естественно, они разделяют шину.
Контроллер заканчивается 64-х разрядной параллельной шиной. С сигналами запроса DMA.
dsmv
Есть хорошие новости:
прошло успешное тестирование одновременной работы двух каналов DMA.

1. Два канала на приём. Время тестирования 6 часов. Средняя скорость по каждому каналу 809.1 Мбайт/с
2. Один канал на приём, второй на передачу. Время тестирования 6 часов. Средняя скорость по каждому каналу 574.2 Мбайт/с

На сайте выложил описание управляющих регистров.
Bad0512
Цитата(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 бит ДДР, но это
не важно). К ним кое-какие сигналы управления. Всё очень похоже.
Кстати, всё забываю спросить... Откуда ваш контроллер берёт данные на плате и куда их складывает? Наиболее часто ДМА машины цепляют к ДДР контроллеру. На этом стыке,
кстати тоже есть возможность потерять производительность.
dmitry-tomsk
Цитата(Bad0512 @ Aug 17 2011, 18:09) *
Никогда не понимал смысла в построении многоканальных контроллеров. Если контроллер построен правильно, то он утилизирует шину почти на 100%.
Соответственно когда один из каналов загружает шину, второй в любом случае ждёт пока шина освободится. Есть смысл распараллеливать лишь те операции,
которые могут в одно и то же время независимо работать не мешая друг другу. Например, чтение и запись. В остальных случаях вместо многоканальных движков
логичнее будет навернуть сверху над движком управляющий автомат, а не дублировать логику движка.

В pcie линия запросов одна - на чтение и на запись. Для чтения (памяти ПК) вторая линия. Минимум два канала формирования запросов. При правильном построении контроллера логика не дублируется, формирователь запросов один для всех каналов чтения/записи, приёмник один для всех каналов чтения. В формирователе добавляется только арбитр и мультиплексор по сравнению с одноканальным вариантом, в приёмнике не добавляется ничего, разве что декодер номера канала. Попробуйте сформировать чтение нескольких потоков данных с разной скоростью имея один канал. Думаю, Вас никакой автомат не спасёт. Простой пример такой необходимости - размещение памяти дескрипторов страниц данных в памяти ПК для sgdma передач (размер буфера больше 1 мбайт winda позволяет сделать только так, бесконечное копирование с задействованием цпу во временный буфер не в счёт).
dsmv
Цитата(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

Bad0512
Цитата(dsmv @ Aug 18 2011, 11:40) *
Документы посмотрел. У них, также как и остальных разработчиков DMA, используется одиночные дескрипторы для DMA. Это резко ограничивает скорость обмена при работе с фрагментированной памятью.

Если Вы имеете ввиду со стороны памяти хоста, то там - честный scatter-gather, с листами страничек и размером одного ДМА пакета до 4 мегабайт (как раз размер HD картинки).
Если речь идёт о непрерывности со стороны интерфейса в локальную память, то в родном геннумовском интерфейсе всё даже хуже - там не то что адрес менять нельзя, его просто нет, интерфейс заточен на ФИФО. Кстати для ЦАП-АЦП вполне подходит такой вариант. Именно потому, что при обращении к локальной памяти нельзя выставить, а потом на ходу и поменять адрес, я и взялся этот дизайн переписывать. Приделал небольшой списочек дескрипторов для локальной памяти, в моём случае было важно за одну операцию забирать до 8 разных кусков видео-аудио, которые уже лежат в локальной памяти, но имеют разный размер (от 0 до 4 мегабайт) и естественно расположены по почти случайным адресам.
FLTI
Цитата(Bad0512 @ Aug 17 2011, 19:38) *
Поглядите документы на IP для бриджа GN4121/GN4124.

В документах от Gennum ( в отличии от Xilinx и Altera, которые приводят результаты даже для конкретных материнских плат ) нигде не указаны достижимые скорости передачи данных для GN4121/GN4124.
Если Вы имели дело с GN4121/GN4124, то что можете сказать по поводу достижимых скоростей?
Или же я всё же не заметил, и есть документ , где эти скорости приведены?
dsmv
Цитата(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.
dsmv
Добавлен проект ML605_LX240T_CORE для платы ML605. Там реализован PCI Express v2.0 x4; Работает. Скорости таки же, как и на AMBPEX5.
dsmv
Всем доброго времени суток.

Несколько слов по поводу развития проекта:

1. Разработка документации. Файлы скачивают, но вопросов пока никто не задаёт. Наверное всё понятно ?
2. Ядро для Spartan-6 x1; Есть ли у кого-нибуть какая либо плата для проверки ?
3. Размещение на opencores.org; Для этого необходимо сделать подключение к шине Wishbone, пример проекта для этой шины и документация на английском языке.

Какие есть ещё предложения ?
mhspace
Цитата(dsmv @ Aug 30 2011, 13:41) *
Файлы скачивают, но вопросов пока никто не задаёт. Наверное всё понятно ?


У меня есть вопрос. Сколько ресурсов требуется при реализации в Virtex - 5 ?
Kuzmi4
Цитата(dsmv @ Aug 30 2011, 13:41) *
...
2. Ядро для Spartan-6 x1; Есть ли у кого-нибуть какая либо плата для проверки ?
...

Имею SP605, в данный момент находится в ящике, при желани можно нарисовать и тестовый PC. Могу подсобить. Будет интересно.
Могу так же поучавствовать в 3.
dsmv

Вот фрагмент отчета для проекта ambpex5_v20_sx50t_core. ПЛИС Virtex 5 SX50T;

Код
Release 13.1 Map O.40d (nt)
Xilinx Mapping Report File for Design 'ambpex5_v20_sx50t_core'

Design Information
------------------
Command Line   : map -p 5VSX50TFF1136-1 -o map.ncd -pr b -ol high -cm speed -ir
off -detail -t 1 -global_opt speed -retiming on -equivalent_register_removal on
-lc auto -mt off ambpex5_v20_sx50t_core_merge_chipscope.ngd
ambpex5_v20_sx50t_core_merge_chipscope.pcf
Target Device  : xc5vsx50t
Target Package : ff1136
Target Speed   : -1
Mapper Version : virtex5 -- $Revision: 1.55 $
Mapped Date    : Fri Aug 12 15:37:44 2011

Design Summary
--------------
Number of errors:      0
Number of warnings:   39
Slice Logic Utilization:
  Number of Slice Registers:                 7,789 out of  32,640   23%
    Number used as Flip Flops:               7,779
    Number used as Latches:                      9
    Number used as Latch-thrus:                  1
  Number of Slice LUTs:                      6,463 out of  32,640   19%
    Number used as logic:                    5,405 out of  32,640   16%
      Number using O6 output only:           4,315
      Number using O5 output only:             610
      Number using O5 and O6:                  480
    Number used as Memory:                   1,002 out of  12,480    8%
      Number used as Dual Port RAM:            692
        Number using O6 output only:           656
        Number using O5 and O6:                 36
      Number used as Single Port RAM:           88
        Number using O6 output only:            88
      Number used as Shift Register:           222
        Number using O6 output only:           220
        Number using O5 output only:             1
        Number using O5 and O6:                  1
    Number used as exclusive route-thru:        56
  Number of route-thrus:                       681
    Number using O6 output only:               660
    Number using O5 output only:                19
    Number using O5 and O6:                      2

Slice Logic Distribution:
  Number of occupied Slices:                 3,017 out of   8,160   36%
  Number of LUT Flip Flop pairs used:        9,916
    Number with an unused Flip Flop:         2,127 out of   9,916   21%
    Number with an unused LUT:               3,453 out of   9,916   34%
    Number of fully used LUT-FF pairs:       4,336 out of   9,916   43%
    Number of unique control sets:             365
    Number of slice register sites lost
      to control set restrictions:             541 out of  32,640    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.
  OVERMAPPING of BRAM resources should be ignored if the design is
  over-mapped for a non-BRAM resource or if placement fails.

IO Utilization:
  Number of bonded IOBs:                         8 out of     480    1%
    Number of LOCed IOBs:                        8 out of       8  100%
    Number of bonded IPADs:                     18
      Number of LOCed IPADs:                    18 out of      18  100%
    Number of bonded OPADs:                     16
      Number of LOCed OPADs:                    16 out of      16  100%

Specific Feature Utilization:
  Number of BlockRAM/FIFO:                      21 out of     132   15%
    Number using BlockRAM only:                 21
    Total primitives used:
      Number of 36k BlockRAM used:              10
      Number of 18k BlockRAM used:              18
    Total Memory used (KB):                    684 out of   4,752   14%
  Number of BUFG/BUFGCTRLs:                      4 out of      32   12%
    Number used as BUFGs:                        4
  Number of BSCANs:                              1 out of       4   25%
  Number of BUFDSs:                              1 out of       6   16%
  Number of DSP48Es:                             4 out of     288    1%
  Number of GTP_DUALs:                           4 out of       6   66%
  Number of PCIEs:                               1 out of       1  100%
  Number of PLL_ADVs:                            1 out of       6   16%

  Number of RPM macros:           12
Average Fanout of Non-Clock Nets:                3.44

Peak Memory Usage:  557 MB
Total REAL time to MAP completion:  8 mins 37 secs
Total CPU time to MAP completion:   8 mins 34 secs



Цитата(Kuzmi4 @ Aug 31 2011, 17:55) *
Имею SP605, в данный момент находится в ящике, при желани можно нарисовать и тестовый PC. Могу подсобить. Будет интересно.
Могу так же поучавствовать в 3.


Отлично. Тогда я начинаю собирать проект.
По поводу opencores - надо обсудить как лучше перейти на wishbone. Нужно заменить компонент core64_pb_transaction и перевести тестовый проект с ADM на что-то более простое. Например сделать блоки тестирования аналогичные block_pe_main;

Kuzmi4
Вот бы ещё описалово какое-никакое к сорцам (хотя бы "в общем и целом" так сказать), цены бы им не было. Потому как я его не нашёл ни в Хранилище ни в Файлах...
dsmv
Цитата(Kuzmi4 @ Sep 1 2011, 19:35) *
Вот бы ещё описалово какое-никакое к сорцам (хотя бы "в общем и целом" так сказать), цены бы им не было. Потому как я его не нашёл ни в Хранилище ни в Файлах...


Хорошо бы. Пока есть только структурная схема
Для создания документации я планирую использовать программу DOXYGEN. Результат здесь. Но конечно этого недостаточно.
Kuzmi4
2 dsmv
То есть, если я правильно понял, на данный момент, чтобы разобраться в дизайне, нужно втыкать в каменты/симуляцию и пользоваться структурной схемой/иерархией проекта? А кроме вас есть ещё лица которые могут просветить в деталях? И куда/кому задавать вопросы ?
dsmv
Цитата(Kuzmi4 @ Sep 2 2011, 14:04) *
2 dsmv
То есть, если я правильно понял, на данный момент, чтобы разобраться в дизайне, нужно втыкать в каменты/симуляцию и пользоваться структурной схемой/иерархией проекта? А кроме вас есть ещё лица которые могут просветить в деталях? И куда/кому задавать вопросы ?


Совершенно верно. Кроме меня проект ещё никто не знает. Да и я уже многое забыл. Вопросы задавать нужно мне. Спрашивать можно например на этом форуме, думаю модераторы не будут против. Или на непосредственно сайте ds-dev.ru

Я открыл этот проект, потому что хочу что бы появились ещё люди, которые в нём разберутся. Иначе знание будет потеряно.
dsmv

Готов проект для SP605. На модели работает. Теперь нужно проверить на реальной плате.

Для проверки надо использовать программу AMBPEX5_SDRAM. Находится в разделе Файлы на сайте.
Драйвера надо скачать здесь. Внутри zip есть файл установки qtpex58x1-12500_rt_v4_01.exe

Kuzmi4
2 dsmv
Для тестов могу взять систему с AMD Athlon64 3000+, 1536 MB RAM (MB не знаю какая , нужно лезть внутря).
Систему смогу собрать хоть сейчас, но с 3.09 по 5.09 меня не будет, потому проверить можно будет только во вторник (за это время думаю подчитать описание, и попытаться разобраться в проекте).

Как я понимаю, заливать в SP605 нужно будет "sp605_lx45t_core_2011_09_02_v1_0_build_0x100.zip\sp605_lx45t_core\implement\ver1\rev1\sp605_lx45t_core.bit" а запускать на компе после установки драйверов(qtpex58x1-12500.zip\qtpex58x1-12500_rt_v4_01.exe) прогу "ambpex5_sdram.zip\bin\ambpex5_sdram.exe"? И как смотреть все ли тесты прошли ?
dsmv
Это не горит. Вторник тоже подойдет.

Прошивка и драйвера:
sp605_lx45t_core_2011_09_02_v1_0_build_0x100.zip\sp605_lx45t_core\implement\ver1\rev1\sp605_lx45t_core.bit
qtpex58x1-12500.zip\qtpex58x1-12500_rt_v4_01.exe

По поводу программы - запускать надо не .exe а .bat файлы.
Список тестов:
test_main.bat - ввод данных из тетрады MAIN
out_main.bat - вывод данных в тетраду MAIN (без проверки)
test_dio.bat - ввод данных из тетрады DIO_IN
out_dio.bat - вывод данных в тетраду DIO_OUT
test_main_dio.bat - ввод двух потоков: из тетрады MAIN и из тетрады DIO_OUT
out_main_dio.bat - ввод из тетрады MAIN и вывод в тетраду DIO_OUT

Это консольное приложение, запускается бесконечный тест, выход по ESC.
В процессе работы отображается количестово принятых и переданных блоков, а также число правильных и ошибочных блоков.
Скорость измеряется двуя способами: на интервале 4 с и средняя скорость с момента запуска.
Если есть ошибки, то перед выходом по esc отображаются первые 16 ошибок.

В тестах test_main._dio.bat и out_main_dio.bat отображаются две строки - по одной для каждого теста.

Kuzmi4
2 dsmv
Просмотрел файлы. Возник вопрос касательно sys_clk_p/sys_clk_n пинов.
У вас эти лапы есть в топовом модуле, и вы их заводите на IBUFDS, то есть тут вопросов нет. И в TB они есть:
Код
sys_clk_p            => clk125p,   -- тактовая частота 125 MHz от PCI_Express

Однако я посмотрел UCF:
1) sp605_lx45t_core\implement\ver1\rev1\sp605_lx45t_core.ucf
2) sp605_lx45t_core\src\top\sp605_lx45t_core.ucf
В этих файлах закоментированы строки назначающие sys_clk_p/sys_clk_n (посмотреть в самом дизайне не могу:UnsupportedFileFormatVersion==>ISE v11.5)
Не могли бы вы проверить ещё раз дизайн(на SP605 speed grade не 2 а 3, попробую завести, но посмотрим чт ов реале будет)??
Kuzmi4
Результаты (система: AMD Athlon64 3000+, 1536 MB RAM, MB: K8N4-E):
заливаю битстрим, ресечусь, вижу подмигивание лампы DS3 при старте, потом глухо.
В Device Manager-e вижу ошибку в дровах.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
PciTree выдаёт собно вот такое:
Нажмите для просмотра прикрепленного файла
Вот выхлоп запусков 3х батников:
Цитата
D:\TMP\PCIe_test\sp605_dma\ambpex5_sdram\bin>test_main.bat

D:\TMP\PCIe_test\sp605_dma\ambpex5_sdram\bin>ambpex5_sdram.exe test_main.cfg
Ошибка при открытии модуля AMBPEX: ret=0x40010100

D:\...test\sp605_dma\ambpex5_sdram\bin>test_main_dio.bat

D:\TMP\PCIe_test\sp605_dma\ambpex5_sdram\bin>ambpex5_sdram.exe test_main.cfg tes
t_dio.cfg
Ошибка при открытии модуля AMBPEX: ret=0x40010100

D:\TMP\PCIe_test\sp605_dma\ambpex5_sdram\bin>

А вот я залил тестовый дизайн хилых:
Нажмите для просмотра прикрепленного файла
в нём всё по ходу пашеД laughing.gif

резюмируя результаты - скорей всего спидгрейдовый вопрос всплыл sad.gif
dsmv
Цитата(Kuzmi4 @ Sep 6 2011, 18:46) *
резюмируя результаты - скорей всего спидгрейдовый вопрос всплыл sad.gif
о

Для начала неплохо. Совершенно правильно определились VendorID, DeviceID. Так что ядро Xilinx работает. Спидгрейд я думаю здесь ни причём. -2 более медленная чем -3. А на ней ошибок по времянке нет. Я завтра ещё одну программу пришлю, посмотрим что читается из регистров BAR0. Скорее всего читаются неправильные значения и драйвер не опознаёт устройство.

Выводы sys_clk_p/sys_clk я проверял, они попадают куда нужно. Но можно и ещё раз завтра посмотреть.

Один из светодиодов (GPIO_LED_1) должен подмигивать, но очень редко. Он показывает ширину шины PCI Express( x1 - один раз мигает), но я забыл что здесь шина 62.5 Мгц вместо 250 Мгц на Virtex 5, так что он будет редко вспыхивать.

В общем - процесс пошёл rolleyes.gif
Kuzmi4
2 dsmv
да , провтыкал я со спидгрейдом: Spartan®-6 LX and LXT FPGAs are available in various speed grades, with -3 having the highest performance.

На счёт светодиода - а на сколько редко он мигать должен ??
На счёт клока - это вы к чему? PCIe х1 корка бегает на 8ns периоде.
dsmv
Нет, частота локальной шины ядра 62.5 Мгц - 16 нс.
У меня есть узел, который мигает светодиодом в соответствии с шириной шины. Он остался от реализаций для x8 на Virtex 5 и Virtex 6. Но там частота шины 250 Мгц, а мигает он и там достаточно медленно. А здесь будет ещё в 4 раза медленней, точный период сказать не могу, возможно раз в минуту.
dsmv

Есть новая информация. Проект SP605_LX45T_CORE успешно работает. Огромное спасибо Kuzmi4 за проверку на реальной плате и обнаружение проблемы при работе с chipset от NVIDEA. В процессе отладки проявилась интересная особенность chipeset P55 - он игнорирует поле LOWER ADR в пакете COMPLETION. Это я поле я оставлял нулевым. В результате на компьютере с процессором AMD и chipset от NVIDEA читались только регистры у которых в младших адресах был 0. На компьютерах c P55 всё работало отлично. После исправления LOWER ADR - заработало и на NVIDEA.

Скорость ввода данных на компьютере с chipset P55 - 201 Мбайт/с.
Jack_of_Shadows
Добрый день! Пишет вам благодарный, но немного бестолковый пользователь вашего проекта sm.gif
Только начал вникать в ваши исходники, поэтому вопросов огромное множество, но пока не буду их все вываливать, надеюсь что постепенно сам разберусь.
Итак, скачал с ds-dev.ru архив ambpex5_v20_sx50t_core_2012_04_09_v1_1_build_0x100.zip. Собрал в ISE, немного исправил под свою плату с XC5VFX30T. Скачал оттуда же исходники под linux, скомпилил то что в application/adm_test. Результаты тестов примерно такие (соединение x1):

test_dio_s128.cfg
Код
             BLOCK_WR   BLOCK_RD   BLOCK_OK  BLOCK_ERR   SPD_CURR    SPD_AVR     STATUS

TRD :   4          0 -544350728          0          0  1423616.0   100837.2     0xFFFF  0    0
TRD :   6          0          0          0          0        0.0        0.0     0x004F  1    0

out_dio_s128.cfg
Код
             BLOCK_WR   BLOCK_RD   BLOCK_OK  BLOCK_ERR   SPD_CURR    SPD_AVR     STATUS

TRD :   4          0 1919343662          0          0  1485236.4     5566.9     0xFFFF  0    0
TRD :   7       1024          0          0          0        0.0        0.0     0x0073

Тест test_main.cfg вылетает с segmentation fault. Результаты вроде обнадеживают. Непонятны некоторые величины, выдаваемые прогой:
если текущая скорость остается примерно одинаковой, то средняя скачет многократно и показывает явно заниженные значения. Это какой-то глюк? Можно вкратце пояснить способ измерения скорости?
Можно пояснить смысл столбцов в логе? Для меня только значения скорости оказались интуитивно понятны.

Касаемо прошивки плис:
правильно ли я понимаю, что само ядро интерфейса это PCIE_CORE64_M1, ну или PCIE_CORE64_M2, если нужна обычная параллельная шина LC bus? И для того, чтобы использовать ядро, достаточно приделать к этой шине свой источник данных, например FIFO-буфер?
Kuzmi4
2 Jack_of_Shadows
Есть версия для вишбона, или вас интересует именно LC bus?
Jack_of_Shadows
Kuzmi4, да-да, видел, на данном этапе мне это не особо принципиально, лишь бы было попроще.
Kuzmi4
2 Jack_of_Shadows
А куда проще ? Времянки на WB документированы, MemoryMap имеется...
Jack_of_Shadows
Kuzmi4,
я хотел сказать что вокруг PCIE_CORE64_M1 есть обертки на обе эти шины, можно взять любую из них, и получить готовый блок PCIe, для работы с которым понадобится только подсовывать новые данные на входную шину. Я правильно понимаю степень законченности вашего проекта?
Jack_of_Shadows
И еще, может я конечно начинаю не с той стороны, но немного покопав программу под Linux совсем засел в тупик:

скорость теста должно показывать в МБ/с, в то время как у меня выдает совершенно нереальные несколько миллионов (из-за того, что параметр BLOCK_RD растет как на дрожжах)

с какими параметрами надо вызывать программу, к примеру для того, чтобы протестировать чтение тестовых данных из плис? Надо указывать тетраду 1 (TEST_CTRL) или какую-то другую? Тесты test_dio_s128.cfg и out_dio_s128.cfg висят в нуле, при вызове программы без параметров счетчики тикают, но как я уже говорил показывают нереально больше значения.
dsmv
Спасибо за интерес к моему проекту. Тест работает неправильно. В качестве параметра надо передавать имя файла конфигурации: test_dio_s128.cfg; Должна появится только одна строчка для тетрады 6; Строки с TRD 4 быть не должно. Что то не срослось. Есть возможность проверить работу на компьютере с Windows ?

Тетрады 4 в тестовом проекте нет, поэтому значения скорости - произвольные. Значение регистра STATUS=0xFFFF это правильно.

Для тетрады 6 значение регистра STATUS=0x4F - это означает что FIFO полностью заполнено, но передачи в PCI Express нет.

По поводу скорости: текущаяя скорость измеряется на интервале 4 секунды, средняя скорость - с момента запуска теста. Вывод в Мбайтах/с; Для PCI Express x1 должно быть около 200 Мбайт/с.

Для Virtex 5 ядром PCI Express является узел PCIE_CORE64_M1. Он реализует пакетную шину PB_BUS; Узел PCIE_CORE64_M2 содержит переход на шину LC_BUS и блок управления BLOCK_MAIN - он нужен для работы наших драйверов. Наиболее просто использовать LC_BUS. Это простая параллельная шина без ожидания готовности. Переход на WISHBONE связан с добавлением промежуточных FIFO.

Jack_of_Shadows
Цитата
Есть возможность проверить работу на компьютере с Windows ?

есть win 7 x64. Качал ambpex5_test_v1_0, но там только тестовая прога без драйвера. И при запуске BRD.DLL требует.
Цитата
Строки с TRD 4 быть не должно

она возникает если запускать как описано здесь:
./adm_test <имя устройства> <файл конфигурации> [<файл конфигурации>]
так как в программе для параметров по умолчанию прописана тетрада 4. Когда же указываю только файл конфигурации, строчка одна, как и должна.
Цитата
Для тетрады 6 значение регистра STATUS=0x4F - это означает что FIFO полностью заполнено, но передачи в PCI Express нет.

что посоветуете посмотреть для дебага?
Kuzmi4
2 Jack_of_Shadows
удалось побороть ошибку ? Система заработала в обе стороны ?
Jack_of_Shadows
Kuzmi4
пока нет. Управляющие регистры доступны, явных ошибок в лог ни программа ни драйвер не выдаёт. Судя по регистру статуса передающее FIFO заполняется тестовыми данными, но DMA не хочет их передавать. В обратную сторону соответственно не хочет забирать.
Кстати по регистрам: в тетраде MAIN есть набор регистров SELx выбора прерывания и канала DMA. Единственное ненулевое значение в них, это в SEL1 записано 0x1000, что значит примерно: для канала 1 DMA разрешено формирование запроса и выбрана тетрада 0. Непонятно почему здесь стоит нулевая тетрада (main) а не приемная или передающая. И как можно посмотреть отправляются ли реально DMA-запросы - в драйвере, программе или плисе?
karak
Цитата(Jack_of_Shadows @ Jan 17 2013, 12:31) *
Kuzmi4
пока нет. Управляющие регистры доступны, явных ошибок в лог ни программа ни драйвер не выдаёт. Судя по регистру статуса передающее FIFO заполняется тестовыми данными, но DMA не хочет их передавать. В обратную сторону соответственно не хочет забирать.
Кстати по регистрам: в тетраде MAIN есть набор регистров SELx выбора прерывания и канала DMA. Единственное ненулевое значение в них, это в SEL1 записано 0x1000, что значит примерно: для канала 1 DMA разрешено формирование запроса и выбрана тетрада 0. Непонятно почему здесь стоит нулевая тетрада (main) а не приемная или передающая. И как можно посмотреть отправляются ли реально DMA-запросы - в драйвере, программе или плисе?

чтобы посмотреть информацию о состоянии регистров модуля нужно выполнить команду cat /proc/MODULE_NAME вместо MODULE_NAME посмотрите какая плата у Вас (что-то вроде ***-PEX5-**) и покажите результат.
Jack_of_Shadows
karak
Код
  Device information
  m_TotalIRQ = 0

  PE_EXT_FIFO 4

  BLOCK_ID = 18
  BLOCK_VER = 103
  FIFO_ID = 3400
  FIFO_NUMBER = 0
  RESOURCE = 2
  DMA_MODE = 0
  DMA_CTRL = 0
  FIFO_STATUS = a000
  FLAG_CLR = 0
  PCI_ADRL = 0
  PCI_ADRH = 0
  LOCAL_ADR = 0

  PE_EXT_FIFO 5

  BLOCK_ID = 18
  BLOCK_VER = 103
  FIFO_ID = 3400
  FIFO_NUMBER = 1
  RESOURCE = 2
  DMA_MODE = 0
  DMA_CTRL = 0
  FIFO_STATUS = a000
  FLAG_CLR = 10
  PCI_ADRL = c000
  PCI_ADRH = 0
  LOCAL_ADR = 1000


а во время работы программы (пытающейся принимать из FIFO 1):
Код
PE_EXT_FIFO 5

  BLOCK_ID = 18
  BLOCK_VER = 103
  FIFO_ID = 3400
  FIFO_NUMBER = 1
  RESOURCE = 2
  DMA_MODE = 27
  DMA_CTRL = 1
  FIFO_STATUS = a000
  FLAG_CLR = 10
  PCI_ADRL = c000
  PCI_ADRH = 0
  LOCAL_ADR = 1000
karak
Цитата(Jack_of_Shadows @ Jan 17 2013, 12:31) *
Kuzmi4
пока нет. Управляющие регистры доступны, явных ошибок в лог ни программа ни драйвер не выдаёт. Судя по регистру статуса передающее FIFO заполняется тестовыми данными, но DMA не хочет их передавать. В обратную сторону соответственно не хочет забирать.
Кстати по регистрам: в тетраде MAIN есть набор регистров SELx выбора прерывания и канала DMA. Единственное ненулевое значение в них, это в SEL1 записано 0x1000, что значит примерно: для канала 1 DMA разрешено формирование запроса и выбрана тетрада 0. Непонятно почему здесь стоит нулевая тетрада (main) а не приемная или передающая. И как можно посмотреть отправляются ли реально DMA-запросы - в драйвере, программе или плисе?

чтобы посмотреть информацию о состоянии регистров модуля нужно выполнить команду cat /proc/MODULE_NAME вместо MODULE_NAME посмотрите какая плата у Вас (что-то вроде ***-PEX5-**) и покажите результат.

Цитата(Jack_of_Shadows @ Jan 17 2013, 13:40) *
а во время работы программы (пытающейся принимать из FIFO 1):
Код
PE_EXT_FIFO 5

  BLOCK_ID = 18
  BLOCK_VER = 103
  FIFO_ID = 3400
  FIFO_NUMBER = 1
  RESOURCE = 2
  DMA_MODE = 27
  DMA_CTRL = 1
  FIFO_STATUS = a000
  FLAG_CLR = 10
  PCI_ADRL = c000
  PCI_ADRH = 0
  LOCAL_ADR = 1000

Что-то предыдущее сообщение отправилось второй раз. то что в статусе 0xA000 говорит о том, что контроллер не стартовал. Должно быть 0xA001 у вас 64 битная linux система или 32?
Jack_of_Shadows
Цитата
у вас 64 битная linux система или 32?

64 бита.
Еще в FIFO_ID старшие четыре бита (значение TYPE) равны 3, хотя как написано здесь может быть 1 (если на чтение) и 2 (если на запись)
dsmv
Цитата(Jack_of_Shadows @ Jan 17 2013, 13:16) *
64 бита.
Еще в FIFO_ID старшие четыре бита (значение TYPE) равны 3, хотя как написано здесь может быть 1 (если на чтение) и 2 (если на запись)


FIDO_ID правильное, 3 - это двунаправленный контроллер. Предыдущии версии были однонаправленными.


Значение FIFO_STATUS 0xA000 - неправильное -должен быть установлен бит DSC_CORRECT (т.е. 0xA100) - это означает, что блок дескрипторов прочитан неправильно.

Здесь два варианта - что неправильно в драйвере или в прошивке ПЛИС. Пришлите Ваш проект, надо посмотреть как он развёлся. Может что увижу.

P.S. Сейчас видно одно из преимуществ контроллера. Блок дескрипторов защищён контрольной суммой. Сейчас есть какая то ошибка и контроллер просто останавливается. Если бы контроля CRC не было, то компьютер бы просто завис.
karak
Цитата(dsmv @ Jan 17 2013, 14:50) *
FIDO_ID правильное, 3 - это двунаправленный контроллер. Предыдущии версии были однонаправленными.


Значение FIFO_STATUS 0xA000 - неправильное -должен быть установлен бит DSC_CORRECT (т.е. 0xA100) - это означает, что блок дескрипторов прочитан неправильно.

Здесь два варианта - что неправильно в драйвере или в прошивке ПЛИС. Пришлите Ваш проект, надо посмотреть как он развёлся. Может что увижу. Пришлите сюда: dsmv@ mail.ru

P.S. Сейчас видно одно из преимуществ контроллера. Блок дескрипторов защищён контрольной суммой. Сейчас есть какая то ошибка и контроллер просто останавливается. Если бы контроля CRC не было, то компьютер бы просто завис.


Точно, не 0xA001 а 0xA100. Посмотрел сейчас на работающем приборе. dsmv спасибо за коррекцию.
Jack_of_Shadows
karak,
мне советовали по поводу проги к вам обращаться: на 32-битном линуксе обмен таки пошёл. На х64 она вообще тестировалась до меня, или 64-битные адреса она не может обрабатывать априори?
Данные пока принимает так (первый запуск программы):
Код
Result of receiving data from tetrade 6
   0  Block: 0     Index: 00000000  Waiting: 00000000A5A50123  Received: 0000000000000000
   1  Block: 0     Index: 00000002  Waiting: 0000000000000002  Received: 0000000000000003
   ...
  30  Block: 0     Index: 0000001F  Waiting: 0000000040000000  Received: 000000007FFFFFFF
  31  Block: 0     Index: 00000020  Waiting: 0000000080000000  Received: 00000000FFFFFFFF

Начиная со второго запуска принимаемые данные везде равны 0x1234567812345678, т.е. равны значению по умолчанию.
После нескольких запусков память перестает выделяться, пишет core_alloc(): Error allocate memory. Также в системном мониторе видно что память, выделенная программой, не освобождается - занятый объем ОЗУ возрастает при запуске программы, и остается на том же уровне при выходе из ней по ctrl-C. Как с этим можно бороться?

upd: с освобождением памяти разобрался, функция освобождения была, но её никто не вызывал почему то.
karak
В функции ошибка, из за которой всегда данные вводились из тетрады MAIN. Нужно 0 заменить на addr sm.gif Про 64-битную систему сказать пока не могу, так как нет под руками. Вообще-то запускалось и кажется работало.

u32 pex_board::core_set_local_addr(int DmaChan, u32 addr)
{
AMB_SET_DMA_CHANNEL DmaParam;
DmaParam.DmaChanNum = DmaChan;
DmaParam.Param = addr;

if(m_Descr[DmaChan])
{
if (0 > ioctl(fd, IOCTL_AMB_SET_SRC_MEM, &DmaParam)) {
fprintf(stderr, "%s(): Error set source for DMA\n", __FUNCTION__ );
return -1;
}
}

return 0;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.