2016-06-28 16 views
1

我正在编写带有AXI4流输入的HLS单元。流中的几个单词包含我想要访问的结构。例如:如何将HLS任意精度类型转换为复合类型

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。

是否有可能以某种方式转换类型(无需为每个字段编写明确的代码)?

编辑:它不清楚该结构需要从流中的几个单词转换。

回答

1

我写了显式代码来完成转换。例如:

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); 
    } 
}; 

这是非常丑陋的,但它是唯一对我有用的东西。

0

正如它被解释为here,由于不同的原因,最好的方法是自己定义一个你需要的数据和你喜欢的数据类型的结构。例如,使用浮动:

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]; 
    } 
} 
+1

也许我没有解释清楚我自己,但我想解析数据是由几个词语出轴的界面。我会更新这个问题。 –

+0

真的很好,我在同样的事情上工作,所以我们可以互相帮助 – Leos313

+0

当然,我很乐意听到你在做什么。让我们离线讨论 –

相关问题