FC2カウンター FPGAの部屋 2020年10月
fc2ブログ

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

FPGAの部屋

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

Vitis アクセラレーション・プラットフォームでデフォルト・クロックを変更する2(実機でテスト)

Vitis アクセラレーション・プラットフォームでデフォルト・クロックを変更する1(Vitis の V++ コンパイラとリンカの設定)”の続き。

今回の Vitis アクセラレーション・プラットフォームで、デフォルト・クロック( 100 MHz )を使用してアクセラレーション・ハードウェアを使用してきたが、他のクロックも使用したい。そこで、 前回は、200 MHz のクロックを使用できるように Vitis のオプションを探って見つけることができた。今回は、できあがったバイナリと xclbin ファイルを Ultra96V2 で実行した。

まずは Ultra96V2 の電源を ON して PetaLinux を起動した。
FTP アプリの FileZilla を使用して、 SFTP を行う。

pfm/lap_filtger_axis_dma_200/Hardware/package/sd_card ディレクトリから Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリに BOOT.BIN, image.ub, lap_filter_axis_dma_200.xclbin ファイルをコピーする。( lap_filter_axis_dma_200 は後でリモートデバックでファイルがアップロードされるので、今はやらない)

まずは、Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリから BOOT.BIN, image.ub, lap_filter_axis_dma_200, lap_filter_axis_dma_200.xclbin ファイルを削除した。( lap_filter_axis_dma_200, lap_filter_axis_dma_200.xclbin ファイルがあるのはいろいろと試しているからだ)
Vitis_acc_option_10_201030.png

削除された。
Vitis_acc_option_11_201030.png

pfm/lap_filtger_axis_dma_200/Hardware/package/sd_card ディレクトリから Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリに BOOT.BIN, image.ub, lap_filter_axis_dma_200.xclbin ファイルをコピーした。
Vitis_acc_option_12_201030.png

Assistant ウインドウの lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware を右クリックし右クリックメニューから Run -> Run Configurations... を選択する。

Run Configurations ダイアログが開く。
Single Application Debug をダブルクリックすると、Debugger_lap_filter_axis_dma_200-Default が生成された。
Connection を 192.138.3.23 (Ultra96V2 の IP アドレス)に変更した。
Vitis_acc_option_16_201030.png

Application タブの内容を示す。
Vitis_acc_option_17_201030.png

Apply ボタンをクリックして、 Run ボタンをクリックすると lap_filter_axis_dma_200 実行ファイルが lap_filter_axis_dma_200.xclbin 引数付きで実行された。
Vitis_acc_option_18_201030.png

成功だ。カーネルの実行時間は 3562350 ns 、約 3.562 ms となった。
カーネルの動作周波数が 100 MHz の時の実行時間は約 6.538 ms だったので、約半分近くになっている。
実行時間は 3.562 / 6.538 X 100 ≒ 54.48 % になっている。
性能は 6.538 / 3.562 ≒ 1.83 倍になっている。
カーネル動作周波数は 200 MHz になっているようだ。

生成された profile_summary.csv を示す。
Vitis_acc_option_19_201030.png

Vitis_acc_option_20_201030.png

Vitis_acc_option_21_201030.png

ラプラシアンフィルタ処理後の temp_lap.bmp を貼っておく。正常にフィルタがかかっているようだ。
Vitis_acc_option_32_201031.png
  1. 2020年10月31日 04:55 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis アクセラレーション・プラットフォームでデフォルト・クロックを変更する1(Vitis の V++ コンパイラとリンカの設定)

今回の Vitis アクセラレーション・プラットフォームでハードウェア・プラットフォームを作る際にクロックを 100 MHz, 200 MHz, 300 MHz, 600 MHz の 4 つのクロックを生成して、 100 MHz をデフォルト・クロックとして使用するように設定した
デフォルト・クロック( 100 MHz )を使用してアクセラレーション・ハードウェアを使用してきたが、他のクロックも使用したい。そこで、 200 MHz のクロックを使用できるように Vitis のオプションを探ってみた。

まずは、v++ コンパイラの --kernel_frequency オプションを探ってみた。

これは v++ コンパイラのオプションだ。 v++ コンパイラについては、”Vitis コンパイラ コマンド”から引用する。

このセクションでは、Vitis コンパイラ コマンド v++ と、コンパイルおよび FPGA バイナリのリンクでこのコマンドにサポートされるさまざまなオプションについて説明します。

Vitis コンパイラはスタンドアロン コマンド ライン ユーティリティで、カーネル アクセラレータ関数をザイリンクス オブジェクト (.xo) ファイルにコンパイルし、それらをほかの .xo ファイルおよびサポートされるプラットフォームとリンクして、FPGA バイナリをビルドします。


この --kernel_frequency 200 オプションを単独で v++ コンパイラのオプションとして付加しても、Vivado での合成時の周波数は 200 MHz になるが、Vivado のブロックデザインでの lap_filter_axis_dma_1 に供給されるクロックは 100 MHz のままだった。

更に”Vitis 統合ソフトウェア開発プラットフォームの資料”を探っていくと、 v++ リンカの --clock.defaultId オプションがあった。
(注)--clock は、エンベデッド プロセッサ プラットフォーム専用のオプションで、現時点では Alveo データセンター アクセラレータ カードをサポートしていないそうです。

v++ コンパイラの --kernel_frequency オプションと v++ リンカの --clock.defaultId オプションを同時に付加すると 200 MHz でハードウェア( lap_filter_axis_dma IP )がコンパイルされて lap_filter_axis_dma_1 に供給されるクロックも 200 MHz になった。

次に、やり方を示す。
まずは、新たに lap_filter_axis_dma_200 の Vitis アクセラレーション・アプリケーション・プロジェクトを作成した。(もうすでにビルド済みだが、気にしないでください)
Vitis_acc_option_1_201029.png

Assistant ウインドウの lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware を右クリックし右クリックメニューから Settings... を選択する。
Vitis_acc_option_2_201029.png

Binary Container Settings ダイアログが開く。
左のウインドウで lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware を展開し、 lap_filter_axis_dma_200 をクリックする。
右のウインドウの V++ linker options: に --clock.defaultId 1 を追加した。
(注)この項目を表示するためには、一旦ビルドする必要があります。
Vitis_acc_option_3_201029.png

左のウインドウで lap_filter_axis_dma_200 -> lap_filter_axis_dma をクリックする。
右のウインドウで、 V++ compilter options: に --kernel_frequency 200 を追加した。
Vitis_acc_option_4_201029.png

これで Apply ボタンをクリックし、Apply and Close ボタンをクリックした。

念の為、Assistant ウインドウの lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware を右クリックし右クリックメニューから Clean を選択して、クリアしておく。
その後、Assistant ウインドウの lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware を右クリックし右クリックメニューから Build を行ってビルドし、成功した。(冒頭のキャプチャ画像)

pfm/lap_filter_axis_dma_200/Hardware/package/sd_card ディレクトリに必要なファイルがビルドされている。
Vitis_acc_option_9_201030.png

さて、Vivado のプロジェクトを見てみよう。
Assistant ウインドウの lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware -> lap_filter_axis_dma_200 を右クリックし右クリックメニューから Open Vivado Project を選択して、Vivado プロジェクトを開いた。
Vitis_acc_option_5_201029.png

ブロックデザインを開く。
clk_wiz_0 の clk_out1 ( 100 MHz クロック)をハイライトすると、 lap_filter_axis_dma_1 のクロック入力には接続されていない。
Vitis_acc_option_6_201029.png

clk_wiz_0 の clk_out1 ( 200 MHz クロック)をハイライトすると、 lap_filter_axis_dma_1 のクロック入力に入力されている。
Vitis_acc_option_7_201029.png

Address Editor 画面を示す。
Vitis_acc_option_8_201029.png

これで、アクセラレーション・カーネルは 200 MHz 動作になったのだが、他の周辺回路は 100 MHz のままだった。全部 200 MHz になると思っていたので、その部分は拍子抜けだ。。。(なお、 V++ linker options: に --clock.defaultFreqHz 200000000 を追加しても同様だった)

Assistant ウインドウの lap_filter_axis_dma_200_system -> lap_filter_axis_dma_200 -> Hardware -> lap_filter_axis_dma_200 -> Link Summary (lap_filter_axis_dma_200) を右クリックし、右クリックメニューから Open in Vitis Analyzer を選択した。

Vitis Analyzer が立ち上がった。
lap_filter_axis_dma_200 (Hardware) -> System Estimate をクリックした。
Target Clock: は 100 MHz だが、 Timing Information (MHz) の Target Frequency は 200 MHz になっている。
Vitis_acc_option_13_201030.png

lap_filter_axis_dma (Hardware) -> Kernel Estimate をクリックした。
こちらの Target Clock: は 200 MHz だった。
Vitis_acc_option_14_201030.png

lap_filter_axis_dma (Hardware) -> HLS Synthesis をクリックした。
Latency (sycles) と Latency (ns) の対比を見ればクロックが 200 MHz であることが分かる。
Vitis_acc_option_15_201030.png
  1. 2020年10月30日 04:05 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

GPS と 3軸加速度センサーを使ったシステム3(GPS 受信をしてみた2)

GPS と 3軸加速度センサーを使ったシステム2(GPS 受信をしてみた)”の続き。

前回は、 3 軸加速度センサーの Vivado プロジェクトに GPS のデータを受信する axi_uartlite IP を追加したプロジェクトを作って、GPS のデータを受信したが、まだ、外に持っていっていないので、ちゃんとしたデータは取れていなかった。今回は、外に持っていって、データを取得した。

ZYBO Z7-20 と GPS ユニット、3 軸加速度センサーもセットで外に持っていったのだが、 1 〜 2 分程度で位置が取れた。GPS の LED も力強く点滅しだした。 1 秒ごとに点滅している。 PPS も測っていないが出力されていることだろう?
その場合の測位モードはSPS(標準測位サービス)モードだった。
GPS のデータを示すが、位置はぼかした。
acc_gps_sensor_8_201028.png

国土地理院の緯度経度地図で確認すると精度 5 m くらいか?

更に、12 分くらいそのままにすると、測位モードが differenctial GPS(干渉測位方式)モードになった。
acc_gps_sensor_9_201028.png

こちらは先程よりも精度は良さそうだ。数 m くらいか?
しかし、緯度と経度の最小桁がドリフトしている。1 秒間隔の計測毎に 1 程度違っている。
大体、位置が取れているようだ。
  1. 2020年10月28日 05:06 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

GPS と 3軸加速度センサーを使ったシステム2(GPS 受信をしてみた)

GPS と 3軸加速度センサーを使ったシステム1(GPS 受信の検討)”の続き。

前回は、3 軸加速度センサー+ GPS システムの検討をした。今回は 3 軸加速度センサーの Vivado プロジェクトに GPS のデータを受信する axi_uartlite IP を追加したプロジェクトを作って、GPS のデータを受信したが、まだ、外に持っていっていないので、ちゃんとしたデータは取れていない。

まずは、ブロックデザインに axi_uartlite IP を追加した Vivado 2020.1 プロジェクトを示す。
acc_gps_sensor_2_201027.png

ブロックデザインを示す。 ( acc_gps_bd.bd )
acc_gps_sensor_3_201027.png

axi_uartlite IP が追加されている。

Address Editor を示す。
acc_gps_sensor_4_201027.png

XDC ファイルを示す。 ( acc_gps_bd.xdc )

set_property PACKAGE_PIN V8 [get_ports IIC_0_scl_io]; # JB,1
set_property PACKAGE_PIN W8 [get_ports IIC_0_sda_io]; # JB,2
set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_scl_io];
set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_sda_io];

set_property PACKAGE_PIN U7 [get_ports UART_0_rxd]; # JB,3
set_property PACKAGE_PIN V7 [get_ports UART_0_txd]; # JB,4
set_property IOSTANDARD LVCMOS33 [get_ports UART_0_rxd];
set_property IOSTANDARD LVCMOS33 [get_ports UART_0_txd];

set_property PACKAGE_PIN Y7 [get_ports GPIO_0_tri_i]; # JB,7
set_property IOSTANDARD LVCMOS33 [get_ports GPIO_0_tri_i];


Vitis 2020.1 の画面を示す。
acc_gps_sensor_5_201027.png

アプリケーション・ソフトウェアの acc_gps_test.c を示す。

// acc_gps_test.c
// 2020/10/26 by marsee
//

#include <stdio.h>

#include "xparameters.h"
#include "xuartlite_l.h"

int main(){
    XUartLite_SetControlReg(XPAR_AXI_UARTLITE_0_BASEADDR, XUL_CR_FIFO_RX_RESET|XUL_CR_FIFO_TX_RESET); // Rst Rx FIFO, Rst TX FIFO
    XUartLite_SetControlReg(XPAR_AXI_UARTLITE_0_BASEADDR, 0); // normal

    while(1){
        u8 status = XUartLite_GetStatusReg(XPAR_AXI_UARTLITE_0_BASEADDR);
        if(status & XUL_SR_RX_FIFO_VALID_DATA){ // received data
            u8 read_data = XUartLite_RecvByte(XPAR_AXI_UARTLITE_0_BASEADDR);
            putchar((int)read_data);
        }
    }

}


ZYBO Z7-20 と 3 軸加速度センサー + GPS のシステムを示す。ブレッドボードで作っている。
acc_gps_sensor_6_201027.jpg

acc_gps_sensor_7_201027.jpg

Tera Term に表示された GPS データを示す。
acc_gps_sensor_1_201026.png

$GPGGA,001530.799,,,,,0,0,,,M,,M,,*48
$GPGLL,,,,,001530.799,V,N*7A
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,001530.799,V,,,,,0.00,0.00,050180,,,N*41
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPZDA,001530.799,05,01,3880,,*51

  1. 2020年10月27日 05:12 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

GPS と 3軸加速度センサーを使ったシステム1(GPS 受信の検討)

今度、お仕事で GPS と 3軸加速度センサーを使ったシステムを作ることになった。内容を公開してよいということなので、ブログに書いておく。

この前の記事の”Xilinx 社の AXI IIC IP で ADXL355 を使用する”も、そこで使用している 20 ビットの 3軸加速度センサーを使用する。
まだ仮の回路で、1 個の 3軸加速度センサーに 1 個の MicroBlaze を貼り付けて専用のコントローラとする予定だ。そうすればセンサー毎に同期が取れて、何個センサーを使用しても、同じ時刻の加速度値をとることができるだろう。というか、同期を取ってセンサーの値を取得する。

GPSは秋月電子の”GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応”を使用する予定だ。

GPS 使ったこと無いのだが、シリアル通信をつないで、電源ON すれば、勝手にシリアルで送ってくるのかな?

送ってくるデータのサンプルが”GPS受信モジュール AE-GYSFDMAXBのデータを表示する”に書かれている。

GPS モジュールから送ってくるデータのフォーマットは NMEAフォーマットと言うそうだが、”GPSのNMEAフォーマット”に NMEAフォーマットの意味が載っているので、参考にしよう。

みちびき対応のGPS受信機(GYSFDMAXB)の使い方 [Arduino]”もスケッチがあって、参考になりそうだ。

GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応”を動作させて、データを受信してみよう。

GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応”は 5V 電源だけど内部は 3.3V で動いているのか?
ZYBO Z7-20 使うとすると PMOD の電源を 5V に昇圧する必要がある。一応、”5V出力昇圧DCDCコンバーター”を買ったけど、”GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応”のシリーズパス・レギュレーターを取ったほうが良いかな?

DCDCコンバーターがまだ届いていないので、とりあえずは別電源を入れて GPS を動かしてみよう。

(2023/03/29:追記)GPS データのフォーマットは”GPSのNMEAフォーマット”が見やすい。
  1. 2020年10月26日 04:21 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

ultra96v2-platform で lap_fitler_axis_dma を試してみる2(リモートデバックで動作を確認)

ultra96v2-platform で lap_fitler_axis_dma を試してみる2(Vitis 2019.2 のカーネルコードはVitis 2020.1で使用できない)”の続き。

Ultra96V2 用の Vitis アクセラレーション・プラットフォーム ultra96v2-platform を使用して、 lap_filter_axis_dma をビルドしたのだが、Vivado を立ち上げてブロックデザインを見ると、使用されていない AXI4-Lite インターフェースがあった。これは、”Vitis HLS 2020.1 と Vivado HLS 2019.2 の違い(AXI4 Master インターフェースでの offset=slave オプション時の扱いの違い)”で探った Vivado HLS と Vitis HLS の違いが原因のようだ。今回は、そこを修正してもう一度ビルドし成功した。今回は、ビルドできたラプラシアンフィルタをリモートデバックで動作させてみよう。

まずは、Run Configuration を作成する。
Vitis 2020.1 の左下の Assistant ウインドウの lap_filter_axis_dma_system -> Hardware を右クリックし右クリックメニューから Run -> Run Configurations... を選択する。

Run Configurations ダイアログが表示される。
左のウインドウの Single Application Debug をクリックして、新しいコンフィグレーションの Debugger_lap_filter_axis_dma-Default を作成する。
Ultra96V2_acc_platform201_137_201025.png

Debugger_lap_filter_axis_dma-Default が作成された。
Connection: で 192.168.3.23 を選択する。(ここは環境によって異なる)
Ultra96V2_acc_platform201_138_201025.png

Application タブを示す。
Ultra96V2_acc_platform201_139_201025.png

Arguments タブを示す。
Ultra96V2_acc_platform201_140_201025.png

Apply ボタンをクリックする。
Run ボタンをクリックする。

Vitis に test.bmp が無いと表示された。
Ultra96V2_acc_platform201_141_201025.png

しまった。 test.bmp ファイルを SFTP してなかった。

64 ピクセル X 48 行の A キャラクタの test.bmp と 800 ピクセル X 600 行の私の部屋の写真 test2.bmp を Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリに SFTP しよう。
Ultra96V2_acc_platform201_142_201025.png

FTP ソフトで Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリをみると、 lap_filter_axis_dma 実行ファイルはあるが、 xclbin ファイルが無かった。
Ultra96V2_acc_platform201_143_201025.png

lap_filter_axis_dma.xclbin, test.bmp, test2.bmp ファイルを Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリにコピーした。
Ultra96V2_acc_platform201_144_201025.png

Debugger_lap_filter_axis_dma-Default を Run すると、ハードウェアのデータが全て 0 でフィルタがかかっていなかった。
Ultra96V2_acc_platform201_145_201025.png

やはりこれは、BOOT.BIN のビットファイルが違っているからだ。
BOOT.BIN を lap_filter_axis_dma 用に変更する必要がある。
Ultra96V2_acc_platform201_146_201025.png

BOOT.BIN を Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリに上書きコピーした。
Ultra96V2 をリブートした。
もう一度、Debugger_lap_filter_axis_dma-Default を Run した。
成功した。ハードウェアの処理時間は 380.63 us だった。
Ultra96V2_acc_platform201_147_201025.png

Ultra96V2 の /media/sd-mmcblk0p1 ディレクトリに生成された temp_lap.bmp をパソコンに SFTP して、画像表示した。
Ultra96V2_acc_platform201_148_201025.png

temp_lap.bmp は A のエッジ画像になっていることが分かる。
Ultra96V2_acc_platform201_149_201025.png

Ultra96V2 で /media/sd-mmcblk0p1 ディレクトリに行って、test.bmp を test_A.bmp にリネームして、test2.bmp を test.bmp に変更した。
cd /media/sd-mmcblk0p1
mv test.bmp test_A.bmp
mv test2.bmp test.bmp

これで、Debugger_lap_filter_axis_dma-Default を Run した。
Ultra96V2_acc_platform201_150_201025.png

成功だ。ハードウェアの動作時間は約 6.538 ms だった。
Ultra96V2_acc_platform201_150_201025.png

temp_lap.bmp もエッジが取れている。
Ultra96V2_acc_platform201_151_201025.jpg

元画像を示す。
Ultra96V2_acc_platform201_152_201025.jpg
  1. 2020年10月25日 06:52 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

ultra96v2-platform で lap_fitler_axis_dma を試してみる2(Vitis 2019.2 のカーネルコードはVitis 2020.1で使用できない)

ultra96v2-platform で lap_fitler_axis_dma を試してみる1(プロジェクトの作成とビルド)”の続き。

前回、Ultra96V2 用の Vitis アクセラレーション・プラットフォーム ultra96v2-platform を使用して、 lap_filter_axis_dma をビルドしたのだが、Vivado を立ち上げてブロックデザインを見ると、使用されていない AXI4-Lite インターフェースがあった。これは、”Vitis HLS 2020.1 と Vivado HLS 2019.2 の違い(AXI4 Master インターフェースでの offset=slave オプション時の扱いの違い)”で探った Vivado HLS と Vitis HLS の違いが原因のようだ。今回は、そこを修正してもう一度ビルドしよう。

