Перейти к содержанию

Подключение периферии к Microblaze

Здраствуйте. Прошу совета. VHDL умею, с Microblaze работаю впервые, C относительно понимаю. Учился ПЛИС в среде Xilinx 14.2, а работать пришлось в Vivado 2016.2 где все по другому и много нового.
Кристалл Artix-7 от trenz-electronic, xc7a35t(TE0712-02-35-2l). Board TE0703-05. Ядро пишу и симулирую в Aldec Active-HDL, собираю в IP и добавляю в проект в Vivado 2016.2, код Microblaze смотрю в SDK 2016.2.
Имелся проект принимающий через Ethernet(UDP) Microblaze-ом данные для конфигурирования 2 кастомных IP по шине AXI. Создатель недоступен, спросить кроме вас не у кого.
Мне требуется создать ещё одно кастом IP c SPI и передачей массива 1024х32bit в DDR3, а Microblaze-ом из DDR3 вынимать данные и медленно выплевывать их в UDP.

На данном этапе, я сделал и отсимулировал ядро с SPI и внутренним буффером на ресурсах ПЛИС, сейчас требуется привязать этот модуль к Microblaze. Тут и начались проблемы. С горем пополам, написал на VHDL AXI <-> Bus2IP/IP2bus, шина S_AXI ядра автоматически совместилась с шиной M_AXI блока microblaze_0_AXI_periph, во вкладке Address Editor в Vivado появился мой модуль с присвоенным ему диапазоном адресов.
Далее я синтезирую, имплементирую, создаю битстрим. Нажимаю File -> Export -> Export Hardware , Потом File -> Launck SDK , запускается SDK, захожу в xparameters.h и там нет BASEADDR/HIGHADDR для моего модуля, а адреса остальных не совпадают с адресами из Address Editor в Vivado. Где то в этом абзаце я допускаю ошибку. Объясните, пожалуйста, как передавать проект в SDK? Или все адреса нужно вписывать ручками?

Как привязать DDR3 к Microblaze вообще не представляю. Но главное заставить работать хотя бы то что есть.

Мой модуль main_dac_0.


Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Про Vivado не подскажу. Но общий принцип: я бы сначала взял готовую сборку Microblaze от отладочной платы c проектом на lwip (раньше это был xapp1026, сейчас не знаю).
Там DDR уже будет прикручен.
Потом поправить настройки под свою плату, убедиться в работоспособности тестового проекта. И только после этого цеплять свой SPI модуль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата
Но общий принцип: я бы сначала взял готовую сборку Microblaze от отладочной платы c проектом на lwip (раньше это был xapp1026, сейчас не знаю).
Там DDR уже будет прикручен.

C DDR это задача максимум. Для начала хочу понять процесс привязывания ядра.

Цитата
И только после этого цеплять свой SPI модуль.


Как? Я не знаю что делаю не так!

Цитата
На данном этапе, я сделал и отсимулировал ядро с SPI и внутренним буффером на ресурсах ПЛИС, сейчас требуется привязать этот модуль к Microblaze. Тут и начались проблемы. С горем пополам, написал на VHDL AXI <-> Bus2IP/IP2bus, шина S_AXI ядра автоматически совместилась с шиной M_AXI блока microblaze_0_AXI_periph, во вкладке Address Editor в Vivado появился мой модуль с присвоенным ему диапазоном адресов.
Далее я синтезирую, имплементирую, создаю битстрим. Нажимаю File -> Export -> Export Hardware , Потом File -> Launck SDK , запускается SDK, захожу в xparameters.h и там нет BASEADDR/HIGHADDR для моего модуля, а адреса остальных не совпадают с адресами из Address Editor в Vivado. Где то в этом абзаце я допускаю ошибку. Объясните, пожалуйста, как передавать проект в SDK? Или все адреса нужно вписывать ручками?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kosek8, Вы вроде все делаете правильно, просто Vivado - это мегакосячная среда... Возможно лучше сохранить кастомные исходники, удалить всю папочку SDK, заново все экспортировать, создать и настроить проект и потом добавить свои исходники...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(kosek8 @ Sep 29 2017, 11:45) <{POST_SNAPBACK}>
Здраствуйте. Прошу совета. VHDL умею, с Microblaze работаю впервые,

На сайте Макро должны быть выложены записи вебинаров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Бывало что-то похожее - создать заново sdk проект(если быть точнее bsp нужно перегенерить)
Я решал проблему так:
1)копировал исходники си проекта в отдельное место
2)удалял папку .sdk из проект
3)экспорт хардвер/ланч сдк
4)создаем новый проект bsp и application
5)копирую исходники си в новую папку проекта в папке .sdk
(Только так мне удалось избавиться от ряда сторонних файлов, которые подсасывались в проект и все соответствовало хардверу)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
По идее рассчитывалось, что regenerate bsp должен все заново сгенерировать, но как показала практика - не всегда это работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Спасибо, svedach и особенно Lutovid a14.gif , сделал по инструкции и заработало.
iosifk, посмотрел я вэбинары, там все рассматривается в общем, и как правило, у лектора все работает с первого раза smile3046.gif , что то все же почерпнул, спасибо за совет.

Реализовал управление мультиплексором, связь с АЦП по SPI, обработку, накопление данных в буфере, передачу буфера в Microblaze и отправку его в UDP.

Однако, буфер кушает много LUT и FF блоков. На моей отладочной плате есть DDR3 SDRAM и я хотел бы её задействовать для новой функции и в случее серьезной нехватки ресурсов перенести в RAM буфер АЦП.
Как один раз сложить туда 0.5 МБайта данных я представляю(нужно знать адреса и через XIo_Out32), а вот как извлекать данные не с помощью Microblaze, а напрямую (т.к. при тактовой частоте в 100МГц требуется данные из ДДР к выводам платы выдавать с частотой 20 МГц, то-есть за 5 тактов. Будет жесткий диапазон адресов - закрепленный за одним выводом.) даже не имею представления.
7 Series FPGAs Memory Interface Solutions User Guide на блок управления оперативой я нашел, но он объемный и на первый взгляд мне не все необходимо, но читаю пока его.

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


Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вам нужно использовать DMA ядро в режиме МемориМап -> АКСИ стрим. Оно подключается к АКСИ Интерконнект и обеспечивает передачу данных из ДДР в Ваше ядро по шине AXI Stream.
Почитайте https://www.xilinx.com/support/documentatio...021_axi_dma.pdf
Обратите внимание на сигналы и внутренние регистры с префиксом MM2S.
При использовании этого ядра все будет очень просто - процессор пишет в его внутренние регистры адрес откуда надо начать передавать и сколько байт нужно передать. Только надо будет освоить AXI Stream, но она легкая.

Будет не понятно - спрашивайте, я этот путь уже несколько раз прошел...
Изменено пользователем svedach

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация