Jump to content

    
Sign in to follow this  
Krys

AXI DataMover (S2MM) сразу после сброса готов принять 4 слова данных из стрима, хотя никакой команды на это ещё не было

Recommended Posts

Здравствуйте. Такая вот проблема. AXI DataMover (S2MM) сразу после сброса готов принять 4 слова данных из стрима, хотя никакой команды на это ещё не было, как я понимаю, он сразу после сброса не должен держать Ready в 1, пока не поступит команда.

Вот осциллограммы из ChipScope Analyzer:

post-13271-1417582334_thumb.png

 

Так выглядит описание в файле *.mhs:

BEGIN axi_datamover
PARAMETER INSTANCE = axi_datamover_y
PARAMETER HW_VER = 4.02.a
PARAMETER C_INCLUDE_MM2S = 0
PARAMETER C_INCLUDE_S2MM = 1
PARAMETER C_INCLUDE_S2MM_DRE = 0
PARAMETER C_S2MM_BTT_USED = 23
PARAMETER C_S2MM_INCLUDE_SF = 0
PARAMETER C_S2MM_BURST_SIZE = 256
PARAMETER C_INCLUDE_S2MM_STSFIFO = 1
PARAMETER C_S2MM_STSCMD_FIFO_DEPTH = 1
PARAMETER C_S2MM_STSCMD_IS_ASYNC = 1
PARAMETER C_M_AXI_S2MM_ID_WIDTH = 3
PARAMETER C_S2MM_ADDR_PIPE_DEPTH = 4
BUS_INTERFACE M_AXI_S2MM = axi4_0
BUS_INTERFACE S_AXIS_S2MM_CMD = axi_dma_ctrl_y_M_AXIS_CMD
BUS_INTERFACE M_AXIS_S2MM_STS = axi_datamover_y_M_AXIS_S2MM_STS
BUS_INTERFACE S_AXIS_S2MM = axi_stream_fft_core_0_Y_AXIS
PORT m_axi_s2mm_aclk = clk_75_0000MHzPLL0
PORT m_axis_s2mm_cmdsts_aresetn = DIP_Switches_4Bits_TRI_I[0]
PORT m_axi_s2mm_aresetn = DIP_Switches_4Bits_TRI_I[0]
PORT m_axis_s2mm_cmdsts_awclk = axi_dma_ctrl_y_axis_aclk_0

END

 

Я использовал плату SP-605 со SPARTAN-6. Софт - ISE 14.7 (Planahead + XPS).

 

Чтобы нагляднее продемонстрировать проблему я специально перевёл датамувер в режим асинхронных команд, чтобы был дополнительный сброс (на всякий случай). Все сбросы датамувера я подключил к DIP-Switch на отладочной плате, и захватил осциллограммы сразу после снятия сброса. Хотя проблема проявляется и без всего перечисленного, но не так наглядно.

 

Кто-нибудь с таким сталкивался? Как лечить? Пока я делаю программный обход этой проблемы, добавляя в стрим избыточные данные (те самые 4 слова), которые будут потеряны при первой пересылке. При дальнейших пересылках всё работает как положено по датащиту.

Share this post


Link to post
Share on other sites

+1

Тоже недавно наткнулся на эту проблему. И именно 4 слова. Быстро разобраться не получилось, пока обошли программным костылём и отложили. Но баг висит, хочу разобраться. :smile3046:

На форуме xilinx натыкался на описание этой проблемы, но решения там так и не нашли.

Share this post


Link to post
Share on other sites
На форуме xilinx натыкался на описание этой проблемы, но решения там так и не нашли.
Покажите плиз

 

 

Скажите вы данные сразу в порты DM кидаете? Я имею ввиду S2MM (tkeep, tvalid, tready ...) и cmd регистр?

Извините, не понял вопроса.

Данные на мастере стрима уже готовы, ждут, пока им дадут реди. Реди даёт датамувер. Но датамуверу ещё не дали команду, он находился в сбросе. Затем сброс убрали, а он уже сразу же скушал 4 слова, при том без какой-либо команды. Т.е. реади 4 такта держал.

Share this post


Link to post
Share on other sites

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

Ежели чего нароете - отпишитесь здесь, пожалуйста. А то я до февраля к этой проблеме вряд ли вернусь.

Share this post


Link to post
Share on other sites
Но если не трудно, напишите в тех.поддержку Xilinx
Готово: http://forums.xilinx.com/t5/Embedded-Proce...ter/td-p/550684

 

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

Т.е. с этим жить можно, просто надо знать, как обходить.

 

Share this post


Link to post
Share on other sites

А, нет, потом дописали, мол, глаза разуйте, всё документировано.

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

Share this post


Link to post
Share on other sites
Извините, не понял вопроса.

Данные на мастере стрима уже готовы, ждут, пока им дадут реди. Реди даёт датамувер. Но датамуверу ещё не дали команду, он находился в сбросе. Затем сброс убрали, а он уже сразу же скушал 4 слова, при том без какой-либо команды. Т.е. реади 4 такта держал.

 

подскажите пожалуйста как организовали стрим в датамувер и из него в MM?

 

Использую датамувер для заполнения ДДР . Включил его в режиме FULL для S2MM с асинхронным command регистром. Сделал мастером на шине, слейв соответственно ДДР. Из датамувера наружу вывел ноги cmd, sts регистров, и s2mm_ tvalid, s2mm_tdata, tready, tlast, tkeep датамувера. На эти ноги буду вешать фифо. Далее как только фифо full и датамувер ready данные посылаю в ДДР по адресу указанному в cmd регистре.

 

пока проблемы с запуском датамувера. Просто делаю сброс по всем ресетам, должен по идее наблюдать сигнал ready от датамувера. Сигнал появляется на пару тактов и пропадает.

 

Идеологию понимаю так: есть реади из датамувера, даю ему валид, он вычитывает burst.

Share this post


Link to post
Share on other sites
подскажите пожалуйста как организовали стрим в датамувер и из него в MM?
Ну лучше бы Вам конкретизировать вопрос )) Моя корка на выходе имеет фифошку по идеологии стрима (по желанию можно взять готовую AXI-Stream FIFO из CoreGen'а, но у меня обычная, т.к. необходимо конвертировать разрядность, а та не умеет. Главное любая из них должна быть в режиме FWFT).

 

 

Использую датамувер для заполнения ДДР . Включил его в режиме FULL для S2MM с асинхронным command регистром. Сделал мастером на шине, слейв соответственно ДДР. Из датамувера наружу вывел ноги cmd, sts регистров, и s2mm_ tvalid, s2mm_tdata, tready, tlast, tkeep датамувера. На эти ноги буду вешать фифо.
Ну у меня тоже DDR, всё точно так же. Единственное: tkeep это для чего сигнал? Я его чото не использовал. Ещё смущает последовательность описанных действий:

как только фифо full и датамувер ready данные посылаю в ДДР по адресу указанному в cmd регистре.
Если я правильно понял. Вы хотите дождаться ready от датамувера, а затем посылать ему команду на пересылку? Это неправильно, он без команды не даст реади. Исключение - по сбросу 4 такта.

 

 

пока проблемы с запуском датамувера. Просто делаю сброс по всем ресетам, должен по идее наблюдать сигнал ready от датамувера. Сигнал появляется на пару тактов и пропадает.
Точно на пару? Должно на 4 судя по эпюрам в моём первом посте. И это не "должно" (как Вы пишете), а "так получилось" (недокументированная фича), т.е. это противоречит логике дальнейшей работы. Поэтому если "должно" соответствует Вашей логике, то она неправильная. Попробуйте разобраться повторно. Если что - спрашивайте конкретные вопросы - постараюсь ответить.

 

 

Идеологию понимаю так: есть реади из датамувера, даю ему валид, он вычитывает burst.
Это утверждение верно. Но у меня судя по наблюдениям не всегда полный бёрст вычитывает, иногда меньше почему-то. Может я хочу сильно много. Поставил максимально возможный для установки - 256 слов.

Share this post


Link to post
Share on other sites
Ну лучше бы Вам конкретизировать вопрос )) Моя корка на выходе имеет фифошку по идеологии стрима (по желанию можно взять готовую AXI-Stream FIFO из CoreGen'а, но у меня обычная, т.к. необходимо конвертировать разрядность, а та не умеет. Главное любая из них должна быть в режиме FWFT).

 

Вопрос такой: есть поток данных по 32 разряда, частота например 10 МГц, необходимо этот поток последовательно записать в ДДР (64 Мб). как можно сделать?

мой вариант такой: Для проекта собираю в xps ддр слейв, и мастер датамувер.

Для перехода с клокового домена потока в клоковый домен системы (ддр + дм), как я понимаю необходимо фифо. Фифо имеет вход "наружу", т.е. на запись потока, и выход в датамувер.

Я пока вывел наружу ноги дата мувера: валид, реади, дата и др. Сам фифо буду делать вне XPS.

Если я вас правильно понял?, варианты с фифо могут быть:

-- coregen ядро (выход прикручивать к дата муверу с "наружи")

-- в ise создавать самому (выход прикручивать к дата муверу с "наружи")

-- должно быть готовое фифо в xps (поглядываю в сторону этого варианта, ноги ядра в stream дата мувера "внутри", и ноги наружу).

 

 

Точно на пару? Должно на 4 судя по эпюрам в моём первом посте. И это не "должно" (как Вы пишете), а "так получилось" (недокументированная фича), т.е. это противоречит логике дальнейшей работы. Поэтому если "должно" соответствует Вашей логике, то она неправильная. Попробуйте разобраться повторно. Если что - спрашивайте конкретные вопросы - постараюсь ответить.

 

все верно: на 4 такта как в начале темы.

 

 

Share this post


Link to post
Share on other sites
Вопрос такой: есть поток данных по 32 разряда, частота например 10 МГц, необходимо этот поток последовательно записать в ДДР (64 Мб). как можно сделать?

мой вариант такой: Для проекта собираю в xps ддр слейв, и мастер датамувер.

Для перехода с клокового домена потока в клоковый домен системы (ддр + дм), как я понимаю необходимо фифо. Фифо имеет вход "наружу", т.е. на запись потока, и выход в датамувер.

Я пока вывел наружу ноги дата мувера: валид, реади, дата и др. Сам фифо буду делать вне XPS.

Если я вас правильно понял?, варианты с фифо могут быть:

-- coregen ядро (выход прикручивать к дата муверу с "наружи")

-- в ise создавать самому (выход прикручивать к дата муверу с "наружи")

-- должно быть готовое фифо в xps (поглядываю в сторону этого варианта, ноги ядра в stream дата мувера "внутри", и ноги наружу).

Данные утверждения все верные. Небольшие комментарии:

 

-- в ise создавать самому (выход прикручивать к дата муверу с "наружи")
Думаю асинхронное фифо городить самому - неблагодарное занятие. Синхронные - ещё куда ни шло... Лучше взять готовую корку из коргена, кучу времени сэкономите.

 

-- должно быть готовое фифо в xps (поглядываю в сторону этого варианта, ноги ядра в stream дата мувера "внутри", и ноги наружу).
Я такую не находил, взял AXI FIFO из коргена и обернул как User IP Core для XPS. Сейчас ещё раз прошёлся поиском по слову FIFO по компонентам в стандартном репозитории - ничего подходящего не предложило.

 

С логикой реади из датамувера удалось разобраться после моих разъяснений?

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