まずは、Vivado プロジェクトを開く。
Assistant ウインドウの lap_filter_axis_dma_system -> lap_filter_axis_dma -> Hardware -> lap_filter_axis_dma を右クリックし右クリックメニューから Open Vivado Project を選択する。
Ultra96V2_acc_platform201_129_201024.png

Vivado のプロジェクトが開く。
Ultra96V2_acc_platform201_130_201024.png

ブロックデザインを確認する。
Ultra96V2_acc_platform201_131_201024.png

lap_filter_axis_dma_1 の s_axi_control_r ポートが空いている。
Ultra96V2_acc_platform201_132_201024.png

これは、”Vitis HLS 2020.1 と Vivado HLS 2019.2 の違い(AXI4 Master インターフェースでの offset=slave オプション時の扱いの違い)”が原因だろう?

lap_filter_axis_dma.cpp の lap_filter_axis_dma 関数に指示子を 2 個追加した。

#pragma HLS INTERFACE s_axilite port=inm bundle=control
#pragma HLS INTERFACE s_axilite port=outm bundle=control


Ultra96V2_acc_platform201_133_201024.png

再度、ビルドを行って成功した。
Ultra96V2_acc_platform201_134_201024.png

再度、Vivado のブロックデザインを見ると lap_filter_axis_dma_1 の s_axilite ポートは 1 つだけで、問題が解消した。
Ultra96V2_acc_platform201_135_201024.png

Assistant ウインドウの lap_filter_axis_dma_system -> lap_filter_axis_dma -> Hardware -> lap_filter_axis_dma -> lap_filter_axis_dma を右クリックし右クリックメニューから Open HLS Project を選択して VItis 2020.1 を起動する。
Ultra96V2_acc_platform201_125_201024.png

Launch Vitis HLS ダイアログが表示された。OK ボタンをクリックした。
Ultra96V2_acc_platform201_126_201024.png

Vitis HLS 2020.1 が表示された。
Ultra96V2_acc_platform201_136_201024.png
  1. 2020年10月24日 20:14 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

ultra96v2-platform で lap_fitler_axis_dma を試してみる1(プロジェクトの作成とビルド)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる7(4 – Create Platform)”で作成した Ultra96V2 用の Vitis アクセラレーション・プラットフォーム ultra96v2-platform を使用して、 lap_filter_axis_dma をビルドしてみよう。

lap_filter_axis_dma は AXI4 Master DMA Read ー AXI4-Stream 入力, ラプラシアン・フィルタ処理, AXI4 Stream 出力 ー AXI4 Master DMA Write のラプラシアン・フィルタ処理のカーネルアプリケーションを行う。ソースコードは”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI4-Streamバージョン2”のソースコードを使用する。

まずは、 Vitis 2020.1 で File メニューから New -> New Application Project... を選択する。

New Application Project ダイアログの Create a New Application Project 画面が開いた。
デフォルトで Next > ボタンをクリックする。
Ultra96V2_acc_platform201_113_201023.png

Platform 画面では、 ultra96v2-platform を選択する。
Ultra96V2_acc_platform201_114_201023.png

Application Project Details 画面では、Application project name: に lap_filter_axis_dma と入力した。
Ultra96V2_acc_platform201_115_201023.png

Domain では、デフォルトのままとした。
Ultra96V2_acc_platform201_116_201023.png

Templates 画面では、 Empty Application を選択して、Finish ボタンをクリックする。
Ultra96V2_acc_platform201_117_201023.png

Vitis IDE に lap_filter_axis_dma_system が追加された。
Ultra96V2_acc_platform201_118_201023.png

lap_filter_axis_dma_system -> lap_filter_axis_dma -> src を右クリックし、右クリックメニューから Import Sources... を選択する。

Import Sources ダイアログが表示された。
bmp_header.h, lap_filter_axis_dma_host.cpp, lap_filter_axis_dma.cpp をインポートする。
Ultra96V2_acc_platform201_119_201023.png

lap_filter_axis_dma_system -> lap_filter_axis_dma -> src にソースコードがインポートされた。
Active build configuration: を Hardware に変更した。
Add Hardware Function... ボタンをクリックして、ハードウェアにする関数を選択する。
Ultra96V2_acc_platform201_120_201023.png

Add Hardware Function が表示された。
lap_filter_axis_dma 関数を選択して、OK ボタンをクリックする。
Ultra96V2_acc_platform201_121_201023.png

ハードウェアにする関数の lap_filter_axis_dma が Hardware Function に入った。
トンカチマークをくりっくして、ビルドを開始した。
Ultra96V2_acc_platform201_122_201023.png

ビルド中。
Ultra96V2_acc_platform201_123_201023.png

ビルドが成功した。
Ultra96V2_acc_platform201_124_201023.png

ログを示す。

04:12:04 **** Build of configuration Hardware for project lap_filter_axis_dma ****
make -j4 incremental 
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/bin/v++ --target hw --compile -I"../src" --config common-config.cfg --config lap_filter_axis_dma-lap_filter_axis_dma-compile.cfg -o"lap_filter_axis_dma.build/lap_filter_axis_dma.xo" "../src/lap_filter_axis_dma.cpp"
Option Map File Used: '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/data/vitis/vpp/optMap.xml'

****** v++ v2020.1 (64-bit)
  **** SW Build 2902540 on Wed May 27 19:54:35 MDT 2020
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

INFO: [v++ 60-1306] Additional information associated with this v++ compile can be found at:
 Reports: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/reports/lap_filter_axis_dma
 Log files: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/logs/lap_filter_axis_dma
INFO: [v++ 60-1657] Initializing dispatch client.
Running Dispatch Server on port:35459
INFO: [v++ 60-1548] Creating build summary session with primary output /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/lap_filter_axis_dma.xo.compile_summary, at Fri Oct 23 04:12:17 2020
INFO: [v++ 60-1316] Initiating connection to rulecheck server, at Fri Oct 23 04:12:17 2020
INFO: [v++ 60-895]   Target platform: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/ultra96v2-platform.xpfm
INFO: [v++ 60-1578]   This platform contains Xilinx Shell Archive '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/hw/ultra96v2.xsa'
INFO: [v++ 60-585] Compiling for hardware target
INFO: [v++ 60-423]   Target device: ultra96v2-platform
INFO: [v++ 60-242] Creating kernel: 'lap_filter_axis_dma'

===>The following messages were generated while  performing high-level synthesis for kernel: lap_filter_axis_dma Log file: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/lap_filter_axis_dma/lap_filter_axis_dma/vitis_hls.log :
INFO: [v++ 204-61] Pipelining loop 'LOOP_DRY_LOOP_DRX'.
INFO: [v++ 200-1470] Pipelining result : Target II = 1, Final II = 1, Depth = 140.
INFO: [v++ 204-61] Pipelining loop 'Loop1'.
INFO: [v++ 200-1470] Pipelining result : Target II = 1, Final II = 1, Depth = 1.
INFO: [v++ 204-61] Pipelining loop 'Loop2_Loop3'.
INFO: [v++ 200-1470] Pipelining result : Target II = 1, Final II = 1, Depth = 10.
INFO: [v++ 204-61] Pipelining loop 'LOOP_DWY_LOOP_DWX'.
INFO: [v++ 200-1470] Pipelining result : Target II = 1, Final II = 1, Depth = 138.
INFO: [v++ 200-790] **** Loop Constraint Status: All loop constraints were satisfied.
INFO: [v++ 200-789] **** Estimated Fmax: 136.99 MHz
INFO: [v++ 60-594] Finished kernel compilation
INFO: [v++ 60-244] Generating system estimate report...
INFO: [v++ 60-1092] Generated system estimate report: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/reports/lap_filter_axis_dma/system_estimate_lap_filter_axis_dma.xtxt
Add Instance lap_filter_axis lap_filter_axis_U0 146
Add Instance dma_read3 dma_read3_U0 156
Add Instance dma_write dma_write_U0 174
INFO: [v++ 60-586] Created lap_filter_axis_dma.build/lap_filter_axis_dma.xo
INFO: [v++ 60-2343] Use the vitis_analyzer tool to visualize and navigate the relevant reports. Run the following command. 
    vitis_analyzer /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/lap_filter_axis_dma.xo.compile_summary 
INFO: [v++ 60-791] Total elapsed time: 0h 0m 59s
INFO: [v++ 60-1653] Closing dispatch client.
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/bin/v++ --target hw --link --config common-config.cfg --config lap_filter_axis_dma-link.cfg -o"lap_filter_axis_dma.xclbin" lap_filter_axis_dma.build/lap_filter_axis_dma.xo
Option Map File Used: '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/data/vitis/vpp/optMap.xml'

****** v++ v2020.1 (64-bit)
  **** SW Build 2902540 on Wed May 27 19:54:35 MDT 2020
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

INFO: [v++ 60-1306] Additional information associated with this v++ link can be found at:
 Reports: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/reports/link
 Log files: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/logs/link
INFO: [v++ 60-1657] Initializing dispatch client.
Running Dispatch Server on port:46033
INFO: [v++ 60-1548] Creating build summary session with primary output /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.xclbin.link_summary, at Fri Oct 23 04:13:18 2020
INFO: [v++ 60-1316] Initiating connection to rulecheck server, at Fri Oct 23 04:13:18 2020
INFO: [v++ 60-895]   Target platform: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/ultra96v2-platform.xpfm
INFO: [v++ 60-1578]   This platform contains Xilinx Shell Archive '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/hw/ultra96v2.xsa'
INFO: [v++ 60-629] Linking for hardware target
INFO: [v++ 60-423]   Target device: ultra96v2-platform
INFO: [v++ 60-1332] Run 'run_link' status: Not started
INFO: [v++ 60-1443] [04:13:19] Run run_link: Step system_link: Started
INFO: [v++ 60-1453] Command Line: system_link --xo /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/lap_filter_axis_dma.xo -keep --config /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/syslinkConfig.ini --xpfm /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/ultra96v2-platform.xpfm --target hw --output_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int --temp_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
INFO: [SYSTEM_LINK 60-1316] Initiating connection to rulecheck server, at Fri Oct 23 04:13:21 2020
INFO: [SYSTEM_LINK 82-70] Extracting xo v3 file /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/lap_filter_axis_dma.xo
INFO: [SYSTEM_LINK 82-53] Creating IP database /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml
INFO: [SYSTEM_LINK 82-38] [04:13:21] build_xd_ip_db started: /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/bin/build_xd_ip_db -ip_search 0  -sds-pf /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/ultra96v2.hpfm -clkid 0 -ip /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/iprepo/xilinx_com_hls_lap_filter_axis_dma_1_0,lap_filter_axis_dma -o /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml
INFO: [SYSTEM_LINK 82-37] [04:13:29] build_xd_ip_db finished successfully
Time (s): cpu = 00:00:09 ; elapsed = 00:00:08 . Memory (MB): peak = 1369.680 ; gain = 0.000 ; free physical = 1432 ; free virtual = 33589
INFO: [SYSTEM_LINK 82-51] Create system connectivity graph
INFO: [SYSTEM_LINK 82-102] Applying explicit connections to the system connectivity graph: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/cfgraph/cfgen_cfgraph.xml
INFO: [SYSTEM_LINK 82-38] [04:13:29] cfgen started: /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/bin/cfgen  -nk lap_filter_axis_dma:1 -dmclkid 0 -r /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml -o /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/cfgraph/cfgen_cfgraph.xml
INFO: [CFGEN 83-0] Kernel Specs: 
INFO: [CFGEN 83-0]   kernel: lap_filter_axis_dma, num: 1  {lap_filter_axis_dma_1}
INFO: [CFGEN 83-2226] Inferring mapping for argument lap_filter_axis_dma_1.inm to HP0
INFO: [CFGEN 83-2226] Inferring mapping for argument lap_filter_axis_dma_1.outm to HP0
INFO: [SYSTEM_LINK 82-37] [04:13:29] cfgen finished successfully
Time (s): cpu = 00:00:00.35 ; elapsed = 00:00:00.43 . Memory (MB): peak = 1369.680 ; gain = 0.000 ; free physical = 1430 ; free virtual = 33588
INFO: [SYSTEM_LINK 82-52] Create top-level block diagram
INFO: [SYSTEM_LINK 82-38] [04:13:29] cf2bd started: /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/bin/cf2bd  --linux --trace_buffer 1024 --input_file /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/cfgraph/cfgen_cfgraph.xml --ip_db /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml --cf_name dr --working_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.xsd --temp_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link --output_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int
INFO: [CF2BD 82-31] Launching cf2xd: cf2xd -linux -trace-buffer 1024 -i /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/cfgraph/cfgen_cfgraph.xml -r /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml -o dr.xml
INFO: [CF2BD 82-28] cf2xd finished successfully
INFO: [CF2BD 82-31] Launching cf_xsd: cf_xsd -disable-address-gen -dn dr -dp /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/sys_link/_sysl/.xsd
INFO: [CF2BD 82-28] cf_xsd finished successfully
INFO: [SYSTEM_LINK 82-37] [04:13:31] cf2bd finished successfully
Time (s): cpu = 00:00:02 ; elapsed = 00:00:02 . Memory (MB): peak = 1369.680 ; gain = 0.000 ; free physical = 1425 ; free virtual = 33588
INFO: [v++ 60-1441] [04:13:31] Run run_link: Step system_link: Completed
Time (s): cpu = 00:00:13 ; elapsed = 00:00:12 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 1450 ; free virtual = 33614
INFO: [v++ 60-1443] [04:13:31] Run run_link: Step cf2sw: Started
INFO: [v++ 60-1453] Command Line: cf2sw -sdsl /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/sdsl.dat -rtd /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/cf2sw.rtd -xclbin /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/xclbin_orig.xml -o /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/xclbin_orig.1.xml
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
INFO: [v++ 60-1441] [04:13:32] Run run_link: Step cf2sw: Completed
Time (s): cpu = 00:00:00.64 ; elapsed = 00:00:00.72 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 1449 ; free virtual = 33613
INFO: [v++ 60-1443] [04:13:32] Run run_link: Step rtd2_system_diagram: Started
INFO: [v++ 60-1453] Command Line: rtd2SystemDiagram
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
INFO: [v++ 60-1441] [04:13:33] Run run_link: Step rtd2_system_diagram: Completed
Time (s): cpu = 00:00:00 ; elapsed = 00:00:01 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 1229 ; free virtual = 33394
INFO: [v++ 60-1443] [04:13:33] Run run_link: Step vpl: Started
INFO: [v++ 60-1453] Command Line: vpl -t hw -f /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/ultra96v2-platform.xpfm --remote_ip_cache /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ip_cache -s --output_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int --log_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/logs/link --report_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/reports/link --config /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/vplConfig.ini -k /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/kernel_info.dat --webtalk_flag Vitis --temp_dir /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link --no-info --iprepo /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/xo/ip_repo/xilinx_com_hls_lap_filter_axis_dma_1_0 --messageDb /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link/vpl.pb /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/dr.bd.tcl
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link

****** vpl v2020.1 (64-bit)
  **** SW Build 2902540 on Wed May 27 19:54:35 MDT 2020
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

INFO: [VPL 60-839] Read in kernel information from file '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/kernel_info.dat'.
INFO: [VPL 60-423]   Target device: ultra96v2-platform
INFO: [VPL 60-1032] Extracting hardware platform to /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/vivado/vpl/.local/hw_platform
[04:13:47] Run vpl: Step create_project: Started
Creating Vivado project.
[04:13:56] Run vpl: Step create_project: Completed
[04:13:56] Run vpl: Step create_bd: Started
[04:14:08] Run vpl: Step create_bd: Completed
[04:14:08] Run vpl: Step update_bd: Started
[04:14:08] Run vpl: Step update_bd: Completed
[04:14:08] Run vpl: Step generate_target: Started
[04:14:55] Run vpl: Step generate_target: Completed
[04:14:55] Run vpl: Step config_hw_runs: Started
[04:14:56] Run vpl: Step config_hw_runs: Completed
[04:14:56] Run vpl: Step synth: Started
[04:15:27] Block-level synthesis in progress, 0 of 2 jobs complete, 2 jobs running.
[04:15:58] Block-level synthesis in progress, 0 of 2 jobs complete, 2 jobs running.
[04:16:28] Block-level synthesis in progress, 0 of 2 jobs complete, 2 jobs running.
[04:16:58] Block-level synthesis in progress, 0 of 2 jobs complete, 2 jobs running.
[04:17:29] Block-level synthesis in progress, 1 of 2 jobs complete, 1 job running.
[04:17:59] Block-level synthesis in progress, 1 of 2 jobs complete, 1 job running.
[04:18:29] Block-level synthesis in progress, 1 of 2 jobs complete, 1 job running.
[04:18:59] Block-level synthesis in progress, 1 of 2 jobs complete, 1 job running.
[04:19:29] Top-level synthesis in progress.
[04:19:59] Top-level synthesis in progress.
[04:20:29] Top-level synthesis in progress.
[04:20:59] Top-level synthesis in progress.
[04:21:20] Run vpl: Step synth: Completed
[04:21:20] Run vpl: Step impl: Started
[04:23:51] Finished 2nd of 6 tasks (FPGA linking synthesized kernels to platform). Elapsed time: 00h 10m 15s 

[04:23:51] Starting logic optimization..
[04:23:51] Phase 1 Retarget
[04:23:51] Phase 2 Constant propagation
[04:23:51] Phase 3 Sweep
[04:23:51] Phase 4 BUFG optimization
[04:23:51] Phase 5 Shift Register Optimization
[04:23:51] Phase 6 Post Processing Netlist
[04:24:21] Finished 3rd of 6 tasks (FPGA logic optimization). Elapsed time: 00h 00m 30s 

[04:24:21] Starting logic placement..
[04:24:21] Phase 1 Placer Initialization
[04:24:21] Phase 1.1 Placer Initialization Netlist Sorting
[04:24:21] Phase 1.2 IO Placement/ Clock Placement/ Build Placer Device
[04:24:51] Phase 1.3 Build Placer Netlist Model
[04:24:51] Phase 1.4 Constrain Clocks/Macros
[04:24:51] Phase 2 Global Placement
[04:24:51] Phase 2.1 Floorplanning
[04:24:51] Phase 2.1.1 Partition Driven Placement
[04:24:51] Phase 2.1.1.1 PBP: Partition Driven Placement
[04:25:21] Phase 2.1.1.2 PBP: Clock Region Placement
[04:25:21] Phase 2.1.1.3 PBP: Compute Congestion
[04:25:21] Phase 2.1.1.4 PBP: UpdateTiming
[04:25:21] Phase 2.1.1.5 PBP: Add part constraints
[04:25:21] Phase 2.2 Global Placement Core
[04:25:51] Phase 2.2.1 Physical Synthesis In Placer
[04:25:51] Phase 3 Detail Placement
[04:25:51] Phase 3.1 Commit Multi Column Macros
[04:25:51] Phase 3.2 Commit Most Macros & LUTRAMs
[04:26:21] Phase 3.3 Area Swap Optimization
[04:26:21] Phase 3.4 Pipeline Register Optimization
[04:26:21] Phase 3.5 Small Shape DP
[04:26:21] Phase 3.5.1 Small Shape Clustering
[04:26:21] Phase 3.5.2 Flow Legalize Slice Clusters
[04:26:21] Phase 3.5.3 Slice Area Swap
[04:26:21] Phase 3.6 Re-assign LUT pins
[04:26:21] Phase 3.7 Pipeline Register Optimization
[04:26:21] Phase 4 Post Placement Optimization and Clean-Up
[04:26:21] Phase 4.1 Post Commit Optimization
[04:26:21] Phase 4.1.1 Post Placement Optimization
[04:26:21] Phase 4.1.1.1 BUFG Insertion
[04:26:21] Phase 1 Physical Synthesis Initialization
[04:26:52] Phase 4.2 Post Placement Cleanup
[04:26:52] Phase 4.3 Placer Reporting
[04:26:52] Phase 4.4 Final Placement Cleanup
[04:26:52] Finished 4th of 6 tasks (FPGA logic placement). Elapsed time: 00h 02m 30s 

[04:26:52] Starting logic routing..
[04:26:52] Phase 1 Build RT Design
[04:26:52] Phase 2 Router Initialization
[04:26:52] Phase 2.1 Create Timer
[04:26:52] Phase 2.2 Fix Topology Constraints
[04:26:52] Phase 2.3 Pre Route Cleanup
[04:26:52] Phase 2.4 Global Clock Net Routing
[04:27:22] Phase 2.5 Update Timing
[04:27:22] Phase 3 Initial Routing
[04:27:22] Phase 4 Rip-up And Reroute
[04:27:22] Phase 4.1 Global Iteration 0
[04:28:52] Phase 4.2 Additional Iteration for Hold
[04:28:52] Phase 5 Delay and Skew Optimization
[04:28:52] Phase 5.1 Delay CleanUp
[04:28:52] Phase 5.1.1 Update Timing
[04:28:52] Phase 5.2 Clock Skew Optimization
[04:28:52] Phase 6 Post Hold Fix
[04:28:52] Phase 6.1 Hold Fix Iter
[04:28:52] Phase 6.1.1 Update Timing
[04:28:52] Phase 7 Route finalize
[04:28:52] Phase 8 Verifying routed nets
[04:28:52] Phase 9 Depositing Routes
[04:28:52] Phase 10 Post Router Timing
[04:28:52] Finished 5th of 6 tasks (FPGA routing). Elapsed time: 00h 02m 00s 

[04:28:52] Starting bitstream generation..
[04:29:22] Creating bitmap...
[04:29:41] Run vpl: Step impl: Completed
[04:29:41] Writing bitstream ./ultra96v2_design_wrapper.bit...
[04:29:42] Finished 6th of 6 tasks (FPGA bitstream generation). Elapsed time: 00h 00m 49s 
[04:29:42] Run vpl: FINISHED. Run Status: impl Complete!
INFO: [v++ 60-1441] [04:29:42] Run run_link: Step vpl: Completed
Time (s): cpu = 00:00:07 ; elapsed = 00:16:09 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 4982 ; free virtual = 34217
INFO: [v++ 60-1443] [04:29:42] Run run_link: Step rtdgen: Started
INFO: [v++ 60-1453] Command Line: rtdgen
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
INFO: [v++ 60-1453] Command Line: cf2sw -a /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/address_map.xml -sdsl /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/sdsl.dat -xclbin /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/xclbin_orig.xml -rtd /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma.rtd -o /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma.xml
INFO: [v++ 60-1652] Cf2sw returned exit code: 0
INFO: [v++ 60-2311] HPISystemDiagram::writeSystemDiagramAfterRunningVivado, rtdInputFilePath: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma.rtd
INFO: [v++ 60-2312] HPISystemDiagram::writeSystemDiagramAfterRunningVivado, systemDiagramOutputFilePath: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/systemDiagramModelSlrBaseAddress.json
INFO: [v++ 60-1618] Launching 
INFO: [v++ 60-1441] [04:29:43] Run run_link: Step rtdgen: Completed
Time (s): cpu = 00:00:00.63 ; elapsed = 00:00:00.97 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 4979 ; free virtual = 34216
INFO: [v++ 60-1443] [04:29:43] Run run_link: Step xclbinutil: Started
INFO: [v++ 60-1453] Command Line: xclbinutil --add-section BITSTREAM:RAW:/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/system.bit --force --target hw --key-value SYS:dfx_enable:false --add-section :JSON:/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma.rtd --add-section CLOCK_FREQ_TOPOLOGY:JSON:/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma_xml.rtd --add-section BUILD_METADATA:JSON:/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma_build.rtd --add-section EMBEDDED_METADATA:RAW:/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma.xml --add-section SYSTEM_METADATA:RAW:/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/systemDiagramModelSlrBaseAddress.json --key-value SYS:PlatformVBNV:vendor_lib_ultra96v2_design_1_0 --output /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.xclbin
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
XRT Build Version: 2.6.655 (2020.1)
       Build Date: 2020-05-22 12:05:03
          Hash ID: 2d6bfe4ce91051d4e5b499d38fc493586dd4859a
Creating a default 'in-memory' xclbin image.

Section: 'BITSTREAM'(0) was successfully added.
Size   : 5568804 bytes
Format : RAW
File   : '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/system.bit'

Section: 'MEM_TOPOLOGY'(6) was successfully added.
Format : JSON
File   : 'mem_topology'

Section: 'IP_LAYOUT'(8) was successfully added.
Format : JSON
File   : 'ip_layout'

Section: 'CONNECTIVITY'(7) was successfully added.
Format : JSON
File   : 'connectivity'
WARNING: Skipping CLOCK_FREQ_TOPOLOGY section for count size is zero.
WARNING: Section 'CLOCK_FREQ_TOPOLOGY' content is empty.  No data in the given JSON file.

Section: 'CLOCK_FREQ_TOPOLOGY'(11) was empty.  No action taken.
Format : JSON
File   : '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma_xml.rtd'

Section: 'BUILD_METADATA'(14) was successfully added.
Size   : 2214 bytes
Format : JSON
File   : '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma_build.rtd'

Section: 'EMBEDDED_METADATA'(2) was successfully added.
Size   : 3657 bytes
Format : RAW
File   : '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/lap_filter_axis_dma.xml'

Section: 'SYSTEM_METADATA'(22) was successfully added.
Size   : 5364 bytes
Format : RAW
File   : '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/int/systemDiagramModelSlrBaseAddress.json'
Successfully wrote (5585879 bytes) to the output file: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.xclbin
Leaving xclbinutil.
INFO: [v++ 60-1441] [04:29:43] Run run_link: Step xclbinutil: Completed
Time (s): cpu = 00:00:00.14 ; elapsed = 00:00:00.39 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 4971 ; free virtual = 34215
INFO: [v++ 60-1443] [04:29:43] Run run_link: Step xclbinutilinfo: Started
INFO: [v++ 60-1453] Command Line: xclbinutil --quiet --force --info /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.xclbin.info --input /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.xclbin
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
INFO: [v++ 60-1441] [04:29:44] Run run_link: Step xclbinutilinfo: Completed
Time (s): cpu = 00:00:00.18 ; elapsed = 00:00:00.51 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 4970 ; free virtual = 34214
INFO: [v++ 60-1443] [04:29:44] Run run_link: Step generate_sc_driver: Started
INFO: [v++ 60-1453] Command Line: 
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/link/run_link
INFO: [v++ 60-1441] [04:29:44] Run run_link: Step generate_sc_driver: Completed
Time (s): cpu = 00:00:00 ; elapsed = 00:00:00 . Memory (MB): peak = 1340.320 ; gain = 0.000 ; free physical = 4970 ; free virtual = 34214
INFO: [v++ 60-244] Generating system estimate report...
INFO: [v++ 60-1092] Generated system estimate report: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/reports/link/system_estimate_lap_filter_axis_dma.xtxt
INFO: [v++ 60-2397] Platform default or user specified output type sd_card detected but is not a supported output for v++ --link. Use the v++ --package option instead to create SD card output.
INFO: [v++ 60-586] Created lap_filter_axis_dma.xclbin
INFO: [v++ 60-1307] Run completed. Additional information can be found in:
 Timing Report: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/reports/link/imp/ultra96v2_design_wrapper_timing_summary_routed.rpt
 Vivado Log: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/logs/link/vivado.log
 Steps Log File: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.build/logs/link/link.steps.log

INFO: [v++ 60-2343] Use the vitis_analyzer tool to visualize and navigate the relevant reports. Run the following command. 
    vitis_analyzer /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/lap_filter_axis_dma.xclbin.link_summary 
INFO: [v++ 60-791] Total elapsed time: 0h 16m 35s
INFO: [v++ 60-1653] Closing dispatch client.
aarch64-linux-gnu-g++ -std=c++0x -DVITIS_PLATFORM=ultra96v2-platform -D__USE_XOPEN2K8 -I/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ -I/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/sw/ultra96v2-platform/linux_domain/sysroot/aarch64-xilinx-linux/usr/include/xrt/ -O2 -g -Wall -c -fmessage-length=0 --sysroot=/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/sw/ultra96v2-platform/linux_domain/sysroot/aarch64-xilinx-linux -o "src/lap_filter_axis_dma_host.o" "../src/lap_filter_axis_dma_host.cpp"
In file included from /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_common.h:641,
                 from /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int.h:54,
                 from ../src/lap_filter_axis_dma_host.cpp:25:
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In instantiation of 'void ap_private<_AP_W, _AP_S, true>::clearUnusedBits() volatile [with int _AP_W = 1; bool _AP_S = false]':
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:1485:1:   required from 'ap_private<_AP_W, _AP_S, true>& ap_private<_AP_W, _AP_S, true>::operator=(int) [with int _AP_W = 1; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int.h:301:3:   required from 'ap_uint<_AP_W>::ap_uint(int) [with int _AP_W = 1]'
../src/lap_filter_axis_dma_host.cpp:235:19:   required from here
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:28: warning: enum constant in boolean context [-Wint-in-bool-context]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |               ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 2145 |                            : (uint64_t)VAL));
      |                            ~~~~~~~~~~~~~~~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In instantiation of 'void ap_private<_AP_W, _AP_S, true>::clearUnusedBits() volatile [with int _AP_W = 32; bool _AP_S = true]':
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:1485:1:   required from 'ap_private<_AP_W, _AP_S, true>& ap_private<_AP_W, _AP_S, true>::operator=(int) [with int _AP_W = 32; bool _AP_S = true]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int.h:160:3:   required from 'ap_int<_AP_W>::ap_int(int) [with int _AP_W = 32]'
../src/lap_filter_axis_dma_host.cpp:236:27:   required from here
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:28: warning: enum constant in boolean context [-Wint-in-bool-context]
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In instantiation of 'void ap_private<_AP_W, _AP_S, true>::clearUnusedBits() volatile [with int _AP_W = 4; bool _AP_S = false]':
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:1631:5:   required from 'ap_private<_AP_W, _AP_S, true>::ap_private() [with int _AP_W = 4; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_common.h:637:18:   required from 'ssdm_int_sim<_AP_W, _AP_S>::ssdm_int_sim() [with int _AP_W = 4; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int_base.h:204:24:   required from 'ap_int_base<_AP_W, _AP_S>::ap_int_base() [with int _AP_W = 4; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int.h:206:27:   required from 'ap_uint<_AP_W>::ap_uint() [with int _AP_W = 4]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_axi_sdata.h:89:10:   required from here
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:28: warning: enum constant in boolean context [-Wint-in-bool-context]
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In instantiation of 'void ap_private<_AP_W, _AP_S, true>::clearUnusedBits() volatile [with int _AP_W = 32; bool _AP_S = false]':
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:1662:5:   required from 'ap_private<_AP_W, _AP_S, true>::ap_private(const ap_private<_AP_W1, _AP_S1, _AP_OPT>&) [with int _AP_W1 = 1; bool _AP_S1 = false; bool _AP_OPT = true; int _AP_W = 32; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2599:34:   required from 'bool ap_private<_AP_W, _AP_S, true>::operator==(const ap_private<_AP_W1, _AP_S1>&) const [with int _AP_W1 = 32; bool _AP_S1 = true; int _AP_W = 1; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int_base.h:879:20:   required from 'bool ap_int_base<_AP_W, _AP_S>::operator==(const ap_int_base<_AP_W2, _AP_S2>&) const [with int _AP_W2 = 32; bool _AP_S2 = true; int _AP_W = 1; bool _AP_S = false]'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/ap_int_base.h:1598:1:   required from 'bool operator==(const ap_int_base<_AP_W2, _AP_S2>&, int) [with int _AP_W = 1; bool _AP_S = false]'
../src/lap_filter_axis_dma_host.cpp:325:25:   required from here
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:28: warning: enum constant in boolean context [-Wint-in-bool-context]
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In function 'int lap_filter_axis_soft(hls::stream<ap_axis<32, 1, 1, 1> >&, hls::stream<ap_axis<32, 1, 1, 1> >&, int32_t, int32_t)':
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: 'pix.ap_private<32, true>::VAL' is used uninitialized in this function [-Wuninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+4).ap_private<4, false, true>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+5).ap_private<4, false, true>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+6).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+7).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+8).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+9).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: 'lap.ap_private<32, true>::VAL' is used uninitialized in this function [-Wuninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& lap)+4).ap_private<4, false, true>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& lap)+5).ap_private<4, false, true>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& lap)+6).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& lap)+7).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& lap)+8).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& lap)+9).ap_private<1, false>::VAL' is used uninitialized in this function [-Wuninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+4).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+5).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+6).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+7).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+8).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+9).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+4).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+5).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+6).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+7).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+8).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+9).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In function 'int main(int, char**)':
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: 'pix.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+4).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+5).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+6).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+7).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+8).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& pix)+9).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: 'vals_soft.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& vals_soft)+4).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& vals_soft)+5).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& vals_soft)+6).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& vals_soft)+7).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& vals_soft)+8).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(& vals_soft)+9).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '<anonymous>.ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+4).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+5).ap_private<4, false, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+6).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+7).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+8).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:42: warning: '*((void*)(&<anonymous>)+9).ap_private<1, false>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |                                          ^~~
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2143:27: warning: '<anonymous>.ap_private<32, true>::VAL' may be used uninitialized in this function [-Wmaybe-uninitialized]
 2143 |             ? ((((int64_t)VAL) << (excess_bits)) >> (excess_bits))
      |                           ^~~
aarch64-linux-gnu-g++ -o "lap_filter_axis_dma" src/lap_filter_axis_dma_host.o -lxilinxopencl -lpthread -lrt -ldl -lcrypt -lstdc++ -L/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/sw/ultra96v2-platform/linux_domain/sysroot/aarch64-xilinx-linux/usr/lib/ --sysroot=/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/sw/ultra96v2-platform/linux_domain/sysroot/aarch64-xilinx-linux
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/bin/v++ --package --config package.cfg lap_filter_axis_dma.xclbin
Option Map File Used: '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/data/vitis/vpp/optMap.xml'

****** v++ v2020.1 (64-bit)
  **** SW Build 2902540 on Wed May 27 19:54:35 MDT 2020
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

INFO: [v++ 60-1306] Additional information associated with this v++ package can be found at:
 Reports: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/package.build/reports/package
 Log files: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/package.build/logs/package
INFO: [v++ 60-1657] Initializing dispatch client.
Running Dispatch Server on port:34929
INFO: [v++ 60-1548] Creating build summary session with primary output ./v++.package_summary, at Fri Oct 23 04:30:01 2020
INFO: [v++ 60-1316] Initiating connection to rulecheck server, at Fri Oct 23 04:30:01 2020
INFO: [v++ 60-895]   Target platform: /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/ultra96v2-platform.xpfm
INFO: [v++ 60-1578]   This platform contains Xilinx Shell Archive '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/ultra96v2-platform/export/ultra96v2-platform/hw/ultra96v2.xsa'
INFO: [v++ 60-2256] Packaging for hardware

Section: 'BITSTREAM'(0) was successfully written.
Format: RAW
File  : '/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/package.build/package/system.bit'
INFO: [v++ 82-1025] Generating bootimage


****** Xilinx Bootgen v2020.1
  **** Build date : May 27 2020-20:33:36
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.


[INFO]   : Bootimage generated successfully

INFO: [v++ 82-1076] Deleting existing - /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/pfm/lap_filter_axis_dma/Hardware/package/sd_card/image.ub
INFO: [v++ 82-1011] Creating sd_card directory
FATSIZE:1124
fat_start:63
fat_end:2096639
fat_sector:2096577
ext4_start:0
ext4_sector:966900
EXT4SIZE:2048
TOTALSIZE:3172
dummy_ext4_sector:3227404
sd_card_fat_start:2048
sd_card_ext4_start:2195456
dummy_ext4_start:3162356
2096577+0 レコード入力
2096577+0 レコード出力
1073447424 bytes (1.1 GB, 1.0 GiB) copied, 5.15768 s, 208 MB/s
966900+0 レコード入力
966900+0 レコード出力
495052800 bytes (495 MB, 472 MiB) copied, 10.8381 s, 45.7 MB/s
3227404+0 レコード入力
3227404+0 レコード出力
1652430848 bytes (1.7 GB, 1.5 GiB) copied, 7.62532 s, 217 MB/s
INFO: [v++ 60-2343] Use the vitis_analyzer tool to visualize and navigate the relevant reports. Run the following command. 
    vitis_analyzer ./v++.package_summary 
INFO: [v++ 60-791] Total elapsed time: 0h 0m 51s
INFO: [v++ 60-1653] Closing dispatch client.

04:30:43 Build Finished (took 18m:39s.321ms)

  1. 2020年10月23日 04:49 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる8(リモートデバック)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる7(5- Test the Platform)”の続き。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、やってみることにしたということで、前回は、前々回作成したアクセラレーション・プラットフォームを使用してアクセラレーション・アプリケーション・プロジェクトを作成してテストし成功した。今回は、”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”ではやっていないが、TCF Agent が走っているので、リモートデバックをやってみる。

Vitis 2020.1 の左下の Assistant ウインドウの vector_add_system -> Hardware を右クリックし右クリックメニューから Run -> Run Configurations... を選択する。

Run Configurations ダイアログが表示される。
左のウインドウの Single Application Debug をクリックして、新しいコンフィグレーションの Debugger_vector_add-Default を作成する。
Main タブの Connection: の New ボタンをクリックして、Ultra96V2 の USB-LAN 変換器の IP アドレスの Connection を作成した。(192.168.3.23)
Ultra96V2_acc_platform201_106_201019.png

Application タブを示す。
Ultra96V2_acc_platform201_107_201019.png

Arguments タブには、Proguram Arguments: として、 ./binary_container_1.xclbin が表示されている。

Apply ボタンをクリックし、Run ボタンをクリックした。
するとエラーになってしまった。

原因を確かめると、どうやら binary_container_1.xclbin が SFTP されていないようなのだ。
そこで、自分で、 binary_container_1.xclbin を /media/sd-mmcblk0p1 ディレクトリに SFTP した。
Ultra96V2_acc_platform201_108_201019.png

これで、 Vitis 2020.1 の左下の Assistant ウインドウの vector_add_system -> Hardware を右クリックし右クリックメニューから Run -> Debugger_vector_add-Default を選択した。

Vitis IDE の Console に TEST PASSED が表示されて成功した。
Ultra96V2_acc_platform201_109_201019.png

でもなぜ? binary_container_1.xclbin が SFTP されないのだろうか?

Run Configurations ダイアログで Enable Profiling にチェックを入れていたので、profile_summary.csv ができていた。
Ultra96V2_acc_platform201_110_201019.png
Ultra96V2_acc_platform201_111_201019.png
Ultra96V2_acc_platform201_112_201019.png
  1. 2020年10月22日 04:15 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる7(5- Test the Platform)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる7(4 – Create Platform)”の続き。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、やってみることにしたということで、前回は、Vitis 2020.1 を使用してアクセラレーション・プラットフォームを作成した。今回は、前回作成したアクセラレーション・プラットフォームを使用してアクセラレーション・アプリケーション・プロジェクトを作成してテストしよう。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”の”5- Test the Platform”を参照してやっていこう。

Vitis 2020.1 で File メニューから New -> Application Project... を選択する。
New Application Project ダイアログの Create a New Application Project 画面が開いた。
デフォルトで Next > ボタンをクリックする。
Ultra96V2_acc_platform201_95_201018.png

Platform 画面では、前回作成した ultra96v2-platform を選択する。
Ultra96V2_acc_platform201_96_201018.png

Application Project Details 画面では、Application project name: に vector_add と入力した。
Ultra96V2_acc_platform201_97_201018.png

Domain では、デフォルトのままとした。
Ultra96V2_acc_platform201_98_201018.png

Templates 画面では Vector Addition を選択して、Finish ボタンをクリックする。
Ultra96V2_acc_platform201_99_201018.png

Vitis IDE に vector_add_system が追加された。
Active build configuration: を Hardware に変更した。
Ultra96V2_acc_platform201_100_201018.png

Vitis IDE の Explorer の vector_add_system -> vector_add を右クリックし右クリックメニューから Build Project を選択する。
Ultra96V2_acc_platform201_101_201018.png

ビルドが成功した。
Ultra96V2_acc_platform201_102_201018.png

pfm/vector_add/Hardware/package/sd_card ディレクトリの BOOT.BIN, binary_container_1.xclbin, image.ub, vector_add ファイルをコピーする。
Ultra96V2_acc_platform201_103_201019.png

MicroSD カードの BOOT パーティションにペーストした。
Ultra96V2_acc_platform201_104_201019.png

その MicroSD カードを Ultra96V2 に挿入して、電源ON したところ、前回同様に PetaLinux が起動した。
ログインしてから XILINX_XRT へのパスを設定する。
export XILINX_XRT=/usr

/mnt/sd-mmcblk0p1 に移動した。
cd /mnt/sd-mmcblk0p1

