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

Чтение ядром PL данных из DDR PS Zynq

Здравствуйте!

Столкнулся с проблемой чтения данных из DDR, подключенной к Zynq. Т.е. работа предполагается такая: при старте системы процессор из флешки копирует определенный массив значений, эти значения используются кастомным ядром в PL. При этом выборка значений случайная (массив большой)...

Писать поток (тоже надо) в DDR через DMA я умею и прекрасно с этим справляюсь, но вот чтение да еще не поточное а по случайным адресам пока толком не понимаю как сделать...

Есть предположение использовать CDMA, при этом к порту S_AXI_LITE подключается моя корка и генерит запросы чтения по нужным адресам (или пишет в регистры CDMA что и откуда прочитать...???)... Это будет работать? Или это не правильный путь?

Может есть способ проще?

Изменено пользователем svedach

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


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

Здравствуйте!

Столкнулся с проблемой чтения данных из DDR, подключенной к Zynq. Т.е. работа предполагается такая: при старте системы процессор из флешки копирует определенный массив значений, эти значения используются кастомным ядром в PL. При этом выборка значений случайная (массив большой)...

Писать поток (тоже надо) в DDR через DMA я умею и прекрасно с этим справляюсь, но вот чтение да еще не поточное а по случайным адресам пока толком не понимаю как сделать...

Есть предположение использовать CDMA, при этом к порту S_AXI_LITE подключается моя корка и генерит запросы чтения по нужным адресам (или пишет в регистры CDMA что и откуда прочитать...???)... Это будет работать?

Может есть способ проще?

Посмотри SG DMA. Там создаёшь лист дескрипторов с указателями на данные для чтения/записи. Когда нужно быстро было переключаться между разными адресами ддр я его использовал

 

Кажется нащупал верный путь: DataMover!!!

Буду пробовать...

 

Датамувер это движок sg dma.

Изменено пользователем Alexey_Rostov

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


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

Алексей, привет!

Проясни "Датамувер это движок sg dma"... Что значит движок?

Датамувер вроде неплохо подходит - кенеришь ему команды и на выходе получаешь поток данных, если я правильно понял...

Изменено пользователем svedach

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


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

Алексей, привет!

Проясни "Датамувер это движок sg dma"... Что значит движок?

Датамувер вроде неплохо подходит - кенеришь ему команды и на выходе получаешь поток данных, если я правильно понял...

Привет ) Датамувер входит в состав SG DMA и выполняет транзакции на шине данных. Для обмена с ДДР датамувер подходит, но тебе каждый раз прийдется записывать указатели и стартовать датамувер заново, плюс ко всему, насколько я помню, интерфейс для записи указателей у датамувера не акси: я записывал адреса для обмена из логики, а не из СНК. Если ты при обмене для работы с указателями используешь процессор, то SG DMA очень удобное решение с точки зрения работы с указателями на массивы данных в ддр

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


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

Я тоже генерирую команды датамуверу из логики, почитал доки - структура команд простая:) + есть фифо команд. Он кстати удобно перекладывает прочитанные данные в АКСИ Стрим + можно указывать последний запрос - по нему будет генериться tlast. По этому стробу удобно запускать обработку принятых данных...

Делаю автомат состояний для генерации команд, попробую - отпишусь что да как...

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


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

Я тоже генерирую команды датамуверу из логики, почитал доки - структура команд простая:) + есть фифо команд. Он кстати удобно перекладывает прочитанные данные в АКСИ Стрим + можно указывать последний запрос - по нему будет генериться tlast. По этому стробу удобно запускать обработку принятых данных...

Делаю автомат состояний для генерации команд, попробую - отпишусь что да как...

 

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

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


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

Алексей, привет!

Наблюдаю следующую картину:

image.png

 

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

 

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


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

Все, разобрался, оказывается шину статуса тоже обязательно надо читать (или хотя бы установить *_sts_tready в "1")...

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


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

Все, разобрался, оказывается шину статуса тоже обязательно надо читать (или хотя бы установить *_sts_tready в "1")...

 

Статусный реади я вообще в 1 поставил и не трогал больше, только отслеживал sts_tvalid.

Изменено пользователем Alexey_Rostov

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


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

У меня сейчас sts_tdata периодически становится 0x40 - ошибка от слейва...

Не сталкивался с таким?

 

image.png

 

При чем после того, как восстанавливается 0x80 (в конце времянки) дальше всегда вроде 0x80. Похоже на то, что какой-то регион памяти недоступен для чтения, или я не правильно понимаю?

P.S. Адреса чтения пока - просто последовательность о 0 до 2621440, заданы только для теста....

Изменено пользователем svedach

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


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

У меня сейчас sts_tdata периодически становится 0x40 - ошибка от слейва...

Не сталкивался с таким?

 

image.png

 

При чем после того, как восстанавливается 0x80 (в конце времянки) дальше всегда вроде 0x80. Похоже на то, что какой-то регион памяти недоступен для чтения, или я не правильно понимаю?

P.S. Адреса чтения пока - просто последовательность о 0 до 2621440, заданы только для теста....

 

У меня была DDR на ML605 и там была проблема записи в определенный регион памяти. я просто исключил его из работы.

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


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

В общем это действительно был какой-то специфический регион... Задал смещение в распределенную в SDK память и всегда 0x80.

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


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

В общем это действительно был какой-то специфический регион... Задал смещение в распределенную в SDK память и всегда 0x80.

А что значит "распределённая в SDK память "?

 

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


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

Я по AXI в регистр в своей корке пишу адрес статического массива (это и есть распределенная память :)) и с этого адреса начинаю читать...

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...