2016-06-28 8 views
1

AXI4 스트림 입력이있는 HLS 유닛을 작성하고 있습니다. 스트림에있는 여러 단어는 액세스하려는 구조체로 구성됩니다. 예를 들어 :HLS 임의 정밀도 유형을 복합 유형으로 변환하는 방법

struct eth_header { 
    ap_uint<48> dest; 
    ap_uint<48> source; 
    ap_uint<16> proto; 
} 

난 쉽게 스트림의 말을 버퍼링 할 수 및 큰 ap_uint<112>로 연결할. 그러나, 나는 매우 eth_header 같은 필드 구조로 액세스 할 수있는 좋은 구조체로 ap_uint<112> 변환 할 싶습니다. 나는 그것을 할 수있는 좋은 방법을 찾을 수 없습니다. ap_uint 클래스가 POD가 아니기 때문에 공용을 전송하거나 사용할 수 없습니다.

형식을 어떻게 든 변환 할 수 있습니까 (각 입력란에 명시적인 코드를 쓰지 않고도 가능합니까?)?

EDIT : 구조체가 스트림에서 여러 단어로 변환되어야한다는 것이 명확하지 않았습니다.

답변

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

물론, 내가하는 일에 대해 기뻐할 것이다. 오프라인 토론 –