Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Xilinx 7 Series PCIe
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
doom13
Приветствую.
Много спрашивал в этой теме, но пока ещё больше вопросов чем ответов. Решил создать свою.
Вот тут очень интересная тема, но мне пока туда рано - надо, чтоб всё заработало с WinDriver.

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

Контрольные регистры ДМА мапируются в BAR pcie. Таким образом pcie как мастер пишет в контрольные регистры CDMA.

Цитата
Правильно ли понимаю, что это должен делать драйвер со стороны компа?

Совершенно верно, комп через pcie мастер пишет в контрольные регистры cdma, давая команду на передачу данных, и адреса куда и откуда.


Цитата
Обязательно ли использовать CDMA? Возможно ли просто подключить к мосту память, чтобы он сам записывал/считывал в/из неё данные? Как понимаю, мост записывает данные в какую-то область памяти (translation_bram), а потом CDMA должен перекинуть их в DDR3.

Обязательно, тк CDMA позволяет работать burst ами, а pcie мастер работает на подобие процессора одиночными транзакциями
doom13
Цитата(farbius @ Jul 1 2015, 09:54) *
Обязательно, тк CDMA позволяет работать burst ами, а pcie мастер работает на подобие процессора одиночными транзакциями

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

Совершенно верно, именно поэтому есть axi bar и pcie bar. На ПК драйвер выделяет буфер, адрес которого пишется в контрольные регистры pcie.
Далее в дма пишется адрес axi bar источника и назначение адрес ддр.
doom13
Спасибо, картинка немного вырисовывается.
Драйвер со стороны ПК без использования может писать память 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
Цитата(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)

