Vitis HLS

Vitis HLS 2019.2 でチュートリアルをやってみた
@Venginner さんのツィートでXilinx/HLS-Tiny-Tutorials を知った。てっきりVivado HLS 2019.2 のチュートリアルかと思ったら、そこに、なんと、コマンドとして、vitis_hls -f run_hls.tcl が書いてあった。え〜〜〜、Vitis HLS というツールがあるか。。。と気がついたのでやってみた。

Vitis HLS 2020.1 のフォントを変更した
Vitis HLS 2020.1 を起動してプロジェクトを作成して、ファイルを書いたら、フォントが小さすぎて、爺さんには見えなかった。それで、フォントを大きくすることにした。

Vitis HLS 2020.1 を使用して IP を作り、Vivado 2020.1 で実装してみよう1(Vitis HLS 編)
Vitis HLS 2020.1 を使用して IP を作り、Vivado 2020.1 で実装してみたいということで、正式リリースされた Vitis HLS 2020.1 を使って IP を作ってみることにした。

Vitis 2020.1 の Theme を Dark から Light に変更した
Vitis HLS は画面が黒い。これこれでかっこ良いのだが、Vitis HLS のセミナ資料を作って印刷する時に画面が黒いと多量のインクを消費して、しかもインクジェット・プリンタで印刷すると紙がしなしなになる。(多量のインクが噴射されるか ら)そこで、テーマをDark から Light に変更した。
Vitis HLS 2020.1 を使用して IP を作り、Vivado 2020.1 で実装してみよう2(Vivado 編)
Vitis HLS 2020.1 を使用して IP を作り、Vivado 2020.1 で実装してみたいということで、正式リリースされた Vitis HLS 2020.1 を使って IP を作ってみることにしたということで、前回は、Ubuntu 18.04 の Vitis HLS 2020.1 でAXI4 Lite インターフェースの乗算 IP を作った。今回は、Vivado 20202.1 を使用して、前回作った乗算 IP を使用して、プロジェクトを作成しよう。Export Hardware Platform が前のバージョンから変更があったので、2 種類試してみた。
Vitis HLS 2020.1 を使用して IP を作り、Vivado 2020.1 で実装してみよう3(Vitis 編)
Vitis HLS 2020.1 を使用して IP を作り、Vivado 2020.1 で実装してみたいということで、正式リリースされた Vitis HLS 2020.1 を使って IP を作ってみることにしたということで、前回は、前々回作った乗算 IP を使用して、プロジェクトを作成し、Export Hardware Platform が前のバージョンから変更があったので、2 種類試してみた。今回は、前回作成した XSA ファイルを使用して、Vitis 2020.1 でアプリケーション・プロジェクトを作ってビルドし、ZYBO Z7-10 で動作を確認しよう。更に現在は Ubuntu 18.04 上でやっているが、Windows 10 上の Vitis HLS 2020.1, Vivado 2020.1, Vitis 2020.1 だとエンベデッド・プラットフォームを作成するところでエラーが出てしまった。

Vitis HLS 2020.1 の C/RTL 協調シミュレーション時の新機能1(Wave Debug)
Vitis HLS 2020.1 の C/RTL 協調シミュレーション時に新しい機能が 3 つある。その内の Wave Debug (Vivado XSIM only) を試してみよう。

Vitis HLS 2020.1 で all_layers_template を IP にする1(C シミュレーション、C コードの合成)
Vitis HLS 2020.1 を使用して、白線走行用CNN の all_layers_template を実装してみよう。 all_layers_template は縦 10 ピクセル x 横 56 ピクセルの白線画像を使用して、右に行くか、直進するか、左に行くかの 3 つの走行状態を出力する畳み込みニューラルネットワークだ。今回は、デバックしながら C シミュレーション、C コードの合成を行った。
Vitis HLS 2020.1 で all_layers_template を IP にする2(合成レポートの確認)
Vitis HLS 2020.1 を使用して、白線走行用CNN の all_layers_template を実装してみよう。 all_layers_template は縦 10 ピクセル x 横 56 ピクセルの白線画像を使用して、右に行くか、直進するか、左に行くかの 3 つの走行状態を出力する畳み込みニューラルネットワークだ。ということで、前回は、デバックしながら C シミュレーション、C コードの合成を行った。今回は、C コードの合成レポートを見ていこう。更に、Export RTL を行って、Vitis HLS の合成結果を Vivado の Place & Route で検証した。
Vitis HLS 2020.1 で all_layers_template を IP にする3(C/RTL 協調シミュレーション)
Vitis HLS 2020.1 を使用して、白線走行用CNN の all_layers_template を実装してみよう。 all_layers_template は縦 10 ピクセル x 横 56 ピクセルの白線画像を使用して、右に行くか、直進するか、左に行くかの 3 つの走行状態を出力する畳み込みニューラルネットワークだ。ということで、前回は、C コードの合成レポートを見ていこう。更に、Export RTL を行って、Vitis HLS の合成結果を Vivado の Place & Route で検証した。今回は、C/RTL 協調シミュレーションと Dataflow Viewer を見ていこう。

Vitis HLS 2020.1 で”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)”をやってみる
Vivado HLS では悩まされた large runtime and excessive memory のエラーが Vitis HLS 2020.1 では改善されているか?を確認してみる。
”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)”を Vitis HLS 2020.1 でやってみることにした。結果はやはり、同様に large runtime and excessive memory のエラーがでる。

Vitis HLS 2020.1 と Vivado HLS 2019.2 の違い(AXI4 Master インターフェースでの offset=slave オプション時の扱いの違い)
”Vitis 2020.1 で ultra96v2_min2_201 アクセラレーション・プラットフォームを使用した自作アプリケーション・プロジェクトが動作しない原因がわかった”で Vitis 2020.1 と Vitis 2019.2 のカーネル・コードの書き方が違っていることが分かった。これはつまり、Vitis HLS 2020.1 と Vivado HLS 2019.2 の書き方が違っているということになる。そこで、 Vitis HLS 2020.1 と Vivado HLS 2019.2 で同じコードを実装してみようと思う。
Vitis HLS では INTERFACE 指示子の m_axi オプションで AXI4 Master インターフェースを実装した時に、 offset=slave でオフセット・アドレスをレジスタマップする時は、その引数に AXI4 Lite Slave インターフェースの指示子、 INTERFACE 指示子の s_axilite オプションも付加する必要がある。

Vitis HLS 2020.1 の Pre-synthesis Control Flow Viewer 機能
Vitis HLS 2020.1 の Pre-synthesis Control Flow Viewer 機能について見て行こう。
Pre-synthesis Control Flow Viewer 機能は、 C シミュレーション時に C Simulation Dialog で Enable Pre-synthesis Control Flow Viewer をチェックすることにより使用することができる。

Vivado HLS 2020.1 vs Vitis HLS 2020.1 (プロジェクトの作成)
現在、Vivado HLS のセミナを大学で、hdlab さんでは、一般向けの Vivado HLS セミナを行っている。(ちなみに、この 2 つは内容が違います)
しかし、いずれは Vitis HLS に移行する必要があると思う。よって、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較することにした。なお、使用している OS は Ubuntu 18.04 だ。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 (C シミュレーション、C コードの合成)
Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較することにした。ということで、前回は、プロジェクトの作成までの違いを探っていたが、あまり違いは見られなかった。今回は、C シミュレーションと C コードの合成をやってみよう。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 その3 (C/RTL 協調シミュレーション、Export RTL)
簡単な乗算回路で、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較することにした。ということで、前回は C シミュレーションと C コードの合成をやってみることにした。今回は、 C/RTL 協調シミュレーションと Export RTL をやっていこう。

Vitis HLS 2020.1 の C/RTL 協調シミュレーション時の新機能2(Random Stall)
前回は、Vitis HLS 2020.1 の新機能の内の Wave Debug を紹介した。今回は、Random Stall を紹介する。
Random Stall は UVM のランダム検証(UVM 知らないので、良く分からないが)を使っているらしい? UVM のメッセージが出てくる。機能としては、データ転送中に適当に Wait を入れて、データ転送が正しいかどうか?を確認しているようだ?

Vivado HLS 2020.1 vs Vitis HLS 2020.1 その4 (AXI4 Lite インターフェースの Slave 機能)
簡単な乗算回路で、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較することにした。ということで、前回は C/RTL 協調シミュレーションと Export RTL を比較した。今回は、AXI4 Lite インターフェースの Slave 機能を比較してみよう。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 その4 (AXI4 Lite インターフェースの Slave 機能)の動作を確認する
簡単な乗算回路で、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較するということで、前回は、AXI4 Lite インターフェースの Slave 機能で比較したのだったが、Export RTL の機能で、リソース使用量が DSP 1 個のみになってしまった。Vivado HLS 2019.2 で同様にやってみたが、FF や LUT を使っていた。そこで、今回は 前回、Vitis HLS 2020.1 で作成した 乗算 IP を使用して、Vivado で回路を作成し、動作させてみた。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 その5 (AXI4 インターフェースの Master 機能1)
前回は、AXI4 インターフェースの Slave 機能の簡単な乗算回路を使って、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較した。今回は、AXI4 インターフェースの Master 機能の 2 乗回路を使用して、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較する。今回の行うのは C シミュレーションと C コードの合成だ。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 その6 (AXI4 インターフェースの Master 機能2)
AXI4 インターフェースの Master 機能の 2 乗回路を使用して、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較する。
前回は、 C シミュレーションと C コードの合成を行った。今回は、C/RTL 協調シミュレーションと Export RTL を行う。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 その7 (AXI4-Stream インターフェース 1)
前回は、AXI4 インターフェースの Master 機能の 2 乗回路を使用して、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較する、ということで、、C/RTL 協調シミュレーションと Export RTL を行った。今回は、AXI4-Stream インターフェース機能の 2 乗回路を使って、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較する。今回は、 C シミュレーションと C コードの合成を行う。
Vivado HLS 2020.1 vs Vitis HLS 2020.1 その8 (AXI4-Stream インターフェース 2)
XI4-Stream インターフェース機能の 2 乗回路を使って、Vitis HLS 2020.1 と Vivado HLS 2020.1 を比較するということで、前回は、C シミュレーションと C コードの合成を行った。今回は、C/RTL 協調シミュレーションと Export RTL を行う。

Vitis HLS で C シミュレーションは動作するが C/RTL 協調シミュレーションが終了しない
Akira's Study Room さんの”Vivado_HLSのcsimは動作するけどcosimが終了しない場合の原因と対処方法”を読んで、私もそういう場面に遭遇しているということで、Vitis HLS で C シミュレーションは動作するが C/RTL 協調シミュレーションが終了しない状況を書いておくことにした。
Vivado HLS に続き、Vitis HLS 2020.1 でもハードウェア化するコードで、出力するコードをスキップすると C/RTL 協調シミュレーションが終了しないようだ。

