|
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 Это всё исправимо. Меня интересует критический разбор проекта.
|
|
|
|
|
 |
Ответов
(1 - 64)
|
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.
|
|
|
|
|
Aug 31 2011, 14:49
|
Группа: Новичок
Сообщений: 5
Регистрация: 19-08-11
Пользователь №: 66 792

|
Цитата(dsmv @ Aug 30 2011, 13:41)  Файлы скачивают, но вопросов пока никто не задаёт. Наверное всё понятно ? У меня есть вопрос. Сколько ресурсов требуется при реализации в Virtex - 5 ?
|
|
|
|
|
Sep 1 2011, 08:09
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Вот фрагмент отчета для проекта 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;
|
|
|
|
|
Sep 2 2011, 08:39
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Kuzmi4 @ Sep 1 2011, 19:35)  Вот бы ещё описалово какое-никакое к сорцам (хотя бы "в общем и целом" так сказать), цены бы им не было. Потому как я его не нашёл ни в Хранилище ни в Файлах... Хорошо бы. Пока есть только структурная схемаДля создания документации я планирую использовать программу DOXYGEN. Результат здесь. Но конечно этого недостаточно.
|
|
|
|
|
Sep 2 2011, 12:35
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Kuzmi4 @ Sep 2 2011, 14:04)  2 dsmv То есть, если я правильно понял, на данный момент, чтобы разобраться в дизайне, нужно втыкать в каменты/симуляцию и пользоваться структурной схемой/иерархией проекта? А кроме вас есть ещё лица которые могут просветить в деталях? И куда/кому задавать вопросы ? Совершенно верно. Кроме меня проект ещё никто не знает. Да и я уже многое забыл. Вопросы задавать нужно мне. Спрашивать можно например на этом форуме, думаю модераторы не будут против. Или на непосредственно сайте ds-dev.ru Я открыл этот проект, потому что хочу что бы появились ещё люди, которые в нём разберутся. Иначе знание будет потеряно.
|
|
|
|
|
Sep 2 2011, 15:18
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Готов проект для SP605. На модели работает. Теперь нужно проверить на реальной плате. Для проверки надо использовать программу AMBPEX5_SDRAM. Находится в разделе Файлы на сайте. Драйвера надо скачать здесь. Внутри zip есть файл установки qtpex58x1-12500_rt_v4_01.exe
|
|
|
|
|
Sep 6 2011, 13:21
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
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, попробую завести, но посмотрим чт ов реале будет)??
|
|
|
|
|
Sep 6 2011, 15:46
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
Результаты (система: 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> А вот я залил тестовый дизайн хилых:
в нём всё по ходу пашеД  резюмируя результаты - скорей всего спидгрейдовый вопрос всплыл
|
|
|
|
|
Sep 6 2011, 16:18
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Kuzmi4 @ Sep 6 2011, 18:46)  резюмируя результаты - скорей всего спидгрейдовый вопрос всплыл  о Для начала неплохо. Совершенно правильно определились VendorID, DeviceID. Так что ядро Xilinx работает. Спидгрейд я думаю здесь ни причём. -2 более медленная чем -3. А на ней ошибок по времянке нет. Я завтра ещё одну программу пришлю, посмотрим что читается из регистров BAR0. Скорее всего читаются неправильные значения и драйвер не опознаёт устройство. Выводы sys_clk_p/sys_clk я проверял, они попадают куда нужно. Но можно и ещё раз завтра посмотреть. Один из светодиодов (GPIO_LED_1) должен подмигивать, но очень редко. Он показывает ширину шины PCI Express( x1 - один раз мигает), но я забыл что здесь шина 62.5 Мгц вместо 250 Мгц на Virtex 5, так что он будет редко вспыхивать. В общем - процесс пошёл
|
|
|
|
|
Dec 28 2012, 14:12
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513

|
Добрый день! Пишет вам благодарный, но немного бестолковый пользователь вашего проекта  Только начал вникать в ваши исходники, поэтому вопросов огромное множество, но пока не буду их все вываливать, надеюсь что постепенно сам разберусь. Итак, скачал с 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-буфер?
|
|
|
|
|
Jan 14 2013, 08:10
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513

