More Related Content
Similar to fpgax #13.pptx (20)
fpgax #13.pptx
- 2. 自己紹介
● lp6m / Yasuhiro Nitta
● https://github.com/lp6m
● Twitter: @lp6m1
● 所属: 株式会社Fixstars
- 4. 第5回コンテスト内容
● 対象ボード: Ultra96-V2
● 開催期間: 2021/10/18~2022/2/15
● 会社の同期とチームVertical_Beachとして参加
● 今日はHW実装, VexRiscvの話をします
https://signate.jp/competitions/537
https://www.avnet.com/wps/portal/japan/pro
ducts/product-highlights/ultra96/
- 7. 開発方針
● 物体追跡アルゴリズム
○ Tracking-by-detection 方式を採用
○ 物体検出・物体追跡を分けて実装を進められる
○ 物体検出は Xilinx DPU を使用して実装を容易に
● RISC-V
○ オープンソースの命令セットアーキテクチャをもつCPU
○ オープンソースな実装が手に入れられる
■ VexRiscv/RocketChip/etc..
○ 今回はVexRiscvを使用
■ Scala DSL SpinalHDL製
■ プラグイン形式で色々なアーキテクチャのコアが生成
できる
- 8. システム概要
● HW構成
○ 対象ボード: Ultra96v2
○ Xilinx DPU + RISC-V
■ DPU: B1600
150/300MHz
■ RISC-V: VexRiscv
rv32imfac 150MHz
● SW構成
○ 物体検出アルゴリズム: YOLOv4-tiny
■ Xilinx DPU にオフロード
○ トラッキングアルゴリズム: ByteTrack
■ ARM コアで処理
■ 線形割当問題のハンガリアン法を RISC-V にオフロード
Xilinx DPU
RISCV
PL
PS
Cortex-A53
- 9. DPU
● Xilinx DPU (Deep-Learning Processor Unit) IP
● Vitis-AI: DPU向けの開発環境
○ Tensorflow/Caffe/PyTorch のモデルをサポート
○ モデルの量子化・DPU向けにモデルをコンパイル
○ VART(Vitis-AI Runtime)を使用してARMコアから制御
● 並列度の異なる複数のIPが存在
○ 比較的小さいB1600を採用
Vitis-AI: https://japan.xilinx.com/products/design-tools/vitis/vitis-ai.html
- 13. RISC-V + DPU HW構成の構築
● DPUを搭載するにはVitisを使用する必要がある
○ Vivadoのみのフロー も存在するがVARTとの連携が難しかった為不採用
● VitisではベースとなるVivadoプロジェクトにDPUを「アクセラレーショ
ンカーネル」として追加する
○ ブロックデザインにIPが自動的に追加される
○ RISC-Vを搭載したデザインをベースプロジェクトにし、VitisでDPUを追加する
Vitisにより作成されたRISC-V+DPUなブロックデザイン
- 17. ● VexRiscvをUltra96-V2で動作させるためのガイド
○ わりとがんばって書きました
○ https://github.com/lp6m/VexRiscv_Ultra96
● AIエッジコンテスト 提出物
○ 整理中
○ ByteTrackの改善手法などについても書いています
○ https://github.com/Vertical-Beach/ai-edge-contest-5
● 個人参加記
○ https://lp6m.hatenablog.com/entry/2022/03/02/234343
第6回エッジAIコンテストもあるそうなので、ぜひ参加してみてください
GitHubなど
Editor's Notes
- クロスコンパイル環境の構築について説明します。
crosstool-NGというクロスコンパイラを簡単にビルドできるツールがあるので、今回はそれを使ってコンパイラをビルドしました。
RISCーVで実行したいプログラムをコンパイルし、コンパイルされたオブジェクトからRISC-V命令列を「この図」に示すような配列の形でダンプするプログラムを使っています。
RISCーVコアはARMコアから駆動されるので、ARMコアで実行する評価アプリケーションをビルドするときに、このソースコードと一緒にコンパイルすることができるので利用しやすくなっています。
リンカスクリプトに施した工夫について説明すると、下の図の通り今回のデザインでは命令BRAMに64K、データBRAMに128Kの範囲を割り当てているのですが、
リンカスクリプトではデータBRAMは前半64Kのみを使用するようにしています。
後ろ64KはRISCーVで実行するプログラムが使用する入出力データ用に確保するために、今回はこういった形になっています。
- ARMコアからRISC-Vコアが駆動される様子について説明します。
右側がRISC-Vコアで実行されるプログラムで、先程説明したとおりコンパイルされたRISC-V向け実行命令列は配列の形で出力されます。
左側がARMコアで実行されるRISC-V実行用アプリケーションです。
まず最初にRISC-Vの実行命令列をBRAMに書き込み、そのあと入力データをセットし、pl_resetn1をリセットします。
ここでは簡単のためにRISC-Vの実行完了はsleepでしていますが、コンテストではポーリング方式を使用しました。
最後にRISC-Vが書き込んだ結果を参照してテスト完了となります。