В конце я хочу использовать потоковый интерфейс с массивами с плавающей запятой одинарной точности в Vivado Design Suite для создания аппаратных ускорителей. Руководство пользователя HLS UG902 показывает, что можно создавать HW-ускорители (начиная с C, C ++, SystemC, OpenCL code), используя разные интерфейсы.
Если вы хотите использовать потоковый интерфейс AXI4, HLS синтезирует сигналы TREADY и TVALID, но не синтезирует сигнал TLAST, необходимый для подключения интерфейса RTL, сгенерированного к системе обработки Zynq (в моем случае ядра ARM9).
Чтобы решить эту проблему, Xilinx дает вам возможность использовать эту библиотеку
#include "ap_axi_sdata.h"
Внутри есть структура — шаблон:
#include "ap_int.h"template<int D,int U,int TI,int TD>
struct ap_axis{
ap_int<D> data;
ap_uint<D/8> keep;
ap_uint<D/8> strb;
ap_uint<U> user;
ap_uint<1> last;
ap_uint<TI> id;
ap_uint<TD> dest;
};
У меня две проблемы:
Есть ли простой способ обработки и управления потоковым интерфейсом в HLS с данными с плавающей запятой?
Для меня самый простой способ решить это, это объявить свой собственный тип данных структуры без использования библиотеки, которую вы упомянули выше. По умолчанию VivadoHLS реализует интерфейсы AXIS с сигналами TDATA, TVALID и TREADY. Если вам также нужны TLAST и одноточечные данные одинарной точности, вы должны объявить свой собственный тип данных, который должен выглядеть примерно так:
struct my_data{
float data;
bool last;
};
Я могу привести пример того, как вы должны его использовать:
void my_function(my_data input[25], my_data output[25])
{
#pragma HLS INTERFACE axis port=output
#pragma HLS INTERFACE axis port=input
#pragma HLS INTERFACE s_axilite port=returnfloat tmp_data;
float tmp_last;
int k=0;
for(k=0;k<25;k++)
{
tmp_data[k] = input[k].data;
tmp_last[k] = input[k].last;
}for(k=0;k<25;k++)
{
output[k].data = tmp_data[k];
output[k].last = tmp_last[k];
}
}
Если вы сделаете это, после синтеза вы получите такой результат:
Во избежание ошибок необходимо обратить внимание на:
Всякий раз, когда вы используете данные ваших потоковых интерфейсов, вы должны быть осторожны, чтобы управлять остальными сигналами интерфейса.
Других решений пока нет …