Как преобразовать тип произвольной точности HLS в составной тип

Я пишу модуль HLS с входом AXI4 Stream. Несколько слов в потоке составляют структуру, к которой я хотел бы получить доступ. Например:

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.

Можно ли как-то преобразовать типы (без написания явного кода для каждого поля)?

РЕДАКТИРОВАТЬ: было непонятно, нужно ли преобразовать структуру из нескольких слов из потока.


person haggai_e    schedule 28.06.2016    source источник


Ответы (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);
    }
};

Это очень уродливо, но это единственное, что у меня сработало.

person haggai_e    schedule 10.07.2016

Как было объяснено здесь, по разным причинам, лучший способ - это определить самостоятельно небольшую структуру с данными, которые вам нужны, и типом данных, который вы предпочитаете. Например, используя 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];
    }
 }
person Leos313    schedule 12.07.2016
comment
Возможно, я не объяснил себя четко, но данные, которые я хочу проанализировать, состоят из нескольких слов из интерфейса оси. Обновлю вопрос. - person haggai_e; 12.07.2016
comment
Действительно мило, я работаю над одним и тем же, поэтому мы можем помогать друг другу - person Leos313; 12.07.2016
comment
Конечно, я был бы рад услышать, над чем вы работаете. Давайте обсудим офлайн - person haggai_e; 12.07.2016