Полная версия этой страницы:
Xilinx 7 Series PCIe
Приветствую.
Много спрашивал в
этой теме, но пока ещё больше вопросов чем ответов. Решил создать свою.
Вот тут
очень интересная тема, но мне пока туда рано - надо, чтоб всё заработало с WinDriver.
Пытаюсь разбираться с PCIe на базе Virtex 7, ядром
AXI Bridge for PCI Express Gen 3 Subsystem и соответственно с
xapp1171. Отдельно завёл DDR3, CDMA. Не могу понять принцип работы собранной в xapp1171 системы (сама система и карта памяти на рисунке). Есть CDMA, а кто им управляет? Правильно ли понимаю, что это должен делать драйвер со стороны компа?
Обязательно ли использовать CDMA? Возможно ли просто подключить к мосту память, чтобы он сам записывал/считывал в/из неё данные? Как понимаю, мост записывает данные в какую-то область памяти (translation_bram), а потом CDMA должен перекинуть их в DDR3.
Alexey_Rostov
Jul 1 2015, 06:54
Цитата(doom13 @ Jul 1 2015, 09:00)

Отдельно завёл DDR3, CDMA. Не могу понять принцип работы собранной в xapp1171 системы (сама система и карта памяти на рисунке). Есть CDMA, а кто им управляет?
Контрольные регистры ДМА мапируются в BAR pcie. Таким образом pcie как мастер пишет в контрольные регистры CDMA.
Цитата
Правильно ли понимаю, что это должен делать драйвер со стороны компа?
Совершенно верно, комп через pcie мастер пишет в контрольные регистры cdma, давая команду на передачу данных, и адреса куда и откуда.
Цитата
Обязательно ли использовать CDMA? Возможно ли просто подключить к мосту память, чтобы он сам записывал/считывал в/из неё данные? Как понимаю, мост записывает данные в какую-то область памяти (translation_bram), а потом CDMA должен перекинуть их в DDR3.
Обязательно, тк CDMA позволяет работать burst ами, а pcie мастер работает на подобие процессора одиночными транзакциями
Цитата(farbius @ Jul 1 2015, 09:54)

Обязательно, тк CDMA позволяет работать burst ами, а pcie мастер работает на подобие процессора одиночными транзакциями
Но ведь прежде чем CDMA сможет перебрасывать данные PCIe мост должен их положить в память ПЛИС? Т.е. чтоб было что перебрасывать в DDR3, надо, чтоб был буфер с данными в памяти ПЛИС. Или CDMA "через мост" (pcie slave) получает доступ к буферам на ПК, и сразу принимая данные от моста запихивает их в DDR3?
Alexey_Rostov
Jul 1 2015, 07:41
Цитата(doom13 @ Jul 1 2015, 10:32)

Или CDMA "через мост" (pcie slave) получает доступ к буферам на ПК, и сразу принимая данные от моста запихивает их в DDR3?
Совершенно верно, именно поэтому есть axi bar и pcie bar. На ПК драйвер выделяет буфер, адрес которого пишется в контрольные регистры pcie.
Далее в дма пишется адрес axi bar источника и назначение адрес ддр.
Спасибо, картинка немного вырисовывается.
Драйвер со стороны ПК без использования может писать память FPGA (медленно, но может). Вот пробую реализовать это, но что-то делаю не так.
Использую Vivado 2015.1 и новое ядро моста и оно немного отличается от того, что описано в xapp1171. Вопрос, что делаю не так?
В системе есть MicroBlaze + local memory, ядро моста, AXI BRAM controller. Карта памяти полученной системы и настройки моста на рисунке. На ПК запускаю Jungo.WinDriver, но что-то в нем только Configuration Space и Interrupt (см. рисунок), если плату не перепрошивать, то есть ещё и область Memory (видимо загружается какой-то factory образ).
На вкладке PCIe:BARs задаётся параметр PCIe_2_AXI, правильно ли, что это адрес памяти (базовый адрес) куда будет писать мост (WinDriver -> PCIe -> bridge -> memory)?
Alexey_Rostov
Jul 1 2015, 09:33
Цитата(doom13 @ Jul 1 2015, 11:19)

