Vitis/Vivado 2020.1でMicroBlazeを使う

Vitis/Vivado 2019.2ではVivado SDKがなくなり、ソフトウェア開発はVitisに統合されました。MicroBlazeを使う場合もVivadoでハードウェアモジュールを組み立ててVitisでソフトウェアの開発をします。

この記事は、Vivado 2020.1でArtyを対象にMicroBlazeを使った開発をする手順のメモです。

Vivadoでハードウェアモジュールを作る

Vivadoでのおおまかな開発の流れは次のとおりです。

  • IP IntegratorでMicroBlazeデザインを用意
  • generate bitstreamでbitファイルを作成
  • 「export Hardware」→「Fixed」→include bitstreamで、.xsaファイルを作る

IP IntegratorでMicroBlazeデザインを用意する

プロジェクトを作成して、Create Block DesignをクリックしてIP Integratorを起動します。とりあえず主役(?)のMicroBlazeを置きます。

Run Block AutomationをクリックしてMicroBlazeの設定をします。ここでは、Local Memoryを32KBに設定。

Run Block Automationが終わるとクロック(clk_wiz_1)やリセット(rst_clk_wiz_1_100M)などのモジュールが追加されます。ついでに、UART(axi_uartlite_0)とGPIO(axi_gpio_0)のインスタンスも追加しました。

clk_wiz_1を設定。入力クロックをSingle ended clock capable pinにリセットの極性をActive Lowにセット。

設定したら Run Connection Automationでクロックの入力信号を外に引き出す

リセットモジュールのext_reset_inも外に出力。

GPIOはLED出力とスイッチ入力に割り当てる

設定したら Run Connection Automationで、全部接続。

最終的には、こんな感じに。

メモリマップはこんな感じ

bitファイルを生成

IPIで作ったブロックのラッパーモジュールを作って合成。ラッパーモジュールはいつものようにCreate HDL Wrapperで生成。

ハードウェアのエクスポート

Vitisでのソフトウェア開発用にハードウェア情報をパックします。まずは、File → Export → Export Hardware…でウィザードを開きます。

ウィザードで、Fixedを選択してNext

Include bitstreamを選択してNext

エクスポート先は適当に決めます。ここではプロジェクト直下が指定されています。エクスポートされるファイルの拡張子は .xsa です。Next→Finishでエクスポート完了。

Vitisでソフトウェア開発

おおまかな流れは次の通り。

  • Vivado プロジェクトの下に作業ディレクトリを作成
  • プロジェクトの作成とXSAの読み込み
  • とりあえずのHello World

作業ディレクトリの作成

作業ディレクトリはVitis起動時に用意します。ここでは、Vivadoプロジェクトの下にvitisという名前のディレクトリを作成してみました。

Eclipseのウェルカムウィンドウが表示されます。

Create Application Projectをクリックして、プロジェクト作成ウィザードを開きます。

プロジェクトの作成とXSAの読み込み

ウィザードを使ってソフトウェア開発用のプロジェクトを作成します。

Create a new platform from hardware (XSA) タブを選択して、Vivadoで作ったxsaファイルを指定します。

アプリケーションプロジェクト名は hello_world とつけてみました。

XSA(ハードウェア)とアプリケーションソフトウェアの間に位置するドメインの設定です。今回はMicroBlazeが一つですしOSものせないので、そのまま次にすすめます。

アプリケーションの雛形を選ぶことができるので、Hello Worldを選択して Finish をクリックします。

Hello World

プロジェクト作成ウィザードを閉じると作成したアプリケーション開発用のウィンドウが開きます。ツールバーの、ハンマーアイコンでプロジェクトをビルドします。

ソフトウェアのビルドが終わったら実行前に、FPGAをコンフィギュレーションします。メニューのXilinx→Program FPGAをクリックします。

FPGAのコンフィギュレーションダイアログです。xsaにビットストリームを含んでいれば、そのビットストリームが選ばれています。もちろん、別途ビットストリームファイルを選択しても構いません。

FPGAをコンフィギュレーションしたらソフトウェアの実行です。 hello_worldの下のBinariesの下にあるhello_world.elfを選択して、ツールバーの虫アイコン右の矢印をクリック、Launch on Hardware (Single Application Debug)をクリックします。

デフォルトでinit_platform()のところにブレークポイントがセットされていて一旦停止するので、ツールバーの再生ボタン(Resume)をクリックして、プログラムを実行します。

UARTが接続されたターミナル /dev/ttyUSB1 とかを開いておくと、無事にHello Worldが表示されることが確認できます。

GPIO経由でLEDを点灯させることもできます。たとえば、ソースコードはこんな感じ。

