Jump to content
    

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

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

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

Плата arty Z7-20.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

А если без AXI?

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

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

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Edited by RuSTA

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

8 minutes ago, Pasha said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Edited by Pasha

Share this post


Link to post
Share on other sites

1 hour ago, Pasha said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Edited by Pasha

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

2 hours ago, Pasha said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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...