./vector_add binary_container_1.xclbin
コマンドを実行したら TEST PASSED と表示された。成功だ。
Ultra96V2_acc_platform201_105_201019.png
  1. 2020年10月21日 04:15 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる7(4 – Create Platform)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる6(3- Prepare SDCARD and Test Linux の残り)”の続き。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、やってみることにしたということで、前回は、MicroSD カードにファイルを書き込み、 Ultra96V2 にできあがった MicroSD カードを挿入して Linux を起動することができた。今回は、Vitis 2020.1 を使用してアクセラレーション・プラットフォームを作成しよう。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”の”4 – Create Platform”を参照する。

ultra96v2-vitis-pkg ディレクトリの下に pfm ディレクトリを作成し、 pfm ディレクトリに cd した。
Vitis 2020.1 を起動した。
mkdir pfm
cd pfm
vitis &

Ultra96V2_acc_platform201_86_201018.png

Workspace を聞かれるので、 ultra96v2-vitis-pkg/pfm を指定して、Launch ボタンをクリックする。
Ultra96V2_acc_platform201_87_201018.png

Vitis が起動した。
Create Platform Project をクリックする。
Ultra96V2_acc_platform201_88_201018.png

New Platform Project ダイアログの Create new platform project 画面で Project name: に ultra96v2-platform を入力する。
Ultra96V2_acc_platform201_89_201018.png

Platform Project 画面は、Create from hardware specification のラジオボタンが選択されていることを確認する。
Ultra96V2_acc_platform201_90_201018.png

Platform Project Specification 画面では、XSA file: に Browse... をクリックして、 ultra96v2-vitis-pkg/vivado/ultra96v2.xsa を選択する。
Operating system: で linux を選択する。
Finish ボタンをクリックする。
Ultra96V2_acc_platform201_91_201018.png

アクセラレーション・プラットフォームが作成された。
右のウインドウで、ultra96v2-platform -> psu_cortex53 -> linux on psu_cortex53 をクリックする。
Domain: linux_domain の各種ファイルやディレクトリを以下の通りに指定する。
Bif File: ultra96v2-vitis-pkg/linux_files/boot/linux.bif
Boot Conponets Directory: ultra96v2-vitis-pkg/linux_files/boot
Linux Image Directory: ultra96v2-vitis-pkg/linux_files/boot
Linux Rootfs: ultra96v2-vitis-pkg/linux_files/boot/rootfs.cpio
Sysroot Directory: ultra96v2-vitis-pkg/linux_files/sysroots/aarch64-xilinx-linux
Ultra96V2_acc_platform201_92_201018.png

Explorer の ultra96v2-platform が選択されているのを確認して、トンカチマークをクリックしてビルドする。
Ultra96V2_acc_platform201_93_201018.png

ビルドが成功した。
Ultra96V2_acc_platform201_94_201018.png
  1. 2020年10月20日 05:23 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる6(3- Prepare SDCARD and Test Linux の残り)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる5(SDカードのフォーマット)”の続き。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、やってみることにしたということで、前回は、3- Prepare SDCARD で MicroSD カードのフォーマットを独自の方法で行った。今回は、3- Prepare SDCARD and Test Linux の残りということで、MicroSD カードにファイルを書き込み、 Ultra96V2 にできあがった MicroSD カードを挿入して Linux を起動してみよう。

実行するコードは”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”から引用して、こちらの環境に合うように変更した。

BOOT.bin を作成する。
ultra96v2-vitis-pkg/ultra96v2-petalinux/images/linux ディレクトリに行く。
petalinux-package --boot --format BIN --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga system.bit --force
Ultra96V2_acc_platform201_79_201017.png
Ultra96V2_acc_platform201_80_201017.png

BOOT.bin が生成された。

BOOT.bin , boot.scr , image.ub を MicroSD カードの BOOT パーティションにコピーする。
cp BOOT.BIN boot.scr image.ub /media/masaaki/BOOT/
ls /media/masaaki/BOOT/

Ultra96V2_acc_platform201_81_201017.png

MicroSD カードの rootfs パーティションに rootfs.tar.gz を展開してコピーする。
sudo tar -zxvf rootfs.tar.gz -C /media/masaaki/rootfs/
sync

Ultra96V2_acc_platform201_83_201017.png

これで MicroSD カードの用意は終了した。
BOOT , rootfs パーティションをアンマウントした。
MicroSD カードを Ultra96V2 に挿入し、 GtkTerm を起動し 115200 bps に設定した。
Ultra96V2 の電源を ON すると PetaLinux が起動した。
Ultra96V2_acc_platform201_84_201017.png

嬉しい。。。

ID: root , パスワード: root でログインできた。
USB - LAN アダプタが付いていたので、 ifconfig すると、 IP が割り振られていた。これでいろいろできる。
Ultra96V2_acc_platform201_85_201017.png

Linux の起動メッセージを貼っておく。

Xilinx Zynq MP First Stage Boot Loader 
Release 2020.1   Oct 14 2020  -  19:51:23
NOTICE:  ATF running on XCZU3EG/silicon v4/RTL5.1 at 0xfffea000
NOTICE:  BL31: v2.2(release):v1.1-5588-g5918e656e
NOTICE:  BL31: Built : 19:50:38, Oct 14 2020


U-Boot 2020.01 (Oct 14 2020 - 19:49:09 +0000)

Model: Avnet Ultra96 Rev1
Board: Xilinx ZynqMP
DRAM:  2 GiB
PMUFW:  v1.1
EL Level:   EL2
Chip ID:    zu3eg
NAND:  0 MiB
MMC:   mmc@ff160000: 0, mmc@ff170000: 1
In:    serial@ff010000
Out:   serial@ff010000
Err:   serial@ff010000
Bootmode: SD_MODE
Reset reason:   EXTERNAL 
Net:   No ethernet found.
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
2007 bytes read in 15 ms (129.9 KiB/s)
## Executing script at 20000000
8134460 bytes read in 598 ms (13 MiB/s)
## Loading kernel from FIT Image at 10000000 ...
   Using 'conf@system-top.dtb' configuration
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0x100000e8
     Data Size:    8088904 Bytes = 7.7 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x00080000
     Entry Point:  0x00080000
     Hash algo:    sha256
     Hash value:   00749594bd2f9da8a22ac2efaa56d09c0ec4a3ba16b7f6748394347fa50fecf8
   Verifying Hash Integrity ... sha256+ OK
## Loading fdt from FIT Image at 10000000 ...
   Using 'conf@system-top.dtb' configuration
   Trying 'fdt@system-top.dtb' fdt subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x107b6f40
     Data Size:    43666 Bytes = 42.6 KiB
     Architecture: AArch64
     Hash algo:    sha256
     Hash value:   9efc87124a9ea2700523c72cedb14216c813da2dc92f3781ddf1c70d1c1c3075
   Verifying Hash Integrity ... sha256+ OK
   Booting using the fdt blob at 0x107b6f40
   Uncompressing Kernel Image
   Loading Device Tree to 000000000fff2000, end 000000000ffffa91 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.4.0-xilinx-v2020.1 (oe-user@oe-host) (gcc version 9.2.0 (GCC)) #1 SMP Wed Oct 14 19:47:16 UTC 2020
[    0.000000] Machine model: Avnet Ultra96 Rev1
[    0.000000] earlycon: cdns0 at MMIO 0x00000000ff010000 (options '115200n8')
[    0.000000] printk: bootconsole [cdns0] enabled
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
[    0.000000] cma: Reserved 1024 MiB at 0x000000003fc00000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.1
[    0.000000] percpu: Embedded 21 pages/cpu s48664 r8192 d29160 u86016
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Speculative Store Bypass Disable mitigation not required
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 515844
[    0.000000] Kernel command line:  earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait
[    0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 990112K/2096128K available (11580K kernel code, 668K rwdata, 3608K rodata, 704K init, 322K bss, 57440K reserved, 1048576K cma-reserved)
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] irq-xilinx: /amba_pl@0/interrupt-controller@80000000: num_irq=32, sw_irq=0, edge=0x0
[    0.000000] random: get_random_bytes called from start_kernel+0x2a8/0x42c with crng_init=0
[    0.000000] arch_timer: cp15 timer(s) running at 100.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171024e7e0, max_idle_ns: 440795205315 ns
[    0.000004] sched_clock: 56 bits at 100MHz, resolution 10ns, wraps every 4398046511100ns
[    0.008485] Console: colour dummy device 80x25
[    0.012491] Calibrating delay loop (skipped), value calculated using timer frequency.. 200.00 BogoMIPS (lpj=400000)
[    0.022839] pid_max: default: 32768 minimum: 301
[    0.027617] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.034789] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.044054] ASID allocator initialised with 32768 entries
[    0.047999] rcu: Hierarchical SRCU implementation.
[    0.052920] EFI services will not be available.
[    0.057363] smp: Bringing up secondary CPUs ...
[    0.062114] Detected VIPT I-cache on CPU1
[    0.062161] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.062581] Detected VIPT I-cache on CPU2
[    0.062604] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.062979] Detected VIPT I-cache on CPU3
[    0.062998] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.063048] smp: Brought up 1 node, 4 CPUs
[    0.097141] SMP: Total of 4 processors activated.
[    0.101813] CPU features: detected: 32-bit EL0 Support
[    0.106917] CPU features: detected: CRC32 instructions
[    0.112058] CPU: All CPU(s) started at EL2
[    0.116098] alternatives: patching kernel code
[    0.122332] devtmpfs: initialized
[    0.129187] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.133486] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.178896] xor: measuring software checksum speed
[    0.216782]    8regs     :  2375.000 MB/sec
[    0.256808]    32regs    :  2725.000 MB/sec
[    0.296840]    arm64_neon:  2365.000 MB/sec
[    0.296880] xor: using function: 32regs (2725.000 MB/sec)
[    0.300757] pinctrl core: initialized pinctrl subsystem
[    0.307034] NET: Registered protocol family 16
[    0.312019] DMA: preallocated 256 KiB pool for atomic allocations
[    0.316427] audit: initializing netlink subsys (disabled)
[    0.321856] audit: type=2000 audit(0.264:1): state=initialized audit_enabled=0 res=1
[    0.322323] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.350719] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.351776] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.358445] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.365101] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    1.446478] DRBG: Continuing without Jitter RNG
[    1.522771] raid6: neonx8   gen()  1539 MB/s
[    1.590826] raid6: neonx8   xor()  1461 MB/s
[    1.658892] raid6: neonx4   gen()  1477 MB/s
[    1.726912] raid6: neonx4   xor()  1419 MB/s
[    1.795011] raid6: neonx2   gen()  1124 MB/s
[    1.863029] raid6: neonx2   xor()  1173 MB/s
[    1.931127] raid6: neonx1   gen()   728 MB/s
[    1.999116] raid6: neonx1   xor()   880 MB/s
[    2.067176] raid6: int64x8  gen()  1162 MB/s
[    2.135234] raid6: int64x8  xor()   760 MB/s
[    2.203299] raid6: int64x4  gen()   977 MB/s
[    2.271306] raid6: int64x4  xor()   733 MB/s
[    2.339406] raid6: int64x2  gen()   678 MB/s
[    2.407428] raid6: int64x2  xor()   591 MB/s
[    2.475478] raid6: int64x1  gen()   449 MB/s
[    2.543500] raid6: int64x1  xor()   451 MB/s
[    2.543540] raid6: using algorithm neonx8 gen() 1539 MB/s
[    2.547496] raid6: .... xor() 1461 MB/s, rmw enabled
[    2.552426] raid6: using neon recovery algorithm
[    2.557855] iommu: Default domain type: Translated 
[    2.562146] SCSI subsystem initialized
[    2.565759] usbcore: registered new interface driver usbfs
[    2.571057] usbcore: registered new interface driver hub
[    2.576330] usbcore: registered new device driver usb
[    2.581371] mc: Linux media interface: v0.10
[    2.585576] videodev: Linux video capture interface: v2.00
[    2.591023] pps_core: LinuxPPS API ver. 1 registered
[    2.595935] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    2.605030] PTP clock support registered
[    2.608923] EDAC MC: Ver: 3.0.0
[    2.612557] zynqmp-ipi-mbox mailbox@ff990400: Registered ZynqMP IPI mbox with TX/RX channels.
[    2.620724] FPGA manager framework
[    2.624022] Advanced Linux Sound Architecture Driver Initialized.
[    2.630315] Bluetooth: Core ver 2.22
[    2.633492] NET: Registered protocol family 31
[    2.637888] Bluetooth: HCI device and connection manager initialized
[    2.644207] Bluetooth: HCI socket layer initialized
[    2.649049] Bluetooth: L2CAP socket layer initialized
[    2.654072] Bluetooth: SCO socket layer initialized
[    2.659345] clocksource: Switched to clocksource arch_sys_counter
[    2.665102] VFS: Disk quotas dquot_6.6.0
[    2.668929] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    2.680241] NET: Registered protocol family 2
[    2.680768] tcp_listen_portaddr_hash hash table entries: 1024 (order: 2, 16384 bytes, linear)
[    2.688520] TCP established hash table entries: 16384 (order: 5, 131072 bytes, linear)
[    2.696470] TCP bind hash table entries: 16384 (order: 6, 262144 bytes, linear)
[    2.704084] TCP: Hash tables configured (established 16384 bind 16384)
[    2.710247] UDP hash table entries: 1024 (order: 3, 32768 bytes, linear)
[    2.716815] UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes, linear)
[    2.724015] NET: Registered protocol family 1
[    2.728580] RPC: Registered named UNIX socket transport module.
[    2.734082] RPC: Registered udp transport module.
[    2.738748] RPC: Registered tcp transport module.
[    2.743421] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    2.750125] PCI: CLS 0 bytes, default 64
[    2.754314] hw perfevents: no interrupt-affinity property for /pmu, guessing.
[    2.761006] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    2.769510] Initialise system trusted keyrings
[    2.773022] workingset: timestamp_bits=46 max_order=19 bucket_order=0
[    2.780231] NFS: Registering the id_resolver key type
[    2.784353] Key type id_resolver registered
[    2.788487] Key type id_legacy registered
[    2.792471] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    2.799147] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[    2.818745] NET: Registered protocol family 38
[    2.818791] Key type asymmetric registered
[    2.821619] Asymmetric key parser 'x509' registered
[    2.826490] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247)
[    2.833815] io scheduler mq-deadline registered
[    2.838310] io scheduler kyber registered
[    2.871494] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    2.876041] cacheinfo: Unable to detect cache hierarchy for CPU 0
[    2.883579] brd: module loaded
[    2.889920] loop: module loaded
[    2.890873] mtdoops: mtd device (mtddev=name/number) must be supplied
[    2.895225] libphy: Fixed MDIO Bus: probed
[    2.899002] tun: Universal TUN/TAP device driver, 1.6
[    2.903077] CAN device driver interface
[    2.907547] usbcore: registered new interface driver asix
[    2.912150] usbcore: registered new interface driver ax88179_178a
[    2.918163] usbcore: registered new interface driver cdc_ether
[    2.923957] usbcore: registered new interface driver net1080
[    2.929583] usbcore: registered new interface driver cdc_subset
[    2.935463] usbcore: registered new interface driver zaurus
[    2.941012] usbcore: registered new interface driver cdc_ncm
[    2.947468] usbcore: registered new interface driver uas
[    2.951911] usbcore: registered new interface driver usb-storage
[    2.958571] rtc_zynqmp ffa60000.rtc: registered as rtc0
[    2.963102] i2c /dev entries driver
[    2.968070] usbcore: registered new interface driver uvcvideo
[    2.972205] USB Video Class driver (1.1.1)
[    2.976919] Bluetooth: HCI UART driver ver 2.3
[    2.980688] Bluetooth: HCI UART protocol H4 registered
[    2.985786] Bluetooth: HCI UART protocol BCSP registered
[    2.991078] Bluetooth: HCI UART protocol LL registered
[    2.996163] Bluetooth: HCI UART protocol ATH3K registered
[    3.001541] Bluetooth: HCI UART protocol Three-wire (H5) registered
[    3.007792] Bluetooth: HCI UART protocol Intel registered
[    3.013131] Bluetooth: HCI UART protocol QCA registered
[    3.018335] usbcore: registered new interface driver bcm203x
[    3.023956] usbcore: registered new interface driver bpa10x
[    3.029493] usbcore: registered new interface driver bfusb
[    3.034942] usbcore: registered new interface driver btusb
[    3.040405] usbcore: registered new interface driver ath3k
[    3.045945] EDAC MC: ECC not enabled
[    3.049499] EDAC DEVICE0: Giving out device to module edac controller cache_err: DEV edac (POLLED)
[    3.058446] EDAC DEVICE1: Giving out device to module zynqmp-ocm-edac controller zynqmp_ocm: DEV ff960000.memory-controller (INTERRUPT)
[    3.070676] sdhci: Secure Digital Host Controller Interface driver
[    3.076521] sdhci: Copyright(c) Pierre Ossman
[    3.080847] sdhci-pltfm: SDHCI platform and OF driver helper
[    3.086924] ledtrig-cpu: registered to indicate activity on CPUs
[    3.092489] zynqmp_firmware_probe Platform Management API v1.1
[    3.098237] zynqmp_firmware_probe Trustzone version v1.0
[    3.107657] zynqmp-pinctrl firmware:zynqmp-firmware:pinctrl: zynqmp pinctrl initialized
[    3.135730] alg: No test for xilinx-zynqmp-aes (zynqmp-aes)
[    3.136080] zynqmp_aes zynqmp_aes: AES Successfully Registered
[    3.136080] 
[    3.143238] alg: No test for xilinx-keccak-384 (zynqmp-keccak-384)
[    3.149453] alg: No test for xilinx-zynqmp-rsa (zynqmp-rsa)
[    3.155022] usbcore: registered new interface driver usbhid
[    3.160231] usbhid: USB HID core driver
[    3.166649] fpga_manager fpga0: Xilinx ZynqMP FPGA Manager registered
[    3.170785] usbcore: registered new interface driver snd-usb-audio
[    3.177537] pktgen: Packet Generator for packet performance testing. Version: 2.75
[    3.184924] Initializing XFRM netlink socket
[    3.188458] NET: Registered protocol family 10
[    3.193317] Segment Routing with IPv6
[    3.196539] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    3.202708] NET: Registered protocol family 17
[    3.206693] NET: Registered protocol family 15
[    3.211109] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[    3.223979] can: controller area network core (rev 20170425 abi 9)
[    3.230163] NET: Registered protocol family 29
[    3.234533] can: raw protocol (rev 20170425)
[    3.238772] can: broadcast manager protocol (rev 20170425 t)
[    3.244396] can: netlink gateway (rev 20190810) max_hops=1
[    3.249941] Bluetooth: RFCOMM TTY layer initialized
[    3.254696] Bluetooth: RFCOMM socket layer initialized
[    3.259804] Bluetooth: RFCOMM ver 1.11
[    3.263516] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    3.268784] Bluetooth: BNEP filters: protocol multicast
[    3.273978] Bluetooth: BNEP socket layer initialized
[    3.278905] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[    3.284789] Bluetooth: HIDP socket layer initialized
[    3.289882] 9pnet: Installing 9P2000 support
[    3.293991] Key type dns_resolver registered
[    3.298566] registered taskstats version 1
[    3.302266] Loading compiled-in X.509 certificates
[    3.307581] Btrfs loaded, crc32c=crc32c-generic
[    3.323838] ff000000.serial: ttyPS1 at MMIO 0xff000000 (irq = 41, base_baud = 6249999) is a xuartps
[    3.327276] printk: console [ttyPS0] enabled
[    3.331592] printk: bootconsole [cdns0] disabled
INIT: version 2.88 booting
Starting udev
Wed Oct 14 20:02:16 UTC 2020
chown: cannot access '/var/log/wtmp': No such file or directory
Failed to set owner -root- for -/var/log/wtmp-.
chmod: cannot access '/var/log/wtmp': No such file or directory
Failed to set mode -0664- for -/var/log/wtmp-.
Configuring packages on first boot....
 (This may take several minutes. Please do not power off the machine.)
Running postinst /etc/rpm-postinsts/100-xrt...
Running postinst /etc/rpm-postinsts/101-sysvinit-inittab...
Running postinst /etc/rpm-postinsts/102-libmali-xlnx...
Running postinst /etc/rpm-postinsts/103-zocl...
update-rc.d: /etc/init.d/run-postinsts exists during rc.d purge (continuing)
 Removing any system startup links for run-postinsts ...
  /etc/rcS.d/S99run-postinsts
INIT: Entering runlevel: 5
Configuring network interfaces... udhcpc: started, v1.31.0
udhcpc: sending discover
udhcpc: sending discover
udhcpc: sending select for 192.168.3.23
udhcpc: lease of 192.168.3.23 obtained, lease time 86400
/etc/udhcpc.d/50default: Adding DNS 192.168.3.1
done.
Starting system message bus: dbus.
Starting haveged: haveged: listening socket at 3
haveged: haveged starting up