|
Цитата Есть возможность проверить работу на компьютере с Windows ? есть win 7 x64. Качал ambpex5_test_v1_0, но там только тестовая прога без драйвера. И при запуске BRD.DLL требует. Цитата Строки с TRD 4 быть не должно она возникает если запускать как описано здесь: ./adm_test <имя устройства> <файл конфигурации> [<файл конфигурации>]так как в программе для параметров по умолчанию прописана тетрада 4. Когда же указываю только файл конфигурации, строчка одна, как и должна. Цитата Для тетрады 6 значение регистра STATUS=0x4F - это означает что FIFO полностью заполнено, но передачи в PCI Express нет. что посоветуете посмотреть для дебага?
|
|
|
|
|
Jan 17 2013, 09:33
|
Группа: Участник
Сообщений: 5
Регистрация: 17-01-13
Пользователь №: 75 224

|
Цитата(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-**) и покажите результат.
|
|
|
|
|
Jan 17 2013, 09:40
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513

|
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
Сообщение отредактировал Jack_of_Shadows - Jan 17 2013, 10:01
|
|
|
|
|
Jan 17 2013, 10:11
|
Группа: Участник
Сообщений: 5
Регистрация: 17-01-13
Пользователь №: 75 224

|
Цитата(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?
|
|
|
|
|
Jan 17 2013, 10:16
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513

|
Цитата у вас 64 битная linux система или 32? 64 бита. Еще в FIFO_ID старшие четыре бита (значение TYPE) равны 3, хотя как написано здесь может быть 1 (если на чтение) и 2 (если на запись)
|
|
|
|
|
Jan 17 2013, 10:50
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(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 не было, то компьютер бы просто завис.
|
|
|
|
|
Jan 17 2013, 15:04
|
Группа: Участник
Сообщений: 5
Регистрация: 17-01-13
Пользователь №: 75 224

|
Цитата(dsmv @ Jan 17 2013, 14:50)  FIDO_ID правильное, 3 - это двунаправленный контроллер. Предыдущии версии были однонаправленными.
Значение FIFO_STATUS 0xA000 - неправильное -должен быть установлен бит DSC_CORRECT (т.е. 0xA100) - это означает, что блок дескрипторов прочитан неправильно.
Здесь два варианта - что неправильно в драйвере или в прошивке ПЛИС. Пришлите Ваш проект, надо посмотреть как он развёлся. Может что увижу. Пришлите сюда: dsmv@ mail.ru
P.S. Сейчас видно одно из преимуществ контроллера. Блок дескрипторов защищён контрольной суммой. Сейчас есть какая то ошибка и контроллер просто останавливается. Если бы контроля CRC не было, то компьютер бы просто завис. Точно, не 0xA001 а 0xA100. Посмотрел сейчас на работающем приборе. dsmv спасибо за коррекцию.
|
|
|
|
|
Jan 21 2013, 12:19
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513

|
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: с освобождением памяти разобрался, функция освобождения была, но её никто не вызывал почему то.
Сообщение отредактировал Jack_of_Shadows - Jan 22 2013, 06:57
|
|
|
|
|
Jan 28 2013, 10:52
|
Группа: Участник
Сообщений: 5
Регистрация: 17-01-13
Пользователь №: 75 224

|
В функции ошибка, из за которой всегда данные вводились из тетрады MAIN. Нужно 0 заменить на addr  Про 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; }
|
|
|
|
|
Mar 22 2013, 07:23
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513

|
Всё руки не доходили написать по поводу 64-битного линукса: было замечено что дело не только в нём (на одном компьютере проект работал, на втором нет), и единственное бросающееся в глаза различие было в том, что при выделении памяти разрядность адреса была разная - на компе где обмен не шёл память выделялась за границами 32-битной области. Поборол принудительным ограничением в драйвере, в функции RequestMemory: Код dma_set_coherent_mask(dma->m_dev, 0xFFFFFFFF); после чего адреса стали 32-битными и DMA-обмен пошел. После исправления из предыдущего поста стали отвечать те тетрады которые и должны. Вообщем проект вполне себе нормально работает с 200 МБ/с на x1.
|
|
|
|
|
Nov 20 2013, 07:03
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 7-08-09
Пользователь №: 51 787

|
Доброго времени суток. Пытаюсь запустить ваше ядро pcie_core64_m1 (m2) на своей плате. Вроде бы разобрался частично, но остались вопросы. Прошу мне помочь.
1. При записи в адреса PE_EXT_FIFO, не содержащие регистров, дальнейшее чтение из правильных регистров невозможно (всегда получаю FFFFF...) это не существенно, вопрос в том, нормальное ли это поведение контроллера. 2. В wiki написано: *Составить цепочку дескрипторов, которая описывает цепочку передаваемых блоков *Записать адрес начального дескриптора в регистр PCI_ADRL *Записать локальный адрес в регистр LOCAL_ADR Модификация 1 - только режим автоинициализации
Я пытаюсь набросать драйвер под Win7. Что это для меня значит? Как мне составить дескрипторы? Выделить 64*8 байт область памяти, заполнить её в соответствии с описанием "Дескриптор блока автоинициализации"; в PCI_ADRL записать адрес этого блока; в LOCAL_ADR адрес, относительно которого на LC шине будут запросы DMA на передачу/прием данных.
Прошу помощи.
|
|
|
|
|
Nov 20 2013, 10:50
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 7-08-09
Пользователь №: 51 787

|
И ещё ничего не понял про NEXT_BLOCK.
Как я понял, в памяти PCI, что отображена в оперативную создаю структуру 64*8 байтов - это и есть блок дескрипторов. Допустим у меня 8192 байт, выделяется три куска памяти по 4096, 1712, 2384. Я создаю блок дескрипторов: 1. - адрес блока 1, команда JUMP_NEXT_BLOCK, размер(4096), направление передачи 2. - адрес блока 2, команда JUMP_NEXT_BLOCK, размер(1712), направление передачи 3. - адрес блока 3, команда EOT, размер(2384), направление передачи
Поясните, чем отличается JUMP_NEXT_DS от JUMP_NEXT_BLOCK и что делать с NEXT_BLOCK, какой писать адрес и как считать CRC.
Спасибо заранее.
|
|
|
|
|
Nov 25 2013, 15:58
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
В памяти компьютера создаётся блок 64*8=512 байт - это блок дескрипторов. Каждый дескриптор - это четыре байта: описание здесь: http://src.ds-dev.ru/doc/core/block_pe_ext_fifo.htmБлок содержит 63 дескриптора и указатель на следующий блок. Что будет происходить после завершения обмена с текущим блоком определяют три бита в поле CMD. Может быть установлен один из них, либо все нули. Если все нули - то канал DMA остановиться. Если JUMP_NEST_DS=1, то произойдёт переход к следующему дескриптору в этом блоке. Если JUMP_NEXT_BLOCK=1, то произойдёт переход к следующему блоку (при этом следующий дескритор содержит адрес следующего блока). Это бит может быть установлен у любого дескриптора. Т.е. не обязательно заполнять все 63 элемента, оставшиеся можно заполнить нулями. Если JUMP_DS0=1, то произойдёт переход к нулевому дескриптору в текущем блоке. Это позволяет не читать блоки дескрипторов из памяти. Обратите внимание - обмен всегда ведётся блоками кратными 4 кбайтам. А при выделении памяти в USER MEMORY - так и просто по 4 килобайта. Если выделено три блока памяти (допустим по 4096 байт), то нужно создать один блок дескрипторов размером 512 байт. 1. адрес блока 1, команда *JUMP_NEST_DS*, размер(4096), направление передачи 2. адрес блока 2, команда *JUMP_NEST_DS*, размер(4096), направление передачи 3. адрес блока 3, команда *EOT*, размер(4096), направление передачи Остальные дескрипторы - нули. В конце надо записать сигнатуру и контрольную сумму. Прерывание будет получено после завершения обмена с блоком 3. P.S. Направление передачи всегда одно и то же для одного сеанса работы. По поводу расчёта CRC - постараюсь выделить кусок программы, но чуть позже. По поводу записи в PE_EXT_FIFO и чтении FF. Интересное наблюдение. Я таких экспериментов не ставил, но вроде бы такого быть не должно. А для записи используются 32-х разрядные команды ?
|
|
|
|
|
Dec 12 2013, 13:32
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 7-08-09
Пользователь №: 51 787

|
Цитата(dsmv @ Nov 25 2013, 19:58)  По поводу записи в PE_EXT_FIFO и чтении FF. Интересное наблюдение. Я таких экспериментов не ставил, но вроде бы такого быть не должно. А для записи используются 32-х разрядные команды ? Спасибо большое за развернутый ответ, всё понятно. Для записи/чтения PE_EXT_FIFO использовал 32-битные команды.
|
|
|
|
|
Dec 21 2013, 05:26
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(StrangerX @ Dec 12 2013, 16:32)  Спасибо большое за развернутый ответ, всё понятно. Для записи/чтения PE_EXT_FIFO использовал 32-битные команды. Вот нашёл класс для подсчёта CRC: PE_ExtChainItem.zip
|
|
|
|
|
Feb 10 2014, 05:15
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-02-14
Пользователь №: 80 421

|
Добрый день! Имеется желание запустить проект на плате Xilinx Artix 7 AC701 (FPGA XC7A200T FBG676ACX плата в наличии).
dsmv, напишите пожалуйста с чего лучше начать и каким образом.
может быть имеются программные мастера по подготовке DS_DMA проекта для нового ядра PCIE?
|
|
|
|
|
Feb 11 2014, 11:15
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Добрый день. Давайте сделаем. Я посмотрю на AC701 и сформирую проект. Цитата(Antonx86 @ Feb 10 2014, 08:15)  Добрый день! Имеется желание запустить проект на плате Xilinx Artix 7 AC701 (FPGA XC7A200T FBG676ACX плата в наличии).
dsmv, напишите пожалуйста с чего лучше начать и каким образом.
может быть имеются программные мастера по подготовке DS_DMA проекта для нового ядра PCIE?
|
|
|
|
|
Mar 12 2014, 05:54
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-02-14
Пользователь №: 80 421

|
dsmv, добрый день, в http://ds-dev.ru/issues/65 обратил внимание на вопрос о генерации ISE 14.5. я сгенерировал ядро pcie для Artix 7 на ISE 14.7 (во вложении) приложил принтскрины с настройками генерации (в случае если настройки не верные - могу сгенерировать заново) надеюсь, что это поможет решить проблемы с моделированием
|
|
|
|
|
Jun 10 2014, 00:32
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-02-14
Пользователь №: 80 421

|
dsmv, добрый день, измеряли ли Вы скорость обмена информацией PC->FPGA->PC для платы SP605 ? т.е. скорости в одном направлении у Вас предоставлены http://ds-dev.ru/projects/ds-dma/wiki/Sp605_lx45t_coreа вот про одновременный обмен от компьютера к ПЛИС и обратно я информацию не нашел ... Какую теоретическую скорость можно добиться PC->FPGA->PC на плате SP605 с помощью Вашего проекта?
|
|
|
|
|
Jun 20 2014, 13:46
|
Местный
  
Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284

|
Цитата(Antonx86 @ Jun 10 2014, 03:32)  dsmv, добрый день, измеряли ли Вы скорость обмена информацией PC->FPGA->PC для платы SP605 ? т.е. скорости в одном направлении у Вас предоставлены http://ds-dev.ru/projects/ds-dma/wiki/Sp605_lx45t_coreа вот про одновременный обмен от компьютера к ПЛИС и обратно я информацию не нашел ... Какую теоретическую скорость можно добиться PC->FPGA->PC на плате SP605 с помощью Вашего проекта? Конкретно на SP605 не измерял, но по аналогии с другими модулями пропускная способность будет делиться пополам. Т.е. следует ожидать ~ 80 Мбайт/с
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|