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

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

 

Что хочется

Принимать данные по 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? Почему не обходятся только им?

 

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


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

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

 

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

 

Что хочется

Принимать данные по 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.

 

 

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


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

Еще одна память ? теперь уже на 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 транзакцию?

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


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

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

 

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

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

 

Не очень понимаю. Сейчас 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.

 

 

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


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

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

Возник вопрос - как правильно подключать 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 порт?

Спасибо.

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


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

Добрый день. Возник такой же вопрос. Подскажите идеологию саму, как правильно надо делать? Плата 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.

 

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


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

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

Добрый день. Возник такой же вопрос. Подскажите идеологию саму, как правильно надо делать? Плата 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.

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


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

Добрый день!

Сделал пока так как описал в первом варианте: В аппаратной части использую порт процессора М_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

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


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

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

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


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

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

Возник вопрос - как правильно подключать 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.

 

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


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

Гость vitzap

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

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

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

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

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


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

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

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


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

Гость vitzap

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

 

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

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

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


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

Гость vitzap

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

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


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

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

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

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

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

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

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

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

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

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