Starting Dropbear SSH server: Generating 2048 bit rsa key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDaFin4E0IbQr7jycOrhll28Pm696wrRqYu5dB/+u3h8lkuBL2/YDksrh2jKw4yXFvr/f7hx/CuT5Aiqk30E+Kd1RwDiMMB8qd5yK5CygKGhBOT4Bc3mAl0a54rFT9bN25b/rampGuuh3w2nogHjpqr4J+hiTTNcNEle0sIeB5vzf1WMHMUglqSc2polQ487B+JVg6MjrnxTNvP03TUlhiOpxwvWpahiFT74Mc3ettGCKJuyKwawCbQKzlR+bLmFU4IJvriFzPitgcExLBGHb2l4jC87KVcvXr+3rr7eSyIzet+zr0hmgtKm8XoKtw1F4VULqeHl9BBKITbh29V8UNZ root@ultra96v2-petalinux
Fingerprint: sha1!! 79:8f:f9:fe:13:19:93:f8:0e:1c:00:a6:4b:43:36:73:48:91:5c:02
dropbear.
haveged: haveged: ver: 1.9.5; arch: generic; vend: ; build: (gcc 9.2.0 CTV); collect: 128K

haveged: haveged: cpu: (VC); data: 16K (D); inst: 16K (D); idx: 11/40; sz: 15456/64452

haveged: haveged: tot tests(BA8): A:1/1 B:1/1 continuous tests(B):  last entropy estimate 7.9991

haveged: haveged: fills: 0, generated: 0 

Starting internet superserver: inetd.
Starting syslogd/klogd: done
Starting tcf-agent: OK

PetaLinux 2020.1 ultra96v2-petalinux ttyPS0

ultra96v2-petalinux login:

  1. 2020年10月19日 04:51 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる5(SDカードのフォーマット)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる4(2- Linux OS その2)”の続き。

前回、自分で Vitis 2020.1 のアクセラレーション・プラットフォームを作成したが、PetaLinux は起動しないままだった。
Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、この通りにやってみることにしたということで、前回は、”2- Linux OS”の残りを実行し、終了した。今回は、3- Prepare SDCARD で MicroSD カードのフォーマットを行う。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”とは違う方法で 32 GB の MicroSD カードを第1パーティションを 2 GB に、第2パーティションを残りの要領にフォーマットする。

参考にするのは、””FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる2(Micro SDカードの準備)”だ。

まずは、 MicroSD カードを接続したライターを USB ポートに接続する。
lsblk で 32 GB の MicroSD カードのマウント状況を確認する。
Ultra96V2_acc_platform201_69_201017.png

32 GB の MicroSD カードは sdf の sdf1 にマウントされていた。

アンマウントする。
sudo umoutn /dev/sdf1
Ultra96V2_acc_platform201_70_201017.png

フォーマットを開始する。
p コマンドでパーティションの状況を確認した。
Ultra96V2_acc_platform201_71_201017.png

d コマンドでパーティションを削除した。
Ultra96V2_acc_platform201_72_201017.png

プライマリ・ディスクのパーティション番号1に 2048 MBの領域を確保する
n コマンドでパーティションを作成する。
n コマンドで新たにパーティションを作製した。
p を押して、primary パーティションを指定した。
パーティション番号を 1 にセット。
First sector で、リターンキーを入力した。
Last sector で、+2048M を入力して、2048 MB の領域を確保した。
p コマンドででパーティションを表示した。
Ultra96V2_acc_platform201_73_201017.png

プライマリ・ディスクのパーティション番号2に残っている領域(27.7 GB)を確保する
n コマンドで新たにパーティションを作製した。
p を押して、primary パーティションを指定した。
パーティション番号を 2 にセット。
First sector で、リターンキーを入力した。
Last sector で、リターンキーを入力した。
p コマンドででパーティションを表示した。
Ultra96V2_acc_platform201_74_201017.png

プライマリ・ディスクのパーティション番号1をFAT32にして、ブート可能フラグを付け、SDカードに書き込む
t コマンドを入力した。
パーティション番号に 1 を入力した。
16進コードに、b を入力した。(W95 FAT32)
a コマンドを入力して、ブート可能フラグを付ける。
パーティション番号に 1 を入力した。
p コマンドででパーティションを表示した。
w コマンドを実行して、今まで設定してきたパーティション情報をMicro SDカードにWrite した。
Ultra96V2_acc_platform201_75_201017.png

lsblk を行うと、設定したパーティションが sdf1, sdf2 として見えている。
Ultra96V2_acc_platform201_76_201017.png

FPGAマガジン No.5 の第3章”Zynq評価ボードZedBoardでLinuxを動かそう”という石原ひでみさんの記事を参考に、/dev/sdf1 に対して、
sudo mkfs.msdos -n BOOT /dev/sdf1
sudo mkfs.ext4 -L rootfs /dev/sdf2

を実行した。
Ultra96V2_acc_platform201_77_201017.png

BOOT と rootfs がマウントされている。
Ultra96V2_acc_platform201_78_201017.png
  1. 2020年10月18日 04:27 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Xilinx 社の AXI IIC IP で ADXL355 を使用する

Xilinx 社の AXI IIC IP を使用して、I2C インターフェースで、ストロベリーリナックスの ADXL355 超低ノイズ3軸加速度センサモジュール を ZYBO Z7-20 ボードに接続した。その際に AXI IIC IP の使い方に相当時間がかかってしまったのでブログに書いておく。

ADXL355 の日本語マニュアルはここにある

I2C のマニュアルや参考URL について紹介しておく。
UM10204 I2C バス仕様およびユーザーマニュアル Rev. 5.0J — 2012 年 10 月 9 日 (日本語翻訳 11 月 2 日)
第5回 Arduino入門 I2C通信編” Read のプロトコルが参考になった。

AXI IIC については、今まで CMOS カメラの設定用に使ってきたが、Write しか使っていなかった。Read を本格的に使うのは今回が初めてだった。
AXI IIC について当ブログでマニュアルをまとめた記事を以下に示す。
AXI IIC のお勉強1
AXI IIC のお勉強2” 結局、この Read 方法でやれば良かったのだが、プログラムにバグがあったため動作しなかった。

Vivado 2020.1 の acc_sensor プロジェクトを示す。
acc_sensor_1_201016.png

ブロックデザインを示す。ZYNQ の PS に AXI IIC が接続されているデザインだ。
acc_sensor_2_201016.png

Address Editor を示す。
acc_sensor_3_201016.png

制約ファイルの acc_sensor.xdc を示す。

set_property PACKAGE_PIN V8 [get_ports IIC_0_scl_io]
set_property PACKAGE_PIN W8 [get_ports IIC_0_sda_io]
set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_scl_io]
set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_sda_io]


Vitis を示す。
acc_sensor_4_201016.png

アプリケーション・ソフトウェアの acc_sensor_test.c を示す。これで動作している。

// acc_sensor_test.c
// 2020/10/12 by marsee
//

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

#define TX_FIFO_EMPTY   0x80
#define RX_FIFO_EMPTY   0x40
#define BB              0x04

void acc_sensor_init(volatile uint32_t *axi_iic_ad){
    axi_iic_ad[72] = 0x0F; // RX_FIFI_PIRQ
    axi_iic_ad[64] = 0x2; // Control Register (100h) reset tx fifo
    axi_iic_ad[64] = 0x1; // Control Register (100h) enable i2c
}

void idle_check(volatile uint32_t *axi_iic_ad){
    int32_t status_reg;
    int32_t check_bit;

    do{
        status_reg = axi_iic_ad[65]; // Status Register (104h))
        check_bit = status_reg & (TX_FIFO_EMPTY | RX_FIFO_EMPTY | BB);
    }while(check_bit != (TX_FIFO_EMPTY | RX_FIFO_EMPTY)) ;
}

