Jump to content

    

Recommended Posts

Всем привет, взываю к помощи так как кажется потерялся в дебрях Цинка.

 

Что хочется

Принимать данные по Ethernet, складывать их в память DDR3, доставать их оттуда, обеспечить доступ к этим данным другим ядрам.

 

Что есть

1) Запустил проект с LwIP вроде xapp. Вижу принятые и отправленные пакеты, посмотрел на них в WireShark, пописал свои пакеты туда с PC и обратно с платформы. Но пока для меня это все выглядит как черный ящик, где я с одной стороны вызываю tcp_recv и tcp_recv, которые внутри себя вызывают LwIP стек, который основан на драйверах Xilinx, которые там что то колдуют с регистрами контроллеров памяти,эзернета и ДМА описанными в UG585

2) Запустил проекты с MIG+ процессорное ядро. Пописал данные в память, почитал через AXI,

3) Пописал принятые по TCP данные в MIG напрямую из процессора. Делал напрямую "в лоб"

 *(Addr+I) = Val;

Где адрес соответственно ссылается на диапазон памяти принадлежащий подключенному MIG

4) Запустил тестовый проект с AXI DMA, пописал данные в память через него.

 

Что делать дальше непонятно, так как не понимаю многих вещей

1) Правильно ли я понял, что LwIP работает исключительно в пределах PS, использует только аппаратный DMA, складывает данные только в память, которая подключена к PS?

 

2) Как в таком случае правильно принять пакеты из Ethernet?

2.1) Если процессор занят обработкой протоколов Ethernet, TCP, IP в рамках выполнения LwIP-программ, то и в память он получается может писать принятые данные сам без ДМА?

2.2) Или он может передавать в DMA команду "бери данные из памяти вот тут вот столько и грузи в MIG"?

2.3) Или надо поток данных из GigE контроллера направить через аппаратный DMA в подключенный напрямую к процессору MIG? И потом вызывать прерывания для обработки?

2.4) Или надо поток данных из GigE напрвавить в MIG через AXI-DMA и дергать прерывание уже им?

 

3) Обязательно ли в такой задаче использовать TCP/IP? Если например стоит задача передавать данные от PC к непосредственно подключенной плате, можно ли использовать голый Ethernet, складывая свои данные в его payload?

 

4) Зачем вообще в множестве проектов используется AXI DMA, когда в PS есть аппаратный 8 канальный DMA-330? Почему не обходятся только им?

 

Share this post


Link to post
Share on other sites

Приветствую!

 

Всем привет, взываю к помощи так как кажется потерялся в дебрях Цинка.

 

Что хочется

Принимать данные по Ethernet, складывать их в память DDR3, доставать их оттуда, обеспечить доступ к этим данным другим ядрам.

 

Что есть

1) Запустил проект с LwIP вроде xapp. Вижу принятые и отправленные пакеты, посмотрел на них в WireShark, пописал свои пакеты туда с PC и обратно с платформы. Но пока для меня это все выглядит как черный ящик, где я с одной стороны вызываю tcp_recv и tcp_recv, которые внутри себя вызывают LwIP стек, который основан на драйверах Xilinx, которые там что то колдуют с регистрами контроллеров памяти,эзернета и ДМА описанными в UG585

Ну вот Ваше желание уже почти исполнилось! Ведь пакеты уже принимаются и складываются в DDR3 память подключенную к PS

 

2) Запустил проекты с MIG+ процессорное ядро. Пописал данные в память, почитал через AXI,

Еще одна память ? теперь уже на PL?

3) Пописал принятые по TCP данные в MIG напрямую из процессора. Делал напрямую "в лоб"

 *(Addr+I) = Val;

Где адрес соответственно ссылается на диапазон памяти принадлежащий подключенному MIG

4) Запустил тестовый проект с AXI DMA, пописал данные в память через него.

 

Что делать дальше непонятно, так как не понимаю многих вещей

1) Правильно ли я понял, что LwIP работает исключительно в пределах PS, использует только аппаратный DMA, складывает данные только в память, которая подключена к PS?

Данные пересылаются по адресу указанному в дескрипторе буферов для DMA. Можно задать адрес не в памяти а в пространстве GP AXI Master порта к которому будут подключены Ваши корки для обработки пакетов.

 

2) Как в таком случае правильно принять пакеты из Ethernet?

Это философский вопрос - что значит правильно?

Для ответа на него нужно определится с желаемым - что же вы хотите построить?

 

Успехов! Rob.

 

 

Share this post


Link to post
Share on other sites
Еще одна память ? теперь уже на PL?

 

Да, именно. Стандартаный Xilinx контроллер MIG для DDR3

 

Данные пересылаются по адресу указанному в дескрипторе буферов для DMA. Можно задать адрес не в памяти а в пространстве GP AXI Master порта к которому будут подключены Ваши корки для обработки пакетов.

 

Не очень понимаю. Сейчас LwIP возвращает указатель на Pbuf https://www.cs.cmu.edu/~srini/15-441/F01.fu...plit/node5.html Данные, заголовок.

