Pasha 0 May 19, 2022 Posted May 19, 2022 · Report post На данный момент принимаю в плис отчёты по 64бита и складываю их в ОЗУ внутри своего ip-ядра ПЛИС. Когда нужно процессор у меня их забирает через AXI, кладет в динамическую память, потом отправляет по юзернету. Поставили задачу отправлять отчёты сразу в динамическкю память из ip-ядра, не складируя в отдельной памяти ядра. Предположили, что через dma контролёр это можно организовать. Плата arty Z7-20. Возможна ли реализация? Если возможна, то выходной интерфейс своего ip-ядра тоже AXI нужно пилить? Quote Share this post Link to post Share on other sites More sharing options...
aabmail 0 May 19, 2022 Posted May 19, 2022 · Report post Возможна при использовании axi_dma. При данной конфигурации axi_dma имеет на входе AXI4stream slave, на выходе AXI4MM master. Выходной интерфейс источника данных должен быть AXI4stream master. Quote Share this post Link to post Share on other sites More sharing options...
Pasha 0 May 19, 2022 Posted May 19, 2022 · Report post А если без AXI? Нашел в PS на странице PS-PL Configuration вкладку DMA Controller > Peripheral request interface. Через него может работать? А то вручную организовывать AXI4stream master для меня та ещё задачка =) Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 May 19, 2022 Posted May 19, 2022 · Report post 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. Quote Share this post Link to post Share on other sites More sharing options...
RuSTA 0 May 20, 2022 Posted May 20, 2022 (edited) · Report post Можно свою корку написать для конвертирования из axis в axi, в том числе axi-lite через interconnector. Там не так сложно. В этом случае не надо настраивать dma. Edited May 20, 2022 by RuSTA Quote Share this post Link to post Share on other sites More sharing options...
Pasha 0 May 23, 2022 Posted May 23, 2022 · Report post 20.05.2022 в 11:58, RuSTA сказал: Можно свою корку написать для конвертирования из axis в axi, в том числе axi-lite через interconnector. Там не так сложно. В этом случае не надо настраивать dma. А можно сразу axi-lite со своего ip-ядра вывести. Потому что стрим впринципе не очень подходит. Мне адрес инкрементировать нужно. А по встроенному DMA Controller Peripheral request interface можете подсказать как работает. Там отдельный интерфейс ахи через интерконнект и отдельный на работу контроллера? Quote Share this post Link to post Share on other sites More sharing options...
Pasha 0 May 24, 2022 Posted May 24, 2022 · Report post А если я прикручу мастер интерфейс axi-lite. Подключу его к интерконекту. А потом к интерфейсу slave axi-lite в процессорной системе. И буду посылать раз в несколько десятков милисекунд 2 слова по 32 байта в нужные мне адреса. А когда передам нужное количество просто дам прерывание. Так будет работать или обязательно нужен axi-dma, что бы он доступ к памяти обеспечивал? Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 May 24, 2022 Posted May 24, 2022 · Report post 8 minutes ago, Pasha said: А если я прикручу мастер интерфейс axi-lite. Подключу его к интерконекту. А потом к интерфейсу slave axi-lite в процессорной системе. И буду посылать раз в несколько десятков милисекунд 2 слова по 32 байта в нужные мне адреса. А когда передам нужное количество просто дам прерывание. Так будет работать или обязательно нужен axi-dma, что бы он доступ к памяти обеспечивал? Для случая DMA всё уже сделано за вас. Вам остаётся разобраться с работой DMA со стороны процессорной системы и сформировать из ваших "отчёты по 64бита" AXI4-Stream (разбить ваши данные на пакеты определённого размера, сформировать TLAST). Quote Share this post Link to post Share on other sites More sharing options...
Pasha 0 May 24, 2022 Posted May 24, 2022 (edited) · Report post 3 часа назад, doom13 сказал: Для случая DMA всё уже сделано за вас. Вам остаётся разобраться с работой DMA со стороны процессорной системы и сформировать из ваших "отчёты по 64бита" AXI4-Stream (разбить ваши данные на пакеты определённого размера, сформировать TLAST). Я наверное не правильно объясняю. Суть в том, что раз в 40 микросекунд в ПЛИС поступают последовательно данные 64 бита. Мне нужно отправить эти 64 бита в какой-то адрес памяти на PS и ждать 40 милисекунд следующие 64 бита, чтобы положить их в следующий адрес. А когда процессору будет нужно он их уже оттуда передаст в ПК. Как я понял, в случае axi-stream я сначала должен все данные собрать в ОЗУ ПЛИС, а потом целиком передать весь пакет. Но процессор итак из ОЗУ ПЛИС может забрать через свой master-axi. Суть в том, чтобы избавиться от ОЗУ в ПЛИС и работать с DDR напрямую. Edited May 24, 2022 by Pasha Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 May 24, 2022 Posted May 24, 2022 · Report post 1 hour ago, Pasha said: А когда процессору будет нужно он их уже оттуда передаст в ПК. Это событие как часто происходит? Размер данных для отправки на ПК какой? Ещё можете в сторону AXI DataMover посмотреть. Quote Share this post Link to post Share on other sites More sharing options...
Pasha 0 May 24, 2022 Posted May 24, 2022 (edited) · Report post 20 минут назад, doom13 сказал: Это событие как часто происходит? Размер данных для отправки на ПК какой? Ещё можете в сторону AXI DataMover посмотреть. По запросу с ПК. Нечасто, секунды, а то и через десяток секунд. По 1000 отчетов. И возможно будет вариант с кольцевым буфером, когда самый старый отчёт будет переписываться новым. Поэтому возможность задать адрес должна быть. AXI Data mover начал смотреть. Ещё пытаюсь разобраться со встроенным DMAC PL Peripheral request interface. Там, судя по управлению, можно отсылать по одному слову. Но непонятно как к нему шину AXI прикрутить и как между собой они согласовываются. Примеров его реализации тоже не нашел ни одного. Edited May 24, 2022 by Pasha Quote Share this post Link to post Share on other sites More sharing options...
Pasha 0 May 26, 2022 Posted May 26, 2022 · Report post Похоже я неправильно понял работу AXI stream. Получается, если я буду успевать снимать m_axis_tvalid до следующего m_axis_tready, то спокойно смогу дождаться следующий отчёт и выставить m_axis_tvalid, а m_axis_tlast выставить только на последнем отчёте? А распихивать по адресам в DDR уже программист будет или это тоже аппаратно настраивается? Quote Share this post Link to post Share on other sites More sharing options...
карамболь 0 May 26, 2022 Posted May 26, 2022 · Report post 2 hours ago, Pasha said: Похоже я неправильно понял работу AXI stream. Получается, если я буду успевать снимать m_axis_tvalid до следующего m_axis_tready, то спокойно смогу дождаться следующий отчёт и выставить m_axis_tvalid, а m_axis_tlast выставить только на последнем отчёте? А распихивать по адресам в DDR уже программист будет или это тоже аппаратно настраивается? Программист в драйвере выделит кусок памяти в ДДР и вернет вам ее физический адрес. Как то так Quote Share this post Link to post Share on other sites More sharing options...
aabmail 0 May 26, 2022 Posted May 26, 2022 · Report post Да. Адреса памяти, по которым будут поступать данные, определяется программистами на стороне PS. По поводу tready. Как я понимаю, у вас сравнительно небольшой поток данных. Вы можете между источником данных и axi_dma поставить буфер fifo (кажется axi_stream_data_fifo он называется), выбрать подходящий размер (допустим, 2 килобайта). Если fifo не переполняется, то он всегда будет готов принимать данные, и гркбо говоря вам не надо проверять его готовность. Когда пишете, поднимаете tvalid. Не пишете - опускаете. В буфер будут записано то, что находится на линии данных к те такты, когда tvalid=1. Передача через DMA происходит порциями. Вы со своим программистом должны договориться о размере порции. Передача порции инициируется в PS. Там же при старте указывается объем данных, которые будут передаваться. Потом вы передаете данные. В конце вместе с последним передаваемым слвоом надо выставить tlast. Это фактически команда на закрытие передачи. Если не поднять tlast, будет косяк. Пропадет часть данных, ну или еще что-то... Quote Share this post Link to post Share on other sites More sharing options...
Dvorkin 0 September 12, 2022 Posted September 12, 2022 · Report post Данные в ПЛИС не надо накапливать, передавайте их по мере поступления. Принятые 64-битные слова пишутся в FIFO, если в FIFO есть данные, то TVALID=1, можно передавать по DMA. Quote Share this post Link to post Share on other sites More sharing options...