|
|
  |
MicroBlaze + DDR3 + my_IP на AXI, подключение к AXI |
|
|
|
May 5 2013, 18:47
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(zuuuuk @ May 5 2013, 17:44)  Добрый день. У меня система на SPARTAN6 Mbz + MCB_DDR3 на шине AXI. Я хочу подключить свой IP блок ко второму порту MCB и получить доступ к DDR3. т.е. мой IP блок должен быть мастером. Для чтения данных из DDR3.
Подскажите,пожалуйста, какой-нибудь пример подключения своего IP к шине AXI. Лучше делать через "переходник" от Xilinx - http://www.xilinx.com/support/documentatio...aster_burst.pdf т.к. AXI достаточно сложная шина. Не скажу, что IP простой и очевидный - но все таки удалось его понять и все работает как часы. Да, в Platform Studio меню Hardware->Create or import periferal - там вам визард сгенерирует работающий пример. У нас в проекте до сих пор фрагменты кода из того примера встречаются  .
|
|
|
|
|
Jun 7 2013, 10:11
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(akorud @ May 5 2013, 22:47)  Лучше делать через "переходник" от Xilinx - http://www.xilinx.com/support/documentatio...aster_burst.pdf т.к. AXI достаточно сложная шина. Не скажу, что IP простой и очевидный - но все таки удалось его понять и все работает как часы. Да, в Platform Studio меню Hardware->Create or import periferal - там вам визард сгенерирует работающий пример. У нас в проекте до сих пор фрагменты кода из того примера встречаются  . как тут действовать? собрал схему на стр. 14 указанного pdf с синтезированным ip. но как добраться до входов ( Bus2IP_***)? Я так понимаю , что на них нужно подавать сигналы от внешнего устройства? если же идти от обратного - т.е. взять проект синтезированного примера и туда добавить microblaze , то тоже непонятно как их состыковать? может кто подскажет путь?
|
|
|
|
|
Jun 7 2013, 12:19
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056

|
Цитата(serg_k1 @ Jun 7 2013, 14:11)  если же идти от обратного - т.е. взять проект синтезированного примера и туда добавить microblaze , то тоже непонятно как их состыковать? может кто подскажет путь? Я бы не советовал так делать. Рекомендую вот такой путь (EDK 14.2). Create or import peripheral -> выбрать To an XPS Projects -> core name -> AXI4 Burst-> галки User Logic Master, User logic SW registers -> число регистров побольше, например 32 -> ... -> галки generate ISE and XST, generate driver -> finish Затем заходите в папку pcores/core name/devl/projnav/ открываете ISE, в нем открываете файл core name.xise Там будет уже 2 готовых VHD-файла. core name.vhd - это и есть "адаптер" в user_logic вписывайте свой код. Могу расписать более подробно.
|
|
|
|
|
Jun 10 2013, 06:33
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(aabmail @ Jun 7 2013, 16:19)  Могу расписать более подробно. было бы очень полезно. но это то и есть второй путь. вернее его первая часть. а вот дольше как действовать? нужно ведь добавить microblaze. и что в нем должно быть. ведь нужно собрать цепочку до DDR3 и при этом оставить существующую связь к DDR3. я ее собирал . но на axi external Master Connector(в Isim не заработало). а как здесь?
|
|
|
|
|
Jun 10 2013, 12:24
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(Golikov A. @ Jun 10 2013, 14:44)  А что если так.
Делаете микроблайз в нем включаете контроллер ДДР (кто-то его должен так или иначе рефрешить), контроллер делаете вешаете на шину АКСИ добавляете в микроблайз АКСИ конектор, соединяете микроблайз и ДДР
Дальше через крейт-импорт хардваре делаете модуль с интерфейсом акси, указываете что перефирия мастер. И ее вешаете на тот же АКСИ конектор.
Я правда не знаю если делать 2 портовый контроллер ДДР, как это выглядит. У него появляется 2 подключения на акси или что? Но с 1 портовым у меня сейчас к нему подключен ДМА и Микроблайз, оба мастера, так что дружатся как то... такой путь уже был другая тема. там уперся в то, что нет разрешения на обмен. даже после reset из переходит z-> 0, а разрешение -1.правда я ничего в тестбенче кроме частоты, reset и управления на запись на microblaze не подавал. но по reset должно появиться разрешение.
|
|
|
|
|
Jun 11 2013, 06:43
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(Golikov A. @ Jun 10 2013, 18:07)  так вы что хотите написать свой акси конектор что ли? Мне кажется это потенциальный источник ошибок в будущем. Лучше к своему модулю приделать интерфейс ДМА.
чего в память то писать-читать надо? получается что да. известные - перечень сигналов(12вх+4вых), временная. ip в микроблайзе - ext_master_conn, который и выводит эти сигналы наружу. хотелось через burst. но очень много вопросов. я начинающий. ну вот собрал я в XPS microblaze систему с burst через крейт-импорт хардвар модуль с интерфейсом акси. и добавил его в мб. теперь нужно в модуле user logic(из pcore) добавить свою систему, которая принимает инф. извне и формирует запись. вот как конкретно это сделать? выйти из xps?.но в ise есть только микроблайз . а так нужно принять данные видео преобразованные и передать их через интернет 1Gb. данные аппаратно в память, чтобы не загружать программу. а далее программно.
|
|
|
|
|
Jun 11 2013, 08:01
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056

