Как я могу преобразовать тип произвольной точности HLS в составной тип
Я пишу блок HLS с входом потока AXI4. Несколько слов в потоке составляют структуру, к которой я хотел бы получить доступ. Например:
struct eth_header {
ap_uint<48> dest;
ap_uint<48> source;
ap_uint<16> proto;
}
Я могу легко буферизовать слова потока и объединить их в большой ap_uint<112>
, Тем не менее, я бы очень хотел ap_uint<112>
в хорошую структуру, как eth_header
выше, что я могу получить доступ с полем синтаксиса. Я не могу найти хороший способ сделать это. Я не могу использовать или использовать союз, потому что ap_uint
класс не POD.
Можно ли как-то преобразовать типы (без написания явного кода для каждого поля)?
РЕДАКТИРОВАТЬ: не было ясно, что структура должна быть преобразована из нескольких слов из потока.
2 ответа
Я закончил писать явный код для преобразования. Например:
struct eth_header {
ap_uint<48> dest;
ap_uint<48> source;
ap_uint<16> proto;
static const int width = 112;
eth_header(const ap_uint<width>& d) :
dest (d( 47, 0)),
source(d( 95, 48)),
proto (d(111, 96))
{}
operator ap_uint<width>()
{
return (hls_helpers::swap16(proto), source, dest);
}
};
Это очень некрасиво, но это единственное, что сработало для меня.
Как было объяснено здесь, по разным причинам лучший способ - это определить для себя небольшую структуру с данными, которые вам нужны, и тип данных, который вы предпочитаете. Например, используя float:
struct my_data{
float data;
bool last;
};
и, если вы используете потоковый интерфейс AXI4:
#define N 32
void my_function(my_data input[N], my_data output[N])
{
#pragma HLS INTERFACE axis port=output
#pragma HLS INTERFACE axis port=input
#pragma HLS INTERFACE s_axilite port=return
float tmp_data;
float tmp_last;
int k=0;
for(k=0;k<N;k++)
{
tmp_data[k] = input[k].data;
tmp_last[k] = input[k].last;
}
//...do something here
for(k=0;k<25;k++)
{
output[k].data = tmp_data[k];
output[k].last = tmp_last[k];
}
}