2017-02-01 3 views
0

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

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

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

+0

Если один из следующих ответов был полезен, вы можете проголосовать или принять один из них. И если у вас есть другие вопросы, вы можете продолжать спрашивать, конечно, – Leos313

ответ

0

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

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

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

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

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

  1. Xilinx Forum

  2. FPGAdeveloper's example

  3. another AXI-stream based design example

  4. FPGA note wiki

  5. AXI DMA Product Guide

  6. Channel of Dr. Sadri of TU Kaiserslautern, really helpful to deeply understand AXI design concepts

Успехов!

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

0

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

Да, это так.

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

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

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

#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 легко управлять передачей с использованием функции в пакете поддержки поддержки (BSP).

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

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

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

Смежные вопросы