Jump to content

    

Recommended Posts

Приветствую.

Много спрашивал в этой теме, но пока ещё больше вопросов чем ответов. Решил создать свою.

Вот тут очень интересная тема, но мне пока туда рано - надо, чтоб всё заработало с WinDriver.

 

Пытаюсь разбираться с PCIe на базе Virtex 7, ядром AXI Bridge for PCI Express Gen 3 Subsystem и соответственно с xapp1171. Отдельно завёл DDR3, CDMA. Не могу понять принцип работы собранной в xapp1171 системы (сама система и карта памяти на рисунке). Есть CDMA, а кто им управляет? Правильно ли понимаю, что это должен делать драйвер со стороны компа?

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

post-63539-1435730334_thumb.png

post-63539-1435730339_thumb.png

Share this post


Link to post
Share on other sites
Отдельно завёл DDR3, CDMA. Не могу понять принцип работы собранной в xapp1171 системы (сама система и карта памяти на рисунке). Есть CDMA, а кто им управляет?

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

 

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

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

 

 

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

Обязательно, тк CDMA позволяет работать burst ами, а pcie мастер работает на подобие процессора одиночными транзакциями

 

Share this post


Link to post
Share on other sites
Обязательно, тк CDMA позволяет работать burst ами, а pcie мастер работает на подобие процессора одиночными транзакциями

Но ведь прежде чем CDMA сможет перебрасывать данные PCIe мост должен их положить в память ПЛИС? Т.е. чтоб было что перебрасывать в DDR3, надо, чтоб был буфер с данными в памяти ПЛИС. Или CDMA "через мост" (pcie slave) получает доступ к буферам на ПК, и сразу принимая данные от моста запихивает их в DDR3?

Share this post


Link to post
Share on other sites
Или CDMA "через мост" (pcie slave) получает доступ к буферам на ПК, и сразу принимая данные от моста запихивает их в DDR3?

Совершенно верно, именно поэтому есть axi bar и pcie bar. На ПК драйвер выделяет буфер, адрес которого пишется в контрольные регистры pcie.

Далее в дма пишется адрес axi bar источника и назначение адрес ддр.

Share this post


Link to post
Share on other sites

Спасибо, картинка немного вырисовывается.

Драйвер со стороны ПК без использования может писать память 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)?

post-63539-1435737684_thumb.jpg

post-63539-1435737809_thumb.jpg

post-63539-1435737813_thumb.jpg

post-63539-1435738222_thumb.jpg

Share this post


Link to post
Share on other sites
Спасибо, картинка немного вырисовывается.

Драйвер со стороны ПК без использования может писать память 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)

 

 

Share this post


Link to post
Share on other sites

Очень помогли разобраться с вопросом, спасибо.

 

Систему можно собрать для 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) определяет наличие буфера (адресного пространства), на которое ссылается мост, адреса назначает по своему усмотрению?

post-63539-1435749752_thumb.png

Share this post


Link to post
Share on other sites
Вопрос по WinDriver (см рисунок), каким образом задаётся адрес BAR0 0xF73F8000 и что это за адрес? Его размер 32 кБ как и буфера PF0_BAR0 в настройках PCIe:BARs (рисунок в сообщении #5). Т.е. система (WinDriver) определяет наличие буфера (адресного пространства), на которое ссылается мост, адреса назначает по своему усмотрению?

ВЕРНО, Это транслированный адрес из системы с axi4 в системе ПК.

Share this post


Link to post
Share on other sites

Вот тут ещё не совсем понимаю.

BAR0, что на рисунке окна WinDriver (адреса 0xF73F_8000 - 0х73FF_FFFF), - это только для работы со стороны ПК, т.е. ПК (а далее Bridge PCIe Master) задаёт что будет писать/читать? На ПК под него памяти нет, память внешняя в ПЛИС?

Как выделяется адресное пространство (память на ПК) доступное на запись/чтение со стороны AXI Master?

Вобщем BAR0 создаёт память с двух сторон PCIe? Если я выделяю 32 кБ памяти в FPGA под PCIe To AXI BAR0, драйвер на компе создаёт соответствующий буфер или он будет пользоваться мостом и адресовать буфер в ПЛИС?

Share this post


Link to post
Share on other sites
Вот тут ещё не совсем понимаю.

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. А корка транслирует адреса физической памяти в адресное пространство системы на ПЛИС.

Как то так)

Edited by farbius

Share this post


Link to post
Share on other sites

Спасибо понятно. Т.е. PCIe BARs - память в ПЛИС, а AXI BARs - память в системе (ПК) выделяемая драйвером. Сначала так и думал, а потом всё запуталось. Тогда ещё спрошу, а можно ли с помощью WinDriver или ещё какой-то стандартной проги выделить эту память (под AXI BARs), чтоб проверить работу Mastera со стороны FPGA? Или тут уже только разбираться с написанием драйвера?

Share this post


Link to post
Share on other sites
Тогда ещё спрошу, а можно ли с помощью WinDriver или ещё какой-то стандартной проги выделить эту память (под AXI BARs), чтоб проверить работу Mastera со стороны FPGA? Или тут уже только разбираться с написанием драйвера?

 

Нужно писать программу. там функция что то типа allocate_buffer_dma. Про нее почитайте. Она должна возвратить адрес физической памяти, который нужно записать в контрольные регистры pcie корки. Контрольные регистры необходимо отмапировать "в себя", т.е. на BAR0 например. И записывать адрес в режиме pcie мастер

 

Share this post


Link to post
Share on other sites

Передачу большого потока данных для PCIe всегда будет выполнять DMA в системе FPGA (возможно несколько) или тут можно заюзать какой-либо ресурс (тот же DMA) системы ПК?

Share this post


Link to post
Share on other sites
Передачу большого потока данных для PCIe всегда будет выполнять DMA в системе FPGA (возможно несколько) или тут можно заюзать какой-либо ресурс (тот же DMA) системы ПК?

читаю данные с ПК через ДМА, пишу поток datamover ом.

То есть ПК пишет в регистры ДМА откуда(физическая память ПК), куда (в моем случае ДДР на ПЛИС или непосредственно на логику ПЛИС) и сколько.

А поток с ПЛИС пишу через datamover.

Share this post


Link to post
Share on other sites
читаю данные с ПК через ДМА, пишу поток datamover ом.

То есть ПК пишет в регистры ДМА откуда(физическая память ПК), куда (в моем случае ДДР на ПЛИС или непосредственно на логику ПЛИС) и сколько.

А поток с ПЛИС пишу через datamover.

Немного не то. Имел ввиду (просто интересно) возможно ли задачу переброса данных переложить на железо компьютера или это будет сложнее и менее производительно? Что-то типа драйвера управляющего DMA центрального процессора который и отвечает за переброс данных по PCIe. Или доступ к чужому железу не получить?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this