Спасибо, картинка немного вырисовывается.
Драйвер со стороны ПК без использования может писать память FPGA (медленно, но может). Вот пробую реализовать это, но что-то делаю не так.
Использую Vivado 2015.1 и новое ядро моста и оно немного отличается от того, что описано в xapp1171. Вопрос, что делаю не так?
В системе есть MicroBlaze + local memory, ядро моста, AXI BRAM controller. Карта памяти полученной системы и настройки моста на рисунке. На ПК запускаю Jungo.WinDriver, но что-то в нем только Configuration Space и Interrupt (см. рисунок), если плату не перепрошивать, то есть ещё и область Memory (видимо загружается какой-то factory образ).
Я на начальном этапе делал так (работал в XPS 14.7 для ml605.)
Собрал проект: только pcie корка с дма (можно и без) и светодиоды. У меня на 32 р системе программа pcietree.
Pcie Bars брал только bar 0, задав его объем (у вас 32 килобайта). В pci2axi записал адрес своих leds (gpio) на шине (у вас там записано число 0х12340).
Прошил, перезагрузил ПК. Открываю pcietree, вижу свою плату как контроллер памяти с BAR0. В bar 0 c ПК пишу число например c нулевым оффсетом, такая запись аналогична записи в регистр gpio корки также с нулевым офсетом. Так зажигаю светодиоды.
Все.
Систему можно собрать для axi4 без микроблейза, т.к. мастер у вас есть (pcie) и слейв (gpio)
Цитата(farbius @ Jul 1 2015, 12:33)

Очень помогли разобраться с вопросом, спасибо.
Цитата(farbius @ Jul 1 2015, 12:33)

