FC2カウンター FPGAの部屋 2018年04月04日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

@ikwzmさんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”をやってみる3

@ikwzmさんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”をやってみる2”の続き。

この記事は、”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”を全面的に参照しています。

前回は、Xilinx APF Accelerator driver を使用してSDSoC で作成した実行ファイルを実行することができた。今回は、前回の実行ファイルを実行した後で、一旦ドライバを取り外して異なるマスタの回路をロードして、マスタ用の実行ファイルを実行してみよう。

まずは、前回の multi_apuint をもう一度やってみよう。
ZYBO-Z7-20 の debian 上で
cd sdsoc_test/multi_apuint/
sudo dtbocfg.rb --install _p0_ --dts _p0_.dts
sudo dtbocfg.rb --install xlnk --dts xlnk.dts
sudo ./sd_card/multi_apuint.elf

すでに、sudo cp sd_card/_sds/_p0_.bin /lib/firmware/ は昨日やってあるので省略。
SDSoC_ikwzm_22_180403.png

”multi_out = 100”が表示された。問題ない。
その時のシリアル接続のターミナルの表示を示す。
SDSoC_ikwzm_23_180403.png

そのまま、ドライバを削除する。
sudo dtbocfg.rb --remove _p0_
sudo dtbocfg.rb --remove xlnk


dma_pow をZYBO-Z7-20 の debian 上で動作させるのだが、最初にSDSoCの画面を示す。
SDSoC_ikwzm_25_180403.png

Vivado HLS の合成結果を示す。
SDSoC_ikwzm_26_180403.png

次にソースコードを示そう。
まずは、DMA_pow.cpp から。

#pragma SDS data zero_copy(in[0:10])
#pragma SDS data zero_copy(out[0:10])

int DMA_pow2(int *in, int *out){

    int i;

    for (i=0; i<10; i++){
     int temp = *in++;
        *out++ =temp * temp;
    }

    return(0);
}


Vivado HLS で使用した”FPGA+SoC+Linux実践勉強会での課題をやってみた1(Vivado HLS編)”に示すコードではエラーになってしまったので変更した。

DMA_pow_tb.cpp を示す。

#include <stdio.h>
#include <stdlib.h>
#include "sds_lib.h"

int DMA_pow2(int *in, int *out);

int main(){
    int *data;
    int *result;
    int i;

    if((data=(int *)sds_alloc(sizeof(int)*10)) == NULL){
     fprintf(stderr, "Can't allocate data[10]\n");
     exit(1);
    }

    if((result=(int *)sds_alloc(sizeof(int)*10)) == NULL){
     fprintf(stderr, "Can't allocate result[10]\n");
     exit(1);
    }

    for(int i=0; i<10; i++){
     data[i] = i;
    }

    DMA_pow2(data, result);

    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }
}


テストベンチは、sds_alloc() を使用して、連続領域にメモリをアサインしていて、DMA_pow.cpp の方がゼロコピーでDMA するようにしてある。最も、このメモリ量だと 4k バイトの1ページに届かないので、連続領域にメモリをアサインしなくも問題ないかもしれない?

ZYBO-Z7-20 の debian 上で dma_pow ディレクトリを作成した。
cd ~/sdsoc_test
mkdir dma_pow
cd dma_pow

SDSoC_ikwzm_27_180403.png

SFTP アプリケーションソフトを PC 上で立ち上げて、PC 上の sdx_workspaces/revisio_zybo_z7_20_ws/DMA_pow/Debug/sd_card ディレクトリを ZYBO-Z7-20 の debian 上の /home/fpga/sdsoc_test/dma_pow/ ディレクトリ上にコピーした。
SDSoC_ikwzm_28_180403.png

tree コマンドで確かめた。そして、multi_apuint で作成した _p0_.dts と xlnk.dts はそのまま使用できるので、コピーした。
tree sd_card
cp ../multi_apuint/*.dts

SDSoC_ikwzm_29_180403.png

sudo cp sd_card/_sds/_p0_.bin /lib/firmware/
sudo dtbocfg.rb --install _p0_ --dts _p0_.dts
sudo dtbocfg.rb --install xlnk --dts xlnk.dts

SDSoC_ikwzm_30_180403.png

sudo ./sd_card/DMA_pow.elf
SDSoC_ikwzm_31_180403.png

結果が問題なく表示された。成功だ。。。

その時のシリアル接続のターミナルの表示を示す。
SDSoC_ikwzm_32_180403.png

これで、SDSoC で作ったビットファイルとアプリケーションソフトを自分の環境で実行することができた。しかも、ZYBO-Z7-20 の debian を起動しながら入れ替えることができた。今までは、出来上がった sd_card ディレクトリの内容を SD カードに書いて、ボードに入れ、電源ON だったのだが、今回は、起動中のボードのLinux に SFTP してファイルを渡せば、ボードのLinux が動作したまま、いくらでも SDSoC の結果を試せるということになる。作って頂いた @ikwzm さん、ありがとうございました。
  1. 2018年04月04日 04:59 |
  2. SDSoC
  3. | トラックバック:0
  4. | コメント:0