Потоковые интерфейсы AXI в системном генераторе Xilinx IP

У меня есть пример дизайна в системном генераторе для обработки изображений, который имеет одно входное изображение и одно выходное изображение. Я хотел бы отправлять данные через потоковый интерфейс AXI и экспортировать их как IP-ядро в IP-интегратор Vivado, а затем развивать дизайн с использованием прямого доступа к памяти и программного обеспечения в SDK.

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

Заранее спасибо. (здесь я приложил изображение примера) Image_filter


person shashi    schedule 01.02.2017    source источник
comment
если один из следующих ответов был полезен, вы можете проголосовать или принять один из них. И если у вас есть другие вопросы, вы, конечно, можете продолжать задавать   -  person Leos313    schedule 12.02.2017


Ответы (3)


В настоящее время я работаю над очень похожим проектом (хотя я не использую System Generator), поэтому могу поспорить, что могу дать вам несколько советов. Насколько я помню, SysGen может создать некоторый код VHDL или Verilog вашего дизайна. Так:

После того, как вы получите HDL-код своего дизайна, упакуйте его как новый IP-адрес в Vivado. Есть много руководств о том, как это сделать, это должно быть легко с небольшим поиском. Вы должны разумно выбирать интерфейсы, которые хотите реализовать. Вам определенно понадобится интерфейс AXI Stream Slave для приема входящих данных и интерфейс AXI Stream Master для передачи результатов.

После того, как вы упаковали свой IP-адрес, вы можете начать создавать свою систему блок за блоком (есть также несколько хороших руководств по этому вопросу, см. Конец ответа). Вам нужно будет использовать IP-адрес AXI DMA (или Video DMA, в зависимости от ваших потребностей), и вам нужно будет правильно его настроить, например, выбрать режим регистрации или разброс-сбор, каналы и т. д.

Будьте предельно осторожны, чтобы правильно генерировать правильные сигналы синхронизации AXI, так как они могут полностью испортить ваш дизайн (и нервы). Это просто, но требует некоторого изучения документации AXI, предоставленной Xilinx (документы ARM, на мой взгляд, слишком сложны).

Наконец, вы обязательно найдете очень полезную информацию на следующих ресурсах:

  1. Форум Xilinx

  2. пример разработчика ПЛИС

  3. еще один пример дизайна на основе AXI-потока

  4. Вики-заметки FPGA

  5. Руководство по продукту AXI DMA

  6. Канал доктора Садри из Технического университета Кайзерслаутерна, очень полезный для глубокого понимания концепции дизайна AXI

Удачи!

PS: Симуляторы — ваши друзья! Никогда не пытайтесь внедрить только что написанный код непосредственно в дизайн системы. Modelsim может сэкономить вам значительное время и усилия, которые в противном случае были бы потрачены на бессмысленную отладку.

person Arkoudinos    schedule 02.02.2017

Во-первых, возможно ли иметь потоковый интерфейс AXI в моем проекте?

Да, это.

Если да, то как я могу это реализовать? Кто-нибудь может мне помочь?

У меня есть аналогичный проект, разработанный в Vivado 2015.3: фильтр изображений (созданный с помощью «Синтез высокого уровня») и этот блок дизайна: Блок дизайна всей системы

Код синтеза высокого уровня должен выглядеть так:

#include "top.h"

void hls_sobel(
    hls::stream< ap_axiu<8,1,1,1> > &video_in,
    hls::stream< ap_axiu<8,1,1,1> > &video_out
            )
{
ap_uint<16> Image_w=IMAGE_W_MAX;
ap_uint<16> Image_h=IMAGE_H_MAX;
// Create AXI streaming interfaces for the core
#pragma HLS INTERFACE axis port=video_in  bundle=video_in
#pragma HLS INTERFACE axis port=video_out bundle=video_out

// No control interface - auto-start as soon as there's an input frame
#pragma HLS INTERFACE ap_ctrl_none port=return  // no handshakes

hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> mat_in(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> mat_out(Image_h, Image_w);

hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> inx(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> iny(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> sobelx(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> sobely(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> zerox(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> zeroy(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> absx(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> absy(Image_h, Image_w);

#pragma HLS dataflow
// read input and convert from axi-stream to Mat
hls::AXIvideo2Mat(video_in, mat_in);

// calculate Sobel in X and Y directions
hls::Duplicate(mat_in, inx, iny);
hls::Sobel<1,0,3>(inx, sobelx);
hls::Sobel<0,1,3>(iny, sobely);
// calculate abs of said Sobel
hls::Zero(zerox);
hls::Zero(zeroy);
hls::AbsDiff(sobelx, zerox, absx);
hls::AbsDiff(sobely, zeroy, absy);
// add both abs
hls::AddWeighted(absx, 1, absy, 1, 0, mat_out);

// write output
hls::Mat2AXIvideo(mat_out, video_out);

}

Как вы можете заметить, используется DMA. Для приложения Video-Image я рекомендую использовать Video-DMA (VDMA) для отправки всей информации о пикселях через потоковый интерфейс. После в SDK легко управлять переносом с помощью функции в Board Support Package (BSP).

Также можно заметить, что в приведенном выше коде явно указано hls::stream< ap_axiu<8,1,1,1> > &video_in,! Таким образом я создаю потоковый интерфейс.

Здесь вы можете найти руководство по фильтру обработки изображений HLS. На последней странице есть полезные ссылки. Следуйте им, чтобы реализовать ту же систему примера.

Я надеюсь, что это может помочь

person Leos313    schedule 02.02.2017

Если я правильно понимаю, вы хотите знать, как создать интерфейс AXI Stream внутри вашего системного генератора.

Да, это возможно. В вашем дизайне должно быть как минимум два входа с именами, например, image_tdata и image_tvalid (входной шлюз). Когда вы создаете IP-ядро, sysgen распознает его как AXI STREAM. Формат важен. Это должны быть $customname_tdata и $customname_tvalid. Вы также можете добавить другие входные данные для добавления в AXI STREAM, такие как $customname_tlast, $customname_tready.

person Bhavanithya Thiraviaraja    schedule 05.02.2021