Надо поменять прожку так, чтобы он для аллокации использовал всю память?

 

Это философский вопрос - что значит правильно?

Для ответа на него нужно определится с желаемым - что же вы хотите построить?

Успехов! Rob.

Правильно это без костылей и велосипедов, как было задумано авторами :)

 

Допустим я вижу указатели на нагрузку и длину пакета

p->payload, p->len

Они хранятся в PS DDR. Хочу положить их в SODIMM DDR.

Надо запустить Memory to memory транзакцию?

Share this post


Link to post
Share on other sites

Приветствую!

 

Правильно это без костылей и велосипедов, как было задумано авторами :)

Я не профессиональный телепат - очень сложно проникать в мысли автора тем более если "...этот пацак все время говорит на языках, продолжение которых не знает" Ку! :) И если без "костылей и велосипедов" - то только ножками шаг за шагом.

 

Не очень понимаю. Сейчас LwIP возвращает указатель на Pbuf https://www.cs.cmu.edu/~srini/15-441/F01.fu...plit/node5.html Данные, заголовок.

Надо поменять прожку так, чтобы он для аллокации использовал всю память?

:cranky: :cranky: :cranky:

 

Допустим я вижу указатели на нагрузку и длину пакета

p->payload, p->len

Они хранятся в PS DDR. Хочу положить их в SODIMM DDR.

Надо запустить Memory to memory транзакцию?

Да - других способов скопировать данные в памяти я не знаю.

Вопрос только каким способом автору это будет более "правильно" :

A ) вызвав memcpy, ("правильно" с точки зрения простоты)

B ) использовав внутренний DMA, ("правильно" с точки зрения производительности)

С ) задействовал внешний CDMA в PL ("правильно" с точки зрения структуры системы)

D ) собственную корку для пересылки данных ("правильно" со всех точек зрения :) )

 

В первых двух случаях данные в PL будут попадать через GP AXI Master что ограничивать скорость пересылки шиной 32 бит.

В двух других - доступ к данным идет через HP Slave что более "правильно" с точки зрения скорости.

 

Успехов! Rob.

 

 

Share this post


Link to post
Share on other sites

Приветствую.

Возник вопрос - как правильно подключать AXI DMA к PS?

DMA использует режим Scatter-Gather, управляется драйвером Linux (дескрипторы и буферы для данных

выделяются ядром динамически в PS DDR3). M_AXI_SG (32 bit) и M_AXI_S2MM (64 bit) получают доступ к PS DDR3 через S_AXI_HP порт процессорной системы.

Есть ли смысл подключения M_AXI_SG через S_AXI_GP порт?

Спасибо.

Share this post


Link to post
Share on other sites

Добрый день. Возник такой же вопрос. Подскажите идеологию саму, как правильно надо делать? Плата zc706, надо поднять ethernet, который будет принимать данные и отсылать их в PL DDR3. Надо использовать именно PL память, чтобі собственные IP ядра имели к ней доступ. Как правильно подключить PL DDR3 к процессору?

1. В аппаратной части использовать порт процессора М_AXI_GP0, который будет подключен к AXI Interconect, а к AXI Interconect подключу MIG

2. В аппаратной части использовать порт процессора М_AXI_GP0, который через AXI Interconect будет подключен к AXI DMA, AXI DMA подключить к MIG (не знаю пока можно так делать или нет).

Напишите, пожалуйста, что и как правильно. В какую сторону надо копать.

На процессоре zynq планирую создать проект в SDK на базе LwIP echo server, который будет полученые tcp пакеті складывать по адрессу PL DDR3.

 

Share this post


Link to post
Share on other sites

Приветствую!

Добрый день. Возник такой же вопрос. Подскажите идеологию саму, как правильно надо делать? Плата zc706, надо поднять ethernet, который будет принимать данные и отсылать их в PL DDR3. Надо использовать именно PL память, чтобі собственные IP ядра имели к ней доступ. Как правильно подключить PL DDR3 к процессору?
Ох уж это "правильно" Я на вскидку могу придумать 5-7 вариантов и все они будут правильные (для меня).

Будет ли они праведильными для Вас будет зависит от критериев этой правильности.

 

1. В аппаратной части использовать порт процессора М_AXI_GP0, который будет подключен к AXI Interconect, а к AXI Interconect подключу MIG

2. В аппаратной части использовать порт процессора М_AXI_GP0, который через AXI Interconect будет подключен к AXI DMA, AXI DMA подключить к MIG (не знаю пока можно так делать или нет).

...

На процессоре zynq планирую создать проект в SDK на базе LwIP echo server, который будет полученые tcp пакеті складывать по адрессу PL DDR3.

Правильно для начала почитать описание Zynq, AXI шины и MIG контроллера.

