« MITOUJTAGセミナー(応用編)を開催しました | トップページ | 特殊電子回路を一度、閉じます »

2018.09.07

SDSoCでAXI Streamからバッファに入れる回路

SDSoCでAXI Streamからバッファに入れる回路が動きました。

Axis_test

どのような回路かというと、基本はコレです。

void pf_read_stream(unsigned long *rbuf) {}
void pf_write_stream(unsigned long *wbuf) {}

int s2mm_data_copy(unsigned long *fifo, unsigned long buf[BUF_SIZE])
{
#pragma HLS interface axis port=fifo
    do  {
    } while ((*fifo & 30) == 0);

    for(int i=0; i<BUF_SIZE; i++) {
#pragma HLS pipeline
        unsigned long tmp = *fifo;
        buf[i] = tmp;
     }
     return 0;
}

void s2mm_data_copy_wrapper(unsigned long *buf) {
    unsigned long rbuf0[1];
    pf_read_stream(rbuf0);
    s2mm_data_copy(rbuf0,buf);
}

SDSoCのチュートリアルでよく見るサンプルコードですが、バスの幅がunsigned longになっています。

このコードをmain.cppとは別のCPPファイルに保存しておき、Hファイルに

#pragma SDS data sys_port (fifo:axis_data_fifo_0_M_AXIS)
#pragma SDS data zero_copy(buf)
int s2mm_data_copy(unsigned long *fifo, unsigned long buf[BUF_SIZE]);
void s2mm_data_copy_wrapper(unsigned long *buf);

と書いておきます。main.cppと、ハードウェア関数が入るソースを分けておいたほうがいいでしょう。分けておくと、main.cppの中のコードを書き換えてからビルドをしても論理合成が走らないので早く出来上がります。

ハードウェア化するのはs2mm_data_copy関数であって、s2mm_data_copy_wrapperではありません。wrapperのほうが何をやっているのかいまだによくわかりませんが、ダミーの配列rbuf0[1]というのがハードウェアの配線に相当するようで、この記述を書くことによってAXI-4 Streamからハードウェア関数へつながります。

ポインタで指定された

また、#pragma SDS data sys_port の記述を使うことで、ハードウェアプラットフォームで定義されたAXI Streamのどこの部分に、この回路がつながるかを指定することができます。

Axis_test2

|

« MITOUJTAGセミナー(応用編)を開催しました | トップページ | 特殊電子回路を一度、閉じます »

コメント

コメントを書く



(ウェブ上には掲載しません)




« MITOUJTAGセミナー(応用編)を開催しました | トップページ | 特殊電子回路を一度、閉じます »