Систему можно собрать для axi4 без микроблейза, т.к. мастер у вас есть (pcie) и слейв (gpio)
MicroBlaze добавил для того, чтоб в SDK в окне Memory можно было смотреть содержимое памяти в которую пишет мост (адрес 0х1234_0000), запись пока без DMA.
Почитал доку на Jungo.WinDriver и всё (пока запись/чтение со стороны ПК в память по адресу 0х1234_0000) заработало. Могу писать/читать данные в памяти FPGA. Проблема была в том, что в Jungo.WinDriver надо было сгенерить INF-файл и выбрать галку Install, после этого появился BAR0 и возможность чтения/записи памяти FPGA.
Вопрос по WinDriver (см рисунок), каким образом задаётся адрес BAR0 0xF73F8000 и что это за адрес? Его размер 32 кБ как и буфера PF0_BAR0 в настройках PCIe:BARs (рисунок в сообщении #5). Т.е. система (WinDriver) определяет наличие буфера (адресного пространства), на которое ссылается мост, адреса назначает по своему усмотрению?
Alexey_Rostov
Jul 1 2015, 11:38
Цитата(doom13 @ Jul 1 2015, 14:23)

Вопрос по WinDriver (см рисунок), каким образом задаётся адрес BAR0 0xF73F8000 и что это за адрес? Его размер 32 кБ как и буфера PF0_BAR0 в настройках PCIe:BARs (рисунок в сообщении #5). Т.е. система (WinDriver) определяет наличие буфера (адресного пространства), на которое ссылается мост, адреса назначает по своему усмотрению?
ВЕРНО, Это транслированный адрес из системы с axi4 в системе ПК.
Вот тут ещё не совсем понимаю.
BAR0, что на рисунке окна WinDriver (адреса 0xF73F_8000 - 0х73FF_FFFF), - это только для работы со стороны ПК, т.е. ПК (а далее Bridge PCIe Master) задаёт что будет писать/читать? На ПК под него памяти нет, память внешняя в ПЛИС?
Как выделяется адресное пространство (память на ПК) доступное на запись/чтение со стороны AXI Master?
Вобщем BAR0 создаёт память с двух сторон PCIe? Если я выделяю 32 кБ памяти в FPGA под PCIe To AXI BAR0, драйвер на компе создаёт соответствующий буфер или он будет пользоваться мостом и адресовать буфер в ПЛИС?
Alexey_Rostov
Jul 1 2015, 12:46
Цитата(doom13 @ Jul 1 2015, 15:11)

Вот тут ещё не совсем понимаю.
BAR0, что на рисунке окна WinDriver (адреса 0xF73F_8000 - 0х73FF_FFFF), - это только для работы со стороны ПК, т.е. ПК (а далее Bridge PCIe Master) задаёт что будет писать/читать? На ПК под него памяти нет, память внешняя в ПЛИС?
Попробую объяснить как понял сам. Могу ошибаться, знающие поправят).
Мост подразумевает отображение адресного пространства ПЛИС в ПК и наоборот.
Итак режим pcie мастер. При перезагрузке компьютера и инициализации платы с PCIe операционная система "видит" BAR0 и мапирует его свою память. Если посмотрите в диспетчер устройств, ОС определяет плату как контроллер памяти. В вашем случае адреса 0xF73F_8000 - 0х73FF_FFFF.
Цитата
Как выделяется адресное пространство (память на ПК) доступное на запись/чтение со стороны AXI Master?
Режим axi мастер (например cdma мастер). В настройках корки pcie выставляются буфера на axi2pcie. При перезагрузке система ничего не выделяет. Тут работает драйвер. Он при запуске выделяет область физической памяти и возвращает динамический адрес этой памяти, кот необходимо записать в контрольные регистры pcie корки.
На плис у вас будут на шине выделены axibar со своими адресами. С этими адресами и работает CDMA. А корка транслирует адреса физической памяти в адресное пространство системы на ПЛИС.
Как то так)
Спасибо понятно. Т.е. PCIe BARs - память в ПЛИС, а AXI BARs - память в системе (ПК) выделяемая драйвером. Сначала так и думал, а потом всё запуталось. Тогда ещё спрошу, а можно ли с помощью WinDriver или ещё какой-то стандартной проги выделить эту память (под AXI BARs), чтоб проверить работу Mastera со стороны FPGA? Или тут уже только разбираться с написанием драйвера?
Alexey_Rostov
Jul 1 2015, 13:27
Цитата(doom13 @ Jul 1 2015, 16:17)

Тогда ещё спрошу, а можно ли с помощью WinDriver или ещё какой-то стандартной проги выделить эту память (под AXI BARs), чтоб проверить работу Mastera со стороны FPGA? Или тут уже только разбираться с написанием драйвера?
Нужно писать программу. там функция что то типа allocate_buffer_dma. Про нее почитайте. Она должна возвратить адрес физической памяти, который нужно записать в контрольные регистры pcie корки. Контрольные регистры необходимо отмапировать "в себя", т.е. на BAR0 например. И записывать адрес в режиме pcie мастер
Передачу большого потока данных для PCIe всегда будет выполнять DMA в системе FPGA (возможно несколько) или тут можно заюзать какой-либо ресурс (тот же DMA) системы ПК?
Alexey_Rostov
Jul 1 2015, 13:49
Цитата(doom13 @ Jul 1 2015, 16:31)

Передачу большого потока данных для PCIe всегда будет выполнять DMA в системе FPGA (возможно несколько) или тут можно заюзать какой-либо ресурс (тот же DMA) системы ПК?
читаю данные с ПК через ДМА, пишу поток datamover ом.
То есть ПК пишет в регистры ДМА откуда(физическая память ПК), куда (в моем случае ДДР на ПЛИС или непосредственно на логику ПЛИС) и сколько.
А поток с ПЛИС пишу через datamover.
Цитата(farbius @ Jul 1 2015, 16:49)