int main()
{
    init_platform();

    print("Hello World\n\r");
    print("Successfully ran Hello World application");

    volatile unsigned int * led = (volatile unsigned int*)0x40000000;
    int i = 0;
    for(int i = 0; i < 256; i++){
    	*led = i;
    	xil_printf("%d\n\r", i);
    	usleep(500000);
    }

    cleanup_platform();
    return 0;
}

実行すると、500m秒ごとにカウント値が表示されてLEDも点滅します。

Intel PAC向けに既存のstpファイルを埋め込む

Intel PACの動作を波形レベルでデバッグしたい場合、mmlinkを使ってデバッグすることができます。新しくstpファイルを作成する場合、Intel PACにSignal Tapを仕込むの手順でデバッグ可能なFPGA用ビットファイルを作ることができます。

ですが、stpファイルと設定済のafu_synth_setup向けファイルが存在している場合に、

$ afu_synth_setup --source hw/rtl/filelist.txt  build_synth
$ cd build_synth/
$ {OPAE_PLATFORM_ROOT}/bin/run.sh

とゼロからビルドすると、うまくデバッグ可能なFPGA用ビットファイルを生成することができませんでした。毎回stpファイルをSignal Tap Logic Analyzerで作成しデザインに組み込むのは面倒なので、回避策が欲しいところ。というわけで、以下が回避方法です。

続きを読む

Intel PACにSignal Tapを仕込む

Intel PACはmmlinkを使って、あたかも実機とJTAGと接続しているようにSignal Tapで信号の変化を観察してデバッグできます。
Accelerator Functional Unit Developer’s Guide for Intel(R) FPGA Programmable Acceleration Cardの6. AFU In-System Debugを見ながら作業すればよい、のですが、環境によるパラメタの設定が若干わかりづらかったので、hello_afuにSignal Tapを仕込む場合の実例を紹介します。
信号見えるまでは、何が悪いのか分からず不安ですから…

続きを読む

ad-refkitでFPGAの再コンフィギュレーション

ad-refkit では githubにあるXilnxリポジトリのLinuxカーネルを利用しています。これは、ZYNQ PLのコンフィギュレーションに /sys/kernel/config/device-tree/overlays を使います。

ad-refkitの場合 init.sh の実行中にFPGAのコンフィギュレーション処理が含まれていますが、マニュアルで実行したい場合は次の手順で。

python3 fpga-bit2bin.py --flip design_1_wrapper.bit fpga.bin
cp /home/user/fpga.bin /lib/firmware/
rmdir /sys/kernel/config/device-tree/overlays/fpga # if exists
mkdir -p /sys/kernel/config/device-tree/overlays/fpga
dtc -I dts -O dtb -o fpga.dtb fpga.dts
cp fpga.dtb /sys/kernel/config/device-tree/overlays/fpga/dtbo

fpga-bit2bin.pyは github からダウンロードできます。

再コンフィギュレーションする場合には一度 rmdir で overlays の下の fpga ディレクトリを削除するのが肝。rm -rf ではないので注意。

GPU拡張ボックスでAlveo U50を使ってみる

PCIeタイプのFPGAを使おうと思うとどうしてもシステムがおおきくなりがちです.ちょっと持ち運んで使いたい場合を想定してGPU拡張ボックスに接続してみました.

フルレングス・フルハイトのGPUも入るボックスなだけあって,Alveo U50は余裕で入ります.なんか,上も結構あいてるから少し前のFPGA評価ボードを入れてもよいかも.

Alveo U50の場合,PCIe x16でデスクトップPCに接続した場合と比べて,転送性能が1/8程度しか出ないものの,とりあえず認識して使えることが確認できました.

続きを読む

Alveo U50で100GbEを使ってみる

XilinxのFPGAボード Alveo U50には,100GbEのポートが用意されています.内蔵されている100GbEコアを使うと,結構簡単にでデータのやりとりができます.

というわけで,とりあえず,Alveo U50の100GbEを使ってみた手順の紹介です.

これは,およそ9000バイトのデータが233サイクル@322MHz(おそらく)で受信されてる様子.

関連情報

続きを読む

Alveo U50のセットアップをする

HBMを搭載したAlveo U50をセットアップしてみました.セットアップ対象は,x86_64の普通のパソコンです.スペックは,

  • CPU: Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz
  • メモリ: MemTotal: 64GB  DDR4 2400 MT/s

OSはUbuntuで18.04で,詳細は次の通り.

$ uname -a
Linux dev-8800 4.15.0-74-generic #84-Ubuntu SMP Thu Dec 19 08:06:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

Vitisの正式サポートはUbuntu 18.04.2までなのですが,とりあえず動作は確認できました.
重要なのは,libjson-glibとunzipのインストールです.

続きを読む