Jump to content
    

MicroBlaze + DDR3 + my_IP на AXI

Ну так mst_reg это и есть регистры.

 

Обычно mst_reg используются для конфигурирования мастера, и для пользователей не предназначены.

Если что-то единичное хотите передавать, используйте slv_reg( ). Они там случайно не сгенерились?

Share this post


Link to post
Share on other sites

глобально компонент это

 

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.

 

Share this post


Link to post
Share on other sites

Обычно mst_reg используются для конфигурирования мастера, и для пользователей не предназначены.

Если что-то единичное хотите передавать, используйте slv_reg( ). Они там случайно не сгенерились?

Там все очень условно. У них в примере - да, причем насколько я помню чтобы показать что можно иметь несколько address space в одном pcore.

Но как только вы начнете изменять мастер (не верю чтоб тот из примера - читаем/пишем FIFO - подошел один к одному) - придется изменять и предназначение регистров.

Share this post


Link to post
Share on other sites

да ничего там не условно:).

 

В модуль входит шина АКСИ - сложная.

Есть компонент от ксалинкса который сложную акси переделывает в Bus2IP и IP2Bus.

 

Один от шины в компонент, другой от компонента в шину. Зачем их делать 2 направленными то?

 

 

 

 

Share this post


Link to post
Share on other sites

глобально компонент это

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;

и через них получить доступ к регистрам?

 

Share this post


Link to post
Share on other sites

помогите разобраться.

1.модуль ,такой как есть, может работать только по командам от процессора?

Если вы о том примере - да

2.если да и я хочу чтобы он работал полностью извне, то нужно вот этими сигналами управлять работой.

Можно конечно, но зачем такое извращение?

Если вам нужно извне управлять - заведите свои сигналы управления модуль.

А что касается регистров - все это условно.

Например FSM bus master - ему откуда-то надо знать что можно начинать работу, откуда и сколько писать или читать. В случае если командует процессор - регистры очевидное решение. Но у вас же своя задача и свои сигналы.... У меня например адрес и размер были вообще зафиксированы, команда "старт" приходила от таймера и регистр я оставил один - для подсчета байтов.

Но никто вам не мешает сделать свой мастер который через упомянутые сигналы будет писать/читать регистры.

Edited by akorud

Share this post


Link to post
Share on other sites

Если вы о том примере - да

 

Можно конечно, но зачем такое извращение?

Если вам нужно извне управлять - заведите свои сигналы управления модуль.

А что касается регистров - все это условно.

Например 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

 

 

 

Но никто вам не мешает сделать свой мастер который через упомянутые сигналы будет писать/читать регистры.

т.е. именно те сигналы , которые я перечислил? с сигналом Bus2IP_BE не понятно ведь он завязан с Bus2IP_Data при записи в регистры. Не могли бы пояснить как?

Share this post


Link to post
Share on other sites

т.е. именно те сигналы , которые я перечислил? с сигналом Bus2IP_BE не понятно ведь он завязан с Bus2IP_Data при записи в регистры. Не могли бы пояснить как?

BE - Byte Enable. Т.е. если Bus2IP_Data шире 8 бит, то BE указывает какие из байтов несут данные (если ширина данных < ширины Bus2IP_Data).

Типичные сценарии:

- запись 8-битного значения на 32-битной шине;

- при burst передаче если размер burst в байтах не кратный 4 (на 32-битной шине) - то при передаче последнего 32-битного слова не все биты Bus2IP_BE будут 1.

Если у вас все данные размерности шины можно записать туда все 1 и не париться.

Edited by akorud

Share this post


Link to post
Share on other sites

чет я не понимаю.

вроде бы 2 задачи

1.

У вас модуль висит на АКСе шине и через нее вы хотите писать в ДДР. Для этой части вы делаете регистровый кусок - мастер шины акси, при помощи которого сможете общатся с память.

2.

Сбор внешних данных которые как раз в память и пишутся. Для этой части вам надо сделать свой кусок который примет внешние сигналы обработает их и перепихает в регистры. Вроде так...

 

 