читаю данные с ПК через ДМА, пишу поток datamover ом.
То есть ПК пишет в регистры ДМА откуда(физическая память ПК), куда (в моем случае ДДР на ПЛИС или непосредственно на логику ПЛИС) и сколько.
А поток с ПЛИС пишу через datamover.
Немного не то. Имел ввиду (просто интересно) возможно ли задачу переброса данных переложить на железо компьютера или это будет сложнее и менее производительно? Что-то типа драйвера управляющего DMA центрального процессора который и отвечает за переброс данных по PCIe. Или доступ к чужому железу не получить?
Alexey_Rostov
Jul 1 2015, 16:24
Цитата(doom13 @ Jul 1 2015, 17:10)

Немного не то. Имел ввиду (просто интересно) возможно ли задачу переброса данных переложить на железо компьютера или это будет сложнее и менее производительно? Что-то типа драйвера управляющего DMA центрального процессора который и отвечает за переброс данных по PCIe. Или доступ к чужому железу не получить?
Такая идея была, но вариант со внешним dma вполне устраивает)
doom13
Jul 21 2015, 17:25
Приветствую.
Нужно ещё пояснение по поводу BAR-ов. Может ли PCIe:BAR0 отличаться по размеру от AXI:BAR0? Как понял, это независимые адресные пространства, но проект для разных их размеров собираться не захотел.
Пока собрал систему с GPIO (светодиод), прикрутил его к PCIe:BAR0 и сделал простенький драйвер под Linux, который при запуске зажигает светодиод, при удалении - гасит. Счас хочу добавить прерывание (от таймера), но не пойму, как это прикрутить к мосту PCIe?
У таймера есть выход interrupt, у моста - вход intx_msi_request. Достаточно ли их соединить и запустить таймер, чтоб мост начал генерить прерывания от таймера?
doom13
Jul 22 2015, 14:05
Таймер запустил, выход таймера interrupt повесил на вход моста intx_msi_request. На порт моста msi_vector_num[4:0] повесил константу 0. В Jungo Windriver собрал драйвер для системы, при запуске Listen Interrupt считает прерывания, но показывает Interrupt Number = 7. За что тогда отвечает msi_vector_num?
doom13
Jul 24 2015, 05:59
Вопрос, что всё же подаётся на порт моста msi_vector_num[4:0]? Если 0, то Windriver видит прерывание от моста. Пробовал поменять (поставил 24) Windriver не видит прерывание, но таймер его постоянно генерит.
Alexey_Rostov
Jul 24 2015, 06:22
Цитата(doom13 @ Jul 21 2015, 20:25)

Приветствую.
Нужно ещё пояснение по поводу BAR-ов. Может ли PCIe:BAR0 отличаться по размеру от AXI:BAR0? Как понял, это независимые адресные пространства, но проект для разных их размеров собираться не захотел.
У меня размеры разные. Все работает.
Цитата
Пока собрал систему с GPIO (светодиод), прикрутил его к PCIe:BAR0 и сделал простенький драйвер под Linux, который при запуске зажигает светодиод, при удалении - гасит. Счас хочу добавить прерывание (от таймера), но не пойму, как это прикрутить к мосту PCIe?
У таймера есть выход interrupt, у моста - вход intx_msi_request. Достаточно ли их соединить и запустить таймер, чтоб мост начал генерить прерывания от таймера?
intx_msi_request (в данном случае legacy интерапт, по импульсу) на этот вход я подаю импульс как только закончена транзакция через pcie в PC (в физ память ПК)
Цитата(doom13 @ Jul 22 2015, 17:05)

За что тогда отвечает msi_vector_num?
Событийные прерывания. Помимо прерывания еще и указывают, чем это прерывание вызвано. В датащите есть расшифровка
doom13
Jul 24 2015, 06:42
Счас ядро сгенерено с опциями (см. рисунок).
Означает ли это, что по импульсу на intx_msi_request ядро выдаст прерывание только если msi_vector_num[4:0] = 0?
Т.е. может генерить один вектор и его номер 0. Если хочу использовать №24, то надо выбрать опцию "32 vectors" для Multiple Message Capability и тогда msi_vector_num[4:0] = 24?
Цитата(farbius @ Jul 24 2015, 09:22)