void acc_sensor_write(volatile uint32_t *axi_iic_ad, uint32_t device_addr, uint32_t write_addr, uint32_t write_data){
    idle_check(axi_iic_ad);
    axi_iic_ad[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    axi_iic_ad[66] = write_addr & 0xff;           // address
    axi_iic_ad[66] = 0x200 | (write_data & 0xff);      // data
}

uint32_t acc_sensor_read(volatile uint32_t *axi_iic_ad, uint32_t device_addr, uint32_t read_addr){
    int32_t status_reg, rx_fifo_empty;

    idle_check(axi_iic_ad);
    axi_iic_ad[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    axi_iic_ad[66] = read_addr & 0xff;  // address byte
    axi_iic_ad[66] = 0x100 | device_addr & 0xff; // Slave IIC Read Address, address is 0x108, i2c_tx_fifo, with repeat start
    axi_iic_ad[66] = 0x201;      // 1 byte data, NACK condition

    do{
        status_reg = axi_iic_ad[65];
        rx_fifo_empty = status_reg & RX_FIFO_EMPTY;
    }while(rx_fifo_empty); // Wait untill not RX_FIFO_EMPTY(Status Register (104h))

    int32_t read_data = axi_iic_ad[67] & 0xff; // Read Receive FIFO (10Ch)
    return(read_data);
}

int main(){
    volatile uint32_t *axi_iic_ad;
    int32_t dataX, dataY, dataZ;
    int32_t read_data, data_ready;

    axi_iic_ad = XPAR_AXI_IIC_0_BASEADDR;

    acc_sensor_init(axi_iic_ad);

    acc_sensor_write(axi_iic_ad, 0x3a, 0x2d, 0x00); // stanby clear

    int32_t temp = acc_sensor_read(axi_iic_ad, 0x3b, 0x00);

    do{
        read_data = acc_sensor_read(axi_iic_ad, 0x3b, 0x04);
        data_ready = read_data & 0x01;
    }while(data_ready != 0x01);

    dataX = acc_sensor_read(axi_iic_ad, 0x3b, 0x08) << 12; // XDATA3
    dataX |= (acc_sensor_read(axi_iic_ad, 0x3b, 0x09) << 4); // XDATA2
    dataX |= ((acc_sensor_read(axi_iic_ad, 0x3b, 0x0a) & 0xf0) >> 4); // XDATA1
    if(dataX & 0x80000) // Is the 19th bit 1?
        dataX |= 0xfff00000; // sign extension

    dataY = acc_sensor_read(axi_iic_ad, 0x3b, 0x0b) << 12; // YDATA3
    dataY |= (acc_sensor_read(axi_iic_ad, 0x3b, 0x0c) << 4); // YDATA2
    dataY |= ((acc_sensor_read(axi_iic_ad, 0x3b, 0x0d) & 0xf0) >> 4); // YDATA1
    if(dataY & 0x80000) // Is the 19th bit 1?
        dataY |= 0xfff00000; // sign extension

    dataZ = acc_sensor_read(axi_iic_ad, 0x3b, 0x0e) << 12; // ZDATA3
    dataZ |= (acc_sensor_read(axi_iic_ad, 0x3b, 0x0f) << 4); // ZDATA2
    dataZ |= ((acc_sensor_read(axi_iic_ad, 0x3b, 0x10) & 0xf0) >> 4); // ZDATA1
    if(dataZ & 0x80000) // Is the 19th bit 1?
        dataZ |= 0xfff00000; // sign extension

    printf("datax = %x, dataY = %x, dataZ = %x\n", (int)dataX, (int)dataY, (int)dataZ);

    return(0);
}


アプリケーション・ソフトウェアを動作させた結果は Tera Term に表示している。
acc_sensor_5_201016.png

ZYBO Z7-20 で ADXL355 を動作させている様子を示す。
acc_sensor_6_201016.jpg

acc_sensor_write(axi_iic_ad, 0x3a, 0x2d, 0x00); のオシロスコープの波形を示す。
acc_sensor_7_201016.jpg

Write は問題なかった。

Read のプロトコルについてはよく分かっていなかった。
ADXL355 の日本語マニュアルの 29 ページの図 68. I2C のタイミング図 - 1 バイト読出しを引用する。
acc_sensor_9_201016.png

これによると、Write のデバイス・アドレス、レジスタ・アドレスを送ってからRepeat Start し、Read のデバイス・アドレスを送って、データをスレーブ(ADXL355)からもらうということのようだ。

第5回 Arduino入門 I2C通信編” の 7 枚目のスライドの”5.タイミングパラメータ”の下の 2 つの図を引用する。
acc_sensor_10_201016.png

これよると、I2C Master が Read データの NACK を送った Read データで転送が終了するということのようだ。

これらを踏まえて、 int32_t temp = acc_sensor_read(axi_iic_ad, 0x3b, 0x00); コードの実行によるオシロスコープの波形を見てみよう。
acc_sensor_8_201016.jpg

Write デバイス・アドレス(0x3a)、レジスタ・アドレス(0x00)、 Repeat Start、 Read デバイス・アドレス(0x3b)、 Read データ(0xad)、 NACK が見える。

ADXL355 のレジスタ・アドレス 0 番地を Read した時のデータは 0xAD なので、合っている。
  1. 2020年10月17日 05:12 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる4(2- Linux OS その2)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる3(2- Linux OS その1)”の続き。

前回、自分で Vitis 2020.1 のアクセラレーション・プラットフォームを作成したが、PetaLinux は起動しないままだった。
Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、この通りにやってみることにしたということで、前回は、PetaLinux を使用して、”petalinux-config -c kernel”まで終了した。今回は、”2- Linux OS”の残りをやっていこう。

ultra96v2-vitis-pkg/ultra96v2-petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi を編集する。
Ultra96V2_acc_platform201_50_201015.png

以下の様に書き換えた。”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”の”2- Linux OS”から引用する。
Ultra96V2_acc_platform201_51_201015.png

/include/ "system-conf.dtsi"
/ {
};
&amba {
zyxclmm_drm {
compatible = "xlnx,zocl";
status = "okay";
interrupt-parent = <&axi_intc_0>;
interrupts = <0  4>, <1  4>, <2  4>, <3  4>,
<4  4>, <5  4>, <6  4>, <7  4>,
<8  4>, <9  4>, <10 4>, <11 4>,
<12 4>, <13 4>, <14 4>, <15 4>,
<16 4>, <17 4>, <18 4>, <19 4>,
<20 4>, <21 4>, <22 4>, <23 4>,
<24 4>, <25 4>, <26 4>, <27 4>,
<28 4>, <29 4>, <30 4>, <31 4>;
};
};
&axi_intc_0 {
xlnx,kind-of-intr = <0x0>;
xlnx,num-intr-inputs = <0x20>;
interrupt-parent = <&gic>;
interrupts = <0 89 4>;
};


AR# 75417 2020.1 Zynq UltraScale+ MPSoC: UART1 をシリアルコンソールとして使用してカーネルをブートしている間に Ultra96V2 ボードがハングする”というバグがあるそうだ。 ikzwm さんによるとこのパッチはダメで、”[PATCH] tty: xilinx_uartps: Really fix id assignment”が本当のパッチということだ。
とにかく、”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”通りにやってみよう。

ultra96v2-vitis-pkg/ultra96v2-petalinux/components/yocto/workspace/sources/linux-xlnx/drivers/tty/serial/xilinx_uartps.c の 1488 行目をコメントアウトする。
Ultra96V2_acc_platform201_52_201015.png

Ultra96V2_acc_platform201_53_201015.png

ultra96v2-vitis-pkg/ultra96v2-petalinux/project-spec/meta-user/conf/user-rootfsconfig に次の行を追加する。
Ultra96V2_acc_platform201_54_201015.png

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”の”2- Linux OS”から引用する。

CONFIG_xrt
CONFIG_xrt-dev
CONFIG_zocl
CONFIG_opencl-clhpp-dev
CONFIG_opencl-headers-dev
CONFIG_packagegroup-petalinux-opencv


Ultra96V2_acc_platform201_55_201015.png

rootfs を設定する。
petalinux-config -c rootfs
Ultra96V2_acc_platform201_56_201015.png

user packages ですべてのパッケージにチェックを入れた。
Ultra96V2_acc_platform201_57_201015.png

< Exit > を数回選択すると、セーブ画面になるので、< Yes > を選択する。
Ultra96V2_acc_platform201_58_201015.png

PetaLinux をビルドする。
petalinux-build
Ultra96V2_acc_platform201_59_201015.png

Ultra96V2_acc_platform201_60_201015.png

ビルドは成功した。

image/linux ディレクトリに移動し、 sdk.sh を生成する。
cd images/linux
petalinux-build --sdk

Ultra96V2_acc_platform201_61_201015.png

Ultra96V2_acc_platform201_62_201015.png

成功した。

./sdk.sh
展開するディレクトリを聞かれるので、/media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/linux_files を入力した。
Ultra96V2_acc_platform201_63_201015.png

ultra96v2-vitis-pkg/linux_files に以下のディレクトリとファイルが生成された。Root File System が生成された。
Ultra96V2_acc_platform201_64_201015.png

ultra96v2-vitis-pkg/ultra96v2-petalinux/images/linux ディレクトリの以下のファイルを選択してコピーした。
Ultra96V2_acc_platform201_65_201015.png

image.ub
zynqmp_fsbl.elf
pmufw.elf
bl31.elf
u-boot.elf
rootfs.cpio


ultra96v2-vitis-pkg/linux_files/boot ディレクトリにペーストした。
Ultra96V2_acc_platform201_66_201015.png

ultra96v2-vitis-pkg/linux_files/boot ディレクトリに以下の linux.bif ファイルを作成した。”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”の”2- Linux OS”から引用し、自分のディレクトリに合うように変更した。
Ultra96V2_acc_platform201_67_201015.png

/* linux */
the_ROM_image:
{
[bootloader] /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/linux_files/boot/zynqmp_fsbl.elf
[pmufw_image] /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/linux_files/boot/pmufw.elf
[destination_device=pl] <bitstream>
[destination_cpu=a53-0, exception_level=el-3, trustzone] /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/linux_files/boot/bl31.elf
[destination_cpu=a53-0, exception_level=el-2] /media/masaaki/Ubuntu_Disk/Vitis_acceleration_platform/ultra96v2-vitis-pkg/linux_files/boot/u-boot.elf
}


Ultra96V2_acc_platform201_68_201015.png
  1. 2020年10月16日 04:48 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる3(2- Linux OS その1)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる2(1- XSA design その2)”の続き。

前回、自分で Vitis 2020.1 のアクセラレーション・プラットフォームを作成したが、PetaLinux は起動しないままだった。
Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、この通りにやってみることにしたということで、前回は、ハードウェア・プラットフォームを作成して、XSA ファイルを出力した。今回は、PetaLinux を使用して、設定を行っていこう。

ultra96v2-vitis-pkg ディレクトリに行って、linux_files ディレクトリを作り、その下に boot ディレクトリを作成する。
PetaLinux のインストール・ディレクトリの setting.sh を起動する。
PetaLinux の ultra96v2-petalinux プロジェクトを作成する。
mkdir linux_files
mkdir linux_files/boot
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/PetaLinux/2020.1/settings.sh
petalinux-create -t project --template zynqMP -n ultra96v2-petalinux

Ultra96V2_acc_platform201_36_201015.png

ultra96v2-petalinux ディレクトリに入って、 petalinux-config を起動した。
cd ultra96v2-petalinux
petalinux-config --get-hw-description=../vivado

Ultra96V2_acc_platform201_37_201015.png

設定画面が開く。
Ultra96V2_acc_platform201_38_201015.png

Subsystem AUTO Hardware Settings –> Serial Setting で stdin/stdout を psu_uart_1 に変更する。
Ultra96V2_acc_platform201_39_201015.png

DTG Settings -> MACHINE_NAME を avnet-ultra96-rev1 に変更する。
Ultra96V2_acc_platform201_40_201015.png

Image Packaging Configuration の Root filesystem type を EXT4 (SD/eMMC/SATA/USB) に変更する。
Ultra96V2_acc_platform201_41_201015.png

< Exit > を数回選択すると、セーブ画面になるので、< Yes > を選択する。
Ultra96V2_acc_platform201_42_201015.png

Kernel を構成する。
petalinux-config -c kernel
Ultra96V2_acc_platform201_43_201015.png

設定画面が開く。
Ultra96V2_acc_platform201_44_201015.png

Library routines -> Size in Mega bytes を 256 から 1024 にする。
Ultra96V2_acc_platform201_45_201015.png

CPU Power Mangement –> CPU Idle –> CPU idle PM support を OFF した。
Ultra96V2_acc_platform201_46_201015.png

CPU Power Mangement –> CPU Freqency scaling を OFF した。(これは、”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”に書いていないが OFF した)
Ultra96V2_acc_platform201_47_201015.png

< Exit > を数回選択すると、セーブ画面になるので、< Yes > を選択する。
Ultra96V2_acc_platform201_48_201015.png

Kernel の設定が終了した。
Ultra96V2_acc_platform201_49_201015.png
  1. 2020年10月15日 04:21 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS で C シミュレーションは動作するが C/RTL 協調シミュレーションが終了しない

Akira's Study Room さんの”Vivado_HLSのcsimは動作するけどcosimが終了しない場合の原因と対処方法”を読んで、私もそういう場面に遭遇しているということで、Vitis HLS で C シミュレーションは動作するが C/RTL 協調シミュレーションが終了しない状況を書いておくことにした。

acc_sensor_inf IP を作っていた。この IP は MicroBlaze で I2C のセンサのデータを取りまくって、Debian 走っている ZYNQ PS に転送する仲立ちをする予定だった。しかし、クリティカル・セクションが多すぎるので、やめにした。
まずは、Vivado で acc_sensor_inf IP を使っているところを示す。
not_stopped_csim_1_201014.png

さて、Vitis HLS 2020.1 の acc_sensor_inf2 プロジェクトを示す。
not_stopped_csim_2_201014.png

acc_sensor_inf.cpp を示す。

// acc_sensor_if.cpp
// 2020/10/02 by marsee
//

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

int acc_sensor_if(int32_t *time_zynq, int32_t time_mb, int32_t *dataX_zynq, int32_t dataX_mb,
    int32_t *dataY_zynq, int32_t dataY_mb, int32_t *dataZ_zynq, int32_t dataZ_mb,
    int32_t wr, int32_t rd){
#pragma HLS INTERFACE s_axilite bundle=mb port=time_mb
#pragma HLS INTERFACE s_axilite bundle=zynq port=time_zynq
#pragma HLS INTERFACE s_axilite port=rd bundle=zynq
#pragma HLS INTERFACE s_axilite port=wr bundle=mb
#pragma HLS INTERFACE s_axilite port=dataX_zynq bundle=zynq
#pragma HLS INTERFACE s_axilite port=dataY_zynq bundle=zynq
#pragma HLS INTERFACE s_axilite port=dataZ_zynq bundle=zynq
#pragma HLS INTERFACE s_axilite port=dataX_mb bundle=mb
#pragma HLS INTERFACE s_axilite port=dataY_mb bundle=mb
#pragma HLS INTERFACE s_axilite port=dataZ_mb bundle=mb
#pragma HLS INTERFACE s_axilite port=return

    static ap_uint<4> wp=0, rp=0;
    static int32_t time[16], x[16], y[16], z[16];

    if(wr!=0 && rp!=wp+1){ // not full
        time[wp] = time_mb;
        x[wp] = dataX_mb;
        y[wp] = dataY_mb;
        z[wp] = dataZ_mb;
        wp++;
    }
    if(rd!=0 && rp!=wp){ //  not empty
        *time_zynq = time[rp];
        *dataX_zynq = x[rp];
        *dataY_zynq = y[rp];
        *dataZ_zynq = z[rp];
        rp++;
    }

    return(0);
}


ちょっと怪しいコードの FIFO だ。
テストベンチの acc_sensor_inf_tb.cpp を示す。

// acc_sensor_if_tb.cpp
// 2020/10/02 by marsee
//

#include <iostream>
#include <stdint.h>

int acc_sensor_if(int32_t *time_zynq, int32_t time_mb, int32_t *dataX_zynq, int32_t dataX_mb,
    int32_t *dataY_zynq, int32_t dataY_mb, int32_t *dataZ_zynq, int32_t dataZ_mb,
    int32_t wr, int32_t rd);

int main(){
    int32_t time_zynq, time_mb;
    int32_t dataX_zynq, dataX_mb;
    int32_t dataY_zynq, dataY_mb;
    int32_t dataZ_zynq, dataZ_mb;
    int32_t wr, rd;

    for(dataX_mb=0; dataX_mb<10; dataX_mb++){
        time_mb = dataX_mb + 3;
        dataY_mb = dataX_mb + 1;
        dataZ_mb = dataX_mb + 2;

        wr = 1; rd = 0;
        acc_sensor_if(&time_zynq, time_mb, &dataX_zynq, dataX_mb, & dataY_zynq, dataY_mb, &dataZ_zynq, dataZ_mb, wr, rd);
        //std::cout << "time_zynq = " << time_zynq << " dataX_zynq = " << dataX_zynq << " dataY_zynq = " << dataY_zynq << " dataZ_zynq = " << dataZ_zynq << std::endl;
    }

    for(int i=0; i<10; i++){
        wr = 0; rd = 1;
        acc_sensor_if(&time_zynq, time_mb, &dataX_zynq, dataX_mb, & dataY_zynq, dataY_mb, &dataZ_zynq, dataZ_mb, wr, rd);
        std::cout <<  "time_zynq = " << time_zynq << " dataX_zynq = " << dataX_zynq << " dataY_zynq = " << dataY_zynq << " dataZ_zynq = " << dataZ_zynq << std::endl;
    }

    for(dataX_mb=10; dataX_mb<20; dataX_mb++){
        time_mb = dataX_mb + 3;
        dataY_mb = dataX_mb + 1;
        dataZ_mb = dataX_mb + 2;

        wr = 1; rd = 0;
        acc_sensor_if(&time_zynq, time_mb, &dataX_zynq, dataX_mb, & dataY_zynq, dataY_mb, &dataZ_zynq, dataZ_mb, wr, rd);
        //std::cout <<  "time_zynq = " << time_zynq << " dataX_zynq = " << dataX_zynq << " dataY_zynq = " << dataY_zynq << " dataZ_zynq = " << dataZ_zynq << std::endl;
    }

    for(int i=0; i<10; i++){
        wr = 0; rd = 1;
        acc_sensor_if(&time_zynq, time_mb, &dataX_zynq, dataX_mb, & dataY_zynq, dataY_mb, &dataZ_zynq, dataZ_mb, wr, rd);
        std::cout <<  "time_zynq = " << time_zynq << " dataX_zynq = " << dataX_zynq << " dataY_zynq = " << dataY_zynq << " dataZ_zynq = " << dataZ_zynq << std::endl;
    }

    return(0);
}


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

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
   Compiling ../../../acc_sensor_if_tb.cpp in debug mode
   Generating csim.exe
time_zynq = 3 dataX_zynq = 0 dataY_zynq = 1 dataZ_zynq = 2
time_zynq = 4 dataX_zynq = 1 dataY_zynq = 2 dataZ_zynq = 3
time_zynq = 5 dataX_zynq = 2 dataY_zynq = 3 dataZ_zynq = 4
time_zynq = 6 dataX_zynq = 3 dataY_zynq = 4 dataZ_zynq = 5
time_zynq = 7 dataX_zynq = 4 dataY_zynq = 5 dataZ_zynq = 6
time_zynq = 8 dataX_zynq = 5 dataY_zynq = 6 dataZ_zynq = 7
time_zynq = 9 dataX_zynq = 6 dataY_zynq = 7 dataZ_zynq = 8
time_zynq = 10 dataX_zynq = 7 dataY_zynq = 8 dataZ_zynq = 9
time_zynq = 11 dataX_zynq = 8 dataY_zynq = 9 dataZ_zynq = 10
time_zynq = 12 dataX_zynq = 9 dataY_zynq = 10 dataZ_zynq = 11
time_zynq = 13 dataX_zynq = 10 dataY_zynq = 11 dataZ_zynq = 12
time_zynq = 14 dataX_zynq = 11 dataY_zynq = 12 dataZ_zynq = 13
time_zynq = 15 dataX_zynq = 12 dataY_zynq = 13 dataZ_zynq = 14
time_zynq = 16 dataX_zynq = 13 dataY_zynq = 14 dataZ_zynq = 15
time_zynq = 17 dataX_zynq = 14 dataY_zynq = 15 dataZ_zynq = 16
time_zynq = 18 dataX_zynq = 15 dataY_zynq = 16 dataZ_zynq = 17
time_zynq = 19 dataX_zynq = 16 dataY_zynq = 17 dataZ_zynq = 18
time_zynq = 20 dataX_zynq = 17 dataY_zynq = 18 dataZ_zynq = 19
time_zynq = 21 dataX_zynq = 18 dataY_zynq = 19 dataZ_zynq = 20
time_zynq = 22 dataX_zynq = 19 dataY_zynq = 20 dataZ_zynq = 21
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


問題ない。

C コードの合成の結果を示す。
not_stopped_csim_4_201014.png

C/RTL 協調シミュレーションを行ったが、終了しなかったので、キャンセルした。
not_stopped_csim_5_201014.png

テストベンチの acc_sensor_inf_tb.cpp を修正した。
acc_sensor_inf.cpp の 2 個の if () 文の中が実行されるように変更を行った。

// acc_sensor_if_tb.cpp
// 2020/10/02 by marsee
//

#include <iostream>
#include <stdint.h>

int acc_sensor_if(int32_t *time_zynq, int32_t time_mb, int32_t *dataX_zynq, int32_t dataX_mb,
    int32_t *dataY_zynq, int32_t dataY_mb, int32_t *dataZ_zynq, int32_t dataZ_mb,
    int32_t wr, int32_t rd);

int main(){
    int32_t time_zynq, time_mb;
    int32_t dataX_zynq, dataX_mb;
    int32_t dataY_zynq, dataY_mb;
    int32_t dataZ_zynq, dataZ_mb;
    int32_t wr, rd;

    for(dataX_mb=0; dataX_mb<10; dataX_mb++){
        time_mb = dataX_mb + 3;
        dataY_mb = dataX_mb + 1;
        dataZ_mb = dataX_mb + 2;

        wr = 1; rd = 1;
        acc_sensor_if(&time_zynq, time_mb, &dataX_zynq, dataX_mb, & dataY_zynq, dataY_mb, &dataZ_zynq, dataZ_mb, wr, rd);
        std::cout << "time_zynq = " << time_zynq << " dataX_zynq = " << dataX_zynq << " dataY_zynq = " << dataY_zynq << " dataZ_zynq = " << dataZ_zynq << std::endl;
    }

    for(dataX_mb=10; dataX_mb<20; dataX_mb++){
        time_mb = dataX_mb + 3;
        dataY_mb = dataX_mb + 1;
        dataZ_mb = dataX_mb + 2;

        wr = 1; rd = 1;
        acc_sensor_if(&time_zynq, time_mb, &dataX_zynq, dataX_mb, & dataY_zynq, dataY_mb, &dataZ_zynq, dataZ_mb, wr, rd);
        std::cout <<  "time_zynq = " << time_zynq << " dataX_zynq = " << dataX_zynq << " dataY_zynq = " << dataY_zynq << " dataZ_zynq = " << dataZ_zynq << std::endl;
    }

    return(0);
}


これで、 C シミュレーションを行ったが、前と同様の結果だった。
not_stopped_csim_6_201014.png

C/RTL 協調シミュレーションを行った。今度は完了した。
not_stopped_csim_7_201014.png

結果の一部を示す。

## run all
////////////////////////////////////////////////////////////////////////////////////
// Inter-Transaction Progress: Completed Transaction / Total Transaction
// Intra-Transaction Progress: Measured Latency / Latency Estimation * 100%
//
// RTL Simulation : "Inter-Transaction Progress" ["Intra-Transaction Progress"] @ "Simulation Time"
////////////////////////////////////////////////////////////////////////////////////
// RTL Simulation : 0 / 20 [0.00%] @ "1125000"
// RTL Simulation : 1 / 20 [950.00%] @ "1975000"
// RTL Simulation : 2 / 20 [975.00%] @ "2855000"
// RTL Simulation : 3 / 20 [950.00%] @ "3715000"
// RTL Simulation : 4 / 20 [950.00%] @ "4585000"
// RTL Simulation : 5 / 20 [950.00%] @ "5455000"
// RTL Simulation : 6 / 20 [950.00%] @ "6325000"
// RTL Simulation : 7 / 20 [975.00%] @ "7205000"
// RTL Simulation : 8 / 20 [950.00%] @ "8065000"
// RTL Simulation : 9 / 20 [950.00%] @ "8935000"
// RTL Simulation : 10 / 20 [950.00%] @ "9805000"
// RTL Simulation : 11 / 20 [950.00%] @ "10675000"
// RTL Simulation : 12 / 20 [975.00%] @ "11555000"
// RTL Simulation : 13 / 20 [950.00%] @ "12415000"
// RTL Simulation : 14 / 20 [950.00%] @ "13285000"
// RTL Simulation : 15 / 20 [950.00%] @ "14155000"
// RTL Simulation : 16 / 20 [950.00%] @ "15025000"
// RTL Simulation : 17 / 20 [975.00%] @ "15905000"
// RTL Simulation : 18 / 20 [950.00%] @ "16765000"
// RTL Simulation : 19 / 20 [950.00%] @ "17635000"
// RTL Simulation : 20 / 20 [100.00%] @ "18505000"
////////////////////////////////////////////////////////////////////////////////////
$finish called at time : 18545 ns : File "/media/masaaki/Ubuntu_Disk/Vitis_HLS/ZYBO_Z7_20/acc_sensor_inf2/solution1/sim/verilog/acc_sensor_if.autotb.v" Line 475
## quit
INFO: [Common 17-206] Exiting xsim at Wed Oct 14 04:56:07 2020...
INFO: [COSIM 212-316] Starting C post checking ...
time_zynq = 3 dataX_zynq = 0 dataY_zynq = 1 dataZ_zynq = 2
time_zynq = 4 dataX_zynq = 1 dataY_zynq = 2 dataZ_zynq = 3
time_zynq = 5 dataX_zynq = 2 dataY_zynq = 3 dataZ_zynq = 4
time_zynq = 6 dataX_zynq = 3 dataY_zynq = 4 dataZ_zynq = 5
time_zynq = 7 dataX_zynq = 4 dataY_zynq = 5 dataZ_zynq = 6
time_zynq = 8 dataX_zynq = 5 dataY_zynq = 6 dataZ_zynq = 7
time_zynq = 9 dataX_zynq = 6 dataY_zynq = 7 dataZ_zynq = 8
time_zynq = 10 dataX_zynq = 7 dataY_zynq = 8 dataZ_zynq = 9
time_zynq = 11 dataX_zynq = 8 dataY_zynq = 9 dataZ_zynq = 10
time_zynq = 12 dataX_zynq = 9 dataY_zynq = 10 dataZ_zynq = 11
time_zynq = 13 dataX_zynq = 10 dataY_zynq = 11 dataZ_zynq = 12
time_zynq = 14 dataX_zynq = 11 dataY_zynq = 12 dataZ_zynq = 13
time_zynq = 15 dataX_zynq = 12 dataY_zynq = 13 dataZ_zynq = 14
time_zynq = 16 dataX_zynq = 13 dataY_zynq = 14 dataZ_zynq = 15
time_zynq = 17 dataX_zynq = 14 dataY_zynq = 15 dataZ_zynq = 16
time_zynq = 18 dataX_zynq = 15 dataY_zynq = 16 dataZ_zynq = 17
time_zynq = 19 dataX_zynq = 16 dataY_zynq = 17 dataZ_zynq = 18
time_zynq = 20 dataX_zynq = 17 dataY_zynq = 18 dataZ_zynq = 19
time_zynq = 21 dataX_zynq = 18 dataY_zynq = 19 dataZ_zynq = 20
time_zynq = 22 dataX_zynq = 19 dataY_zynq = 20 dataZ_zynq = 21
INFO: [COSIM 212-1000] *** C/RTL co-simulation finished: PASS ***
Finished C/RTL cosimulation.


ということで、Vivado HLS に続き、Vitis HLS 2020.1 でもハードウェア化するコードで、出力するコードをスキップすると C/RTL 協調シミュレーションが終了しないようだ。
  1. 2020年10月14日 05:02 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる2(1- XSA design その2)

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる1(1- XSA design その1)”の続き。

前回、自分で Vitis 2020.1 のアクセラレーション・プラットフォームを作成したが、PetaLinux は起動しないままだった。
Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、この通りにやってみることにしたということで、前回は、Vivado 2020.1 でプロジェクトを作り、Zynq UltraScale+ MPSoC を Add IP した。今回は、残りの Vivado 2020.1 で作業をやっていこう。

Zynq UltraScale+ MPSoC をダブルクリックして、設定画面を開いた。
Page Navigator から PS-PL Configuration をクリックして、 PS-PL Interface -> Master Interface -> AXI HPM0 FPD と AXI HPM1 FPD のチェックを外す。
Ultra96V2_acc_platform201_9_201011.png

Clocking Wizard を Add IP した。
Ultra96V2_acc_platform201_10_201011.png

Clocking Wizard をダブルクリックして設定を行う。
clk_out1 -> 100 MHz
clk_out2 -> 200 MHz
clk_out3 -> 300 MHz
clk_out4 -> 600 MHz (ここは 500 MHz ではワーニングがでるので変更した)

Reset Type は Active Low に変更した。
Ultra96V2_acc_platform201_11_201011.png

ブロックデザインに Processor System Reset を 4 個 Add IP した。
Ultra96V2_acc_platform201_12_201011.png

IP を下図のように配線した。
Ultra96V2_acc_platform201_13_201011.png

AXI Interrupt Controller を Add IP した。
Ultra96V2_acc_platform201_14_201011.png

もう一度、Zynq UltraScale+ MPSoC をダブルクリックして、設定画面を開いた。
Page Navigator から PS-PL Configuration をクリックして、 PS-PL Interface -> Master Interface -> AXI HPM0 LPD にチェックを入れて、AXI HPM0 LPD Data Width を 32 にした。
Ultra96V2_acc_platform201_15_201012.png

Zynq UltraScale+ MPSoC の maxlhpm0_lpd_aclk を clk_wiz_0 の clk_out1 に接続する。

Run Connection Automation をクリックする。
Ultra96V2_acc_platform201_16_201012.png

Run Connection Automation ダイアログが表示された。ダイアログを使用して配線を行った。
Ultra96V2_acc_platform201_17_201012.png

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”と違って、axi_intc_0 の interrupt を展開して、 irq を Zynq UltraScale+ MPSoC の pl_ps_irq0[0:0] に接続した。

Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”では、Vivado の TCL Console で以下のコマンドを実行する。

set_property PFM.IRQ {intr {id 0 range 32}} [get_bd_cells /axi_intc_0]


Ultra96V2_acc_platform201_18_201012.png

Vivado の Window メニューから Platform Interfaces を選択する。
Enable platform interfaces をクリックして、 platform interfaces を有効化する。
Ultra96V2_acc_platform201_19_201012.png

Platform Interfaces で以下のポートを選択して、右クリックし右クリックメニューから Enable を選択する。

M_AXI_HPM0_FPD
M_AXI_HPM1_FPD
S_AXI_HPC0_FPD
S_AXI_HPC1_FPD
S_AXI_HP0_FPD
S_AXI_HP1_FPD
S_AXI_HP2_FPD
S_AXI_HP3_FPD


Ultra96V2_acc_platform201_20_201012.png

Enable 後の様子。
Ultra96V2_acc_platform201_21_201012.png

S_AXI_HPC0_FPD の Platform Interface Properties -> sptag に HPC0 と入力した。
以下、下に示すポートに sptag を入力した。

S_AXI_HPC0_FPD -> HPC0
S_AXI_HPC1_FPD -> HPC1
S_AXI_HP0_FPD -> HP0
S_AXI_HP1_FPD -> HP1
S_AXI_HP2_FPD -> HP2
S_AXI_HP3_FPD -> HP3


Ultra96V2_acc_platform201_22_201012.png

clk_wiz_0 の clk_out1 の Platform Interface Properties の id を 0 、 is_default のチェックボックスにチェックを入れた。
clk_wiz_0 の clk_out2 の Platform Interface Properties の id を 1 に設定した。
clk_wiz_0 の clk_out3 の Platform Interface Properties の id を 2 に設定した。
clk_wiz_0 の clk_out4 の Platform Interface Properties の id を 3 に設定した。
Ultra96V2_acc_platform201_23_201012.png

Platform Interfaces ウインドウで、 ps8_0_axi_periph の以下のポートを Enable にした。

M01_AXI
M02_AXI
M03_AXI
M04_AXI
M05_AXI
M06_AXI
M07_AXI
M08_AXI


Ultra96V2_acc_platform201_24_201012.png

M01_AXI 〜 M08_AXI の sptag を HPM0_LPD に設定した。
Ultra96V2_acc_platform201_25_201012.png

Ultra96V2_acc_platform201_26_201012.png

TCL Console で以下のコマンドを実行した。

set_property platform.design_intent.embedded true [current_project]
set_property platform.design_intent.server_managed false [current_project]
set_property platform.design_intent.external_host false [current_project]
set_property platform.design_intent.datacenter false [current_project]
set_property platform.default_output_type "sd_card" [current_project]


Ultra96V2_acc_platform201_27_201012.png

Diagram ウインドウで Validate Design アイコンをクリックし、デザインの検証を行ったが、1 個 Critical Warring がでている。
Ultra96V2_acc_platform201_28_201012.png

Sources ウインドウの ultra96v2_design を右クリックし、右クリックメニューから Generate Output Products... を選択する。
Ultra96V2_acc_platform201_29_201012.png

Generate Output Products ダイアログが表示された。
Generate ボタンをクリックする。
Ultra96V2_acc_platform201_30_201012.png

また、 Critical Warring がでた。
Ultra96V2_acc_platform201_31_201012.png

(2020/12/11:追加)Create HDL Wrapper が抜けていたので追加。
Source ウインドウで ultra96v2_design.bd を右クリックし、右クリックメニューから Create HDL Wrapper.. を選択する。

Create HDL Wrapper ダイアログが開く。
デフォルトで Let Vivado manage wrapper and auto-update のラジオボタンがチェックされているので、そのまま OK ボタンをクリックする。

ultra96_design_wrapper.v が生成された。

Flow Navigator -> PROGRAM AND DEBUG -> Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行う。
Ultra96V2_acc_platform201_32_201012.png

論理合成、インプリメンテーション、ビットストリームの生成が成功した。
Ultra96V2_acc_platform201_33_201012.png

XSA ファイルを出力する。

TCL Console で以下のコマンドを入力した。
write_hw_platform -include_bit ultra96v2.xsa
pwd
validate_hw_platform ./ultra96v2.xsa


Ultra96V2_acc_platform201_34_201012.png

ultra96v2.xsa ファイルが生成された。
Ultra96V2_acc_platform201_35_201012.png
  1. 2020年10月13日 05:01 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”をやってみる1(1- XSA design その1)

前回、自分で Vitis 2020.1 のアクセラレーション・プラットフォームを作成したが、PetaLinux は起動しないままだった。
Ultra96v2 Linux-Based Platform in Xilinx Vitis 2020.1”を見つけたので、この通りにやってみることにした。

1- XSA design からやってみよう。

ultra96v2-vitis-pkg というディレクトリを作成する。
ultra96v2-vitis-pkg の下に vivado ディレクトリを作成する。
vivado ディレクトリに移動する。
Vivado 2020.1 を起動する。
Ultra96V2_acc_platform201_1_201011.png

Vivado 2020.1 が起動した。
Create New Project をクリックして、 ultra96v2-vitis-pkg/vivado ディレクトリに ultra96v2-xsa というプロジェクトを作成する。
なお、New Project ウインドウの下に書いてある画面以外はすべてデフォルトでNext > ボタンをクリックしている。

New Project ウインドウの Project Name 画面で、Project name: に ultra96-xsa を、Project location: に ultra96v2-vitis-pkg/vivado ディレクトリを指定した。
Ultra96V2_acc_platform201_2_201011.png

Default Part 画面では、Boards をクリックし、Vendor: を avnet.com にして、Ultra96v2 Single Board Computer を選択する。
Ultra96V2_acc_platform201_3_201011.png

New Project Summary 画面を示す。
Finish ボタンをクリックする。
Ultra96V2_acc_platform201_4_201011.png

ultra96-xsa プロジェクトが生成された。
左の Flow Navigator の Create Block Design をクリックして、ブロックデザインを生成する。
Create Block Design ダイアログが開く。Design name: に ultra96v2_design と入力し、OK ボタンをクリックした。
Ultra96V2_acc_platform201_5_201011.png

開いた Diagram ウインドウで、+ ボタンをクリックし、Zynq UltraScale+ MPSoC を Add IP した。
Run Block Automation をクリックする。
Ultra96V2_acc_platform201_6_201011.png

Run Block Automation が開いた。
Apply Board Preset にチェックが入っているのを確認して、OKボタンをクリックした。
Ultra96V2_acc_platform201_7_201011.png

zynq_ultra_ps_e_0 の様子を示す。
Ultra96V2_acc_platform201_8_201011.png
  1. 2020年10月12日 05:09 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる7(Vitis その3 + デバック)

Nexys Video でMicroBlaze のチュートリアルをやってみる6(Vitis その2 + デバック)”の続き。

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思うということで、前回は、ラン・コンフィグレーションを作り、デバックモードで起動して、GPIO の Write アクセスを Vivado Analyzer で観察した。今回は、”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”手順 13: ロジックからプロセッサへのクロストリガーの設定”をやってみよう。

Vitis で 50 行目のブレーク・ポイントを削除した。
microblaze_tut_80_201011.png

Vivado Analyzer で Trigger mode を BASIC_OR_TRIG_IN に、TRIG_OUT mode を TRIGGER_OR_TRIG_IN に変更した。
AWVALID は Rise でトリガをかけてある。
microblaze_tut_81_201011.png

Vivado Analyzer の Status ウインドウで Run trigger for this ILA core ボタンをクリックする。
トリガを待っている。
microblaze_tut_82_201011.png

Vitis で Resume ボタンをクリックして、ソフトウェアを走らせる。
microblaze_tut_83_201011.png

Vitis は停止したが、 exit で停止しているようだ。クロストリガーでは停止していないようだ?
microblaze_tut_84_201011.png

Vivado Analyzer はトリガーがかかっている。
microblaze_tut_85_201011.png

波形を拡大した。
microblaze_tut_86_201011.png

ロジックからプロセッサへのクロストリガーはうまく行かなかった。
  1. 2020年10月11日 05:10 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる6(Vitis その2 + デバック)

Nexys Video でMicroBlaze のチュートリアルをやってみる5(Vitis その1)”の続き。

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思うということで、前回は、Vitis を起動して、プラットフォームとアプリケーション・プラットフォームを作成し、テンプレートとして Peripheral Tests を選択しビルドし成功した。今回は、ラン・コンフィグレーションを作り、デバックモードで起動して、GPIO の Write アクセスを Vivado Analyzer で観察した。

Explorer から Microblaze_tut_system -> Microblaze_tut を右クリックし、右クリックメニューから Generate Linker Script を選択する。
microblaze_tut_65_201010.png

Basic タブの Place code Sections in: と Place Data Sections in: 、 Place Heap and Stack in: で mig_7series_0_memaddr を選択する
microblaze_tut_62_201009.png

Explorer から Microblaze_tut_system -> Microblaze_tut -> src -> lscript.ld を開くと設定が変わっている。
microblaze_tut_63_201010.png

Assistant ウインドウから Microblaze_tut_system -> Microblaze_tut -> Debug を右クリックし、右クリックメニューから Debug AS -> Debug Configurations... を選択する。
microblaze_tut_64_201010.png

Debug Configurations ダイアログが開く。
Singu Application Debug を右クリックし、右クリックメニューから New Configuration を選択する。
microblaze_tut_66_201010.png

Debugger_Microblaze_tut-Default という名前の Debug Configurations ダイアログが開いた。
とりあえず Close ボタンをクリックして、ダイアログを閉じる。
microblaze_tut_67_201010.png

Nexys Video の PROG 、 UART ポートを USB ケーブルでパソコンに接続して、電源 ON した。
JP4 は JTAG モードに変更した。

gtkterm を sudo で開いて、 /dev/ttyUSB1 をポートとして指定する。ボーレートは 9600 bps だ。
microblaze_tut_68_201010.png

Vitis IDE に戻って、 testperiph.c を書き換える。
41 行目に

while(1)

を入力した。
59 行目にブレーク・ポイントを入力した。
microblaze_tut_69_201010.png

Assistant ウインドウから Microblaze_tut_system -> Microblaze_tut -> Debug を右クリックし、右クリックメニューから Debugger_Microblaze_tut-Default を選択する。
microblaze_tut_70_201010.png

Debug モードになって、 testperiph.c の main() の最初の行でストップした。
microblaze_tut_71_201010.png

Vivado に戻って、 Flow Navigator から PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックし、 Auto Connect を選択した。
microblaze_tut_72_201010.png

HARWARE MANAGER が起動し、hw_ila_1 が表示された。
microblaze_tut_73_201010.png

Settings - hw_ila_1 で Trigger mode: を TRIG_IN_ONLY、 TRIG_OUT mode: を TRIG_IN_ONLY に変更した。
microblaze_tut_74_201010.png

Run Trigger ボタン(緑の横三角)をクリックして、波形キャプチャをスタートした。
Windows sample が 512 of 1024 になった。この時点でトリガを待っている。
microblaze_tut_75_201010.png

Vitis で Resume ボタンをクリックして、50 行目までソフトウェアを進める。
microblaze_tut_76_201010.png

Vivado Analyer で波形がキャプチャできた。
microblaze_tut_77_201010.png

gtkerm の表示を示す。
microblaze_tut_79_201010.png

Settings - hw_ila_1 で Trigger mode: を BASIC_ONLY、 TRIG_OUT mode: を DISABLED に戻した。

デバックモードを終了して、もう一度、Assistant ウインドウから Microblaze_tut_system -> Microblaze_tut -> Debug を右クリックし、右クリックメニューから Debugger_Microblaze_tut-Default を選択した。

Vivado に戻って、 Flow Navigator から PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックし、 Auto Connect を選択した。

今度は、 hw_ila_1 の Trigger Setup で AWVALID を R でトリガにした。

Run Trigger ボタン(緑の横三角)をクリックして、波形キャプチャをスタートした。
Windows sample が 512 of 1024 になった。この時点でトリガを待っている。

Vitis の Resume ボタンをクリックして、50 行目までソフトウェアを進める。

Vivado Analyer で波形がキャプチャできた。
microblaze_tut_78_201010.png

今度は、AWVALID などの制御信号もキャプチャできている。
  1. 2020年10月10日 16:52 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる5(Vitis その1)

Nexys Video でMicroBlaze のチュートリアルをやってみる4(手順 2: IP インテグレーター デザインの作成 その3)”の続き。

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思うということで、前回はできあがった回路を論理合成、インプリメンテーション、ビットストリームの生成を行って、XSA ファイルを生成した。今回は、Vitis を起動して、プラットフォームとアプリケーション・プラットフォームを作成し、テンプレートとして Peripheral Tests を選択した。

Viavdo 2020.1 の Tools メニューから Launch Vitis IDE を選択する。

Eclipse Launcher ダイアログが表示された。
Browse... ボタンをクリックする。
microblaze_tut_49_201008.png

MicroBlaze_tut プロジェクトのディレクトリに行って、フォルダの作成ボタンをクリックする。
microblaze_tut_50_201008.png

vitis_work を作成した。それを選択して、OKボタンをクリックする。
microblaze_tut_51_201008.png

Workspace: に MicroBlaze_tut/vitis_work が入った。そのまま、 Launch ボタンをクリックする。
microblaze_tut_52_201008.png

Vitis 2020.1 の Welcome 画面が表示された。
microblaze_tut_61_201009.png

Create Application Project をクリックする。
New Application Project の Create a New Application Project 画面が表示された。
Next > ボタンをクリックする。
microblaze_tut_53_201008.png

Platform 画面では、Create a new platform hardware (XSA) タブをクリックする。
XSA File: の Browse... ボタンをクリックする。
microblaze_tut_54_201008.png

MicroBlaze_tut/mb_subsystem_wrapper.xsa ファイルを指定した。
microblaze_tut_55_201008.png

Application Project Details 画面で、Application project name: に Micorblaze_tut と入力した。
microblaze_tut_56_201008.png

Domain 画面はデフォルトのままとした。
microblaze_tut_57_201008.png

Templates ウインドウでは、 Peripheral Tests を選択して、 Finish ボタンをクリックした。
microblaze_tut_58_201008.png

プラットフォームとアプリケーション・プロジェクトが作成された。
microblaze_tut_59_201008.png

トンカチマークをくりっくして、ビルドを行った。
ビルドは成功した。
microblaze_tut_60_201009.png
  1. 2020年10月09日 04:32 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる4(手順 2: IP インテグレーター デザインの作成 その3)

Nexys Video でMicroBlaze のチュートリアルをやってみる3(手順 2: IP インテグレーター デザインの作成 その2)”の続き。

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思うということで、前回は、、”手順 2: IP インテグレーター デザインの作成”を更に進めていって、ブロックデザインが完成したと思ったが、クロックのピンなどがなかった。今回は、クロックピンや clocking Wizard を追加して、ブロックデザインを完成させ、論理合成、インプリメンテーション、ビットストリームの生成を行った。

やはり、”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”は、ザイリンクス KC705 FPGA 評価ボードのチュートリアルなので、Nexys Video に適用できないところがある。前回のブロックデザインでは、MIG のクロック sys_clk_i が直接出ている。これは 200 MHz のクロック入力だが、Nexys Video のクロックは 100 MHz だった。

Board ウインドウから System Clock と Reset を Diagram ウインドウにドラック & ドロップした。
microblaze_tut_41_201007.png

clocking Wizard を追加した。
clk_out1 を MIG 用の 200 MHz に設定変更して、Reset Type を Active Low に変更した。
microblaze_tut_40_201005.png

最終的に完成したブロックデザインを示す。
Processor System Reset と Clocking Wizard IP を追加してある。
microblaze_tut_41_201005.png

MIG 以外の IP のクロックは MIG の ui_clk から自動的に接続されていたので、とりあえずこれで良いことにする。

Validate Design を行ったところ、成功した。
microblaze_tut_38_201004.png

Vivado の Source ウインドウで mb_system_i を右クリックし右クリックメニューから Create HDL Wrapper... を選択して Verilog HDL のラッパーファイルを生成した。
microblaze_tut_39_201004.png

Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行った。
成功して、ビットファイルが生成された。
microblaze_tut_42_201007.png

Project Summary を示す。
タイミングもメットしている。
microblaze_tut_43_201007.png

さて、XSA ファイルを出力しよう。
Vivado の File メニューから Export -> Export Hardware... をクリックする。
Export Hardware Platform ダイアログが表示された。
Platform Type はデフォルトの Fixed のままで Next > ボタンをクリックする。
microblaze_tut_44_201007.png

Output 画面では、Inclue bitstream のラジオボタンを選択する。
microblaze_tut_45_201007.png

Files ではデフォルトのままとする。
microblaze_tut_46_201007.png

Exporting Hardware Platform で Finish ボタンをクリックする。
microblaze_tut_47_201007.png

mb_subsystem_wrapper.xsa ファイルが生成された。
microblaze_tut_48_201007.png
  1. 2020年10月08日 04:58 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS の任意精度固定小数点データ型 ap_fixed 型にソフトウェアから直接データを入力するには?

Vivado HLS 2019.2 で合成した IP を Vivado で使ったが動作しなかった1(Vivado HLS 編 1)”の Vivado HLS 2019.2 でハードウェアにする ap_ufixed<8, 0, AP_TRN_ZERO, AP_SAT> in[784] の AXI4 Master のポートに入力するデータを”Vivado HLS 2019.2 で合成した IP を Vivado で使ったが動作しなかった8(動作しました)”で、uint8_t で定義された配列から入力した。
これは、任意精度固定小数点データ型の方が、2 新数の小数点位置を変更したものだったからだ。つまり、ap_ufixed<8, 0, AP_TRN_ZERO, AP_SAT> は uint8_t の小数点位置を 8 ビット左に移動したものだ。つまり、uint8_t の 0x01 は ap_ufixed<8, 0, AP_TRN_ZERO, AP_SAT> では、0.00390625 となる。そこで、 ap_ufixed<8, 0, AP_TRN_ZERO, AP_SAT> in[784] の AXI4 Master のポートに入力するデータを用意する場合は、uint8_t の配列を渡せばよい。uint8_t が 1/256 倍になっているのだが。。。
どうして、こういうことをするかというと、ソフトウェアには ap_ufixed<8, 0, AP_TRN_ZERO, AP_SAT> データ型が無いから、この型を使えないからだ。

それでは、符号なしの場合はこれで良いが、符号ありの場合の int8_t でデータを渡すための ap_fixed の型は何だろう?ということでやってみた。
それは、ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> だった。なお、ここでは、 AP_TRN_ZERO, AP_SAT は意味がない。 8, 1 が重要だ。
初めは、ap_fixed<8, 0, AP_TRN_ZERO, AP_SAT> かと思ったのだが、int8_t は 127 ~ -128 なので、正と負の値を取る。正の値の範囲は符号なしに比べて半分なので、整数値を符号として 1 ビット取る必要があるようだ。つまり、ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> のステップは 2 ^ -7 = 0.0078125 となる。
それでは、Vviado HLS で確かめてみよう。

AXI4 Master で 2 倍にする IP の DMA_multi2_ap_fixed プロジェクトを作る。

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

// DMA_multi2_ap_fixed.cpp
// 2020/10/06 by marsee
//

#include <ap_fixed.h>

int DMA_multi2_ap_fixed(ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> *in, ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> *out){
#pragma HLS INTERFACE m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE m_axi depth=10 port=in offset=slave
#pragma HLS INTERFACE s_axilite port=return

    for (int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> temp = in[i];
        out[i] = temp + temp;
    }

    return(0);
}


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

// DMA_multi2_ap_fixed_tb.cpp
// 2020/10/06 by marsee
//

#include <iostream>
#include <ap_fixed.h>

int DMA_multi2_ap_fixed(ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> *in, ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> *out);

int main(){
 ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> data[10] = {0, 0.0078125, 0.015625, 0.0234375, 0.03125, 0.0390625, 0.046875, 0.0546875, 0.5, -0.5};
 ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> result[10];

 DMA_multi2_ap_fixed(data, result);

    for(int i=0; i<10; i++){
        std::cout << "data[" << i << "]= " << data[i] <<
                ", result[" << i << "] = " <<
                result[i] << std::endl;
    }
}


Vivado HLS 2019.2 で DMA_multi2_ap_fixed プロジェクトを作成した。
DMA_multi2_ap_fixed_1_201007.png

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

ログを示す。

data[0]= 0, result[0] = 0
data[1]= 0.0078125, result[1] = 0.015625
data[2]= 0.015625, result[2] = 0.03125
data[3]= 0.0234375, result[3] = 0.046875
data[4]= 0.03125, result[4] = 0.0625
data[5]= 0.0390625, result[5] = 0.078125
data[6]= 0.046875, result[6] = 0.09375
data[7]= 0.0546875, result[7] = 0.109375
data[8]= 0.5, result[8] = 0.992188
data[9]= -0.5, result[9] = -1


-0.5 の 2 倍は -1 だが、0.5 の 2 倍は丸められて、0.992188 になっている。
-0.5 は 2 の補数で 0xC0、0.5 は 0x40 、-1 は 0x80、0.992188 は 0x7F のはずだ。

C コードの合成を行った。レポートを示す。
DMA_multi2_ap_fixed_3_201007.png

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

最後の 2 倍の値が 80 と 7f になっているのが分かるだろうか?
ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> に入れるには、1/256 倍になった int8_t の値を入れれば良いようだ。

今回は、ap_ufixed の場合は 0 ~ 255 を 0 ~ 0.99609375 に割り当てた数(つまり正規化してある)について、ap_fixed の場合は -128 ~ +127 を -1 ~ +0.9921875 に割り当てた数についてやってみたが、8 ビット長の数については倍率が違っても、同じこととなる。符号なしで 0 ~ 1.9921875 や符号付で -2 ~ 1.984375 など。
また、uint16_t, int16_t, uint32_t, int32_t についてもレンジが違うが同じように扱うことができる。

(2020/12/25:追記)
ADXL355、3軸加速度センサーのリセット端子が無いか探していたが、0x2F番地に0x52を書くとリセットされる。
ただし、次の動作には待ち時間が必要、今のところ、1 msのWaitを入れてある。

acc_sensor_init(axi_iic_ad);

acc_sensor_write(axi_iic_ad, 0x3a, 0x2f, 0x52); // Reset
usleep(1000);
acc_sensor_write(axi_iic_ad, 0x3a, 0x2c, 0x82); // I2C speed is Hi speed, +-4g

  1. 2020年10月07日 05:00 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS で AXI4 Master を使用したときのビット幅2(いろいろなビット幅)

Vivado HLS で AXI4 Master を使用したときのビット幅1(128 ビットの例)”の続き。

Vivado HLS で AXI4 Master を使用したときに、32ビット幅以外の時はどのような実装になるかを調べてみたということで、前回は、128 ビット幅の例を試してみた。今回は、いろいろなビット幅を試してみよう。

まず、ビット幅がどこまで合成できるか?だが、まずは、AXI4 Master のビット幅が 512 ビットの場合をやってみよう。
DMA_pow2_XX_6_201005.png

これは、合成できたのだが、ZYBO Z7-10 では、DSP48E が 617 % と大幅にリソースをオーバーしている。
DMA_pow2_XX_7_201005.png

次に、、AXI4 Master のビット幅が 1024 ビットの場合をやってみた。
エラーになってしまったので、512 ビット幅までのようだ。
DMA_pow2_XX_8_201005.png

次に中途半端なビット幅ということで、127 ビット幅の場合をやってみた。
これは、

ERROR: [XFORM 203-801] Interface parameter bitwidth 'in.V' (DMA_pow2_XX/DMA_pow2_XX.cpp:9:1) must be a multiple of 8 for AXI4 master port.

でエラーになってしまう。
DMA_pow2_XX_9_201005.png

それじゃということで、120 ビット幅にしてみよう。これだと 8 の倍数だ。
これも、

ERROR: [XFORM 203-801] Bitwidth of (packed) data on axi master must be power of 2: Found 'in.V' (DMA_pow2_XX/DMA_pow2_XX.cpp:9:1) (packed) has a bitwidth of 120.

というエラーになった。
DMA_pow2_XX_10_201005.png

2 の n 乗ということで、それは、そうだよね。
それじゃ、ビット幅 8 は?ということで、8 ビット幅でやってみた。
DMA_pow2_XX_11_201005.png

これは合成できた。
DMA_pow2_XX_12_201005.png

合成された VHDL ファイルの entity 部分を引用する。

entity DMA_pow2_XX is
generic (
    C_M_AXI_GMEM_ADDR_WIDTH : INTEGER := 32;
    C_M_AXI_GMEM_ID_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_AWUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_DATA_WIDTH : INTEGER := 32;
    C_M_AXI_GMEM_WUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_ARUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_RUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_BUSER_WIDTH : INTEGER := 1;
    C_S_AXI_AXILITES_ADDR_WIDTH : INTEGER := 6;
    C_S_AXI_AXILITES_DATA_WIDTH : INTEGER := 32;
    C_M_AXI_GMEM_USER_VALUE : INTEGER := 0;
    C_M_AXI_GMEM_PROT_VALUE : INTEGER := 0;
    C_M_AXI_GMEM_CACHE_VALUE : INTEGER := 3 );
port (
    ap_clk : IN STD_LOGIC;
    ap_rst_n : IN STD_LOGIC;
    m_axi_gmem_AWVALID : OUT STD_LOGIC;
    m_axi_gmem_AWREADY : IN STD_LOGIC;
    m_axi_gmem_AWADDR : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ADDR_WIDTH-1 downto 0);
    m_axi_gmem_AWID : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_AWLEN : OUT STD_LOGIC_VECTOR (7 downto 0);
    m_axi_gmem_AWSIZE : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_AWBURST : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_AWLOCK : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_AWCACHE : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_AWPROT : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_AWQOS : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_AWREGION : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_AWUSER : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_AWUSER_WIDTH-1 downto 0);
    m_axi_gmem_WVALID : OUT STD_LOGIC;
    m_axi_gmem_WREADY : IN STD_LOGIC;
    m_axi_gmem_WDATA : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_DATA_WIDTH-1 downto 0);
    m_axi_gmem_WSTRB : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_DATA_WIDTH/8-1 downto 0);
    m_axi_gmem_WLAST : OUT STD_LOGIC;
    m_axi_gmem_WID : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_WUSER : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_WUSER_WIDTH-1 downto 0);
    m_axi_gmem_ARVALID : OUT STD_LOGIC;
    m_axi_gmem_ARREADY : IN STD_LOGIC;
    m_axi_gmem_ARADDR : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ADDR_WIDTH-1 downto 0);
    m_axi_gmem_ARID : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_ARLEN : OUT STD_LOGIC_VECTOR (7 downto 0);
    m_axi_gmem_ARSIZE : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_ARBURST : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_ARLOCK : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_ARCACHE : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_ARPROT : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_ARQOS : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_ARREGION : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_ARUSER : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ARUSER_WIDTH-1 downto 0);
    m_axi_gmem_RVALID : IN STD_LOGIC;
    m_axi_gmem_RREADY : OUT STD_LOGIC;
    m_axi_gmem_RDATA : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_DATA_WIDTH-1 downto 0);
    m_axi_gmem_RLAST : IN STD_LOGIC;
    m_axi_gmem_RID : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_RUSER : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_RUSER_WIDTH-1 downto 0);
    m_axi_gmem_RRESP : IN STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_BVALID : IN STD_LOGIC;
    m_axi_gmem_BREADY : OUT STD_LOGIC;
    m_axi_gmem_BRESP : IN STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_BID : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_BUSER : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_BUSER_WIDTH-1 downto 0);
    s_axi_AXILiteS_AWVALID : IN STD_LOGIC;
    s_axi_AXILiteS_AWREADY : OUT STD_LOGIC;
    s_axi_AXILiteS_AWADDR : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_ADDR_WIDTH-1 downto 0);
    s_axi_AXILiteS_WVALID : IN STD_LOGIC;
    s_axi_AXILiteS_WREADY : OUT STD_LOGIC;
    s_axi_AXILiteS_WDATA : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_DATA_WIDTH-1 downto 0);
    s_axi_AXILiteS_WSTRB : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_DATA_WIDTH/8-1 downto 0);
    s_axi_AXILiteS_ARVALID : IN STD_LOGIC;
    s_axi_AXILiteS_ARREADY : OUT STD_LOGIC;
    s_axi_AXILiteS_ARADDR : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_ADDR_WIDTH-1 downto 0);
    s_axi_AXILiteS_RVALID : OUT STD_LOGIC;
    s_axi_AXILiteS_RREADY : IN STD_LOGIC;
    s_axi_AXILiteS_RDATA : OUT STD_LOGIC_VECTOR (C_S_AXI_AXILITES_DATA_WIDTH-1 downto 0);
    s_axi_AXILiteS_RRESP : OUT STD_LOGIC_VECTOR (1 downto 0);
    s_axi_AXILiteS_BVALID : OUT STD_LOGIC;
    s_axi_AXILiteS_BREADY : IN STD_LOGIC;
    s_axi_AXILiteS_BRESP : OUT STD_LOGIC_VECTOR (1 downto 0);
    interrupt : OUT STD_LOGIC );
