#概要
以前,「FPGA上で動くニューラルネットワーク・ジェネレータを作った」で公開したニューラルネットワーク・ジェネレータで出力したソースコードをFPGA実機Atlas-SoC(DE0-Nano-SoC)で動かしてみました.
リポジトリはここ
https://github.com/kotauchisunsun/DE0_NN
#ライセンス
Affero GPL v3
DE0-Nano-Socのスイッチを入力,LEDを出力としてニューラルネットワークの挙動をします.
スイッチをonにすると1が代入され,offにすると0が代入されるようになっています.
SW[0]を入力1
SW[1]を入力2
SW[2]を左上のニューラルネットワークの出力と右上のニューラルネットワークの重み係数
SW[3]を左下のニューラルネットワークの出力と右上のニューラルネットワークの重み係数
に割り当てています.また,
右上のニューラルネットワークが発火すると,LED[0]が点灯
右下のニューラルネットワークが発火すると,LED[1]が点灯
という風な機能になっています.
#準備
##ソースコードの生成
この作業は上記リポジトリからコピーする方は不要です.
「FPGA上で動くニューラルネットワーク・ジェネレータを作った」で用いたニューラルネットワーク・ジェネレータを使います.
をcloneしてきます.
$ cd NN_FPGA
$ python script/main.py 16 2 2 2
> NN_NL_016_0002_0002_NL_016_0002_0002
> saved to generate.v
> None
これでgenerate.vというファイルが生成され,メインのニューラルネットのモジュールのNN_NL_016_0002_0002_NL_016_0002_0002というモジュールが生成されました.
##ひな形のダウンロード
Atlas-SoCとDE0-Nano-SoCはハード的には同じで,ファームウェアが違うだけのものです.
そのため,SDカードでファームウェアを書き換えることで,DE0-Nano-SoCとAtlas-Socを変更することができます.
今回は,以下のリンクのDE0-Nano-SoCのSystemCDというデータを用います.
##デモプロジェクトのコピー
先ほどダウンロードしたファイルを解凍し,
DE0-Nano_SoC_v.1.0.9_SystemCD\Demonstrations\SoC_FPGA\my_first_hps-fpga_base
my_first_hps-fpga_baseをコピーして用います.
##ソースコードの編集
先ほどのリポジトリ https://github.com/kotauchisunsun/DE0_NN or 生成したgenerate.v をプロジェクトに追加します.
追加の仕方は詳しくは解説しませんが,メニューバーの[Project] -> [Add Current File to Project]から追加できます.
そののち,プロジェクト内にあるghrd.vを編集します.
これは少し特殊で,ghrd.vの271行目,endmoduleの前にリポジトリのdiff_ghrd.vの内容をコピペしてください.
(回りくどい書き方をしているのはghrd.v自体のライセンスがよくわからないので,リポジトリにあげると問題が発生する可能性があるためです.)
##実機動作
あとはコンパイルして,ProgrammerでDE0-Nano-SoCに焼いてください.
#テストケース
実際に動かしてみないとわからないと思うので,テストケースを用意しました.
これらを試してみると,実際にニューラルネットが稼働している様子が確認できます.
SW[0] | SW[1] | SW[2] | SW[3] | LED[0] | LED[1] |
---|---|---|---|---|---|
off | off | off | off | off | off |
on | off | off | off | off | on |
off | on | off | off | off | on |
on | on | off | off | off | on |
on | off | off | on | on | on |
off | off | off | on | off | off |
off | off | on | on | off | off |
(備考) SW[2]=on SW[3]=onのとき,LED[0],LED[1]はSW[0]とSW[1]のOR出力になっていることが分かります.
#まとめ
「FPGA上で動くニューラルネットワーク・ジェネレータを作った」で作ったニューラルネットワーク・ジェネレータ(もしくはそれから生成されたコード)を用いて,DE0-Nano-SoC(Atlas-SoC)で動くニューラルネットワークを作成し,実際動作することが確認できました.