2019/03/31

Arty に Microblaze を導入して、カスタムペリフェラルを組み込んでみる

FPGA などで RTL で作ったハードワイヤードの回路というのは全くもって融通が利かないし、かといってシビアなタイミングや本当の並列動作はプロセッサと組み込みのソフトでは厳しいですよね?

「だったら両方入ってればいいじゃん!」

はい、どっちも入れましょう。プロセッサ+カスタムペリフェラルという形で。仕事じゃないので好き放題できます(笑)

手元には二年半ほど前に買って、埃をかぶっている Arty が転がっているのでこれを使います。今回はプロセッサには流行りの RISC-V は今回は敬遠して、Arty に簡単に導入できる Microblaze を採用してみます。ちなみに Microblaze も RISC プロセッサです。RISC プロセッサに関してはこちらの有名な本をどうぞ。

Arty

ところで Arty は Digilent の FPGA 評価ボード。いくつか種類があるんですが、入手性はどうなんだろう?特にこの安い無印 Arty。これは確か DigiKey で購入したような。。秋月でも取り扱いがあります(2019.3)。他には Avnet から直接購入することも出来るようです。

Microblaze は Arty 以外でも導入することが出来るので、Arty にこだわる必要はありません。ただ、Arty 安いし、小型なので Cafe でデバッグ出来ますよ(笑)

さて前置きはこれぐらいにして、Arty に Microblaze を導入して、AXI バスに適合するペリフェラルを作って、Microblaze にくっつけましょう。最後に Microblaze に豊四季タイニーBASICを移植して、カスタムペリフェラルを BASIC から動かせるようにしてみます。
それでは、

  • Microblaze を組み込む
  • カスタムペリフェラルを作って Microblaze にくっつける
  • 豊四季タイニーBASICを移植する

を順に追っていきたいと思います。

  1. Microblaze を組み込む
    Arty に関しては沢山のドキュメントが揃っています。これを参考にします。豊四季タイニーBASICを動かすことを目標にしているので、Getting Started with Microblaze がぴったりです。Microblaze と UART (シリアル) が入っているだけですが、豊四季タイニーBASIC はシリアル端末で動作させる仕様なので十分です。とりあえずこのチュートリアルに従って Microblaze を入れてみましょう。
    ここで注意点が1つ。Xilinx の FPGA のツール Vivado の最新版 2018.3 (2019.3 時点)がこのチュートリアルに沿って Microblaze を導入しようとすると途中でコケます。あまり深く追求したく無いので、とりあえず 2016.4 を導入してみたらこのチュートリアル通りにはできましたのでこのバージョンで試した結果を書いておきます。そのうち新しいバージョンでも再度挑戦してみようとは思いますが、めんどくさいのでいつになるやら。あと高位合成などしないので、フリーのライセンスで OK。あと、Microblaze のプログラムをコンパイルするために Vivado のインストール時に XSDK もインストールすることをお忘れなく。
    とりあえず適当なターミナルソフト(チュートリアルでは Tera Term 使ってる)で Hello World が出ればよしです。ここで作るプロジェクト名はチュートリアルと同じ Arty_GSMB にしておきます。
  2. カスタムペリフェラルと作って Microblaze にくっつける
    AXI バスに適合したインターフェースを持つ回路を用意できればいいのですが、Vivado では AXI スレーブ・マスターのひな型を作ることができて、ライブラリに登録されるので、他のプロジェクトから簡単に導入できるんですね。AXI バスとひな型の作り方はこちらのブログで紹介されているので、こちらを参考にしました。

    とりあえず、電子工作をまったく行わずに独自のペリフェラルを作ってみます。
    題して
    「2倍演算機!」
    です。

    32bit のデータを与えるとそのデータを二倍にして返すというとてもシンプルな回路です。ペリフェラルにデータを与えて結果を受け取るという基本中の基本ができればあとは応用ですから。

    Microblaze において AXI バスのペリフェラルはメモリマップドI/Oと言って、そのインターフェースはメモリー上に位置しています。プログラムから見れば特定のアドレスにデータを読み書きすることでペリフェラルにアクセスすることができます。

    こんな感じ。

    ではさっそくカスタムペリフェラルを作ってみます。ここからは先ほどのブログと被るところが多々ありますが、一応書いておきます。
    最初に上記のチュートリアルで作成したプロジェクト Arty_GSMB を開いているならば、Vivado のメニューの Tools から、Create and Package New IP をクリックします。



    Create a new AIX4 peripheral を選択して Next。



    IP の Name を適当につけてあげます。alu_double にしました。



    AXI バスのインターフェースを決めます。割り込みの信号もここで用意できるみたいですが、今回はいらないので有効にしません(今度試してみよう)。Lite, Slave でバス幅を 32、レジスターの数も最小の 4 にしておきます。



    ひな型ができたらすぐ編集するので、Edit IP を選択して Finish。



    続いて Project Manager の Hierarchy の Design Sources の下にある alu_double_v1_0_S00_AXI をダブルクリックするとひな型のコードが右側に現れます。



    このコードには以下の4つのレジスタ slv_reg0,1,2,3 を AXI バスから読み書きするという簡単なコードが書かれています。ここに値を二倍する回路を組んでいきます。



    二倍演算といっても、C などのプログラミング言語で左に1ビットシフトすればよいだけですよね。RTL でも一緒です。そこで、slv_reg0 に書かれた値を二倍して、本来 slv_reg3 を読み出す代わりに、二倍された値を読み出せるようにします。ちなみに slv_reg0 を読み出す代わりに演算した結果でもいいんですけど、ここではあえてそうしてみました。以下の always 文は、指定されたアドレスの値を読み出し用のデータバスに出力するマルチプレクサのコードです。マークしたところが書き換えた部分。簡単ですね。実際合成される回路ではビットシフトは LSB には GND が接続され、他は単なる配線の付け替えという論理回路の消費ゼロなお手軽な演算回路が出来上がります。これでも立派な演算回路ですよね(笑)



    ではここで、最初に作ったプロジェクト Arty_GSMB に戻ります。Project Manager の Design Sources から system_wrapper の下の system_i をダブルクリックするとブロックダイアグラムが開きます。





    ダイアグラムエディタの左にある Add IP アイコンをクリックして、Search で alu とタイプしてみると、先ほど作成した alu_double がみつかります。ENTER して追加すると、ブロックエディタにこの IP がインスタンスされます。



    Run Connection Automation をクリックすると



    以下のようなウィンドウが現れるので、そのまま OK すると AXI バスに自作 IP を自動的に接続してくれます。アドレスのアサインも適宜おこなってくれています。回路作成はこれでおしまい。簡単ですね。素晴らしい!



    新しく作成した回路の Bitstream を生成して、XSDK にエクスポートしておきます。これは最初に Microblaze を組み込んだ時と一緒です。エクスポートする際には Include bitstream にチェックすることを忘れないように。




    以上で HW の作成はおしまいです。豊四季タイニーBASICの移植は分けてアップします。

    それにしても、AXI スレーブのひな形がかんたんに作れて、接続できてしまうのはいいなぁ。仕事ではこういったのは全て手で書き起こしていたのでとても便利に感じます。












0 件のコメント: