FC2カウンター FPGAの部屋 Vitis HLS
fc2ブログ

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

FPGAの部屋

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

Vitis HLS 2022.1 で不具合が出た vflip_dma_write プロジェクトを Vitis HLS 2022.2 でやってみた

垂直方向が反転している画像のDMA4(vflip_dma_write)”で、Vitis HLS 2022.1 で Implementation を行った結果のリソース使用量は LUT が 83439 個、FF が 67186 個だった。リソース使用量が多すぎた。C コードの合成時には普通だったので、Vivado の問題かも知れないが。。。なお、 Vivado HLS 2019.2、Vitis HLS 2020.2、Vitis HLS 2021.2 で vflip_dma_write をやってたが、どれも正常にインプリメンテーションができた。
この vflip_dma_write を Vitis HLS 2022.2 でやってみたいと思う。

ソースコード、ヘッダファイル、テストベンチ・ファイルは”垂直方向が反転している画像のDMA4(vflip_dma_write)”から引用した。
Vitis HLS 2022.2 で Part を xc7z020-clg400-1 に指定して、vflip_dma_write プロジェクトを作成した。
Solution メニューから Solution Settins... を選択すると、Solution Settings (solution1) ダイアログが表示された。
config_interface を展開して、m_axi_addr64 のチェックを外した

C シミュレーションを行って、成功した。
vflip_dma_write_1_221023.png

C コードの合成を行った。結果を示す。
vflip_dma_write_2_221023.png
vflip_dma_write_3_221023.png
vflip_dma_write_4_221023.png
vflip_dma_write_5_221023.png

Latency は 1440048 クロックで 2022.1 と同じだった。FF と LUT の個数も 2022.1 と 2022.2 は同じ数だった。

C/RTL 協調シミュレーションを行った。結果を示す。
vflip_dma_write_6_221023.png

Latency は 1654257 クロックで、Vitis HLS 2022.1 と同じ Latency だった。

C/RTL 協調シミュレーションの波形を示す。
vflip_dma_write_7_221023.png

Export RTL を行った。
Export RTL ダイアログが表示されて、いつものように OK ボタンをクリックしてスタートしたら、
vflip_dma_write_8_221023.png

なんか、Implementation をやっているようだった。
結果が表示されると、やはり、Vivado でインプリメンテーションしているようだった。
vflip_dma_write_9_221023.png

Export RTL をすると、Implementation をする仕様に変更されたのだろうか?
リソース使用量は、LUT が 1283 個、FF が 2013 個、DSP 3個、BRAM 1個で通常のリソース使用量だった。これなら使える。
Vitis HLS 2022.1 (Vivado 2022.1)になんか不具合があったのだろうか? Vitis HLS 2022.2 は大丈夫そうだ。
  1. 2022年10月23日 06:45 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2022.1 で multi_axi4ls IP を作成する

Vitis アクセラレーション・プラットフォーム上に予め回路を埋め込んでおいて、その回路を XRT 経由で操作するというお題は以前やってみたのだが、失敗した。それなら、Vitis とは別のソフトウェアで動かせば良いのでは?というアドバイスを AMD XILINX TECH DAY TOKYO 2022 の後のタリーズコーヒーでいただいたので、やってみることにした。

今回は、”自作回路を cocotb でシミュレーションする1(Vitis HLS で multiplier を作成1)”と”自作回路を cocotb でシミュレーションする2(Vitis HLS で multiplier を作成2)”で作成した multiplier を multi_axi4ls として、 AXI4 Lite インターフェース対応にする。
multi_axi4ls IP を Vitis アクセラレーション・プラットフォームのハードウエア・プラットフォーム上に実装する。

ソースコードの multi_axi4ls.cpp を示す。

// multi_axi4ls.cpp
// 2022/09/18 by marsee
//

#include <stdint.h>

int multi_axi4ls(int16_t a, int16_t b, int32_t *c){
#pragma HLS INTERFACE mode=s_axilite port=c
#pragma HLS INTERFACE mode=s_axilite port=b
#pragma HLS INTERFACE mode=s_axilite port=a
#pragma HLS INTERFACE mode=s_axilite port=return

    *c = a * b;

    return(0);
}


テストベンチの multi_axi4ls_tb.cpp を示す。

// multi_axi4ls_tb.cpp
// 2022/09/18 by marsee
//

#include <stdio.h>
#include <stdint.h>

int multi_axi4ls(int16_t a, int16_t b, int32_t *c);

int main(){
    int16_t a, b;
    int32_t c;

    a = 3;
    b = 4;

    multi_axi4ls(a, b, &c);
    printf("a = %d, b = %d, c = (a*b) = %d\n", a, b, c);

    return(0);
}


Vitis HLS 2022.1 の multi_axi4ls プロジェクトを示す。KV260 用だ。Part は xck26-sfvc784-2LV-c だ。
KV260_custom_platform_1_220918.jpg

C シミュレーションの結果を示す。
KV260_custom_platform_2_220918.jpg

C コードの合成を行った。結果を示す。
なお、200 MHz で動かす予定なので、クロック周期は 5 ns に設定してある。
KV260_custom_platform_3_220919.png

C/RTL 協調シミュレーションを行った。結果を示す。
レイテンシは 3 クロックだった。
KV260_custom_platform_4_220919.png

C/RTL 協調シミュレーションの波形を示す。
KV260_custom_platform_5_220919.png

Export RTL を行った。

Implementation の結果を示す。
問題ないようだ。
KV260_custom_platform_6_220919.png
  1. 2022年09月19日 06:48 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

axis2DMA4dwc IP の作成2

axis2DMA4dwc IP の作成1”の続き。

axis2DMA IP を TUSER を使用しないように作り変えることにしたということで、スタートに TUSER を使用しない axis2DMA4dwc IP を作成する。前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2022.1 の axis2DMA4dwc プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行った。C/RTL 協調シミュレーションのレイテンシが大きいので、Vitis HLS 2021.2 でも axis2DMA4dwc プロジェクトを作成し、C/RTL 協調シミュレーションを行ったところ、Vitis HLS 2021.2 の方がレイテンシが小さいので、こちらを採用することにした。

Vitis HLS 2022.1 で実装
C シミュレーションの結果を示す。
ZYBO_Z7_PYNQ_214_220824.png

solution1/csim/build ディレクトリには、test.jpg が生成された。
ZYBO_Z7_PYNQ_215_220824.png

C コードの合成を行った。結果を示す。
ZYBO_Z7_PYNQ_216_220824.png
ZYBO_Z7_PYNQ_217_220824.png

C/RTL 協調シミュレーションを行った。結果を示す。
レイテンシは 559801 クロックだった。1.16 クロック/ピクセルだった。余り性能が良くない気がする。
ZYBO_Z7_PYNQ_219_220824.png

1 行分の C/RTL 協調シミュレーション波形を示す。
ZYBO_Z7_PYNQ_218_220824.png

Export RTL を行った。

Implemenation を行った。結果を示す。
ZYBO_Z7_PYNQ_220_220824.png

Vitis HLS 2021.2 で実装
C/RTL 協調シミュレーションのレイテンシが大きいので、Vitis HLS 2021.2 でも axis2DMA4dwc プロジェクトを作成して、C コードの合成を行って、C/RTL 協調シミュレーションを行った。結果を示す。
レイテンシは 490801 クロックだった。1.02 クロック/ピクセルとなる。Vitis HLS 2022.1 よりもレイテンシが短いので、Vitis HLS 2021.2 を採用することにする。
ZYBO_Z7_PYNQ_224_220826.png

1 行分の C/RTL 協調シミュレーション波形を示す。
ZYBO_Z7_PYNQ_225_220826.png

Export RTL を行った。

Implementation の結果を示す。問題ないようだ。
ZYBO_Z7_PYNQ_226_220826.png
  1. 2022年08月26日 04:44 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

axis2DMA4dwc IP の作成1

ZYBO Z7-20 の PYNQ 2.7 上で Jupyter Notebook に画像を表示する5”で、AXI4-Stream Data Width Converter の AXI4-Stream 入出力に TUSER が無いということが分かった。そこで、axis2DMA IP を TUSER を使用しないように作り変えることにした。
そういう訳で、スタートに TUSER を使用しない axis2DMA4dwc IP を作成する。

最初にソースコードの axis2DMA4dwc.cpp を示す。

// axis2DMA4dwc.cpp
// 2022/08/24 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <stdint.h>

int axis2DMA4dwc(hls::stream<ap_axis<32,1,1,1> >& ins,
         int32_t row_size, int32_t col_size, ap_int<32> *out){
#pragma HLS INTERFACE mode=m_axi depth=480000 port=out offset=slave
#pragma HLS INTERFACE mode=s_axilite port=col_size
#pragma HLS INTERFACE mode=s_axilite port=row_size
#pragma HLS INTERFACE mode=axis register_mode=both port=ins register
#pragma HLS INTERFACE mode=s_axilite port=return

    ap_axis<32,1,1,1> val;

    for(int y=0; y<row_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=480 max=1080 avg=600
        for(int x=0; x<col_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=640 max=1920 avg=800
            ins >> val;
            out[y*col_size+x] = val.data;
        }
    }

    return(0);
}


テストベンチの axis2DMA4dwc_tb.cpp を示す。

// axis2DMA4dwc_tb.cpp
// 2022/08/24 by marsee
//

#include <iostream>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#include "pict_data.h"

char OUTPUT_PICT_FILE[] = "test.jpg";

int axis2DMA4dwc(hls::stream<ap_axis<32,1,1,1> >& ins,
         int32_t row_size, int32_t col_size, ap_int<32> *out);

int main(){
    hls::stream<ap_axis<32,1,1,1> > ins;
    ap_axis<32,1,1,1> axisp;
    ap_int<32> *wr_pict;

    for(int y=0; y<Y_SIZE; y++){
        for(int x=0; x<X_SIZE; x++){
            axisp.data = (ap_int<32>)pict_file_array[y][x][0] | ((ap_int<32>)pict_file_array[y][x][1])<<8 | ((ap_int<32>)pict_file_array[y][x][2])<<16;

            if(y==0 && x==0)
                axisp.user = 1;
            else
                axisp.user = 0;

            if(x == X_SIZE-1)
                axisp.last = 1;
            else
                axisp.last = 0;

            ins << axisp;
        }
    }

    if((wr_pict =(ap_int<32> *)malloc(sizeof(ap_int<32>) * (X_SIZE * Y_SIZE))) == NULL){
        fprintf(stderr, "Can't allocate wr_pict memory\n");
        exit(1);
    }

    axis2DMA4dwc(ins, Y_SIZE, X_SIZE, wr_pict);

    cv::Mat img(Y_SIZE, X_SIZE, CV_8UC3);
    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for (int y=0; y<Y_SIZE; y++){
        for (int x=0; x<X_SIZE; x++){
            ap_int<32> data = wr_pict[y*X_SIZE+x];
            cv::Vec3b pixel;
            pixel[0] = data & 0xff; // blue
            pixel[1] = (data >> 8) & 0xff; // green
            pixel[2] = (data >> 16) & 0xff; // red
            dst_vec3b(y,x) = pixel;
        }
    }

    cv::imwrite(OUTPUT_PICT_FILE, img);

    return(0);
}


なお、pict_data.h は画像をヘッダファイルにしたもので、”Vitis HLS 2021.2 を使用して画像ファイルを C のヘッダファイルに変換する”で作成したヘッダ・ファイルだ。

ZYBO Z7-20 用の Vitis HLS 2022.1 で作成した axis2DMA4dwc プロジェクトを示す。
ZYBO_Z7_PYNQ_211_220824.png

ZYBO Z7-20 用なので、Solution メニューから Solution Settings... を選択し、ダイアログを表示された。
config_interface を展開して、m_axi_addr64 のチェックを外して、AXI4-Master のアドレス幅を 32 ビットに変更した。
ZYBO_Z7_PYNQ_212_220824.png

Vitis HLS 2021.2 の Project メニューから Project Settings... を選択して、設定を行った。
Project Settings (axis2DMA2st) ダイアログが開く。
左のウインドウで Simulation をクリックする。
axis2DMA2_tb.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
axis2DMA2_tb.cpp の CFLAGS に

-I/usr/local/include

を設定した。

Linker Flags に

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc

を設定した。
ZYBO_Z7_PYNQ_213_220824.png
  1. 2022年08月25日 04:21 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

axis2DMA IP の作成2

axis2DMA IP の作成1”の続き。

ZYBO Z7-20 用の AXI4-Stream から DMA Write する axis2DMA IP を作成するということで、前回はソースコードとテストベンチ・コードを貼って、Vitis HLS 2022.1 の axis2DMA プロジェクトを作成した。今回は、C シミュレーション、C コードの合成を行ったところで、リソース使用量が多くなっていたので、ソースコードを修正して C コードの合成を行った。C/RTL 協調シミュレーション、Export RTL 、Implemenation を行った。

C シミュレーションを行った。
ZYBO_Z7_PYNQ_167_220816.png

axis2DMA/solution1/csim/build ディレクトリに test.jpg が生成された。
ZYBO_Z7_PYNQ_168_220816.png

C コードの合成をした所、リソース使用量が多かった。
ZYBO_Z7_PYNQ_169_220816.png

そこで、ソースコード axis2DMA.cpp の

#pragma HLS PIPELINE II=1 rewind

を削除した。

// axis2DMA.cpp
// 2022/08/15 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <stdint.h>

int axis2DMA2(hls::stream<ap_axis<32,1,1,1> >& ins,
         int32_t row_size, int32_t col_size, ap_int<32> *out){
#pragma HLS INTERFACE mode=m_axi depth=480000 port=out offset=slave
#pragma HLS INTERFACE mode=s_axilite port=col_size
#pragma HLS INTERFACE mode=s_axilite port=row_size
#pragma HLS INTERFACE mode=axis register_mode=both port=ins register
#pragma HLS INTERFACE mode=s_axilite port=return

    ap_axis<32,1,1,1> val;

    Loop1 : do {    // user が 1 になった時にスタート
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
        ins >> val;
    } while(val.user == 0);

    for(int y=0; y<row_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=480 max=1080 avg=600
        for(int x=0; x<col_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=640 max=1920 avg=800
            if(!(y==0 && x==0)){
                ins >> val;
            }
            out[y*col_size+x] = val.data;
        }
    }

    return(0);
}


もう一度、C コードの合成を行った。今度はリソース使用量は少ない。
ZYBO_Z7_PYNQ_170_220816.png
ZYBO_Z7_PYNQ_171_220816.png

C/RTL 協調シミュレーションを行った。
ZYBO_Z7_PYNQ_172_220816.png

レイテンシは 559804 クロックだった。
559804/480000 ≒ 1.17 だった。

C/RTL 協調シミュレーションの波形の一部を示す。
ZYBO_Z7_PYNQ_173_220816.png

Export RTL を行った。
solution1/impl ディレクトリに export.zip が生成された。

Implementation を行った。(solution2 にしてある)
問題無さそうだ。
ZYBO_Z7_PYNQ_174_220816.png
  1. 2022年08月16日 05:17 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

axis2DMA IP の作成1

AXI4-Stream から DMA Write する axis2DMA IP を作成する。ZYBO Z7-20 用だ。

Vitis HLS 2022.1 の axis2DMA プロジェクトを示す。
ZYBO_Z7_PYNQ_165_220815.png

ソースコードの axis2DMA.cpp を示す。

// axis2DMA.cpp
// 2022/08/15 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <stdint.h>

int axis2DMA2(hls::stream<ap_axis<32,1,1,1> >& ins,
   int32_t row_size, int32_t col_size, ap_int<32> *out){
#pragma HLS INTERFACE mode=m_axi depth=480000 port=out offset=slave
#pragma HLS INTERFACE mode=s_axilite port=col_size
#pragma HLS INTERFACE mode=s_axilite port=row_size
#pragma HLS INTERFACE mode=axis register_mode=both port=ins register
#pragma HLS INTERFACE mode=s_axilite port=return

    ap_axis<32,1,1,1> val;

    Loop1 : do {    // user が 1 になった時にスタート
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
  ins >> val;
    } while(val.user == 0);

    for(int y=0; y<row_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=480 max=1080 avg=600
        for(int x=0; x<col_size; x++){
#pragma HLS PIPELINE II=1 rewind
#pragma HLS LOOP_TRIPCOUNT min=640 max=1920 avg=800
            if(!(y==0 && x==0)){
    ins >> val;
            }
            out[y*col_size+x] = val.data;
        }
    }

    return(0);
}


テストベンチの axis2DMA_tb.cpp を示す。

// axis2DMA_tb.cpp
// 2022/08/15 by marsee
//

#include <iostream>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#include "pict_data.h"

char OUTPUT_PICT_FILE[] = "test.jpg";

int axis2DMA2(hls::stream<ap_axis<32,1,1,1> >& ins,
   int32_t row_size, int32_t col_size, ap_int<32> *out);

int main(){
    hls::stream<ap_axis<32,1,1,1> > ins;
    ap_axis<32,1,1,1> axisp;
    ap_int<32> *wr_pict;

    for(int y=0; y<Y_SIZE; y++){
        for(int x=0; x<X_SIZE; x++){
            axisp.data = (ap_int<32>)pict_file_array[y][x][0] | ((ap_int<32>)pict_file_array[y][x][1])<<8 | ((ap_int<32>)pict_file_array[y][x][2])<<16;

            if(y==0 && x==0)
                axisp.user = 1;
            else
                axisp.user = 0;

            if(x == X_SIZE-1)
                axisp.last = 1;
            else
                axisp.last = 0;

            ins << axisp;
        }
    }

    if((wr_pict =(ap_int<32> *)malloc(sizeof(ap_int<32>) * (X_SIZE * Y_SIZE))) == NULL){
        fprintf(stderr, "Can't allocate wr_pict memory\n");
        exit(1);
    }

    axis2DMA2(ins, Y_SIZE, X_SIZE, wr_pict);

    cv::Mat img(Y_SIZE, X_SIZE, CV_8UC3);
    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for (int y=0; y<Y_SIZE; y++){
        for (int x=0; x<X_SIZE; x++){
            ap_int<32> data = wr_pict[y*X_SIZE+x];
            cv::Vec3b pixel;
            pixel[0] = data & 0xff; // blue
            pixel[1] = (data >> 8) & 0xff; // green
            pixel[2] = (data >> 16) & 0xff; // red
            dst_vec3b(y,x) = pixel;
        }
    }

    cv::imwrite(OUTPUT_PICT_FILE, img);

    return(0);
}


なお、pict_data.h は画像をヘッダファイルにしたもので、”Vitis HLS 2021.2 を使用して画像ファイルを C のヘッダファイルに変換する”で作成したヘッダ・ファイルだ。

ZYBO Z7-20 用なので、Solution メニューから Solution Settings... を選択し、ダイアログを表示された。
config_interface を展開して、m_axi_addr64 のチェックを外して、AXI4-Master のアドレス幅を 32 ビットに変更した。
ZYBO_Z7_PYNQ_166_220815.png

Vitis HLS 2021.2 の Project メニューから Project Settings... を選択して、設定を行った。
Project Settings (axis2DMA2st) ダイアログが開く。
左のウインドウで Simulation をクリックする。
axis2DMA2_tb.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
axis2DMA2_tb.cpp の CFLAGS に

-I/usr/local/include

を設定した。

Linker Flags に

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc


を設定した。
ZYBO_Z7_PYNQ_164_220815.png
  1. 2022年08月15日 06:36 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

今日、”FPGAの部屋 プレゼンツ Vitis HLS スタートアップ”セミナを行います

今日、”FPGAの部屋 プレゼンツ Vitis HLS スタートアップ”セミナを行います。

今日の Vitis HLS スタートアップ・セミナはいつも HDLab さんのセミナでやっているようにハンズオンで行きたいと思います。人数が多いので同期は取れませんが、ゆっくりと実装していくので、良ければ自分でも Vitis HLS 2022.1 を立ち上げて実装してみてください。
更に ZYBO Z7-10 で実機確認するので、ZYBO Z7-10 を持っている方は実機確認もやってみてください。ZYBO Z7-20 でも可です。

自分で実装するために使用するソースコードをここに貼っておきます。

sum_of_squares.cpp です。これは Vitis HLS のソースコードです。

#include <ap_int.h>

int sum_of_squares(ap_int<8> x, ap_int<8> y,
        ap_int<17> *result){

    *result = x*x + y*y;

    return(0);
}


sum_of_squares_tb.cpp です。これは Vitis HLS のテストベンチのコードです。

#include <ap_int.h>

int sum_of_squares(ap_int<8> x, ap_int<8> y, ap_int<17> *result);

int main(){
    ap_int<8> x;
    ap_int<8> y;
    ap_int<17> result;

    for(x=0, y=1; x<10; x++, y++){
        sum_of_squares(x, y, &result);
        std::cout << "x = " << x << " y = " << y << " result = "
        << result << std::endl;
        if(result != (x*x + y*y))
            return(1);
    }
    return(0);
}


最後に Vitis HLS で作成した IP を Vivado の IP インテグレーターで使用して、回路を完成し、Vitis でアプリケーション・ソフトウェアを作って実機確認するが、その際のアプリケーション・ソフトウェアの sums_test.c を示す。

// sums_test.c
// 2019/08/16 : by marsee
// x の入力の時に999を入力すると終了する
//

#include <stdio.h>
#include "xsum_of_squares.h"

int main(){
    XSum_of_squares XSums_ap;
    XSum_of_squares_Config *XSums_apPtr;
    int val;

    // Look Up the device configuration
    XSums_apPtr = XSum_of_squares_LookupConfig(0);
    if (!XSums_apPtr){
        fprintf(stderr, "XSum_of_squares configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int XSums_status = XSum_of_squares_CfgInitialize(&XSums_ap, XSums_apPtr);
    if (XSums_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XSum_of_squares\n");
        return(-1);
    }

   while(1){
       printf("\n\rx = ");
       scanf("%d", &val);
       if(val == 999)
           break;
       XSum_of_squares_Set_x(&XSums_ap, val);

       printf("\n\ry = ");
       scanf("%d", &val);
       XSum_of_squares_Set_y(&XSums_ap, val);

       while(!XSum_of_squares_IsIdle(&XSums_ap)) ;

       XSum_of_squares_Start(&XSums_ap);

       while(!XSum_of_squares_IsDone(&XSums_ap)) ;

       printf("\n\rresult = %d\n\r", (int)XSum_of_squares_Get_result(&XSums_ap));
   }

   return(0);
}


それでは今日のセミナ、よろしくお願いします。
  1. 2022年08月03日 04:51 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0
»