|
Цитата(serg_k1 @ Jun 10 2013, 10:33)  было бы очень полезно. но это то и есть второй путь. вернее его первая часть. а вот дольше как действовать? нужно ведь добавить microblaze. и что в нем должно быть. ведь нужно собрать цепочку до DDR3 и при этом оставить существующую связь к DDR3. я ее собирал . но на axi external Master Connector(в Isim не заработало). а как здесь? Открываете EDK. Create a new project using Base system builder Выбрать Axi system. Выбрать директорию для проекта. Название лучше оставить "system" Далее укажите тип своей борды, а если у вас custom-плата, то указываете тип кристалла и частоту задающего генератора. Остальное по умочланию. В следующем диалоге добавляете периферию, в т.ч. DDR3 SDRAM, Soft TEMAC Ethernet, UART16550 и др. Finish. Т.о. будет создан проект EDK, в котором будет уже готовый набор стандартных ядер. Вам теперь нужно создать свою user-ядро. Для этого: Create or import peripheral -> выбрать To an XPS Projects -> core name -> AXI4 Burst-> галки User Logic Master, User logic SW registers -> число регистров побольше, например 32 -> ... -> галки generate ISE and XST, generate driver -> finish Затем заходите в папку pcores/core name/devl/projnav/ открываете ISE, в нем открываете файл core name.xise Там будет уже 2 готовых VHD-файла. core name.vhd - это и есть "адаптер" в user_logic вписывайте свой код.
|
|
|
|
|
Jun 11 2013, 09:35
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(aabmail @ Jun 11 2013, 12:01)  Открываете EDK. Create a new project using Base system builder Выбрать Axi system. Выбрать директорию для проекта. Название лучше оставить "system" Далее укажите тип своей борды, а если у вас custom-плата, то указываете тип кристалла и частоту задающего генератора. Остальное по умочланию. В следующем диалоге добавляете периферию, в т.ч. DDR3 SDRAM, Soft TEMAC Ethernet, UART16550 и др. Finish.
Т.о. будет создан проект EDK, в котором будет уже готовый набор стандартных ядер. Вам теперь нужно создать свою user-ядро. Для этого:
Create or import peripheral -> выбрать To an XPS Projects -> core name -> AXI4 Burst-> галки User Logic Master, User logic SW registers -> число регистров побольше, например 32 -> ... -> галки generate ISE and XST, generate driver -> finish
Затем заходите в папку pcores/core name/devl/projnav/ открываете ISE, в нем открываете файл core name.xise Там будет уже 2 готовых VHD-файла. core name.vhd - это и есть "адаптер" в user_logic вписывайте свой код. все это я и раньше проделал. 1. теперь мой проект core name.xise. но там же нет микроблайза. нужно его добавить? я добавил. делаю его головным.а при подключении "адаптера" в подчиненном выдает ошибку , что неизвестный "адаптер". если наоборот "адаптер" головной микроблайз подчиненный все проходит. но там слишком со многими сигналами микроблайза нужно разбираться. и еще . к чему подключается "адаптер" в микроблайзе. 2.или проект остается в XPS. а ISE только для написания кода в адаптере? но тогда как мне сделать свой вход в "адаптере" от внешнего пина. в адаптере я так понял есть 4 модуля. 1-user , 2-axi_master_burst,3-axi_lite_ipif,4-головной(пусть mmm). и только ммм связан с микоблайзом. input my_clk мой входной сигнал. я его добавил в user , а дальше должен провести через эти модули в микроблайз. ведь в этом случае есть только он и через него нужно вводить сигналы от внешнего устройства?.
|
|
|
|
|
Jun 11 2013, 09:54
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056