end;


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

32 ビット幅の AXI4 インターフェースで 4 個の 8 ビット幅データを一度に転送している。
16ビット幅の場合も 32 ビット幅の AXI4 インターフェースで 2 個の 16 ビット幅データを一度に転送している。
AXI4 Master は 32 ビット幅が最小のようだ。
  1. 2020年10月06日 03:24 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS で AXI4 Master を使用したときのビット幅1(128 ビットの例)

Vivado HLS で AXI4 Master を使用したときに、32ビット幅以外の時はどのような実装になるかを調べてみた。
使用するプロジェクトは DMA_pow2_XX プロジェクトだ。
これは、AXI4 Master にする引数を ap_int で書いてあって、いろいろなデータ幅にすることができる。

初めに 128 ビットのデータ幅にしてみよう。
DMA_pow2_XX.h を示す。

// DMA_pow2_XX.h
// 2020/09/25 by marsee
//

#ifndef __DMA_POW2_XX_H__
#define __DMA_POW2_XX_H__

#define BIT_LEN 128

#endif


DMA_pow2_XX.cpp を示す。

// DMA_pow2_XX.cpp
// 2020/09/25 by marsee

#include <ap_int.h>
#include "DMA_pow2_XX.h"

int DMA_pow2_XX(volatile ap_int<BIT_LEN> *in, volatile ap_int<BIT_LEN> *out){
#pragma HLS INTERFACE m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE m_axi depth=10 port=in offset=slave
#pragma HLS INTERFACE s_axilite port=return

    for (int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        ap_int<BIT_LEN> temp = in[i];
        out[i] = temp * temp;
    }

    return(0);
}


