Как передать часть потока Xilinx HLS другой функции?

У меня есть две переменные:

void func1(hls::stream<ap_axiu<8,1,1,1>> &a);
void func2(hls::stream<ap_uint<8>> &b);

Где ap_axiu определяется как:

template<int D,int U,int TI,int TD>
  struct ap_axiu{
    ap_uint<D>       data;
    ap_uint<(D+7)/8> keep;
    ap_uint<(D+7)/8> strb;
    ap_uint<U>       user;
    ap_uint<1>       last;
    ap_uint<TI>      id;
    ap_uint<TD>      dest;
  };

Я хотел бы вызвать func2 внутри func1, используя данные параметра a из func1 (см. определение ap_axiu). Таким образом, func будет выглядеть примерно так:

void func1(hls::stream<ap_axiu<8,1,1,1>> &a) {
   func2(???);
}

где ??? должна быть частью ap_uint<D> data переменной hls::stream<ap_axiu<8,1,1,1>> a, окруженной hls::stream< >.

Как я могу сделать это на С++? У меня нет большого опыта работы с шаблонами, и я также не могу найти его в Google.


person Roy Meijer    schedule 29.03.2021    source источник
comment
Вы читали документы библиотеки, которую используете? xilinx.com/html_docs/xilinx2020_2/vitis_doc/   -  person John Zwinck    schedule 29.03.2021
comment
Да, но мне это мало помогает   -  person Roy Meijer    schedule 29.03.2021


Ответы (1)


Попробуй это:

void func1(hls::stream<ap_axiu<8,1,1,1>> a)
{
    ap_axiu<8,1,1,1> input = a.read();
    hls::stream<ap_uint<8>> intermediate;
    intermediate.write(input.data);
    func2(intermediate);
}

Идея состоит в том, чтобы прочитать всю структуру из a и поместить одно поле, которое вам нужно, в intermediate, чтобы вы могли вызвать func2.

Это предполагает, что вы хотите передать только один элемент из func1 в func2. Поток может содержать много элементов, и в этом случае вам может понадобиться добавить цикл для чтения и записи нескольких значений.

person John Zwinck    schedule 29.03.2021
comment
Я забыл упомянуть, что a и b можно либо прочитать, либо записать. Я добавил ссылочные знаки к переменным a и b в исходном посте. Сохранение его в промежуточной переменной не сработает, потому что мне нужно передать много данных, а ресурсов для их локального хранения недостаточно. - person Roy Meijer; 29.03.2021
comment
Справочные знаки не будут иметь никакого значения: приведенное выше решение — **единственно возможный путь**. В конце концов, вы синтезируете FIFO (класс hls::stream), и по определению FIFO имеет одну сторону производителя и одну сторону потребителя. На практике вы не можете использовать один и тот же для чтения и записи на ваш IP и с него: вам нужен еще один аргумент, чтобы один поток был только для чтения, а другой только для записи. Если вам действительно нужно не хватать портов (или ресурсов), используйте вместо этого интерфейс BRAM или AXI. - person Stefano Ribes; 29.03.2021