|
Цитата(serg_k1 @ Jun 11 2013, 13:35)  все это я и раньше проделал. 1. теперь мой проект core name.xise. но там же нет микроблайза. нужно его добавить? я добавил. делаю его головным.а при подключении "адаптера" в подчиненном выдает ошибку , что неизвестный "адаптер". если наоборот "адаптер" головной микроблайз подчиненный все проходит. но там слишком со многими сигналами микроблайза нужно разбираться. и еще . к чему подключается "адаптер" в микроблайзе. 2.или проект остается в XPS. а ISE только для написания кода в адаптере? но тогда как мне сделать свой вход в "адаптере" от внешнего пина. в адаптере я так понял есть 4 модуля. 1-user , 2-axi_master_burst,3-axi_lite_ipif,4-головной(пусть mmm). и только ммм связан с микоблайзом. input my_clk мой входной сигнал. я его добавил в user , а дальше должен провести через эти модули в микроблайз. ведь в этом случае есть только он и через него нужно вводить сигналы от внешнего устройства?. Ваш второй вариант ближе к мной предложенному пути. ISE фактически служит для написания кода (Кстати, что вы понимаете под словом "Адаптер"?). Еще через ISE удобно вызывать симуляцию. В user-core есть не 4, а 2 модуля - по порядку: головной, типа axi_mmm_core.vhd и user_logic.vhd. Все остальное - это инклюды. Вы хотите ввести извне сигнал my_clk? Это случайно не system_clock для всего проекта? Если это "обычный просто сигнал", то его нужно прописать в следующие файлы: system.ucf, system.mhs, axi_mmm_core.mpd, axi_mmm_core.vhd, user_logic.vhd. Таким образом вы вводите сигнал в свой user_core. Подключить его напрямую к блэйзу нельзя. Это можно сделать только через AXI. Если вы это делаете впервые, попробуйте его для начала присоединить к сигналу USER_LOGIC/SLV_REG0(0). Для проверки правильности написания имеет смысл делать синтез в ISE, и потом смотреть лог, исправлять ошибки. Потом нажимаете Generate bitstream в EDK.
|
|
|
|
|
Jun 11 2013, 10:52
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(aabmail @ Jun 11 2013, 11:54)  Ваш второй вариант ближе к мной предложенному пути. Поддерживаю. Мне такой вариант показался самым удобным, только код я писал в sublime text. ISE так ни разу и не запустил.
|
|
|
|
|
Jun 11 2013, 12:11
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(aabmail @ Jun 11 2013, 13:54)  Ваш второй вариант ближе к мной предложенному пути. спасибо , сейчас как-то мне попонятнее. я просто не понял какой путь предложен. теперь понял -второй. Цитата Вы хотите ввести извне сигнал my_clk? Это случайно не system_clock для всего проекта? это просто для примера. нужно данные байт и строб. Цитата Если это "обычный просто сигнал", то его нужно прописать в следующие файлы: system.ucf, system.mhs, axi_mmm_core.mpd, axi_mmm_core.vhd, user_logic.vhd. Таким образом вы вводите сигнал в свой user_core. в головном m.vhd port (my_clk :in std_logic;) component user_logic port (my_clk_user : in std_logic;) port map ( my_clk_user => my_clk,) в user logic(он в verilog) module user_logic ( my_clk_user, ) input my_clk_user; что здесь? m.mpd PORT my_clk = ???, DIR = I, BUS = ??? system.ucf PORT my_clk = my_clk, DIR = I и нужно ли здесь BEGIN m PARAMETER INSTANCE = m_0 PARAMETER HW_VER = 1.00.a PARAMETER C_BASEADDR = 0xa0000000 PARAMETER C_HIGHADDR = 0xa000ffff BUS_INTERFACE M_AXI = axi4_0 BUS_INTERFACE S_AXI = axi4lite_0 PORT S_AXI_ACLK = clk_50_0000MHzPLL0 PORT m_axi_aclk = clk_100_0000MHzPLL0 END system.ucf NET my_clk LOC = "N19" | IOSTANDARD = "LVCMOS25"; N19 заменю на нужный контакт если можно, то еще может подскажете как быстро подключиться в user_logic. нужна запись 32р слов, количество ~ 500.
|
|
|
|
|
Jun 11 2013, 16:42
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056

|
Цитата(akorud @ Jun 11 2013, 14:52)  Поддерживаю. Мне такой вариант показался самым удобным, только код я писал в sublime text. ISE так ни разу и не запустил. ISE все-таки удобно тем, что там можно генерить test_bench для ModelSim. А редактор в ISE конечно плохой, и даже иногда виснет на пустом месте. Цитата component user_logic port (my_clk_user : in std_logic;) port map ( my_clk_user => my_clk,) честно говоря мне до сих пор непонятно, когда следует применять ключевое слово component. Делаю обычно так: LABEL: entity work.user_logic port map ( Bus2IP_Clk => clk, ... ); Цитата что здесь? m.mpd PORT my_clk = ???, DIR = I, BUS = ??? PORT my_clk = "", DIR = I MHS лучше поначалу руками не править. Пользуйтесь графической средой. Когда заполните MPD, перезагрузите EDK. Найдите в EDK окно System Assembly View и в нем вкладку Ports. Найдите там свое ядро, свой сигнал и выберите Make external. Посмотрите, как изменится MHS. Цитата system.ucf NET my_clk LOC = "N19" | IOSTANDARD = "LVCMOS25"; N19 заменю на нужный контакт Как то так. Цитата если можно, то еще может подскажете как быстро подключиться в user_logic. нужна запись 32р слов, количество ~ 500. 500 слов раз в секунду или чаще?
Сообщение отредактировал aabmail - Jun 11 2013, 16:02
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|