|
|
  |
MicroBlaze + DDR3 + my_IP на AXI, подключение к AXI |
|
|
|
Jun 17 2013, 10:09
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056

|
Цитата(akorud @ Jun 17 2013, 00:54)  Ну так mst_reg это и есть регистры. Обычно mst_reg используются для конфигурирования мастера, и для пользователей не предназначены. Если что-то единичное хотите передавать, используйте slv_reg( ). Они там случайно не сгенерились?
|
|
|
|
|
Jun 17 2013, 13:25
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(Golikov A. @ Jun 14 2013, 17:59)  глобально компонент это
1. Модуль обертка - который вешается на шину внутри содержит: 1.1 вспомогательный модуль который работает с шиной и преобразует ее сложные сигналы в понятный набор сигналов Bus2IP - бас ту айпи, от шины к вам и IP2Bus - обратно клоки чипселекты, и прочие вспомогательные сигналы. 1.2 Пользовательский модуль, куда заведены эти понятные сигналы
Последний сделан для вас, для редактирования. Изначально он не содержит ничего кроме набора регистров с прописанным примером их чтения и записи.
Дальше вы в него пихаете компоненты, написанные вами прочие модули, и все все все что вам надо. И делаете управление всем этим через регистры. И выдачу данных обратно через регистры. и все.
Также не воспрещается добавлять прочие как входные, так и выходные сигналы, их надо добавить и в пользовательском модуле и в модуле обертке, и соединить в модуле обертке...
Также в модуль обертки можно добавить еще пользовательский модуль если это надо...
Только надо понимать что это все для взаимодействия вашего модуля с микроблайзом, а если микроблайза нет, то и с шиной париться не надо, и можно писать обычный плисовый не процессорный модуль, что иногда бывает проще... без регистров, оберток и прочеее все-таки не понятно. 1. регистры -приемники и задаются через Bus2IP_Data, Bus2IP_BE,Bus2IP_WrCE. а это входы user_logic. получается что , если делать свою часть в user_logic, то нужно на внешние входы подавать сигналы из самого же блока. значит либо делать их inout(что вроде как запрещено) либо организовать цепочку выход вход. 2.Bus2IP_Data, Bus2IP_BE,Bus2IP_WrCE- эти сигналы формируются в драйвере. значит их нужно отключить оттуда? да и с содержанием Bus2IP_BE не очень понятно. 3.в user_logic есть как бы две части.slave model и master model? 4. для реализации алгоритма записи с помощью этого компонента (только не одиночной как в примере ,а Burst Write Transaction , как Figure 10: Example Burst Write Transaction Timing DS844) нужно пользоваться master model? здесь есть и адрес и длина записи. но тоже непонятно, как всем этим воспользоваться без сигналов Bus2IP_Data, Bus2IP_BE,Bus2IP_WrCE.
|
|
|
|
|
Jun 17 2013, 13:26
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(aabmail @ Jun 17 2013, 12:09)  Обычно mst_reg используются для конфигурирования мастера, и для пользователей не предназначены. Если что-то единичное хотите передавать, используйте slv_reg( ). Они там случайно не сгенерились? Там все очень условно. У них в примере - да, причем насколько я помню чтобы показать что можно иметь несколько address space в одном pcore. Но как только вы начнете изменять мастер (не верю чтоб тот из примера - читаем/пишем FIFO - подошел один к одному) - придется изменять и предназначение регистров.
|
|
|
|
|
Jun 19 2013, 12:21
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(Golikov A. @ Jun 14 2013, 17:59)  глобально компонент это 1. Модуль обертка - который вешается на шину внутри содержит: 1.1 вспомогательный модуль который работает с шиной и преобразует ее сложные сигналы в понятный набор сигналов Bus2IP - бас ту айпи, от шины к вам и IP2Bus - обратно клоки чипселекты, и прочие вспомогательные сигналы. 1.2 Пользовательский модуль, куда заведены эти понятные сигналы
Последний сделан для вас, для редактирования. Изначально он не содержит ничего кроме набора регистров с прописанным примером их чтения и записи.
Только надо понимать что это все для взаимодействия вашего модуля с микроблайзом, а если микроблайза нет, то и с шиной париться не надо, и можно писать обычный плисовый не процессорный модуль, что иногда бывает проще... без регистров, оберток и прочеее помогите разобраться. 1.модуль ,такой как есть, может работать только по командам от процессора? 2.если да и я хочу чтобы он работал полностью извне, то нужно вот этими сигналами управлять работой. Bus2IP_Clk : in std_logic; Bus2IP_Resetn : in std_logic; Bus2IP_Data : in std_logic_vector(C_SLV_DWIDTH-1 downto 0); Bus2IP_BE : in std_logic_vector(C_SLV_DWIDTH/8-1 downto 0); Bus2IP_RdCE : in std_logic_vector(C_NUM_REG-1 downto 0); Bus2IP_WrCE : in std_logic_vector(C_NUM_REG-1 downto 0); IP2Bus_Data : out std_logic_vector(C_SLV_DWIDTH-1 downto 0); IP2Bus_RdAck : out std_logic; IP2Bus_WrAck : out std_logic; IP2Bus_Error : out std_logic; и через них получить доступ к регистрам?
|
|
|
|
|
Jun 19 2013, 13:25
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(serg_k1 @ Jun 19 2013, 14:21)  помогите разобраться. 1.модуль ,такой как есть, может работать только по командам от процессора? Если вы о том примере - да Цитата(serg_k1 @ Jun 19 2013, 14:21)  2.если да и я хочу чтобы он работал полностью извне, то нужно вот этими сигналами управлять работой. Можно конечно, но зачем такое извращение? Если вам нужно извне управлять - заведите свои сигналы управления модуль. А что касается регистров - все это условно. Например FSM bus master - ему откуда-то надо знать что можно начинать работу, откуда и сколько писать или читать. В случае если командует процессор - регистры очевидное решение. Но у вас же своя задача и свои сигналы.... У меня например адрес и размер были вообще зафиксированы, команда "старт" приходила от таймера и регистр я оставил один - для подсчета байтов. Но никто вам не мешает сделать свой мастер который через упомянутые сигналы будет писать/читать регистры.
Сообщение отредактировал akorud - Jun 19 2013, 13:26
|
|
|
|
|
Jun 19 2013, 14:05
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(akorud @ Jun 19 2013, 17:25)  Если вы о том примере - да
Можно конечно, но зачем такое извращение? Если вам нужно извне управлять - заведите свои сигналы управления модуль. А что касается регистров - все это условно. Например FSM bus master - ему откуда-то надо знать что можно начинать работу, откуда и сколько писать или читать. В случае если командует процессор - регистры очевидное решение. Но у вас же своя задача и свои сигналы.... У меня например адрес и размер были вообще зафиксированы, команда "старт" приходила от таймера и регистр я оставил один - для подсчета байтов. Но никто вам не мешает сделать свой мастер который через упомянутые сигналы будет писать/читать регистры. я записываю в фифо данные. они не считываются пока нет команды на запуск. и что можно прямо так mst_reg(0) <= x"0a"; -- Control Register 0x02= single data beat 0x0a=Burst Assertion Control+Write Request Control mst_reg(1) <= x"01"; -- Status Register mst_reg(4) <= x"80"; -- Target Address mst_reg(5) <= x"00"; mst_reg(6) <= x"00"; mst_reg(7) <= x"00"; mst_reg(8) <= x"00"; -- Master BE mst_reg(9) <= x"00"; mst_reg(12) <= x"04"; -- Length Register -- bit 0-3 - Reserved mst_reg(13) <= x"00"; -- bit 4-15 - Transfer Length mst_reg(14) <= x"00"; mst_reg(15) <= x"0a"; -- Go Register Цитата(akorud @ Jun 19 2013, 17:25)  Но никто вам не мешает сделать свой мастер который через упомянутые сигналы будет писать/читать регистры. т.е. именно те сигналы , которые я перечислил? с сигналом Bus2IP_BE не понятно ведь он завязан с Bus2IP_Data при записи в регистры. Не могли бы пояснить как?
|
|
|
|
|
Jun 19 2013, 14:27
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(serg_k1 @ Jun 19 2013, 16:05)  т.е. именно те сигналы , которые я перечислил? с сигналом Bus2IP_BE не понятно ведь он завязан с Bus2IP_Data при записи в регистры. Не могли бы пояснить как? BE - Byte Enable. Т.е. если Bus2IP_Data шире 8 бит, то BE указывает какие из байтов несут данные (если ширина данных < ширины Bus2IP_Data). Типичные сценарии: - запись 8-битного значения на 32-битной шине; - при burst передаче если размер burst в байтах не кратный 4 (на 32-битной шине) - то при передаче последнего 32-битного слова не все биты Bus2IP_BE будут 1. Если у вас все данные размерности шины можно записать туда все 1 и не париться.
Сообщение отредактировал akorud - Jun 19 2013, 14:29
|
|
|
|
|
Jun 20 2013, 08:18
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(Golikov A. @ Jun 20 2013, 07:01)  ...который примет внешние сигналы обработает их и перепихает в регистры. Вроде так... Не так. Регистры служат исключительно для управления мастером, из них они читает что делать, сколько и куда. Данных там нет. В примере - данные в ФИФО. Я у себя тоже так делал. Но не обязательно.
|
|
|
|
|
Jun 20 2013, 13:53
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(akorud @ Jun 19 2013, 18:27)  BE - Byte Enable. Т.е. если Bus2IP_Data шире 8 бит, то BE указывает какие из байтов несут данные (если ширина данных < ширины Bus2IP_Data). Типичные сценарии: - запись 8-битного значения на 32-битной шине; - при burst передаче если размер burst в байтах не кратный 4 (на 32-битной шине) - то при передаче последнего 32-битного слова не все биты Bus2IP_BE будут 1. Если у вас все данные размерности шины можно записать туда все 1 и не париться. спасибо, у меня 32р. сделал Bus2IP_BE все единицы. в mst_reg все записал, правда кроме 15. и как раз проблемы с mst_go. mst_go в 1 не могу сделать. делаю Bus2IP_Data в старшем байте = X"0A" при mst_byte_we(GO_BYTE_LANE) = '1' и ничего. ? Цитата(Golikov A. @ Jun 20 2013, 09:01)  чет я не понимаю. вроде бы 2 задачи 1. У вас модуль висит на АКСе шине и через нее вы хотите писать в ДДР. Для этой части вы делаете регистровый кусок - мастер шины акси, при помощи которого сможете общатся с память. 2. Сбор внешних данных которые как раз в память и пишутся. Для этой части вам надо сделать свой кусок который примет внешние сигналы обработает их и перепихает в регистры. Вроде так...
1 часть вроде должен был сделать визард компонента. 2 часть пишется руками, все сигналы заводятся какие надо из вне. Я бы сделал визардом первую часть и научился бы писать - читать память. Получить доступ к шине тоже не тривиальная, может в этом случае ДМА готовое было бы проще...
Только не ляпайте заплаток, если сегодня модуль пишет только 32 битными словами, кто вам сказал что завтра не понадобиться 8 битных? задача такая. принять данные и передать их через 1Gb интернет. есть микроблэйз связанный с DDR3 через AXI4 через порт P0 MCB_DDR3. он берет оттуда данные . хочется ввести данные в те же области откуда берет микроблэйз. ввести через AXI4 в порт P1 MCB_DDR3. и задавая адрес в DDR. без участия микроблэйза. поэтому и нужно, чтобы все управление было с внешней стороны. я думал что самый простой путь - это добавить AXI_External_Master_Connector. у него есть m_axi c одной стороны , а с другой внешний порт. но не получилось. не выставляется сигнал разрешения доступа aw_ready. тогда начал с этим компонентом. допустим что данные есть. их нужно подключить на вход фифо. и запустить мастер в user_logic. в нем задать адрес , количество и запустить чтение из фифо. но только не по программе микроблэйза, чтобы он не терял время. и вот если с Example code to demonstrate user logic master model functionality мне вроде как понятно. нужно задать самому из самого компонента в mst_reg режим в Control Register, Addrress Register -адрес. Length Register - количество, Status Register , Byte Enable Register и Go Register пока не ясно и запустить чтение. и смотреть чтобы не было переполнения. по окончании новый адрес и новый цикл. и таким образом заполнять те же области, откуда микроблэйз их будет забирать. а вот с первой часть примера с набором регистров ничего не понятно. кстати получается что в моей версии эта часть не используется вообще. Цитата(Golikov A. @ Jun 20 2013, 14:13)  каким мастером? как можно управлять мастером? я так понял этот блок сам должен быть мастером? я думаю что да Цитата(akorud @ Jun 20 2013, 12:18)  Не так. Регистры служат исключительно для управления мастером, из них они читает что делать, сколько и куда. Данных там нет. В примере - данные в ФИФО. Я у себя тоже так делал. Но не обязательно. если про регистры mst_reg , то да. а вот с slv_reg0 не понятно.
|
|
|
|
|
Jun 20 2013, 15:51
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Не соглашусь, ну на то тут и форум чтобы можно было различные мнения публиковать. Зачем ДМА? Зачем 2 порта памяти? Насколько я понял речь идет о 1Gbps - это медленно. Я сам собственноручно написал модуль принимающий пакеты по ethernet и складывающий в ДДР без участия microblaze. Все чудесно работает с однопортовой ДДР, при частоте шины 50MHz. Где-то тут я уже постил скриншот из XPS. Цитата(serg_k1 @ Jun 20 2013, 15:53)  задача такая. принять данные и передать их через 1Gb интернет. IP/UDP надо по условию задачи? Скорость поступления данных? Если данные поступают медленнее чем их высылает сеть, то такая задача решается за полдня, делал недавно и думаю вполне смогу поделится кодом.
|
|
|
|
|
Jun 20 2013, 18:41
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Да я что-то уже путаюсь. Мне кажется что топикстартер где то еще что-то подобное уже обсуждал, а может это кто-то другой. То есть задача раскинута по нескольким топикам, или я ошибаюсь... Если есть данные которые надо просто передать по езернету, и скорость входа их меньше, то естественно тут даже микроблайз по хорошему не нужен. Но что-то мне подсказывает что когда говорят езернет, то имеют ввиду чтобы в компьютер включить и в виндусе получить. А это уже значит IP, а то и ТСР, UDP - край. Но даже по UDP задача решаема, есть модули которые напрямую формируют пакеты UDP с контрольной суммой и так далее.... Но я так понимаю речь идет о полной системе, которая нормально видится в сети, и с нее можно забрать какие то намеренные показания, отсюда и строю свое понимание, а именно что надо взять микроблайз с DDR и LwIP, сделать нормальный серверочек данных с протоколом, а то и что-то стандартное выше уровнем типа ФТП, ХТТП... а к этой системе уже прикрутить модуль сбора, первичной обработки данных, который их уложит аккуратными стопочками в память. Я бы конечно бы их из модуля в память перекладывал бы Микроблайзом, но ТС хочет его освободить от этого как я понял, и потому фактически старается написать свой модуль ДМА, а я предлагаю взять готовый... Вот такое мое понимание задачи, хотя я признаю может я все и перепутал  ...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|