WSL2 上で動作する Vitis HLS 2020.1 の C シミュレーション時のエラー解消
WSL2 上で動作する Vitis HLS 2020.1 の C シミュレーション時に 2 つエラーが出てしまったので、その解消方法を書いておく。
sudo apt install libc6-dev-i386
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu

Adam Taylor さんの”MicroZed Chronicles: Using Analysis View in Vitis and Vivado”をやってみる1
Adam Taylor さんの”MicroZed Chronicles: Using Analysis View in Vitis and Vivado”が気になったので、自分でもやってみることにした。
Adam Taylor さんの”MicroZed Chronicles: Using Analysis View in Vitis and Vivado”をやってみる2
Adam Taylor さんの”MicroZed Chronicles: Using Analysis View in Vitis and Vivado”が気になったので、自分でもやってみることにしたということで、前回はソースコードを貼って、Vitis HLS 2020.1 と Vivado HLS 2020.1 のプロジェクトを作成し、C シミュレーションを行った。今回は、 *raw_line の定義が volatile ap_uint<1> の時の C コードの合成、Analysis 画面を確認、C/RTL 協調シミュレーション、C/RTL 協調シミュレーションの波形の確認を行う。
Adam Taylor さんの”MicroZed Chronicles: Using Analysis View in Vitis and Vivado”をやってみる3
前回は *raw_line の定義が volatile ap_uint<1> の時の C コードの合成、Analysis 画面を確認、C/RTL 協調シミュレーション、C/RTL 協調シミュレーションの波形の確認を行った。今回は、 *raw_line の定義が volatile bool の時の C コードの合成、Analysis 画面を確認、C/RTL 協調シミュレーション、C/RTL 協調シミュレーションの波形の確認を行う。

Vitis HLS 2020.2 を使ってみる1
Vivado 2020.2 が出たので、Vitis HLS 2020.2 も使ってみよう。
”Vivado HLS 2020.1 vs Vitis HLS 2020.1 (プロジェクトの作成)”で使用した multi_apuint.cpp を例に見ていこう。
Vitis HLS 2020.2 を使ってみる2
前回は、”Vivado HLS 2020.1 vs Vitis HLS 2020.1 (プロジェクトの作成)”で使用した multi_apuint.cpp を例にやってみた。今回は、 AXI4 Master インターフェースのラプラシアン・フィルタを題材に Vitis HLS 2020.1 と Vitis_HLS 2020.2 を比較しよう。
Vitis HLS 2020.2 を使ってみる3
前回は、 AXI4 Master インターフェースのラプラシアン・フィルタを題材に Vitis HLS 2020.1 と Vitis_HLS 2020.2 を比較した。今回は、C シミュレーションや C/RTL 協調シミュレーションのオプションをチェックしてみよう。

”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る”を Vitis HLS 2020.2 でやってみる
前にやった時に”large runtime and excessive memory usage”でうまく行かなかった”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る”を Vitis HLS 2020.2 で、もう一度やってみよう。

Watchdog timer を Vitis HLS 2020.1 で実装する1(Vitis HLS 2020.1)
”GPS と 3軸加速度センサーを使ったシステム5(Vivado 2020.1 のプロジェクトを作成中)”(現在は、3軸加速度センサーが 9 個付くようになっている)に Watchdog Timer を実装することにした。そこで、Vitis HLS 2020.1 で Watchdog Timer を作成することにした。

Vitis HLS 2020.2 で hls::stream の ap_axiu , ap_axis データタイプが AXI4-Stream ポートでしか使用できない
ちょっとタイトルが長くなってしまったが、今まで、Vivado HLS で複数の関数を並列に実行させるのに、 hls::stream<ap_axiu<32,1,1,1> >& axis_out と言うように、hls::stream の ap_axis, ap_axiu データイプのポートを使用してきたが、これは、Vitis HLS 2020.2 では使用できないようだ。当然ながら、外部への AXI4-Stream 入出力としては使用できるが、内部のポートとしてはエラーになってしまう。

AXI4-Stream インターフェース用 INTERFACE 指示子の register_mode オプション
Vivado HLS で使ってきた AXI4-Stream インターフェース用の指示子のオプションが Vitis HLS で変更になったので、覚書を書いておく。

調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する1
調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにした。
Xilinx 社のUART IP として AXI Uartlite があるが、これはボーレートを自分で自由に決めることができない。
PIC マイコンで生成された調歩同期方式シリアル通信データをなるべく高速に受けたいというモチベーションがあるのだが、どうもいつも使っているボーレートにすることが難しいの で、任意にボーレートを決定したいためだ。今回は、500kbps のボーレートで通信したい。
今回は、96 MHz のクロックを使用して、それを 12 分周すると 8 MHz になって、ちょうど 500 kHz x 16 となる。つまり、12 分周 x 16 分周でやってみよう。
uart_rx のソースコード、テストベンチと Vitis HLS のプロジェクトを作成した。
調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する2
調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにしたということで、前回は、ソースコードをブログに貼って、Vitis HLS 2020.2 の uart_rx プロジェクトを作成した。今回は、uart_rx プロジェクトで C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行って、uart_rx IP を作成しよう。
調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する3
前回は、uart_rx プロジェクトで C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行って、uart_rx IP を作成した。今回は、Vivado 2020.2 の uart_rx プロジェクトを作成し、合成された uart_rx の Verilog HDL ファイルをコピーし、SystemVerilog のテストベンチファイルを作成して、Vivado 上でシミュレーションしてみよう。

uart_rx を使用して 3 軸加速度センサー用のデータを作成する uart_rx_axi4ls IP の作成1
調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにしたということで、前回は、Vivado 2020.2 の uart_rx プロジェクトを作成し、合成された uart_rx の Verilog HDL ファイルをコピーし、SystemVerilog のテストベンチファイルを作成して、Vivado 上でシミュレーションして、問題なく動作しそうだということが分かった。今度は、その uart_rx の後段で 3 軸加速度センサー用のデータを作成する IP である uart_rx_axi4ls IP を作成していこう。
uart_rx_axi4ls のソースコード、テストベンチと Vitis HLS のプロジェクトを作成した。
uart_rx を使用して 3 軸加速度センサー用のデータを作成する uart_rx_axi4ls IP の作成2
uart_rx の後段で 3 軸加速度センサー用のデータを作成する IP である uart_rx_axi4ls IP を作成していこうということで、前回は、ソースコードとテストベンチのコードを貼って、 Vitis HLS 2020.2 の uart_rx_axi4ls プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、 C/RTL 協調シミュレーション、Export RTL を行う。

調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する1
調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。残りっている調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しよう。
今回は、 uart_tx のソースコードとテストベンチ・コードを貼っておく。
調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する2
調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。今回は、調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しようとうことで、前回は、uart_tx のソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の uart_tx プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行っていこう。
調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する3
今回は、調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しようということで、前回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、ブロックレベルのインターフェースを s_axilite にしてみようと思う。

Windows 10 版の Vitis HLS 2020.2 で作成した AXI4Lite インターフェースの IP を使用した回路は Vitis 2020.2 でプラットフォームがビルドできない
Windows 10 で Vitis HLS 2020.2 のAXI4Lite インターフェースを使用した IP を使用した Vivado 2020.2 のプロジェクトを論理合成、インプリメンテーション、ビットストリームの生成をした。ハードウェアをエクスポートして、Vitis 2020.2 で XSA ファイルを元にプラットフォームを作って、ビルドしたらエラーになってしまった。これは Vitis HLS 2020.2 のAXI4Lite インターフェースを使用した IP を使用した複数の Vivado 2020.2 のプロジェクトで起こるようだ。バグじゃないだろうか? なお、このバグは Windows 版の Vitis HLS 2020.2 だけで発生して、Linux 版の Vitis HLS 2020.2 では発生しない。

Xilinx Vitis HLS LLVM 2020.2 をやってみる1
Xilinx は Vitis HLS のフロントエンドをオープンソースとして GitHub 上で公開することになったそうだ。その Vitis HLS の GitHub が”Xilinx Vitis HLS LLVM 2020.2”なので、それをやってみることにした。
Xilinx Vitis HLS LLVM 2020.2 をやってみる2
前回は、HLS/llvm ディレクトリでビルドすると、hls-build ディレクトリが生成された。今回は、HLS/plugins ディレクトリ以下の 2 つのプラグインをビルドしてみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる3
前回は、HLS/plugins ディレクトリ以下の 2 つのプラグインをビルドした。今回は、HLS/vitis_hls_examples/ ディレクトリの override_llvm_flow_demo をやってみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる4
前回は、HLS/vitis_hls_examples/ ディレクトリの override_llvm_flow_demo をやってみた。ここでは、VitisHLS内でローカルLLVMビルドを使用してソースコードを合成した。今回は、HLS/vitis_hls_examples /override_opt_flow_demo をやってみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる5
前回は、HLS/vitis_hls_examples /override_opt_flow_demo をやってみた。今回は、HLS/vitis_​​hls_examples/plugin_analyze_rename_flow_demo をやってみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる6
前回は、HLS/vitis_​​ hls_examples/plugin_analyze_rename_flow_demo をやってみた。今回は、HLS/vitis_​​hls_examples/plugin_auto_array_partition_flow_demo/ をやってみて、自動 array_partition を体験してみたい。
Xilinx Vitis HLS LLVM 2020.2 をやってみる7
前回は、HLS/vitis_​​ hls_examples/plugin_auto_array_partition_flow_demo/ をやってみて、自動 array_partition を体験した。今回は、 plugin_auto_array_partition_flow_demo の結果と、通常の Vitis HLS 2020.2 の結果を比較してみよう。そして、手動で ARRAY PARTITION 指示子を追加した結果と plugin_auto_array_partition_flow_demo の結果を比較してみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる8
前回は、plugin_auto_array_partition_flow_demo の結果と、通常の Vitis HLS 2020.2 の結果を比較した。そして、手動で ARRAY PARTITION 指示子を追加した結果と plugin_auto_array_partition_flow_demo の結果を比較した。今回は、以前実装した ””IMX219 MIPI sensor to Ultra96-V2 FPGA DisplayPort”にラプラシアン・フィルタを追加する1”の lap_filter_axis_RBG10 を使用して plugin_auto_array_partition_flow_demo のスキームでどのような結果になるか?を検証してみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる9
前回は、以前実装した ””IMX219 MIPI sensor to Ultra96-V2 FPGA DisplayPort”にラプラシアン・フィルタを追加する1”の lap_filter_axis_RBG10 を使用して plugin_auto_array_partition_flow_demo のスキームでどのような結果になるか?を検証したところ、array partition 指示子を入れたのと同等の性能だった。今回は、HLS/vitis_hls_examples/slxplugin_loopinterchange_demo/ をやってみよう。
Xilinx Vitis HLS LLVM 2020.2 をやってみる10
前回は、HLS/vitis_hls_examples /slxplugin_loopinterchange_demo/ をやってみた。今回は、HLS/vitis_hls_examples/slxplugin_loopinterchange_demo/ のスキームを使って、lap_filter_axis_RBG10.cpp を合成してみよう。


