FC2カウンター FPGAの部屋 2023年03月19日
fc2ブログ

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

FPGAの部屋

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

vadd.cpp を書き換えて、multi_axi4ls と DMA_pow2 も動作させる

IP を追加した kr260_ip 用の Vitis アクセラレーション・プラットホームをテストする”で vadd を動作させた環境で、multi_axi4ls と DMA_pow2_test アプリケーション・ソフトウェアも動作を確認できた。それでは、アクセラレーション・アプリケーションのホストのソフトウェアの vadd.cpp を書き換えて、multi_axi4ls と DMA_pow2 の動作を確認してみよう。当然ながら vadd も同時に動作させてみる。これができればハードウェア・プラットホーム上の IP を動作させながら、アクセラレーション・ハードウェアも同時に動作させることができる。結果は、問題なく動作した。

Vitis 2022.1 の kr260_vadd プロジェクトのホストのソフトウェアの vadd.cpp に multi_axi4ls と DMA_pow2_test アプリケーション・ソフトウェアを追加した。
KR260_383_230318.png

include 文の下に次のコードを追加した。(57 行付近)

// ---- Modified by marsee
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/mman.h>

int32_t multi_calc(int32_t *multi_axi4ls, int32_t a, int32_t b){
    while((multi_axi4ls[0] &4) == 0) ; // wait ap_idle
    multi_axi4ls[6] = a; // reg a, 0x18
    multi_axi4ls[8] = b; // reg b, 0x20
    multi_axi4ls[0] = 1; // ap_start = 1
    while((multi_axi4ls[11] & 1) == 0) ; // wait c_ap_vld
    return(multi_axi4ls[10]);
}
// ---- Modified by marsee


int main(int argc, char* argv[]) { の直下に以下の行を追加した。

    // ---- Modified by marsee
    // muilti_axi4ls
    int uio8_fd;
    int32_t *multi_axi4ls;
    int32_t a, b, c;

    if((uio8_fd = open("/dev/uio8", O_RDWR)) == -1) {
        printf("Can not open /dev/uio8\n");
        exit(1);
    }
    multi_axi4ls = (int32_t*)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, uio8_fd, 0);

    for(a = 0, b = 1; a < 10; a++, b++){
        c = multi_calc(multi_axi4ls, a, b);
        printf("a = %d, b = %d, c = %d\n", a, b, c);
    }

    // DMA_pow2
    int uio4_fd;
    volatile int32_t *dma_pow2;
    volatile int32_t *data;
    int fd_udmabuf0;
    u_int32_t fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;

    // uio4, DMP_pow2
    if((uio4_fd = open("/dev/uio4", O_RDWR)) == -1) {
        printf("Can not open /dev/uio4\n");
        exit(1);
    }
    dma_pow2 = (volatile int32_t*)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, uio4_fd, 0);

    // udmabuf0
    fd_udmabuf0 = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled.
    if (fd_udmabuf0 == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    /*read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);
    */

    data = (volatile int32_t *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf0, 0);
    if (data == MAP_FAILED){
        fprintf(stderr, "data mmap error\n");
        exit(-1);
    }

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

    // DMP_pow2 start
    while((dma_pow2[0] & 4) == 0) ; // wait ap_idle
    dma_pow2[6] = phys_addr; // in_r
    dma_pow2[8] = phys_addr + 10 * sizeof(int32_t); // out_r
    dma_pow2[0] = 1; // ap_start
    while((dma_pow2[0] & 2) == 0) ; // wait ap_done


    for(int i=0; i<10; i++){
        printf("in = %d, out = %d\n", data[i], data[i+10]);
    }
    // ---- Modified by marsee


これで、kr260_vadd_system をビルドして成功した。

KR260/kr260_custom_platform/kr260_custom_platform/kr260_vadd_system/Hardware/binary_container_1.xclbin が更新されていた。
KR260_384_230318.png

KR260/kr260_custom_platform/kr260_custom_platform/kr260_vadd/Hardware/kr260_vadd が更新されていた。
KR260_385_230318.png

binary_container_1.xclbin と kr260_vadd を KR260/kr260_custom_platform/kr260_custom_platform/dtg/ip_vadd_file_trasfer ディレクトリのファイルと入れ替えた。

KR260 の Petalinux を起動して、binary_container_1.xclbin と kr260_vadd を kr260_ip_vadd ディレクトリのファイルと入れ替えた。
KR260_386_230318.png

KR260 の Petalinux で、kr260_ip_vadd ディレクトリに移動して、binary_container_1.bin を削除した。
binary_container_1.xclbin の名前を binary_container_1.bin に変更し、pl.dtbo binary_container_1.bin ファイルを /lib/firmware/xilinx/kr260_ip_vadd ディレクトリにコピーした。(pl.dtbo をコピーする必要は無かった。更新していないので。)
現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_ip_vadd をロードする。
cd ~/kr260_ip_vadd
rm binary_container_1.bin
mv binary_container_1.xclbin binary_container_1.bin
sudo cp pl.dtbo binary_container_1.bin /lib/firmware/xilinx/kr260_ip_vadd
sudo xmutil unloadapp
sudo xmutil loadapp kr260_ip_vadd


u-dma-buf.ko をロードした。
/dev/uio* と /dev/udmabuf0 を読み書きモードに変更した。
kr260_vadd を実行したところ、multi_axi4ls と DMA_pow2 の動作が確認できると同時に vadd の動作も確認できた。
sudo chmod 666 /dev/uio*
cd
sudo insmod u-dma-buf.ko udmabuf0=0x10000
sudo chmod 666 /dev/udmabuf0
cd ~/kr260_ip_vadd
./kr260_vadd binary_container_1.bin

KR260_387_230318.png
KR260_388_230318.png

なお、pl.dtbo は”KR260 の kr260_custom アクセラレーション・プラットホームにいろいろな IP を追加する7”で、ハードウェア・プラットホーム上の自分で追加した IP のデバイスツリー・ソースの compatible を generic-uio に書き換えてある。
  1. 2023年03月19日 05:07 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0