1 часть вроде должен был сделать визард компонента. 2 часть пишется руками, все сигналы заводятся какие надо из вне. Я бы сделал визардом первую часть и научился бы писать - читать память. Получить доступ к шине тоже не тривиальная, может в этом случае ДМА готовое было бы проще...

 

Только не ляпайте заплаток, если сегодня модуль пишет только 32 битными словами, кто вам сказал что завтра не понадобиться 8 битных?

 

 

 

Share this post


Link to post
Share on other sites

...который примет внешние сигналы обработает их и перепихает в регистры. Вроде так...

Не так. Регистры служат исключительно для управления мастером, из них они читает что делать, сколько и куда. Данных там нет.

В примере - данные в ФИФО. Я у себя тоже так делал. Но не обязательно.

 

Share this post


Link to post
Share on other sites

каким мастером? как можно управлять мастером?

я так понял этот блок сам должен быть мастером?

 

 

Share this post


Link to post
Share on other sites

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' и ничего. ?

 

чет я не понимаю.

вроде бы 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 пока не ясно и запустить чтение. и смотреть чтобы не было переполнения. по окончании новый адрес и новый цикл. и таким образом заполнять те же области, откуда микроблэйз их будет забирать.

а вот с первой часть примера с набором регистров ничего не понятно. кстати получается что в моей версии эта часть не используется вообще.

 

 

каким мастером? как можно управлять мастером?

я так понял этот блок сам должен быть мастером?

я думаю что да

 

Не так. Регистры служат исключительно для управления мастером, из них они читает что делать, сколько и куда. Данных там нет.

В примере - данные в ФИФО. Я у себя тоже так делал. Но не обязательно.

если про регистры mst_reg , то да. а вот с slv_reg0 не понятно.

Share this post


Link to post
Share on other sites

вообщем это делается так.

 

Есть микроблайз с ДДР, который как я понимаю данные будет в езернет пихать

 

Есть ваш компонент внутри с ФИФО, в которое будут данные собираться

 

и есть ДМА контроллер, уже готовый ксалинксом написанный, который соединит выход вашего фифо и ДДР

 

если совсем извратиться можно даже так настроить чтобы ДМА данные клало в выходной буфер ЛвИП,

 

Вот в эту сторону я бы копал, это лучше чем делать своего мастера на шине руками

 

Share this post


Link to post
Share on other sites

Не соглашусь, ну на то тут и форум чтобы можно было различные мнения публиковать.

Зачем ДМА? Зачем 2 порта памяти? Насколько я понял речь идет о 1Gbps - это медленно.

Я сам собственноручно написал модуль принимающий пакеты по ethernet и складывающий в ДДР без участия microblaze. Все чудесно работает с однопортовой ДДР, при частоте шины 50MHz. Где-то тут я уже постил скриншот из XPS.

 

 

задача такая.

принять данные и передать их через 1Gb интернет.

IP/UDP надо по условию задачи? Скорость поступления данных?

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

 

Share this post


Link to post
Share on other sites

Да я что-то уже путаюсь. Мне кажется что топикстартер где то еще что-то подобное уже обсуждал, а может это кто-то другой. То есть задача раскинута по нескольким топикам, или я ошибаюсь...

 

Если есть данные которые надо просто передать по езернету, и скорость входа их меньше, то естественно тут даже микроблайз по хорошему не нужен. Но что-то мне подсказывает что когда говорят езернет, то имеют ввиду чтобы в компьютер включить и в виндусе получить. А это уже значит IP, а то и ТСР, UDP - край.

 

Но даже по UDP задача решаема, есть модули которые напрямую формируют пакеты UDP с контрольной суммой и так далее....

 

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

 

что надо взять микроблайз с DDR и LwIP, сделать нормальный серверочек данных с протоколом, а то и что-то стандартное выше уровнем типа ФТП, ХТТП...

 

а к этой системе уже прикрутить модуль сбора, первичной обработки данных, который их уложит аккуратными стопочками в память.

 

Я бы конечно бы их из модуля в память перекладывал бы Микроблайзом, но ТС хочет его освободить от этого как я понял, и потому фактически старается написать свой модуль ДМА, а я предлагаю взять готовый...

 

 

Вот такое мое понимание задачи, хотя я признаю может я все и перепутал:)...

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.

×
×
  • Create New...