DMA_pow2_XX_tb.cpp を示す。

// DMA_pow2_XX_tb.cpp
// 2020/09/25 by marsee
//

#include <iostream>
#include <ap_int.h>
#include "DMA_pow2_XX.h"

int DMA_pow2_XX(volatile ap_int<BIT_LEN> *in, volatile ap_int<BIT_LEN> *out);

int main(){
    ap_int<BIT_LEN> data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    ap_int<BIT_LEN> result[10];

    DMA_pow2_XX(data, result);

    for(int i=0; i<10; i++){
        std::cout << "data[" << i << "]= " << data[i] <<
                ", result[" << i << "] = " <<
                result[i] << std::endl;
    }
}


DMA_pow2_XX プロジェクトを示す。
DMA_pow2_XX_3_201005.png

C シミュレーションを行った。出力は問題ない。
DMA_pow2_XX_1_201005.png

C コードの合成を行った。
DMA_pow2_XX_2_201005.png

出力されたトップの VHDL コードの entity 部分を見てみよう。

entity DMA_pow2_XX is
generic (
    C_M_AXI_GMEM_ADDR_WIDTH : INTEGER := 32;
    C_M_AXI_GMEM_ID_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_AWUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_DATA_WIDTH : INTEGER := 128;
    C_M_AXI_GMEM_WUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_ARUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_RUSER_WIDTH : INTEGER := 1;
    C_M_AXI_GMEM_BUSER_WIDTH : INTEGER := 1;
    C_S_AXI_AXILITES_ADDR_WIDTH : INTEGER := 6;
    C_S_AXI_AXILITES_DATA_WIDTH : INTEGER := 32;
    C_M_AXI_GMEM_USER_VALUE : INTEGER := 0;
    C_M_AXI_GMEM_PROT_VALUE : INTEGER := 0;
    C_M_AXI_GMEM_CACHE_VALUE : INTEGER := 3 );
port (
    ap_clk : IN STD_LOGIC;
    ap_rst_n : IN STD_LOGIC;
    m_axi_gmem_AWVALID : OUT STD_LOGIC;
    m_axi_gmem_AWREADY : IN STD_LOGIC;
    m_axi_gmem_AWADDR : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ADDR_WIDTH-1 downto 0);
    m_axi_gmem_AWID : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_AWLEN : OUT STD_LOGIC_VECTOR (7 downto 0);
    m_axi_gmem_AWSIZE : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_AWBURST : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_AWLOCK : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_AWCACHE : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_AWPROT : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_AWQOS : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_AWREGION : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_AWUSER : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_AWUSER_WIDTH-1 downto 0);
    m_axi_gmem_WVALID : OUT STD_LOGIC;
    m_axi_gmem_WREADY : IN STD_LOGIC;
    m_axi_gmem_WDATA : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_DATA_WIDTH-1 downto 0);
    m_axi_gmem_WSTRB : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_DATA_WIDTH/8-1 downto 0);
    m_axi_gmem_WLAST : OUT STD_LOGIC;
    m_axi_gmem_WID : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_WUSER : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_WUSER_WIDTH-1 downto 0);
    m_axi_gmem_ARVALID : OUT STD_LOGIC;
    m_axi_gmem_ARREADY : IN STD_LOGIC;
    m_axi_gmem_ARADDR : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ADDR_WIDTH-1 downto 0);
    m_axi_gmem_ARID : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_ARLEN : OUT STD_LOGIC_VECTOR (7 downto 0);
    m_axi_gmem_ARSIZE : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_ARBURST : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_ARLOCK : OUT STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_ARCACHE : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_ARPROT : OUT STD_LOGIC_VECTOR (2 downto 0);
    m_axi_gmem_ARQOS : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_ARREGION : OUT STD_LOGIC_VECTOR (3 downto 0);
    m_axi_gmem_ARUSER : OUT STD_LOGIC_VECTOR (C_M_AXI_GMEM_ARUSER_WIDTH-1 downto 0);
    m_axi_gmem_RVALID : IN STD_LOGIC;
    m_axi_gmem_RREADY : OUT STD_LOGIC;
    m_axi_gmem_RDATA : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_DATA_WIDTH-1 downto 0);
    m_axi_gmem_RLAST : IN STD_LOGIC;
    m_axi_gmem_RID : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_RUSER : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_RUSER_WIDTH-1 downto 0);
    m_axi_gmem_RRESP : IN STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_BVALID : IN STD_LOGIC;
    m_axi_gmem_BREADY : OUT STD_LOGIC;
    m_axi_gmem_BRESP : IN STD_LOGIC_VECTOR (1 downto 0);
    m_axi_gmem_BID : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_ID_WIDTH-1 downto 0);
    m_axi_gmem_BUSER : IN STD_LOGIC_VECTOR (C_M_AXI_GMEM_BUSER_WIDTH-1 downto 0);
    s_axi_AXILiteS_AWVALID : IN STD_LOGIC;
    s_axi_AXILiteS_AWREADY : OUT STD_LOGIC;
    s_axi_AXILiteS_AWADDR : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_ADDR_WIDTH-1 downto 0);
    s_axi_AXILiteS_WVALID : IN STD_LOGIC;
    s_axi_AXILiteS_WREADY : OUT STD_LOGIC;
    s_axi_AXILiteS_WDATA : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_DATA_WIDTH-1 downto 0);
    s_axi_AXILiteS_WSTRB : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_DATA_WIDTH/8-1 downto 0);
    s_axi_AXILiteS_ARVALID : IN STD_LOGIC;
    s_axi_AXILiteS_ARREADY : OUT STD_LOGIC;
    s_axi_AXILiteS_ARADDR : IN STD_LOGIC_VECTOR (C_S_AXI_AXILITES_ADDR_WIDTH-1 downto 0);
    s_axi_AXILiteS_RVALID : OUT STD_LOGIC;
    s_axi_AXILiteS_RREADY : IN STD_LOGIC;
    s_axi_AXILiteS_RDATA : OUT STD_LOGIC_VECTOR (C_S_AXI_AXILITES_DATA_WIDTH-1 downto 0);
    s_axi_AXILiteS_RRESP : OUT STD_LOGIC_VECTOR (1 downto 0);
    s_axi_AXILiteS_BVALID : OUT STD_LOGIC;
    s_axi_AXILiteS_BREADY : IN STD_LOGIC;
    s_axi_AXILiteS_BRESP : OUT STD_LOGIC_VECTOR (1 downto 0);
    interrupt : OUT STD_LOGIC );
end;


C_M_AXI_GMEM_DATA_WIDTH が 128 ビット幅になっている。

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

C/RTL協調シミュレーションの波形を示す。
RDATA と WDATA が 128 ビットになっているのが分かる。
DMA_pow2_XX_5_201005.png

データ幅が 128 ビットでも問題なく、Vivado HLS 2019.2 で実装できた。
次は、32 ビット幅以下の値を ap_int に書いた場合にどうなるのか?を調べてみたい。
  1. 2020年10月05日 05:17 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる3(手順 2: IP インテグレーター デザインの作成 その2)

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思うということで、前回は”手順 2: IP インテグレーター デザインの作成”を進めていって、axi_uartlite_0 のインスタンスまで終了した。今回は、”手順 2: IP インテグレーター デザインの作成”を更に進めていく。

次は、Board ウインドウの GPIO 8 LEDs を Diagram ウインドウにドラック & ドロップした。
microblaze_tut_22_201002.png

axi_gpio_0 の Auto Connect ダイアログが表示された。OK ボタンをクリックする。
microblaze_tut_23_201002.png

Diagram ウインドウの + ボタンをクリックして、AXI BRAM Controller を Add IP する。
microblaze_tut_24_201002.png

Run Block Automation をクリックする。
microblaze_tut_25_201002.png

microblaze_0 の設定画面が開く。下図の様に設定を行った。
microblaze_tut_26_201002.png

micoblaze_0_local_memory, Processor System Reset, MicroBlaze Debug Module が追加され、それらと MIG 7 Series が配線された。
microblaze_tut_27_201002.png

Run Connection Automation をクリックする。
Run Connection Automation ダイアログが開いた。
All Automation (9 out of 9 selected) のチェックボックスにチェックを入れて、OK ボタンをクリックする。
microblaze_tut_28_201002.png

配線がだいたい完成したが、まだ Run Connection Automation が表示されている。Run Connection Automation をクリックする。
mdm_1 の M_AXI ポートを接続する。
OK ボタンをクリックする。
microblaze_tut_30_201002.png

Run Connection Automation 後のブロックデザインを示す。
microblaze_tut_31_201002.png

microblaze_0_axi_periph IP の M00_AXI インターフェースと axi_gpio_0 IP の S_AXI インターフェースの接続線を選択し、右クリックし、右クリックメニューから Debug を選択する。
microblaze_tut_32_201002.png

Debug を設定すると、Run Connection Automation が表示された。
Run Connection Automation をクリックする。
microblaze_tut_34_201002.png

All Automation にチェックが入っている。
OK ボタンをクリックする。
microblaze_tut_35_201002.png

system_ila が配線され、 Diagram ウインドウの回路が完成した。
microblaze_tut_36_201003.png

Address Editor 画面を示す。
microblaze_tut_37_201003.png
  1. 2020年10月04日 04:27 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる2(手順 2: IP インテグレーター デザインの作成 その1)

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思うということで、前回は、Vivado プロジェクトを作成した。今回は、”手順 2: IP インテグレーター デザインの作成”を行う。

Flow Navigator で IP Integrator -> Create Block Design をクリックする。
Create Block Design ダイアログが表示される。
Design name: に mb_subsystem と入力した。
microblaze_tut_8_201002.png

ブロックデザインが生成された。
Diagram ウインドウで + アイコンをクリックして、Add IP を行う。
”mig”と入力すると、 Memory Interface Generator (MIG 7 Series) が表示されたので、ダブルクリックして、Add IP する。
microblaze_tut_9_201002.png

MIG が Add IP された。
Run Block Automation をクリックする。
microblaze_tut_10_201002.png

Run Block Automation が表示された。
All Automation にチェックを入れて、(デフォルトで入っていたかも?)OK ボタンをクリックする。
microblaze_tut_11_201002.png

Critcal Messages ダイアログが表示された。
OK ボタンをクリックする。
microblaze_tut_12_201002.png

mig_7series_0 がインスタンスされた。
microblaze_tut_13_201002.png

Add IP アイコンをクリックして、MicroBlaze を Add IP する。
microblaze_tut_14_201002.png

microblaze_0 がインスタンスされた。
microblaze_tut_15_201002.png

Board ウインドウを見たが、UG940 の様に DDR3 SDRAM のオレンジ色のマークが表示されていなかった。たぶん、エラーが出たためだろう?
そこで、DDR3 SDRAM を右クリックし右クリックメニューから Auto Connect を選択した。
microblaze_tut_16_201002.png

すると、Auto Connect ダイアログが表示されて、DDR3 SDRAM が mig_7series_0 に接続された。
microblaze_tut_17_201002.png

DDR3 SDRAM にオレンジ色のマークが表示された。これで UG940 と同じになった。
microblaze_tut_18_201002.png

現在の Diagram ウインドウの様子を示す。
microblaze_tut_19_201002.png

Board ウインドウの UART -> USB UART を Diagram ウインドウにドラック & ドロップする。
microblaze_tut_20_201002.png

axi_uartlite_0 がインスタンスされた。
microblaze_tut_21_201002.png
  1. 2020年10月03日 03:46 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0

Nexys Video でMicroBlaze のチュートリアルをやってみる1(Vivado プロジェクトの作成)

Nexys Video を使用して”Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”をやってみようと思う。

まずは、Digilent 社の方からいただいた Nexys Video の写真を示す。
箱から。
microblaze_tut_5_201001.jpg

箱を開けたところ。
microblaze_tut_6_201001.jpg

Nexys Video 基板を示す。
microblaze_tut_7_201001.jpg

HDMI 入出力、ミニ DisplayPort 出力、SDカードも入るし、結構リッチな構成だ。

Vivado Design Suite チュートリアル エンベデッド プロセッサ ハードウェア デザイン UG940 (v2019.2) 2019 年 11 月 26 日”の”第 4 章 演習 3: エンベデッド MicroBlaze プロセ ッサのプログラム”は、Xilinx の FPGA ボードの KC705 用になっているが、これを Nexys Video でやっていこう。

まずは、Vivado 2020.1 を立ち上げた。

Vivado の起動画面で Create Project を選択する。

New Project ダイアログの Project Name 画面で Project name: に MicroBlaze_tut を入力した。
microblaze_tut_1_201001.png

New Project の Default Part 画面まで、デフォルトのまま Next > ボタンをクリックした。

Default Part 画面では、Nexys Video を選択した。ただし、予め、Digilent 社のボード・ファイルをインストールしてある。(”Digilent社のボード・ファイルのインストール”を参照のこと)
microblaze_tut_2_201001.png

New Project Summary 画面が表示された。
microblaze_tut_3_201001.png

MicroBlaze_tut プロジェクトが表示された。
microblaze_tut_4_201001.png
  1. 2020年10月02日 04:57 |
  2. MicroBlaze
  3. | トラックバック:0
  4. | コメント:0