Vitis HLS 2020.2 で DMA2axis IP を作る1
”Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4”で作った bitmap_disp_cont_axis IP を実機でテストするために DMA to axis 変換 IP を作る必要があるので、作成する。
Vitis HLS 2020.2 で DMA2axis IP を作る2
前回は、ソースコードとテストベンチ、そして Vitis HLS 2020.2 の DMA2axis プロジェクトを紹介した。今回は、 C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

AXI4-Stream 出力 xf_8uc3_2axis IP を Vitis HLS 2020.2 で作成する1
”AXI4-Stream の IP を使用して Vitis Vision Library で加工されたデータをディスプレイに表示する1(構想編)”で構想したように、DMA Write 出力 xf_8uc3_2rgb IP を AXI4-Stream 出力 xf_8uc3_2axis IP に変更したい。
そこで、今回は、AXI4-Stream 出力 xf_8uc3_2axis IP を作成しよう。
AXI4-Stream 出力 xf_8uc3_2axis IP を Vitis HLS 2020.2 で作成する2
AXI4-Stream 出力の xf_8uc3_2axis IP を作成するということで、前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の xf_8uc3_2axis プロジェクトを作成した。今回は、C シミュレーション、 C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。
AXI4-Stream 出力 xf_8uc3_2axis IP を Vitis HLS 2020.2 で作成する3
AXI4-Stream 出力の xf_8uc3_2axis IP を作成するということで、前回は、Vitis HLS 2020.2 の xf_8uc3_2axis プロジェクトで、C シミュレーション、 C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、どうしても DSP を 20 個も使っているのが気に入らないので、浮動小数点数演算を任意精度固定小数点演算に変更する。

Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する2(axis2xf8uc3 IP その1)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみようということで、前回は、構想を練った。今回は、図のうちで axis2xf8uc3 IP を Vitis HLS 2020.2 で作成する。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する3(axis2xf8uc3 IP その2)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみようということで、前回は、 axis2xf8uc3 IP のソースコードとテストベンチ・ファイルを貼った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行ったが、単発転送になっていたので、もう一度作り直すことになった。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する4(axis2xf8uc3 IP その3)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみようということで、前回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行ったが、単発転送になっていたので、もう一度作り直すことになった。今回はソースコードを修正して、もう一度、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する5(random_nise_gen その1)
前回は、AXI4-Stream の画像データを XF8UC3(CV8UC3) に変換する IP を作成できた。今回は、”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する1(構想編)”の図に示してあるランダムノイズ発生器(random_noise_gen)を作成す る。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する6(random_nise_gen その2)
前回は、”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する1(構想編)”の図に示してあるランダムノイズ発生器(random_noise_gen)を作成する ということで、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の random_noise.gen プロジェクトを示した。今回は、その random_noise_gen プロジェクトで、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する7(random_nise_gen その3)
前回は、ランダムノイズ発生器(random_noise_gen)プロジェクトで、 C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、ランダムノイズの発生をON/OFF できるようにソースコードとテストベンチを変更したので、それを貼っておく。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する8(aixs2xf8uc3 IP その4)
OV5642 カメラを使用するには、カメラの設定の関係で画像の上下を反転する vflip_dma_write IP が必要だった。DMA IP にする必要があるため、aixs2xf8uc3 に vflip 引数を追加しよう。

axis2xf8uc3 IP を Vitis HLS 2020.2 で作成する
axis2xf8uc3 に関する記事が長くなってので、別スレッドにすることにした。
なお、vflip の axis2xf8uc8 は別の IP にすることにした。
いろいろな実装を試しているが、XF8UC3 は unsigned なので、それで実装し直したので、もう一度貼っておく。
axis2xf8uc8 は PIPELINE 指示子に rewind オプションを付加してもリソース使用量が増えないが、vflip の axis2xf8uc8 は”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する8(aixs2xf8uc3 IP その4)”の様にリソース使用量が 8 倍以上になってしまった。

axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成する1
”axis2xf8uc3 IP を Vitis HLS 2020.2 で作成する”で通常 DMA の AXI4-Stream から XF8UC3 変換してDMA Write する IP を作成した。今回は、AXI4-Stream の画像データを XF8UC3 に変換して、画像の上下を入れ替えてDMA する axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成した。
画像の上下をひっくり返すために、1行の画像データが 3/4 で割り切れることが条件となる。 800 x 600 ピクセルの画像は 800 ピクセルの 3/4 は 600 となって割り切れるため vflip することができる。
axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成する2
前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の axis2xf8uc3vflip プロジェクトを作った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。
axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成する3
”axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成する1”で、vflip の axis2xf8uc8 は dma_write 関数の for ループの PIPELINE 指示子に rewind オプションを付加すると”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する8(aixs2xf8uc3 IP その4)”の様にリソース使用量が 8 倍以上になってしまったのだが、その原因を追求することにした。

vitis_vision_cam プロジェクトをデバックするために dma_read4image を Vitis HLS 2020.2 で作る1
Vivado 2020.2 プロジェクトの vitis_vision_cam のデバックをするためにメモリから DMA Read して、AXI4-Stream に出力する dma_read4image を Vitis HLS 2020.2 のプロジェクトとして作成することにした。
vitis_vision_cam プロジェクトをデバックするために dma_read4image を Vitis HLS 2020.2 で作る2
前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の dma_read4image プロジェクトを作成した。今回は、 dma_read4image プロジェクトの C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

DATAFLOW 指示子を使用しない Vitis HLS 2020.2 の axis2xf8uc3vflip2 プロジェクトを作成する1
”vitis_vision_cam の Vivado 2020.2 プロジェクトで、どの IP がバグっているのかを調査した”で vitis_vision_cam プロジェクトが動作しないのは、どうやら axis2xf8uc3vflip IP が原因のようだ?ということがわかった。
そこで、DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を作ることにしたのだが、並列動作させずに DMA_Write すると DMA_Write する部分に if 文が入るので、単発転送になってしまう。今回は、1 行データをまとめたら、バーストで DMA 転送する方式にすることにした。これだと、レイテンシは 3/4 だけ増加することになるが、もともとピクセル・クロックが 40 MHz (SVGA) なので、AXI4-Stream の動作周波数の 100 MHz からすると 2/5 になっていて半分以下なので、十分に間に合う計算になる。
DATAFLOW 指示子を使用しない Vitis HLS 2020.2 の axis2xf8uc3vflip2 プロジェクトを作成する2
DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を作ることにしたということで、前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の axis2xf8uc3vflip2 プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

DATAFLOW 指示子を使用した sobel_axis_dma IP を使った sobel_axis_dma_cam を実装する
”DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を使用して vitis_vision_cam を実装する”で DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を使用すると vitis_vision_cam プロジェクトを使用して、カメラ画面を表示することができた。
今回は、DATAFLOW 指示子を使用したら、全てが連続動作時にバグが出るということは無いと思うので、HDLab の Vivado HLS セミナで使用している、DATAFLOW 指示子を使った sobel_axis_dma の Vivado HLS での IP を使用して、カメラ画像表示システムの sobel_axis_dma_cam を作成する
DATAFLOW 指示子を使った sobel_axis_dma の Vivado HLS での IP の連続動作には問題が無かった。
次は、 sobel_axis_dma を Vitis HLS 2020.2 で実装して、動作を確認してみよう。

Vitis HLS 2020.2 で DATAFLOW 指示子を使った sobel_axis_dma IP を作成する1
”DATAFLOW 指示子を使用した sobel_axis_dma IP を使った sobel_axis_dma_cam を実装する”で Vivado HLS 2019.2 を使用して作成した sobel_axis_dma IP を使用して作成した Vivado 2020.2 プロジェクトの sobel_axis_dma_cam の動作を確認することができた。
今回は、 Vitis HLS 2020.2 で sobel_axis_dma IP を実装して、 sobel_axis_dma_cam に入れ替えて試してみることにした。
Vitis HLS 2020.2 で DATAFLOW 指示子を使った sobel_axis_dma IP を作成する2
Vitis HLS 2020.2 で sobel_axis_dma IP を実装して、 sobel_axis_dma_cam に入れ替えて試してみることにした。ということで、前回は、ソースコードとテストベンチ・コードを貼って、 Vitis HLS 2020.2 の sobel_axis_dma プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

DATAFLOW 指示子を使用した sobel_axis_dma IP を使った sobel_axis_dma_cam を実装する2
前回は、DATAFLOW 指示子を使った sobel_axis_dma の Vivado HLS での IP を使用して、カメラ画像表示システムの sobel_axis_dma_cam を作成して、ソーベル・フィルタをかけることができた。しかし、 sobel_axis_dma IP は Vivado HLS 2019.2 で作成したので、最新の Vitis HLS 2020.2 で作成した IP はどうなのか?という疑問は残った。今回は、下に示す 2 つの記事のブログで作ってきた Vitis HLS 2020.2 版の sobel_axis_dma IP を sobel_axis_dma_cam プロジェクトで使用して、動作を確認したところ、成功した。

axis2xf8uc3vflip IP をデバックする
DATAFLOW 指示子を使用した axis2xf8uc3vflip IP をデバックしてみよう。
”ILA デフォルト・ダッシュボードの ADVANCED トリガ・モードを使用して、バグを確かめる”で画像フレームの 8 フレームまでは正常に動作して、 9 フレームからは動作がおかしくなるようなので、Vitis HLS 2020.2 で 16 フレーム・シミュレーションしてみようと思った。
バグは出なかった。

Vitis HLS 2021.1 を使ってみる(DMA_pow2)
Vitis HLS 2021.1 が出たので、使ってみることにした。
題材は DMA_pow2 で、入力を 2 乗して出力する AXI4 Master 入出力の IP だ。
なお、今回は訳あって、Windows 10 の Vitis HLS 2021.1 を使用している。

