|
|
|
Xilinx Zynq+DDR+DMA+Ethernet, Все в тумане |
|
|
|
Nov 12 2015, 14:03
|
Участник
Группа: Участник
Сообщений: 58
Регистрация: 12-11-15
Пользователь №: 89 287
|
Всем привет, взываю к помощи так как кажется потерялся в дебрях Цинка. Что хочется Принимать данные по Ethernet, складывать их в память DDR3, доставать их оттуда, обеспечить доступ к этим данным другим ядрам. Что есть 1) Запустил проект с LwIP вроде xapp. Вижу принятые и отправленные пакеты, посмотрел на них в WireShark, пописал свои пакеты туда с PC и обратно с платформы. Но пока для меня это все выглядит как черный ящик, где я с одной стороны вызываю tcp_recv и tcp_recv, которые внутри себя вызывают LwIP стек, который основан на драйверах Xilinx, которые там что то колдуют с регистрами контроллеров памяти,эзернета и ДМА описанными в UG5852) Запустил проекты с 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? Почему не обходятся только им?
|
|
|
|
|
Nov 12 2015, 15:05
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(ConstHw @ Nov 12 2015, 16:03) Всем привет, взываю к помощи так как кажется потерялся в дебрях Цинка. Что хочется Принимать данные по Ethernet, складывать их в память DDR3, доставать их оттуда, обеспечить доступ к этим данным другим ядрам. Что есть 1) Запустил проект с LwIP вроде xapp. Вижу принятые и отправленные пакеты, посмотрел на них в WireShark, пописал свои пакеты туда с PC и обратно с платформы. Но пока для меня это все выглядит как черный ящик, где я с одной стороны вызываю tcp_recv и tcp_recv, которые внутри себя вызывают LwIP стек, который основан на драйверах Xilinx, которые там что то колдуют с регистрами контроллеров памяти,эзернета и ДМА описанными в UG585Ну вот Ваше желание уже почти исполнилось! Ведь пакеты уже принимаются и складываются в DDR3 память подключенную к PS Цитата(ConstHw @ Nov 12 2015, 16:03) 2) Запустил проекты с MIG+ процессорное ядро. Пописал данные в память, почитал через AXI, Еще одна память ? теперь уже на PL? Цитата(ConstHw @ Nov 12 2015, 16:03) 3) Пописал принятые по TCP данные в MIG напрямую из процессора. Делал напрямую "в лоб" Код *(Addr+I) = Val; Где адрес соответственно ссылается на диапазон памяти принадлежащий подключенному MIG 4) Запустил тестовый проект с AXI DMA, пописал данные в память через него. Что делать дальше непонятно, так как не понимаю многих вещей 1) Правильно ли я понял, что LwIP работает исключительно в пределах PS, использует только аппаратный DMA, складывает данные только в память, которая подключена к PS? Данные пересылаются по адресу указанному в дескрипторе буферов для DMA. Можно задать адрес не в памяти а в пространстве GP AXI Master порта к которому будут подключены Ваши корки для обработки пакетов. Цитата(ConstHw @ Nov 12 2015, 16:03) 2) Как в таком случае правильно принять пакеты из Ethernet? Это философский вопрос - что значит правильно? Для ответа на него нужно определится с желаемым - что же вы хотите построить? Успехов! Rob.
|
|
|
|
|
Nov 13 2015, 07:22
|
Участник
Группа: Участник
Сообщений: 58
Регистрация: 12-11-15
Пользователь №: 89 287
|
Цитата(RobFPGA @ Nov 12 2015, 16:05) Еще одна память ? теперь уже на PL? Да, именно. Стандартаный Xilinx контроллер MIG для DDR3 Цитата(RobFPGA @ Nov 12 2015, 16:05) Данные пересылаются по адресу указанному в дескрипторе буферов для DMA. Можно задать адрес не в памяти а в пространстве GP AXI Master порта к которому будут подключены Ваши корки для обработки пакетов. Не очень понимаю. Сейчас LwIP возвращает указатель на Pbuf https://www.cs.cmu.edu/~srini/15-441/F01.fu...plit/node5.html Данные, заголовок. Надо поменять прожку так, чтобы он для аллокации использовал всю память? Цитата(RobFPGA @ Nov 12 2015, 16:05) Это философский вопрос - что значит правильно? Для ответа на него нужно определится с желаемым - что же вы хотите построить? Успехов! Rob. Правильно это без костылей и велосипедов, как было задумано авторами Допустим я вижу указатели на нагрузку и длину пакета Код p->payload, p->len Они хранятся в PS DDR. Хочу положить их в SODIMM DDR. Надо запустить Memory to memory транзакцию?
|
|
|
|
|
Nov 13 2015, 10:15
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(ConstHw @ Nov 13 2015, 09:22) Правильно это без костылей и велосипедов, как было задумано авторами Я не профессиональный телепат - очень сложно проникать в мысли автора тем более если "...этот пацак все время говорит на языках, продолжение которых не знает" Ку! И если без "костылей и велосипедов" - то только ножками шаг за шагом. Цитата(ConstHw @ Nov 13 2015, 09:22) Не очень понимаю. Сейчас LwIP возвращает указатель на Pbuf https://www.cs.cmu.edu/~srini/15-441/F01.fu...plit/node5.html Данные, заголовок. Надо поменять прожку так, чтобы он для аллокации использовал всю память? Цитата(ConstHw @ Nov 13 2015, 09:22) Допустим я вижу указатели на нагрузку и длину пакета Код 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.
|
|
|
|
|
Aug 14 2018, 07:45
|
Группа: Новичок
Сообщений: 3
Регистрация: 2-02-17
Пользователь №: 95 272
|
Добрый день. Возник такой же вопрос. Подскажите идеологию саму, как правильно надо делать? Плата 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.
|
|
|
|
|
Aug 14 2018, 09:11
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(t_34 @ Aug 14 2018, 10:45) Добрый день. Возник такой же вопрос. Подскажите идеологию саму, как правильно надо делать? Плата zc706, надо поднять ethernet, который будет принимать данные и отсылать их в PL DDR3. Надо использовать именно PL память, чтобі собственные IP ядра имели к ней доступ. Как правильно подключить PL DDR3 к процессору? Ох уж это "правильно" Я на вскидку могу придумать 5-7 вариантов и все они будут правильные (для меня). Будет ли они пра ведильными для Вас будет зависит от критериев этой правильности. Цитата(t_34 @ Aug 14 2018, 10:45) 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. Цитата(t_34 @ Aug 14 2018, 10:45) ... Напишите, пожалуйста, что и как правильно. В какую сторону надо копать. Если картошку сажать то вширь, если уголек добывать то вглубь, "подкоп" под начальника не предлагаю Удачи! Rob.
|
|
|
|
|
Aug 20 2018, 06:35
|
Группа: Новичок
Сообщений: 3
Регистрация: 2-02-17
Пользователь №: 95 272
|
Добрый день! Сделал пока так как описал в первом варианте: В аппаратной части использую порт процессора М_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
|
|
|
|
|
Aug 21 2018, 15:21
|
Группа: Новичок
Сообщений: 3
Регистрация: 2-02-17
Пользователь №: 95 272
|
Добрый вечер! Возник еще один вопрос! За основу для SDK взят проект echo server xapp1026, передаю с помощью iperf файл данных с ПК на плату zc706, полученные данные пишу в память. Как понять, что пришел последний пакет данных, TCP соединение закрывается FIN пакетом на сколько я знаю. В коде echo server как можно задетектировать этот пакет? или как мне отобразить статус TCP соединения?
|
|
|
|
|
Aug 22 2018, 06:33
|
Частый гость
Группа: Свой
Сообщений: 130
Регистрация: 19-12-05
Пользователь №: 12 399
|
Цитата(doom13 @ Nov 25 2016, 15:43) Приветствую. Возник вопрос - как правильно подключать 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.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|