Как я могу преобразовать тип произвольной точности 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];
    }
 }
Другие вопросы по тегам