Затем прикинуть и нарисовать на листике структуру обработки данных с предполагаемыми объемами данных - что от куда приходить - куда сохраняется - кто и что будет читать|писать данные - как часто? Затем совместив это с остатком знаний от чтения доков подумать как можно использовать то что уже есть. Оценив результат повторить итерацию 2-3 раза. Затем когда бумага кончится поделится с нами результатом. :) Ну а мы естественно скажем что это не правильно и предложим свои варианты.

 

Внешние IP core в PL могут прекрасно получать доступ к данным в памяти PS DDR (через HP AXI порт). И если пропускной способности достаточно то можно напрямую пускать пастись Ваши IP в память PS. Ну или поставив CDMA таскать эти данные и складывать в тот же в PL MIG. Если же использовать М_AXI_GP* то в этом случае CPU может напрямую писать в память (memcpy) или использовать встроенный в ZYNQ DMA.

 

... Напишите, пожалуйста, что и как правильно. В какую сторону надо копать.
Если картошку сажать то вширь, если уголек добывать то вглубь, "подкоп" под начальника не предлагаю :)

 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Добрый день!

Сделал пока так как описал в первом варианте: В аппаратной части использую порт процессора М_AXI_GP0, который подключен к AXI Interconect, а к AXI Interconect подключу MIG ядру. В SDK проект на основе xapp1026 - TCP RX throughput test. Запустил консольную программу iperf для тестирования пропускной способности, если принятые пакеты не писать во внешнюю PL DDR3, то скорость порядка 40 Мbit/s, если писать во внешнюю PL DDR3 принятые пакеты, то скорость падает до 11 Мbit/s.

Если загрузить в SDK проект на основании xapp1026 - TCP TX throughput test, то есть когда я постоянно с платы шлю пакеты (в данном проекте я не использую PL DDR3), то скорость передачи iperf показывает порядка 250 Мbit/s.

Почему скорость приема так отличается от скорости передачи? Возможно это специфика кода проекта xapp1026, не уверен. Поделитесь у кого какие скоростя были на основание данного проекта xapp1026

Share this post


Link to post
Share on other sites

Добрый вечер! Возник еще один вопрос! За основу для SDK взят проект echo server xapp1026, передаю с помощью iperf файл данных с ПК на плату zc706, полученные данные пишу в память. Как понять, что пришел последний пакет данных, TCP соединение закрывается FIN пакетом на сколько я знаю. В коде echo server как можно задетектировать этот пакет? или как мне отобразить статус TCP соединения?

Share this post


Link to post
Share on other sites
Приветствую.

Возник вопрос - как правильно подключать AXI DMA к PS?

DMA использует режим Scatter-Gather, управляется драйвером Linux (дескрипторы и буферы для данных

выделяются ядром динамически в PS DDR3). M_AXI_SG (32 bit) и M_AXI_S2MM (64 bit) получают доступ к PS DDR3 через S_AXI_HP порт процессорной системы.

Есть ли смысл подключения M_AXI_SG через S_AXI_GP порт?

Спасибо.

 

Как подключать зависит от того какой поток (сколько и за какое время) и сколько каналов (потоков). Если данных не очень много то можно всё через ***_GP пустить. Обычно данные (когда они быстрые и ихмного) )подключаются через S_AXI_HP(порт цынка), а управление через M_AXI_GP(порт цынка). Если ваш контроллер и дескрипторы сам забирает, то конечно, не стесняйтесь, подключайте его к S_AXI_GP PS.

 

Share this post


Link to post
Share on other sites

Добрый день. Подниму старую тему. У меня возникла аналогичная задача - на Zynq 7020 прилетают данные с сетевого интерфейса, размещенного в PL и складываются в ОЗУ DDR3 через MIG, размещенный в PL. PS должен получать кусочки этого буфера (размер кусочка до 20 МБ). Вижу два варианта решения задачи:

1. Цифровой автомат по запросу PS запрашивает данные из MIG и направляет их в ОЗУ PS через HP AXI Slave . В этом случае у процессора нет прямого доступа к памяти на PL. Но скорость должна быть выше.

2. Обращаться к MIG посредством GP AXI-Master, адресацию сделать страничной по 4М. Несомненное достоинство - прямая адресация. Вопрос в том, какой скорости можно таким образом достичь. В сообщении выше фигурировало значение 11 Мбит/с. Если более высокой скорости (хотя бы 100 Мбит/с) достичь нельзя, то эта затея не имеет смысла.

Кто-нибудь пробовал делать нечто подобное?

Share this post


Link to post
Share on other sites

эмм, т.е. у вас две независимые памяти на борту ? проще лить в одну память, к процу подключенную. Scather-Gather DMA не рассматривается?

Share this post


Link to post
Share on other sites

Да, две независимые. В одну лить проще, но нужен объем, превышающий 1GB.

 

Собственно, нечто типа Scatter-gather DMA я имел в виду под №1.

Edited by vitzap

Share this post


Link to post
Share on other sites

ZynqMP - здорово, только микросхемы серии Ultrascale стоят существенно больше, поэтому рассматривается решение с двумя независимыми банками.

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.