doom13
Цитата(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
Цитата(doom13 @ Jul 1 2015, 14:23) *
Вопрос по WinDriver (см рисунок), каким образом задаётся адрес BAR0 0xF73F8000 и что это за адрес? Его размер 32 кБ как и буфера PF0_BAR0 в настройках PCIe:BARs (рисунок в сообщении #5). Т.е. система (WinDriver) определяет наличие буфера (адресного пространства), на которое ссылается мост, адреса назначает по своему усмотрению?

ВЕРНО, Это транслированный адрес из системы с axi4 в системе ПК.
doom13
Вот тут ещё не совсем понимаю.
BAR0, что на рисунке окна WinDriver (адреса 0xF73F_8000 - 0х73FF_FFFF), - это только для работы со стороны ПК, т.е. ПК (а далее Bridge PCIe Master) задаёт что будет писать/читать? На ПК под него памяти нет, память внешняя в ПЛИС?
Как выделяется адресное пространство (память на ПК) доступное на запись/чтение со стороны AXI Master?
Вобщем BAR0 создаёт память с двух сторон PCIe? Если я выделяю 32 кБ памяти в FPGA под PCIe To AXI BAR0, драйвер на компе создаёт соответствующий буфер или он будет пользоваться мостом и адресовать буфер в ПЛИС?
Alexey_Rostov
Цитата(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. А корка транслирует адреса физической памяти в адресное пространство системы на ПЛИС.
Как то так)
doom13
Спасибо понятно. Т.е. PCIe BARs - память в ПЛИС, а AXI BARs - память в системе (ПК) выделяемая драйвером. Сначала так и думал, а потом всё запуталось. Тогда ещё спрошу, а можно ли с помощью WinDriver или ещё какой-то стандартной проги выделить эту память (под AXI BARs), чтоб проверить работу Mastera со стороны FPGA? Или тут уже только разбираться с написанием драйвера?
Alexey_Rostov
Цитата(doom13 @ Jul 1 2015, 16:17) *
Тогда ещё спрошу, а можно ли с помощью WinDriver или ещё какой-то стандартной проги выделить эту память (под AXI BARs), чтоб проверить работу Mastera со стороны FPGA? Или тут уже только разбираться с написанием драйвера?


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

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

Немного не то. Имел ввиду (просто интересно) возможно ли задачу переброса данных переложить на железо компьютера или это будет сложнее и менее производительно? Что-то типа драйвера управляющего DMA центрального процессора который и отвечает за переброс данных по PCIe. Или доступ к чужому железу не получить?
Alexey_Rostov
Цитата(doom13 @ Jul 1 2015, 17:10) *
Немного не то. Имел ввиду (просто интересно) возможно ли задачу переброса данных переложить на железо компьютера или это будет сложнее и менее производительно? Что-то типа драйвера управляющего DMA центрального процессора который и отвечает за переброс данных по PCIe. Или доступ к чужому железу не получить?

Такая идея была, но вариант со внешним dma вполне устраивает)
doom13
Приветствую.
Нужно ещё пояснение по поводу BAR-ов. Может ли PCIe:BAR0 отличаться по размеру от AXI:BAR0? Как понял, это независимые адресные пространства, но проект для разных их размеров собираться не захотел.

Пока собрал систему с GPIO (светодиод), прикрутил его к PCIe:BAR0 и сделал простенький драйвер под Linux, который при запуске зажигает светодиод, при удалении - гасит. Счас хочу добавить прерывание (от таймера), но не пойму, как это прикрутить к мосту PCIe?
У таймера есть выход interrupt, у моста - вход intx_msi_request. Достаточно ли их соединить и запустить таймер, чтоб мост начал генерить прерывания от таймера?
doom13
Таймер запустил, выход таймера interrupt повесил на вход моста intx_msi_request. На порт моста msi_vector_num[4:0] повесил константу 0. В Jungo Windriver собрал драйвер для системы, при запуске Listen Interrupt считает прерывания, но показывает Interrupt Number = 7. За что тогда отвечает msi_vector_num?
doom13
Вопрос, что всё же подаётся на порт моста msi_vector_num[4:0]? Если 0, то Windriver видит прерывание от моста. Пробовал поменять (поставил 24) Windriver не видит прерывание, но таймер его постоянно генерит.
Alexey_Rostov
Цитата(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
Счас ядро сгенерено с опциями (см. рисунок).
Означает ли это, что по импульсу на 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
Цитата(doom13 @ Jul 24 2015, 09:42) *
Означает ли это, что по импульсу на intx_msi_request ядро выдаст прерывание только если msi_vector_num[4:0] = 0?


я вообще не задействовал msi_vector_num. Прерывания работают, windrive их видит
doom13
Цитата(farbius @ Jul 24 2015, 09:55) *
я вообще не задействовал msi_vector_num. Прерывания работают, windrive их видит

Надо затянуть это прерывание в Linux. Пока не понимаю, как это вообще будет выглядеть и как ему назначить какой-либо номер. Посмотрел, что в системе №24 вроде свободен, поэтому и хочу его назначить.
doom13
PCI Configuration Space Header содержит поле Intr Line.
1) Кто его заполняет и как возможно его изменить (счас он 11, Linux и Win7 показывают одинаковый номер)?
2) Обработчик прерывания со стороны драйвера привязывается к лини прерывания с данным номером?
doom13
Не могу найти ответ на вопрос:
-как система (Linux) назначает номера линий прерывания для устройств? Моему устройству в системе назначается линия прерывания №16.
doom13
Цитата(farbius @ Jul 1 2015, 16:49) *
А поток с ПЛИС пишу через datamover.

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


В буфер ПСИе пишу поток со скоростью примерно 300-400 Мб/с. Можно и быстрее. Поясню: скорость шины с коркой псие 100 Мгц, датамувер кидает по 4 Мб в один из двух буферов отмапированных в памяти ПК. Скорость шины можно повысить до 200 МГц (виртекс 6 прекрасно работает на 200, проблемы начинаются от 250-300 Мгц, все это конечно условно). У меня необходимости в бОльшей скорости не возникало
doom13
Спасибо, просто упёрся в потолок 8.5-8.7 Gbit/s для Gen2 x4, хотел сравнить c Вашим результатом.
EugeneS
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
Цитата(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?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.