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

Zynq7000 Запись данных из PL в ddr через dma

 На данный момент принимаю в плис отчёты по 64бита и складываю их в ОЗУ внутри своего ip-ядра ПЛИС. Когда нужно процессор у меня их забирает через AXI, кладет в динамическую память, потом отправляет по юзернету.

Поставили задачу отправлять отчёты сразу в динамическкю память из ip-ядра, не складируя в отдельной памяти ядра. Предположили, что через dma контролёр это можно организовать.

Плата arty Z7-20.

Возможна ли реализация? Если возможна, то выходной интерфейс своего ip-ядра тоже AXI нужно пилить?

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


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

Возможна при использовании axi_dma. При данной конфигурации axi_dma имеет на входе AXI4stream slave, на выходе AXI4MM master.  Выходной интерфейс источника данных должен быть AXI4stream master.

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


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

А если без AXI?

Нашел в PS на странице PS-PL Configuration вкладку DMA Controller > Peripheral request interface.

Через него может работать?

А то вручную организовывать AXI4stream master для меня та ещё задачка =)

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


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

3 hours ago, Pasha said:

 

А то вручную организовывать AXI4stream master для меня та ещё задачка =)

Там нет ничего сложного, интерфейс с пятью портами реализовать: m_axis_aclk, m_axis_tvalid, m_axis_tready, m_axis_tlast, m_axis_tdata[n-1:0].

Можно и без tready, поставите фифо между вашим ядром и AXI DMA, которое будет буферизировать данные на время перезарядки DMA.

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


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

Можно свою корку написать для конвертирования из axis в axi, в том числе axi-lite через interconnector. Там не так сложно. В этом случае не надо настраивать dma.

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

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


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

20.05.2022 в 11:58, RuSTA сказал:

Можно свою корку написать для конвертирования из axis в axi, в том числе axi-lite через interconnector. Там не так сложно. В этом случае не надо настраивать dma.

А можно сразу axi-lite со своего ip-ядра вывести. Потому что стрим впринципе не очень подходит. Мне адрес инкрементировать нужно. 

А по встроенному DMA Controller Peripheral request interface можете подсказать как работает. Там отдельный интерфейс ахи через интерконнект и отдельный на работу контроллера?

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


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

А если я прикручу мастер интерфейс axi-lite. Подключу его к интерконекту. А потом к интерфейсу slave axi-lite в процессорной системе. И буду посылать раз в несколько десятков милисекунд 2 слова по 32 байта в нужные мне адреса. А когда передам нужное количество просто дам прерывание. Так будет работать или обязательно нужен axi-dma, что бы он доступ к памяти обеспечивал?

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


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

8 minutes ago, Pasha said:

А если я прикручу мастер интерфейс axi-lite. Подключу его к интерконекту. А потом к интерфейсу slave axi-lite в процессорной системе. И буду посылать раз в несколько десятков милисекунд 2 слова по 32 байта в нужные мне адреса. А когда передам нужное количество просто дам прерывание. Так будет работать или обязательно нужен axi-dma, что бы он доступ к памяти обеспечивал?

Для случая DMA всё уже сделано за вас. Вам остаётся разобраться с работой DMA со стороны процессорной системы и сформировать из ваших "отчёты по 64бита" AXI4-Stream (разбить ваши данные на пакеты определённого размера, сформировать TLAST).

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


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

3 часа назад, doom13 сказал:

Для случая DMA всё уже сделано за вас. Вам остаётся разобраться с работой DMA со стороны процессорной системы и сформировать из ваших "отчёты по 64бита" AXI4-Stream (разбить ваши данные на пакеты определённого размера, сформировать TLAST).

Я наверное не правильно объясняю. 

Суть в том, что раз в 40 микросекунд в ПЛИС поступают последовательно данные 64 бита. Мне нужно отправить эти 64 бита в какой-то адрес памяти на PS и ждать 40 милисекунд следующие 64 бита, чтобы положить их в следующий адрес. А когда процессору будет нужно он их уже оттуда передаст в ПК.

Как я понял, в случае axi-stream я сначала должен все данные собрать в ОЗУ ПЛИС, а потом целиком передать весь пакет.

Но процессор итак из ОЗУ ПЛИС может забрать через свой master-axi. Суть в том, чтобы избавиться от ОЗУ в ПЛИС и работать с DDR напрямую.

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

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


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

1 hour ago, Pasha said:

А когда процессору будет нужно он их уже оттуда передаст в ПК.

Это событие как часто происходит? Размер данных для отправки на ПК какой?

Ещё можете в сторону AXI DataMover посмотреть.

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


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

20 минут назад, doom13 сказал:

Это событие как часто происходит? Размер данных для отправки на ПК какой?

Ещё можете в сторону AXI DataMover посмотреть.

По запросу с ПК. Нечасто, секунды, а то и через десяток секунд. По 1000 отчетов. И возможно будет вариант с кольцевым буфером, когда самый старый отчёт будет переписываться новым. Поэтому возможность задать адрес должна быть. AXI Data mover начал смотреть.

Ещё пытаюсь разобраться со встроенным DMAC PL Peripheral request interface. Там, судя по управлению, можно отсылать по одному слову. Но непонятно как к нему шину AXI прикрутить и как между собой они согласовываются. Примеров его реализации тоже не нашел ни одного.

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

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


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

Похоже я неправильно понял работу AXI stream. Получается, если я буду успевать снимать m_axis_tvalid до следующего m_axis_tready, то спокойно смогу дождаться следующий отчёт и выставить m_axis_tvalid, а m_axis_tlast выставить только на последнем отчёте?

А распихивать по адресам в DDR уже программист будет или это тоже аппаратно настраивается?

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


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

2 hours ago, Pasha said:

Похоже я неправильно понял работу AXI stream. Получается, если я буду успевать снимать m_axis_tvalid до следующего m_axis_tready, то спокойно смогу дождаться следующий отчёт и выставить m_axis_tvalid, а m_axis_tlast выставить только на последнем отчёте?

А распихивать по адресам в DDR уже программист будет или это тоже аппаратно настраивается?

Программист в драйвере выделит кусок памяти в ДДР и вернет вам ее физический адрес. Как то так

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


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

Да. Адреса памяти, по которым будут поступать данные, определяется программистами на стороне PS.

По поводу tready. Как я понимаю, у вас сравнительно  небольшой поток данных. Вы можете между источником данных и axi_dma поставить буфер fifo (кажется axi_stream_data_fifo он называется), выбрать подходящий размер (допустим, 2 килобайта). Если fifo не переполняется, то он всегда будет готов принимать данные, и гркбо говоря вам не надо проверять его готовность. Когда пишете, поднимаете tvalid. Не пишете - опускаете. В буфер будут записано то, что находится на линии данных к те такты, когда tvalid=1.

Передача через DMA происходит порциями. Вы со своим программистом должны договориться о размере порции. Передача порции инициируется в PS.  Там же при старте указывается объем данных, которые будут передаваться. Потом вы передаете данные. В конце вместе с последним передаваемым слвоом надо выставить tlast. Это фактически команда на закрытие передачи. Если не поднять tlast, будет косяк. Пропадет часть данных, ну или еще что-то...

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


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

Данные в ПЛИС не надо накапливать, передавайте их по мере поступления. Принятые 64-битные слова пишутся в FIFO, если в FIFO есть данные, то TVALID=1, можно передавать по DMA.

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


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

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

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

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

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

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

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

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

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

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