У меня размеры разные. Все работает.
Спасибо, проверим ещё раз.
Alexey_Rostov
Jul 24 2015, 06:55
Цитата(doom13 @ Jul 24 2015, 09:42)

Означает ли это, что по импульсу на intx_msi_request ядро выдаст прерывание только если msi_vector_num[4:0] = 0?
я вообще не задействовал msi_vector_num. Прерывания работают, windrive их видит
doom13
Jul 24 2015, 07:00
Цитата(farbius @ Jul 24 2015, 09:55)

я вообще не задействовал msi_vector_num. Прерывания работают, windrive их видит
Надо затянуть это прерывание в Linux. Пока не понимаю, как это вообще будет выглядеть и как ему назначить какой-либо номер. Посмотрел, что в системе №24 вроде свободен, поэтому и хочу его назначить.
doom13
Jul 27 2015, 12:54
PCI Configuration Space Header содержит поле Intr Line.
1) Кто его заполняет и как возможно его изменить (счас он 11, Linux и Win7 показывают одинаковый номер)?
2) Обработчик прерывания со стороны драйвера привязывается к лини прерывания с данным номером?
Не могу найти ответ на вопрос:
-как система (Linux) назначает номера линий прерывания для устройств? Моему устройству в системе назначается линия прерывания №16.
doom13
Oct 15 2015, 06:45
Цитата(farbius @ Jul 1 2015, 16:49)

А поток с ПЛИС пишу через datamover.
Приветствую.
Подскажите, какую скорость передачи данных удалось получить на Вашей системе?
Alexey_Rostov
Oct 15 2015, 07:48
Цитата(doom13 @ Oct 15 2015, 09:45)

Приветствую.
Подскажите, какую скорость передачи данных удалось получить на Вашей системе?
В буфер ПСИе пишу поток со скоростью примерно 300-400 Мб/с. Можно и быстрее. Поясню: скорость шины с коркой псие 100 Мгц, датамувер кидает по 4 Мб в один из двух буферов отмапированных в памяти ПК. Скорость шины можно повысить до 200 МГц (виртекс 6 прекрасно работает на 200, проблемы начинаются от 250-300 Мгц, все это конечно условно). У меня необходимости в бОльшей скорости не возникало
doom13
Oct 15 2015, 08:37
Спасибо, просто упёрся в потолок 8.5-8.7 Gbit/s для Gen2 x4, хотел сравнить c Вашим результатом.
EugeneS
Oct 20 2015, 07:56
QUOTE (doom13 @ Oct 15 2015, 11:37)

Спасибо, просто упёрся в потолок 8.5-8.7 Gbit/s для Gen2 x4, хотел сравнить c Вашим результатом.
Для коммерческих не предел. Я для Kintex-7 в TRD мерял 12 Gbit/s, а с примером из Northwest Logic 14 Gbit/s.
SnowBuzz
Feb 10 2017, 14:23
Цитата(farbius @ Jul 1 2015, 12:33)

Я на начальном этапе делал так (работал в XPS 14.7 для ml605.)
Собрал проект: только pcie корка с дма (можно и без) и светодиоды. У меня на 32 р системе программа pcietree.
Pcie Bars брал только bar 0, задав его объем (у вас 32 килобайта). В pci2axi записал адрес своих leds (gpio) на шине (у вас там записано число 0х12340).
Прошил, перезагрузил ПК. Открываю pcietree, вижу свою плату как контроллер памяти с BAR0. В bar 0 c ПК пишу число например c нулевым оффсетом, такая запись аналогична записи в регистр gpio корки также с нулевым офсетом. Так зажигаю светодиоды.
Все.
Систему можно собрать для axi4 без микроблейза, т.к. мастер у вас есть (pcie) и слейв (gpio)
Расскажите как получилось собрать систему без микроблейза? Я так понимаю как то удалось использовать исходники из XSP и собрать свой проект для pci-to-AXI?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.