”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る”を Vitis HLS 2021.1 でやってみる
””(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る”を Vitis HLS 2020.2 でやってみる”で”large runtime and excessive memory usage”でうまく行かなかった”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る”を Vitis HLS 2021.1 で、もう一度やってみよう。
合成が成功した。

hls4ml を Vitis HLS 2021.1 でやってみる
hls4ml はVivado HLS を使用して機械学習をハードウェア化するフレームワークだ。以前、FPGAの部屋でもやってみたが、ロボットカーの曲がる方向を示すニューラルネットワークを構築しようと して、large runtime and excessive memory usage エラーで止まっていた。(”hls4mlをやってみた7(自分で学習したネットワークをhls4mlでハードウェア化2)”参照)これを Vitis HLS 2021.1 でやり直してみようと思う。
”ERROR: [XFORM 203-103] Array 'mult.V.1' (/home/masaaki/DNN/hls4ml/nnet_utils/nnet_dense.h:56): partitioned elements number (15600) has exeeded the threshold (1024), which may cause long run-time.”で止まってしまった。

DFX をやってみよう2(DMA_pow2 IP の作成)
”DFX をやってみよう2(チュートリアル例の説明)”に書いたように、”Vitis HLS 2021.1 を使ってみる(DMA_pow2)”の IP の入出力ポートを少々変更する。
DFX をやってみよう3(DMA_square_root8 IP の作成1)
前回は、DMA_pow2 IP を Vitis HLS 2021.1 で作成した。今回は、8 ビットの整数の平方根を計算する DMA_square_root8 を作成してみよう。
DFX をやってみよう4(DMA_square_root8 IP の作成2)
前回は、8 ビットの整数の平方根を計算する DMA_square_root8 を作成するということで、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2021.1 で DMA_square_root8 プロジェクトを作成した。
今回は、その C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーション、Export RTL、 インプリメンテーションを行っていこう。

画像フィルタを DFX する5(through_axis IP 1)
前回は、DFX のために、ビデオ側の DMA2axis IP の動作を一度止めて、再起動した時にカメラ画像が表示されることを確認できた。今回は、DFX のリコンフィギャブル・モジュール(RM)として、AXI4-Stream の通過 IP の through_axis を作成する。この IP は AXI4-Stream のデータをそのまま AXI4-Stream に出力する。Vitis HLS 2021.1 の through_axis プロジェクトを示し、ソースコードとテストベンチ・コードを貼った。
画像フィルタを DFX する6(through_axis IP 2)
前回は、DFX のリコンフィギャブル・モジュール(RM)として、AXI4-Stream の通過 IP の through_axis を作成する。この IP は AXI4-Stream のデータをそのまま AXI4-Stream に出力する。Vitis HLS 2021.1 の through_axis プロジェクトを示し、ソースコードとテストベンチ・コードを貼って、 C シミュレーションを行った。今回は、その through_axis の Vitis HLS プロジェクトで C コードの合成、 C/RTL 協調シミュレーション、 Export RTL 、 Run Implementation を行う。
画像フィルタを DFX する7(lap_filter_axis IP 1)
前回は、AXI4-Stream インターフェースの通過するだけの IP 、 through_axis を作成した。これはカメラ画像を表示するのに使用する。今回は、 AXI4-Stream インターフェースのラプラシアン・フィルタを作成する。ソースコードとテストベンチ・コードを貼って、 C シミュレーションを行った。
画像フィルタを DFX する8(lap_filter_axis IP 2)
前回は、AXI4-Stream インターフェースのラプラシアン・フィルタを作成するということで、ソースコードとテストベンチ・コードを貼って、 C シミュレーションを行った。今回は、C コードの合成、 C/RTL 協調シミュレーション、 Export RTL 、 Run Implementation を行う。
画像フィルタを DFX する9(sobel_filter_axis IP 1)
前回は、AXI4-Stream インターフェースのラプラシアン・フィルタを作成するということで、 C コードの合成、 C/RTL 協調シミュレーション、 Export RTL 、 Run Implementation を行った。
今回は DFX で切り替えるフィルタの第 2 段として AXI4-Stream インターフェースのソーベル・フィルタを作成する。
画像フィルタを DFX する10(sobel_filter_axis IP 2)
前回は、 DFX で切り替えるフィルタの第 2 段として AXI4-Stream インターフェースのソーベル・フィルタを作成するということで、ソースコードとテストベンチ・コードを貼って、 Vitis HLS 2021.1 の sobel_filter_axis3 プロジェクトを作成し、OpenCV を使用できるように設定を行った。今回は、 C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーション、 Export RTL 、 Run Implementation を行う。

RBG 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する1
”MicroZed Chronicles: Kria & Raspberry Pi Camera”のブロック・デザインにソーベル・フィルタを追加するために RBG 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成することにした。今回は、ソーベル・フィルタのソースコードを貼って、 Vitis HLS 2021.1 で sobel_filter_axis_RBG プロジェクトを作成した。
RBG 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する2
前回は、ソーベル・フィルタのソースコードを貼って、 Vitis HLS 2021.1 で sobel_filter_axis_RBG プロジェクトを作成した。今回は、 C シミュレーションを行ったが、エラーになってしまった。 Kria KV260 ボードを指定したのだが、これを単体の FPGA チップにしたところ、エラーが解消した。
RBG 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する3
前回は、C シミュレーションを行ったが、エラーになってしまった。 Kria KV260 ボードを指定したのだが、これを単体の FPGA チップにしたところ、エラーが解消した。今回は残りの C コードの合成、 C/RTL 協調シミュレーション、 Export RTL 、 Implementation を行った。

RBG 24 ビット・データ入出力対応のガウシアン・フィルタを Vitis HLS 2021.1 で作成する1
”MicroZed Chronicles: Kria & Raspberry Pi Camera”のブロック・デザインにソーベル・フィルタを追加するために RBG 24 ビット・データ入出力対応のガウシアン・フィルタを Vitis HLS 2021.1 で作成することにした。今回は、ガウシアン・フィルタのソースコードを貼って、 Vitis HLS 2021.1 で gaussian_filter_axis_RBG プロジェクトを作成した。
RBG 24 ビット・データ入出力対応のガウシアン・フィルタを Vitis HLS 2021.1 で作成する2
前回は、ガウシアン・フィルタのソースコードを貼って、 Vitis HLS 2021.1 で gaussian_filter_axis_RBG プロジェクトを作成した。今回は、 C シミュレーションと C コードの合成を行った。
RBG 24 ビット・データ入出力対応のガウシアン・フィルタを Vitis HLS 2021.1 で作成する3
前回は、C シミュレーションと C コードの合成を行った。今回は、 C/RTL 協調シミュレーションを行って、Export RTL で IP 化して、 Implementation を行った。

RBG 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.1 で作成する1
ガウシアン・フィルタを作ってきたが、ガウシアン・フィルタのノイズ除去性能は以前 OpenCV で実装したメディアン・フィルタの性能を下回っている。そこで、メディアン・フィルタも自分で実装してみたくなった。
メディアン・フィルタは中央値フィルタで、3 x 3 のカーネル内のピクセルの中央の値を取るフィルタだ。
RBG 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.1 で作成する2
メディアン・フィルタを実装してみたくなった、ということで、前回は、ソースコードと テストベンチコードを貼って、 Vitis HLS 2021.1 で median_filter_axis_RBG プロジェクトを作成した。今回は、 C シミュレーションと C コードの合成を行った。
RBG 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.1 で作成する3
前回は、 C シミュレーションと C コードの合成を行った。今回は、メディアン・フィルタの演算部分、主にバブルソートの C コードの合成の様子を見ていこうと思う。
RBG 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.1 で作成する4
前回は、メディアン・フィルタの演算部分、主にバブルソートの C コードの合成の様子をみた。今回は、 C/RTL 協調シミュレーションを行い、 Export RTL で IP 化、 Implementation で Vivado での合成レポートを確認しよう。

Vitis HLS 2021.2 での AXI4 Master インターフェースにおける volatile の扱い1(バーストアクセス 1)
Vivado HLS では、ハードウェアする時に AXI4 Master インターフェースを使用する引数があるような時には、 volatile を付けろと Users Guide に書いてあった。しかし、 Vitis HLS での volatile の扱いは違っているのかも知れない?それを検証してみよう。
Vitis HLS 2021.2 での AXI4 Master インターフェースにおける volatile の扱い2(バーストアクセス 2)
前回は、volatile を付けた引数を AXI4 Master インターフェースと使用する場合を Vitis HLS 2021.2 で検証した。今回は、前回から volatile を除いた場合について検証していこう。
Vitis HLS 2021.2 での AXI4 Master インターフェースにおける volatile の扱い3(単発アクセス 1)
前回は、volatile を付けない引数の AXI4 Master インターフェースのバーストアクセスを使用する場合を Vitis HLS 2021.2 で検証した。結果は、volatile を付けない方が良いということだった。次に、AXI4 Master インターフェースで volatile を付けたほうが良い場合を検証していこう。今回は、volatile を引数に付けない場合の AXI4 Master インターフェースの単発アクセスについて検証する。
Vitis HLS 2021.2 での AXI4 Master インターフェースにおける volatile の扱い4(単発アクセス 2)
前回は、volatile を引数に付けない場合の AXI4 Master インターフェースの単発アクセスについて検証した。結果は、Read、 Write 共に 1 回の AXI4 Master アクセスとなった。今回は、関数の引数に volatile を付けて、その結果を見てみよう。
Read も Write も 2 回ずつのアクセスが発生している。
Vitis HLS 2021.2 での AXI4 Master インターフェースにおける volatile の扱い5(単発アクセス 3)
前回は、関数の引数に volatile を付けて、その結果を確認したが、Write は 4 を書いてから、 8 書いているので、これはコードのままなのだが、 Read の方が 2 回ずつ計 4 回 Read しているはずなのに 2 回のみになっている。今回は、Read も 4 回アクセスがでるようにコードを修正してみよう。
このコードでは引数だけでなく、関数内で宣言された変数の acc に volatile を付ける必要があったようだ。覚えておこう。

Vitis HLS 2021.2 で DMA Readしたデータを2乗し、DMA Writeする KV260 用 IP を作成
KV260 で ikwzm さんの Debian をインストールしてきたが、Ultra96 でやったように DMA Readしたデータを2乗し、DMA Writeする KV260 用 IP を Vitis HLS 2021.2 で作って、Vivado で実装して KV260 の Debian に持っていて動作させてみよう。今回は手始めに Vitis HLS 2021.2 で DMA Read したデータを2乗し、DMA Writeする KV260 用 IP を Vitis HLS 2021.2 で作成する。

Vitis HLS 2021.2 で DMA_read IP を作成した
”KV260 で ikwzm さんのデバイスツリー・オーバーレイをテストする3”で ZynqMP の S_AXI_HPC0_FPD を使用しても、キャッシュに読み書きできていないということが分かった。ikwzm さんにお聞きすると、キャッシュに読み書きさせるようにするのも、今の所難しいということだった。
そこで、キャッシュに読み書きするのではなく、メモリに UIO 経由でメモリに直接 read/write する IP を作成しようと思う。最初に DMA_read IP を作成する。
Vitis HLS 2021.2 で DMA_write IP を作成した
メモリに UIO 経由でメモリに直接 read/write する IP を作成しようと思うということで、前回は、DMA_read IP を作成した。今回は、DMA write IP を作成する。

Vivado HLS, Vitis HLS で 2022 年問題発生
”Microsoft Exchange Server、日付チェック問題でメール配信停止(対処中)”だそうですが、Vivado HLS, Vitis HLS も 2022 年問題で現在、Export RTL ができなくなっています。
Vivado HLS, Vitis HLS の 2022 年問題にパッチを当てる
”Vivado HLSリビジョンオーバーフロー問題のパッチの当て方”(参考にさせて頂きます)を見て Vivado HLS, Vitis HLS の 2022 年問題のパッチが出ていることに気がついたので、私もやってみることにした。

Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定してみよう。
今回は、Vitis HLS 2021.2 のプロジェクトを作成し、C シミュレーションを行った。
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する2
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定してみようということで、前回は、Vitis HLS 2021.2 のプロジェクトを作成し、C シミュレーションを行った。今回は、C コードの合成と C/RTL 協調シミュレーションを行ったが、C/RTL 協調シミュレーションがエラーで停止してしまった。Export RTL と Implementation は Vitis HLS 2022 年問題が出てしまった。
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する3
前回は、C コードの合成と C/RTL 協調シミュレーションを行ったが、C/RTL 協調シミュレーションがエラーで停止してしまった。Export RTL と Implementation は Vitis HLS 2022 年問題が出てしまった。今回は、前回の C コードの合成の AXI4 Master のアドレス幅が 64 ビットになっていたので、32 ビットに変更し、もう一度 C コードの合成と Export RTL をやり直した。更に C/RTL 協調シミュレーションも Dump Trace の設定を port にしたら成功した。
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する4
前回は、 C コードの合成の AXI4 Master のアドレス幅が 64 ビットになっていたので、32 ビットに変更し、もう一度 C コードの合成と Export RTL をやり直した。更に C/RTL 協調シミュレーションも Dump Trace の設定を port にしたら成功した。今回は、前回 IP を作成できたので、Vivado 2021.2 でプロジェクトを作成し、作成した DMP_pow2_defclk IP を使用して、ブロック・デザインを作成した。そして、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、タイミングでエラーになった。
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する5
前回は、前回 IP を作成できたので、Vivado 2021.2 でプロジェクトを作成し、作成した DMP_pow2_defclk IP を使用して、ブロック・デザインを作成した。そして、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、タイミングでエラーになった。今回は、タイミ ング・エラーを検証する。
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する6
前回は、タイミング・エラーを検証して FCLK_CLK0 が 100 MHz 、FCLK_CLK1 が 75 MHz ではダメそうだということが分かった。今回は、FCLK_CLK0 が 100 MHz 、FCLK_CLK1 が 50 MHz で再度やり直してみよう。
Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定する7Vitis HLS 2021.2 で AXI4-Lite インターフェースのクロックに別のクロックを指定してみようということで、前回は、FCLK_CLK0 が 100 MHz 、FCLK_CLK1 が 50 MHz で再度やり直したところ、タイミング・エラーは発生しなかった。今回は、実際に動作するか?を調べてみよう。
動作確認は成功だった。
結局、Vitis HLS 2021.2 の AXI4-Lite インターフェースのクロックを独自に生成する機能は、クロック載せ替えがされていないので、特定の周波数しか Vivado でのタイミングがメットしないようだ。今回は、IP 全体の動作周波数が 100 MHz で AXI4-Lite インターフェースが 50 MHz で動作確認した。
Vitis HLS 2021.2 を使用して画像ファイルを C のヘッダファイルに変換する
”Vivado HLS 2019.1 を使用してBMPファイルをC のヘッダファイルに変換する”というブログを書いたが、それを Vitis HLS 2021.2 でやってみる。また、OpenCV 3.4.9 を使用するので、BMP ファイルじゃなくても問題ない。従ってBMPファイルから画像ファイルにタイトルを変更した。
変換成功した。
画像ファイルをC のヘッダファイルに変換したファイルを Vitis HLS 2021.2 で検証してみた
”Vitis HLS 2021.2 を使用して画像ファイルを C のヘッダファイルに変換する”で JPG ファイルを C 言語のヘッダに変換することができたが、本当に画像に戻るのかを今回検証する。このブログは、”BMPファイルをC のヘッダファイルに変換したファイルを検証してみた”を参照している。

AXI4 Stream 出力にAXI4 Stream スイッチ付きのDMA Read IP を Vitis HLS 2021.2 で作成 1
Vitis HLS 2021.2 で”AXI4 Stream 出力にAXI4 Stream スイッチ付きのDMA Read IP 1”をやってみることにした。これをやるのは Vitis HLS と Vivado HLS の違いを比べたいという欲求と Vitis Vision Library の AXI4-Stream 入出力の xf_median_blur IP を実機でテストしたいからだ。
AXI4 Stream 出力にAXI4 Stream スイッチ付きのDMA Read IP を Vitis HLS 2021.2 で作成 2
Vitis Vision Library の AXI4-Stream 入出力の xf_median_blur IP を実機でテストするために、前回は、Vitis HLS 2021.2 で ZYBO Z7-20 用の DMA2axis2st プロジェクトを作成して、 C シミュレーションを行った。今回は、残りの C コードの合成、C/RTL 協調シミュレーション、Export RTL 、Implementation を行った。

私のブログで bmp_header.h を使用する Vitis HLS テストベンチ・ファイルの入力画像縛りの件
私のブログで bmp_header.h を使用する Vitis HLS テストベンチ・ファイルがあるが、残念ながら、コードが足りないためグレースケールの BMP 画像ファイルには対応していない。例えば、”ZynqBerryZero で HDMI にラプラシアン・フィルタ画像を出力する1(Vitis HLS 2020.2編1)”は bmp_header.h 使っているので、この制限がある。

AXI4 Stream 入力にAXI4 Stream スイッチ付きのDMA Write IP を Vitis HLS 2021.2 で作成 1
Vitis HLS 2021.2 で”AXI4 Stream 入力にAXI4 Stream スイッチ付きのDMA Write IP 1”をやってみることにした。これをやるのは Vitis HLS と Vivado HLS の違いを比べたいという欲求と Vitis Vision Library の AXI4-Stream 入出力の xf_median_blur IP を実機でテストしたいからだ。
AXI4 Stream 入力にAXI4 Stream スイッチ付きのDMA Write IP を Vitis HLS 2021.2 で作成 2
前回は、axis2DMA2st プロジェクトを Vitis HLS 2021.2 で作成して、 C シミュレーションを行った。今回は、axis2DMA2st プロジェクトで C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

Vitis HLS 2021.2 で Vitis Vision Library L1 を使用して C コードの合成を行う方法
”Vitis HLS 2021.2 で Vitis Vision Library を使用する8(AXI4-Stream 入出力の xf_resize 編 1)”で C コードの合成を行ったが、Vitis Vision Library L1 のインクルード・ファイルが見つからないというエラーになってしまった。
この解決方法は Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で読み込んで合成する、だった。(”Vitis HLS 2021.2 で Vitis Vision Library を使用する2(dilation 編 2)”参照)
しかし、ただ単に Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で読み込んでもダメなようだった。うまく行く条件は Vitis HLS 2020.2 で一回 C コードの合成を行っておくということのようだ。

square_root_apfixed で Vitis HLS 2021.2 の合成時の動作を確認した
square_root_apfixed プロジェクトを Vitis HLS 2021.2 で作成し、C コードの合成を行った時に、Vitis HLS 2021.2 の動作が確認できたので、書いておく。
Vitis HLS 2021.2 では、ループ上にパイプライン指示子が無ければ、ターゲットの動作周波数を確保するようにパイプラインの開始間隔を大きくする。ループ上にパイプライン指示子があれば、そ の指定に従う。ただし、Target に Estimated の値が届かないことがある。

Vitis HLS 2021.2 で KV260 用の DMA_pow2_axis IP を作成する
”PYNQ を使って Python で手軽に FPGA を活用 (5)”をやってみるために、AXI4-Stream インターフェースの 2 乗する IP 、DMA_pow2_axis を作成しよう。
Vitis HLS 2021.2 で KV260 用の DMA_pow2_axis IP を作成する2
前回、”PYNQ を使って Python で手軽に FPGA を活用 (5)”をやってみるために、AXI4-Stream インターフェースの 2 乗する IP 、DMA_pow2_axis を作成したが、””PYNQ を使って Python で手軽に FPGA を活用 (5)”をやってみる3(System ILA を使用したデバック)”に示すように、AXI4-Stream インターフェース出力で tlast を出力する必要があることが分かったので、ソースコードに tlast を追加しようと思う。

axi_dma と DMA_pow2_axis を Kria-PYNQ で動作させる1(Vitis HLS で DMA_pow2_axis IP を作成)
TKEEP と TSTRB は、入力された信号を出力するか、オール 1 にする必要がありそうだということで、それを踏まえて、再度 axi_dma と DMA_pow2_axis を Kria-PYNQ で動作させてみようと思う。

RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する1
”PYNQ の画像ファイル・フォーマットを調査するために choose_RGB IP を Vitis HLS 2021.2 で作成する8”までの作業で画像を KV260 の PYNQ で処理する手順と RGB のフィールドは確認することができた。それじゃ実際の画像アプリケーションを KV260 の PYNQ で実装してみたいということで、ソーベル・フィルタを KV260 の PYNQ で実装してみることにした。
そういう訳で、RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する。今回は、ヘッダとソースコード、テストベンチを貼っておく。
RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する2
前回は、PYNQ で使用するためのソーベル・フィルタを Vitis HLS 2021.2 で作成するためのコードを貼って、sobel_axis_RGB24 プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL 、Implementation を行った。

RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する3
”KV260 の PYNQ で自作のソーベル・フィルタを動作させる4”で sobel_axis_RGB24 IP が動作しなかったので、見直した所、”Xilinx の axi_dma IP を画像用に使用するための方法”に示すように、axi_vdma 用と axi_dma 用に動作を分けることにした。改めて、ソースコードとテストベンチを示す。
RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.1 で作成する4
前回は、axi_vdma 用と axi_dma 用に動作を分けた sobel_axis_RGB24 のソースコードとテストベンチを貼った。今回は、sobel_axis_RGB24 の C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する1
今まで、ソーベル・フィルタを KV260 の PYNQ で動作させてきたが、メディアン・フィルタも KV260 の PYNQ で動作させてみよう。とりあえず、RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成することにした。今回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 のソースコードとテストベンチ・コードを貼って、Vitis HLS 2021.2 で作成した median_axis_RGB24 プロジェクトを示す。
RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する2
前回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 のソースコードとテストベンチ・コードを貼って、Vitis HLS 2021.2 で作成した median_axis_RGB24 プロジェクトを示した。今回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 の C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

AXI4-Lite インターフェースを AXI4-Stream に変換する1
AXI4-Lite インターフェースを AXI4-Stream に変換する IP を Vitis HLS 2022.1 で作成する。
AXI4-Lite インターフェースを AXI4-Stream に変換する2
AXI4-Lite インターフェースを AXI4-Stream に変換する IP を Vitis HLS 2022.1 で作成するということで、前回は、ソースコードの axilw2stream.cpp とテストベンチの axilw2stream_tb.cpp を貼って、Vitis HLS 2022.1 の axilw2stream プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

AXI4-Stream を AXI4-Lite インターフェースに変換する1
前回までは、AXI4-Lite インターフェースを AXI4-Stream に変換する Vitis HLS 2022.1 で作った axilw2Stream IP を作成した。今回は、AXI4-Stream を AXI4-Lite インターフェースに変換する stream2axilr IP を作成する。ソースコードとテストベンチを貼って、Vits HLS 2022.1 で stream2axilr プロジェクトを作成した。
AXI4-Stream を AXI4-Lite インターフェースに変換する2
前回は、AXI4-Stream を AXI4-Lite インターフェースに変換する stream2axilr IP を作成するということで、ソースコードとテストベンチを貼って、Vits HLS 2022.1 で stream2axilr プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Exprot RTL、Implementation を行う。

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する3
前回から時間が経っているが、前回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 の C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。前回は、100 MHz 対応の solution1 だったが、200 MHz 対応の solution2 を作成し、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

”FPGAの部屋 プレゼンツ Vitis HLS スタートアップ”が開催されます
”FPGAの部屋 プレゼンツ Vitis HLS スタートアップ”が開催されます。参加費用は無料です。

RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2022.1 で作成する1
自分で作った回路を ZYBO Z7-20 の PYNQ で動作させるためソーベル・フィルタを実装することにした。
つまり、KV260 でやってきたことを ZYBO Z7-20 でやってみよう。
最初は ZYBO Z7-20 用の RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2022.1 で実装してみよう。
RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2022.1 で作成する2
自分で作った回路を ZYBO Z7-20 の PYNQ で動作させるためソーベル・フィルタを実装することにしたということで、前回は、 ZYBO Z7-20 用の RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2022.1 実装するために Vitis HLS 2022.1 で sobel_axis_RGB24 プロジェクトを作成した。今回は、そのプロジェクトで C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

垂直方向が反転している画像の DMA2(vflip_dma_write)
vflip_dma_write は垂直方向はフリップしているが、水平方向はミラーなしの場合の DMA だ。なぜこのような DMA を実装するか?というと、OV5642 で垂直方向がフリップしている状態の SVGA 画像しか設定できなかったからだ。
vflip_dma_write を ZYBO Z7-20 用に Vitis HLS 2022.1 で実装する。
垂直方向が反転している画像の DMA3(vflip_dma_write)
vflip_dma_write は垂直方向はフリップしているが、水平方向はミラーなしの場合の DMA だ。前回は、vflip_dma_write のソースコードとテストベンチ・コードを貼った。今回は、C シミュレーションと C コードの合成結果を書いたところで、リソースを食いすぎることが分かって、中断した。
垂直方向が反転している画像の DMA4(vflip_dma_write)
前回は、C シミュレーションと C コードの合成結果を書いたところで、リソースを食いすぎることが分かって、中断した。今回は、画像のサイズを固定にしたコードを作成したが、最後の Implementation でリソースの使用量が大きい値が示された。これではリソース使用量が大きくて使えない。
垂直方向が反転している画像の DMA5(vflip_dma_write)
前回は、画像のサイズを固定にしたコードを作成したが、最後の Implementation でリソースの使用量が大きい値が示された。これではリソース使用量が大きくて使えない。今回は、C コードの合成では、リソース使用量が普通だったのに、Vivado で、論理合成、インプリメンテーションを行うとリソース使用量が大きくなってしまうのは、Vitis HLS 2022.1 特有の現象ではないか?という推測のもとに Vivado HLS 2019.2、Vitis HLS 2020.2、Vitis HLS 2021.2 で vflip_dma_write をやってたが、どれも正常にインプリメンテーションができた。

トリプル・バッファの AXI4-Stream 出力 DMA 1(DMA2axis_3buf)
前回の vflip_dma_write がトリプル・バッファだったので、それと組のトリプル・バッファの AXI4-Stream 出力 DMA (DMA2axis_3buf)を Vitis HLS 2022.1 で作成する。なお DMA2axis_3buf の使用するボードは ZYBO Z7-20 で、SVGA 画像専用とする。
トリプル・バッファの AXI4-Stream 出力 DMA 2(DMA2axis_3buf)
ZYBO Z7-20 用のトリプル・バッファの AXI4-Stream 出力 DMA (DMA2axis_3buf)を Vitis HLS 2022.1 で作成するということで、前回は、ソースコードとテストベンチ・コードを貼って、DMA2axis_3buf プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

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

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

axis2DMA4dwc IP の作成1
”ZYBO Z7-20 の PYNQ 2.7 上で Jupyter Notebook に画像を表示する5”で、AXI4-Stream Data Width Converter の AXI4-Stream 入出力に TUSER が無いということが分かった。そこで、axis2DMA IP を TUSER を使用しないように作り変えることにした。
そういう訳で、スタートに TUSER を使用しない axis2DMA4dwc IP を作成する。
axis2DMA4dwc IP の作成2
axis2DMA IP を TUSER を使用しないように作り変えることにしたということで、スタートに TUSER を使用しない axis2DMA4dwc IP を作成する。前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2022.1 の axis2DMA4dwc プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行った。C/RTL 協調シミュレーションのレイテンシが大きいので、Vitis HLS 2021.2 でも axis2DMA4dwc プロジェクトを作成し、C/RTL 協調シミュレーションを行ったところ、Vitis HLS 2021.2 の方がレイテンシが小さいので、こちらを採用することにした。

Vitis HLS 2022.1 で multi_axi4ls IP を作成する
今回は、”自作回路を cocotb でシミュレーションする1(Vitis HLS で multiplier を作成1)”と”自作回路を cocotb でシミュレーションする2(Vitis HLS で multiplier を作成2)”で作成した multiplier を multi_axi4ls として、 AXI4 Lite インターフェース対応にする。

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

Vitis HLS 2022.2 の新機能を確かめる1(performance プラグマ)
”What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”を参考に、Vitis HLS 2022.2 の新機能を確かめてみよう。最初は performance プラグマだ。
Vitis HLS 2022.2 の新機能を確かめる2(performance プラグマ2)
”What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”を参考に、Vitis HLS 2022.2 の新機能を確かめてみようということで、前回は、 performance プラグマについて調査した。今回は、 performance プラグマの続きをやってみる。
Vitis HLS 2022.2 の新機能を確かめる3(performance プラグマ3)
前回は、performance プラグマが無くても、その他のパフォーマンスに関係するプラグマが無くても、ソーベル・フィルタのソースコードでループ回数を固定すると、1 クロックで 1 ピクセル処理をパフォーマンスに関するプラグマなしの状態で達成できた。今回は、より performance プラグマを評価するために、ソフトウエアとして書いた AXI4 Master アクセスベースの sobel_fil_axim.cpp とそのテストベンチ、Vitis HLS プロジェクトを示す。
Vitis HLS 2022.2 の新機能を確かめる4(performance プラグマ4)
前回は、、より performance プラグマを評価するために、ソフトウエアとして書いた AXI4 Master アクセスベースの sobel_fil_axim.cpp とそのテストベンチ、Vitis HLS プロジェクトを表示した。今回は、performance プラグマなしとありの状態で、C コードの合成を行って比較した。
Vitis HLS 2022.2 の新機能を確かめる5(hls::print 関数)
前回は、ソフトウエアとして書いた AXI4 Master アクセスベースの sobel_fil_axim.cpp で performance プラグマなしとありの状態で、C コードの合成を行って比較した。今回は、hls::print 関数について調べてみよう。

Zybot でガボール・フィルタを使用して白線間走行する3(Vitis HLS 2022.2 の Gabor_Filter_lh_2 プロジェクト)
Zybot でガボール・フィルタを使用して白線間を走行させたいと思っているということで、前回は、”Zybot による障害物回避”のハードウエアを Vivado 2022.2 に変換して、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、タイミング・エラーが発生した。今回は、ガボール・フィルタ IP でタイミング・エラーが発生したので、ガボール・フィルタ IP を Vitis HLS 2022.2 で作り直そうと思う。今回は、ソースコードを貼った。
Zybot でガボール・フィルタを使用して白線間走行する4(Vitis HLS 2022.2 の Gabor_Filter_lh_2 プロジェクト2)
Zybot でガボール・フィルタを使用して白線間を走行させたいと思っているということで、前回は、ガボール・フィルタ IP でタイミング・エラーが発生したので、ガボール・フィルタ IP を Vitis HLS 2022.2 で作り直そうということで、ソースコードを貼って、Vitis HLS 2022.2 の Gabor_Filter_lh_2 プロジェクトを示した。今回は、Vitis HLS 2022.2 で C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

AXI4-Stream 32 ビット入出力のラプラシアン・フィルタを作る1
AXI4-Stream 32 ビット入出力のラプラシアン・フィルタを作って、ガボール・フィルタの後に入れて値を確認してみようと思う。家で白線をガボール・フィルタ処理してみたところ、0xff が複数ピクセルに渡って現れることが分かった。それのエッジを取ってみようという発想だ。上昇する方のエッジのみを使用するので、マイナスの方は 0 にしようと思う。
AXI4-Stream 32 ビット入出力のラプラシアン・フィルタを作る2
AXI4-Stream 32 ビット入出力のラプラシアン・フィルタを作って、ガボール・フィルタの後に入れて値を確認してみようと思うということで、前回は、ソースコードを貼った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

AXI4-Stream 32 ビット入出力のガボール・フィルタを変更する1
Vitis HLS 2022.2 を使用して、AXI4-Stream 32 ビット入出力のガボール・フィルタ Gabor_Filter_lh_2 を Gabor_Filter_lh_3 として作成することにした。
Gabor_Filter_lh_3 はスルー出力とガボール・フィルタ出力を切り替えることができて、画像の大きさを指定することができるようにする。
AXI4-Stream 32 ビット入出力のガボール・フィルタを変更する2
Vitis HLS 2022.2 を使用して、AXI4-Stream 32 ビット入出力のガボール・フィルタ Gabor_Filter_lh_2 を Gabor_Filter_lh_3 として作成することにしたということで、前回は、ソースコードを貼って、Vitis HLS 2022.2 の Gabor_Filter_lh_3 プロジェクトを作成した。今回は、C シミュレーションを行って、C コードの合成を行ったところ、Estimated が 10.213 ns と 10 ns をオーバーしてしまったので、 Gabor_Filter_lh_3.cpp を書き換えた。
AXI4-Stream 32 ビット入出力のガボール・フィルタを変更する3
前回は、C シミュレーションを行って、C コードの合成を行ったところ、Estimated が 10.213 ns と 10 ns をオーバーしてしまったので、 Gabor_Filter_lh_3.cpp を書き換えた。今回は、C コードの合成をやり直したところ、Estimated は 7.385 ns に改善した。C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

Xilinx 社画像用 IP の AXI4-Stream のスタート位置を検出する IP を Vitis HLS 2022.2 で作成する 1
ガボール・フィルタ IP から Xilinx 社画像用 IP の AXI4-Stream のスタート位置を検出する機能を削除したので、その機能を実行する IP の find_startp を作成する。今回は、ソースコードを貼って、find_startp プロジェクトを作成する。
なお、find_startp IP はきちんと IP の制御をしていれば要らないとは思うが、フェール・セーフを考えて入れておくことにしよう。
Xilinx 社画像用 IP の AXI4-Stream のスタート位置を検出する IP を Vitis HLS 2022.2 で作成する 2
ガボール・フィルタ IP から Xilinx 社画像用 IP の AXI4-Stream のスタート位置を検出する機能を削除したので、その機能を実行する IP の find_startp を作成するということで、前回は、ソースコードを貼って、find_startp プロジェクトを作成する。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。
Xilinx 社画像用 IP の AXI4-Stream のスタート位置を検出する IP のソースコードを 2 重ループから 1 重ループに変更した
前々回、前回の記事で C コードの合成時の Estimated の成績があまり良くないので、もっとチューニングできる方法を考えていた。
考えた結果、for 文が 2 重ループになっているので、これを 1 重ループにしたら比較が減って高速にならないだろうか?という考えに至ったので、確かめてみよう。

Vitis HLS 2022.1 で KR260 用の multi_axi4ls IP を作成する
””RPi+PMOD Connector GPIO with Custom PL Design in Kria KR260”をやってみる1”の axi gpio を 4 こ追加した kr260_bd ブロック・デザインに追加するために”Vitis HLS 2022.1 で multi_axi4ls IP を作成する”の multi_axi4ls IP を KR260 用に作り直した。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーション1
cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーションしたいということで、2 乗する AXI4 Lite インターフェースの test_square_axil IP を Vitis HLS 2023.1 で作成した。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4, AXI4 Lite インターフェースの IP をシミュレーション1
cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーションしたいということで、2 乗する AXI4 インターフェースの test_square_axi IP を Vitis HLS 2023.1 で作成した。制御信号は AXI4 Lite インターフェースに実装したので、cocotbext-axi を使って、AXI4, AXI4 Lite インターフェースをシミュレーションする予定だ。
cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーション1
cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーションしようということで、DMA Read して値を 2 乗し、 AXI4-Stream 出力を行う test_square_axis IP を作成した。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4 Lite インターフェースの IP をシミュレーション1
cocotbext-axi を使って、Vitis HLS 2023.1 で作成した IP をシミュレーションしてきたが、最後に AXI4-Stream の Source 側が残っているので、それを cocotbext-axi でシミュレーションしようということで、AXI4-Stream 入出力の 2 乗 IP の test_square_axis2 を Vitis HLS 2013.1 で作成した。

RGB 24 ビットの AXI4-Stream データ入出力対応のソーベル・フィルタを Vitis HLS 2023.1 で作成する
ソーベル・フィルタを ZUBoard 1CG の PYNQ v3.0.1 で使用するために Vitis HLS 2023.1 で RGB 24 ビットの AXI4-Stream データ入出力対応のソーベル・フィルタを Vitis HLS 2023.1 で作成した。

RGB 24 ビットの AXI4-Stream データ入出力対応のメディアン・フィルタを Vitis HLS 2023.1 で作成する1
メディアン・フィルタを ZUBoard 1CG の PYNQ v3.0.1 で使用するために Vitis HLS 2023.1 で RGB 24 ビットの AXI4-Stream データ入出力対応のメディアン・フィルタを Vitis HLS 2023.1 で作成した。

RGB 24 ビットの AXI4-Stream データ入出力対応のメディアン・フィルタを Vitis HLS 2023.1 で作成する1
メディアン・フィルタを ZUBoard 1CG の PYNQ v3.0.1 で使用するために Vitis HLS 2023.1 で RGB 24 ビットの AXI4-Stream データ入出力対応のメディアン・フィルタを Vitis HLS 2023.1 で作成した。
RGB 24 ビットの AXI4-Stream データ入出力対応のメディアン・フィルタを Vitis HLS 2023.1 で作成する2
メディアン・フィルタを ZUBoard 1CG の PYNQ v3.0.1 で使用するために Vitis HLS 2023.1 で RGB 24 ビットの AXI4-Stream データ入出力対応のメディアン・フィルタを Vitis HLS 2023.1 で作成するということで、前回は、Vitis HLS 2023.1 で median_axis_RGB24 プロジェクトを作成し、C シミュレーションを行った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

RGB 24 ビットの AXI4-Stream データ入出力対応のガウシアン・フィルタを Vitis HLS 2023.1 で作成する1
RGB 24 ビットの AXI4-Stream データ入出力対応のソーベル・フィルタを Vitis HLS 2023.1 で作成した。
RGB 24 ビットの AXI4-Stream データ入出力対応のガウシアン・フィルタを Vitis HLS 2023.1 で作成する2
RGB 24 ビットの AXI4-Stream データ入出力対応のソーベル・フィルタを Vitis HLS 2023.1 で作成するということで、前回は、ソースコードとテストベンチコードを貼って、Vitis HLS 2023.1 で gaussian_axis_RGB24 プロジェクトを作成した。今回は、gaussian_axis_RGB24 プロジェクトで、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

Vitis HLS 2023.1 で RGB の各色を n 倍する color_converter_RGB24 IP を作成する2
Vitis HLS 2023.1 で RGB の各色を n 倍する color_converter_RGB24 IP を作成するということで、前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2023.1 で ZUBoard 1CG 用の color_converter_RGB24 プロジェクトを作成した。今回は、その color_converter_RGB24 プロジェクトで C シミュレーションを行った。
Vitis HLS 2023.1 で RGB の各色を n 倍する color_converter_RGB24 IP を作成する3
前回は、color_converter_RGB24 プロジェクトで C シミュレーションを行った。今回は、C コードの合成を行って、C/RTL 協調シミュレーションをしたが、まだ終了していない。
その後、C/RTL 協調シミュレーションを一度終了して、もう一度やり直したら終了した。
Export RTL と Implementation を行った。

メディアン・フィルタとガウシ アン・フィルタが RBG 出力でバグっていた
”ZUBoard 1CG の PYNQ v3.0.1 で自作の 4 個のフィルタを動作させる2”の次の課題の ZUBoard 1CG の PYNQ Linux の Jupyuter Notebook でテストしていたときに、どうにも色がおかしい事案が発生した。そこで、メディアン・フィルタとガウシアン・フィルタのコードを見たらフィルタの演算をして、出力するとこ ろで、RGB の順で出力するところ、RBG で出力するバグを発見した。これを修正する。
ガウシアン・フィルタの Vitis HLS 2023.1 を修正して、csim したらエラーになった
”メディアン・フィルタとガウシアン・フィルタが RBG 出力でバグっていた”でガウシアン・フィルタのコードを修正したので、もう一度、Vitis HLS で C シミュレーションしようとしたらエラーになった。
苦肉の策で、/snap/gnome-3-38-2004/140/usr/lib/x86_64-linux-gnu/libwebp.so.6.0.2 を /usr/lib にコピーして、libwebp.so.6 にリンクを貼ったら Vitis HLS 2023.1 の C シミュレーションが通った。

Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する1
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成しよう。ZUBoard 1CG 用とする。
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する2
前回は、RGB から HSV 色空間に変換する Vitis HLS 2023.1 プロジェクトの RGB24toHSV を作成し、ソースコードとテストベンチを貼った。今回は、C シミュレーションを行った。
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する3
前回は、RGB から HSV 色空間に変換する Vitis HLS 2023.1 プロジェクトの RGB24toHSV の C シミュレーションを行った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する4
”Vitis HLS 2023.1 で HSV を RGB に変換する IP を作成する2”で、RGB-HSV 変換し、HSV-RGB 変換して元の画像に戻らなかったので、RGB-HSV 変換 IP と HSV-RGB 変換 IP をもう一度検証してみることにした。まずは、RGB-HSV 変換 IP から検証してみよう。
ソースコードとテストベンチを修正したが、バグが残っていた。
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する5
前回は、バグがあったので、RGB-HSV 変換 IP から検証したところ、バグが見つかった。バグを修正したソースコードとテストベンチを示した。今回は、C シミュレーションを行った。
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する6
前回は、HSV - RGB 変換 IP の C シミュレーションを行った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。
Vitis HLS 2023.1 で RGB を HSV に変換する IP を作成する7
前回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行って、完成とするはずだったが、”Vitis HLS 2023.1 で HSV を RGB に変換する IP を作成する3”で、MAG = 16、つまり、小数点以下の桁が 16 ビットのほうが精度が良いとわかったので、今回は、それを修正し、更にテストベンチも浮動小数点数で演算した結果と比較することにした。結果として、任意精度固定小数点数 で演算した HSV 値と浮動小数点数で演算した HSV 値の差分が 1 より大きくはないことがわかった。
ソースコードとテストベンチを示した。

Vitis HLS 2023.1 で HSV を RGB に変換する IP を作成する1
Vitis HLS 2023.1 で RGB 色空間を HSV 色空間に変換する IP を作ってきたが、HSV 色空間を RGB 色空間に変換する HSVtoRGB24 IP を作ってみよう。
Vitis HLS 2023.1 で HSV を RGB に変換する IP を作成する2
前回は、ソースコード、テストベンチを貼って、Vitis HLS 2023.1 の HSVtoRGB24 プロジェクトを作成した。今回は、C シミュレーションを行った。RGB の画像を RGB色空間から HSV 色空間に変換して、HSV から RGB に変換したところ元画像に戻らなかった。
Vitis HLS 2023.1 で HSV を RGB に変換する IP を作成する3
前回は、C シミュレーションを行った。RGB の画像を RGB色空間から HSV 色空間に変換して、HSV から RGB に変換したところ元画像に戻らなかった。今回は、バグを見つけ、コードを修正して、ほとんど元画像に戻すことができるようなった。また、元画像と RGB - HSV - RGB 変換した画像を元画像の 2 乗誤差を 4 以内に収めるには、RGB - HSV 変換 IP と HSV - RGB 変換 IP の固定小数点数の小数点以下を 16 桁にする必要があった。
Vitis HLS 2023.1 で HSV を RGB に変換する IP を作成する4
前回は、バグを見つけ、コードを修正して、ほとんど元画像に戻すことができるようなった。ま た、元画像と RGB - HSV - RGB 変換した画像を元画像の 2 乗誤差を 4 以内に収めるには、RGB - HSV 変換 IP と HSV - RGB 変換 IP の固定小数点数の小数点以下を 16 桁にする必要があった。C シミュレーションを行った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

HSV の値を変更する HSVConverter を作る1
これまで、RGB-HSV 変換 IP と HSV-RGB 変換 IP を作ってきたが、HSV の値を変更する HSVConverter IP を Vitis HLS 2023.1 で作成しよう。
仕様を検討した。
HSV の値を変更する HSVConverter を作る2
前回は、これまで、RGB-HSV 変換 IP と HSV-RGB 変換 IP を作ってきたが、HSV の値を変更する HSVConverter IP を Vitis HLS 2023.1 で作成しようということで、概要を述べた。今回は、ソースコードの HSVConverter.cpp とテストベンチの HSVConverter_tb.cpp を示して、Vitis HLS 2023.1 の HSVConverter プロジェクトを作成した。
HSV の値を変更する HSVConverter を作る3
前回は、ソースコードの HSVConverter.cpp とテストベンチの HSVConverter_tb.cpp を示して、Vitis HLS 2023.1 の HSVConverter プロジェクトを作成した。今回は、C シミュレーションを行った。
HSV の値を変更する HSVConverter を作る4
前回は、HSVConverter の C シミュレーションを行った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

Vitis Unified IDE 2023.2 の HLS Development を試す1
Vitis Unified IDE 2023.2 の HLS Development を試してみようということで、HLS コンポーネントの HSVConverter プロジェクトを作成することにした。しかし、プロジェクトが作れなかったが、Settings 画面の項目を全て記入したところ HSVConverter プロジェクトを作成することができた。
Vitis Unified IDE 2023.2 の HLS Development を試す2
Vitis Unified IDE 2023.2 の HLS Development を試してみようということで、前回は、HLS コンポーネントの HSVConverter プロジェクトを作成することにした。やってみたところ、プロジェクトが作れなかったが、Settings 画面の項目を全て記入したところ HSVConverter プロジェクトを作成することができた。今回は、hls_config.cfg と vitis-comp.json を見て、ソースファイルとテストベンチファイル、画像ファイルをコピーした。コピーしたファイルを Vitis Unified IDE に登録して、C シミュレーションを行ったが、エラーになった。
Vitis Unified IDE 2023.2 の HLS Development を試す3
前回は、hls_config.cfg と vitis-comp.json を見て、ソースファイルとテストベンチファイル、画像ファイルをコピーした。コピーしたファイルを Vitis Unified IDE に登録して、C シミュレーションを行ったが、エラーになった。今回は、hls_config.cfg に OpenCV のインクルードパスとリンカー・オプションを設定したところ C シミュレーションが通った。
Vitis Unified IDE 2023.2 の HLS Development を試す4
前回は、hls_config.cfg に OpenCV のインクルードパスとリンカー・オプションを設定したところ C シミュレーションが通った。今回は、C コードの合成を行った。Function Call Graph を表示しようとしたらフリー・ライセンスが必要ということなので、ライセンスを取得したら、Function Call Graph、Schedule Viewer を表示することができた。
Vitis Unified IDE 2023.2 の HLS Development を試す5
前回は、C コードの合成を行った。Function Call Graph を表示しようとしたらフリー・ライセンスが必要ということなので、ライセンスを取得したら、Function Call Graph、Schedule Viewer を表示することができた。今回は、C/RTL 協調シミュレーションを行った。最初に trace_level を port にしたところ、C/RTL 協調シミュレーションが終了しなかった。trace_level を none にしたら、終了した。もう一度、trace_level を port にして、wave_debug にチェックを入れたところ、波形を確認することができた。
Vitis Unified IDE 2023.2 の HLS Development を試す6
前回は、C/RTL 協調シミュレーションを行った。最初に trace_level を port にしたところ、C/RTL 協調シミュレーションが終了しなかった。trace_level を none にしたら、終了した。もう一度、trace_level を port にして、wave_debug にチェックを入れたところ、波形を確認することができた。今回は、Export RTL と Implementation を行った。

Vitis Unified IDE 2023.2 で平均化フィルタの average_axis_RGB24 を実装する1
Vitis Unified IDE 2023.2 で画像フィルタの一種である平均化フィルタを実装してみよう。使用する FPGA ボードは AVNET 社の ZUBoard 1CG とする。
Vitis Unified IDE 2023.2 で平均化フィルタの average_axis_RGB24 を実装する2
Vitis Unified IDE 2023.2 で画像フィルタの一種である平均化フィルタを実装するということで、前回は、Vitis Unified IDE 2023.2 で ZUBoard 1CG 用の average_axis_RGB24 プロジェクトを作成し、OpenCV を使用できる設定を行った。また、ヘッダ・ファイル、ソースコード、テストベンチのコードを示した。今回は、C シミュレーションと C コードの合成を行った。
Vitis Unified IDE 2023.2 で平均化フィルタの average_axis_RGB24 を実装する3
前回は、C シミュレーションと C コードの合成を行った。今回は、C/RTL 協調シミュレーションを行ったところ、エラーになった。Package と Implementation を行った。
Vitis Unified IDE 2023.2 で平均化フィルタの average_axis_RGB24 を実装する4
前回は、C/RTL 協調シミュレーションを行ったところ、エラーになった。Package と Implementation を行った。今回は、C/RTL 協調シミュレーションするために HLS プロジェクトを新規作成して、C/RTL Cosimulation を行ったところ成功した。

Vitis Unified IDE 2023.2 で最小値フィルタ、最大値フィルタの min_max_axis_RGB24 を実装する1
Vitis Unified IDE 2023.2 で最小値フィルタ、最大値フィルタの min_max_axis_RGB24 を実装してみよう。
Vitis Unified IDE 2023.2 で最小値フィルタ、最大値フィルタの min_max_axis_RGB24 を実装する2
前回は、Vitis Unified IDE 2023.2 で min_max_axis_RGB24 プロジェクトを作成し、ソースコードとテストベンチを示した。今回は、C シミュレーションと C コードの合成を行った。
Vitis Unified IDE 2023.2 で最小値フィルタ、最大値フィルタの min_max_axis_RGB24 を実装する3
前回は、C シミュレーションと C コードの合成を行った。今回は C/RTL 協調シミュレーション、Package、Implementation を行った。

Vitis Unified IDE 2023.2 でメディアンフィルタの median_axis_RGB24 を実装する1
”RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する1”のメディアンフィルタは 3 x 3 ピクセルの領域から、RGB それぞれの中央値を見つけるソースコードだったが、それでは、ピクセルを合成していることになってしまう。各ピクセルを輝度値に直して、中央値になるピクセルを見つけ、そ のピクセルをメディアンフィルタの値とする必要があるので、実装し直すことにした。
Vitis Unified IDE 2023.2 でメディアンフィルタの median_axis_RGB24 を実装する2
メディアンフィルタの median_axis_RGB24 がバグっていたので作り直すということで、前回は、Vitis Unified IDE 2023.2 で median_axis_RGB24 プロジェクトを作成し、設定を行った。そして、ソースコードとテストベンチを示した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Package、Implementation を行った。

Vitis Unified IDE 2023.2 でアンシャープマスクキング・フィルタの unsharp_masking_axis_RGB24 を実装する1
以前にもアンシャープマスキング・フィルタを実装したことがあったが、実装し直すことにして、Vitis Unified IDE 2023.2 でアンシャープマスクキング・フィルタの unsharp_masking_axis_RGB24 を実装した。
Vitis Unified IDE 2023.2 でアンシャープマスクキング・フィルタの unsharp_masking_axis_RGB24 を実装する2
前回は、Vitis Unified IDE 2023.2 で ZUBoard 1CG 用のアンシャープマスクキング・フィルタの unsharp_masking_axis_RGB24 プロジェクトと作成し、ソースコードとテストベンチを書いた。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Package、Implementation を行った。

Vitis Unified IDE 2023.2 でラプラシアン・フィルタの laplacian_axis_RGB24 を実装する1
Vitis Unified IDE 2023.2 でラプラシアン・フィルタの laplacian_axis_RGB24 を実装してみよう。
Vitis Unified IDE 2023.2 でラプラシアン・フィルタの laplacian_axis_RGB24 を実装する2
ラプラシアン・フィルタもたくさん実装しているが、改めて実装してみるということで、前回は、 Vitis Unified IDE 2023.2 で ZUBoard 1CG 用のラプラシアン・フィルタの laplacian_axis_RGB24 プロジェクトと作成し、ソースコードとテストベンチを書いた。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Package、Implementation を行った。

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する1
Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装してみよう。
エッジ強調フィルタは画像の輪郭を強調して、画像をはっきりさせるためのフィルタだ。
Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する2
Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装するということで、前回は、、Vitis Unified IDE 2023.2 で ZUBoard 1CG 用のエッジ強調フィルタの edge_enhancement_axis_RGB24 プロジェクトと作成し、ソースコードとテストベンチを書いた。今回は、C シミュレーション、C コードの合成を行った。
Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する3
前回は、C シミュレーション、C コードの合成を行った。今回は、C/RTL 協調シミュレーション、Package 、Implementation を行った。

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する1
Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したい。というのも、Bambu では画像の縦、横のピクセル数の設定を入力ポートでしか設定できなようだからだ。つまり、プロセッサから自由に画像サイズを設定したいということで、Vitis HLS 2023.2 で作成することにした。
Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する2
Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したいということで、前回は、Vitis 2023.2 で ZUBoard 1CG 用の HLS Development プロジェクトの median_reg プロジェクトを作成した。今回は、median_reg.cpp と median_reg_tb.cpp を貼って、C シミュレーションと C コードの合成を行った。
Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する3
前回は、median_reg.cpp と median_reg_tb.cpp を貼って、C シミュレーションと C コードの合成を行った。今回は、C/RTL 協調シミュレーションと Package, Implementation を行った。




inserted by FC2 system