JavaとPythonでFPGA回路設計をするための開発環境作ったよ
どうも,まるさ@maruuusa83です.
ひさしぶりに真面目に技術っぽい記事かきます.
現在ぼくは,コンピュータ・アーキテクチャあたりの単語をキーワードとしている研究室で活動をしています.
もともとずっとソフトやってたのでヒーヒー言ってます.
高位合成(HLS, High Level Synthesis)という技術がホットだそうで,色々あってツールを統合するツールを作りました.
PyJer: JavaとPythonでサクッとZedBoardアプリを設計するよ!なフレームワーク
Java言語ベースの高位合成ツールSynthesijerと PythonベースのIPコア合成フレームワークPyCoRAMを組み合わせていい感じにサクッとZynqアプリがつくれます.
まだREADME雑にしか作ってないですがご勘弁を.
今回作ったフレームワークの嬉しいところは,JavaとPythonでロジックを書いたらあとはBOOT.binの生成まで勝手にやってくれるところです.
ぼくはこいつをGitlab CIに食わせてDropboxに出来上がったBOOT.binを投げ込んでくれるようにしています.
OS載せたZynqを想定しているので,ビルドをフックさせて自動デプロイまでできると思います.
どんなもの?
次のようなアーキテクチャのハードウェアの構築のためのフレームワークです.
ハードウェアの概略構成
このような構成に限定しているために,BOOT.binの生成まで勝手にやってくれます.
赤枠が自分で実装することになる部分です.
IoTデバイスのような,外部回路(センサなど)からデータを受け取ってインターネットへ出力するデバイスの プロトタイピングのためのツールとして作成しました.
User Logicの領域は主にJava言語のフツーのプログラムとして記述します.
Synthesijerを用いた高位合成によってハードウェアが合成されます.
ぼくは外部回路との通信などクロックレベルのタイミング管理が必要な部分はVerilogで書いてJava側から呼び出しています.
PSとPLの間のデータ共有は,PyCoRAMが生成するCoRAMアーキテクチャを使って行ないます.
そのため,Data Flow ControllerはPythonによって記述することになります.
User Logicで処理したデータはDRAMに転送できるので,Linux上のプログラムから自由にデータを使うことができます.
つかいかた
(v0.2.1時点での使い方です.この後変更の予定があります.詳細な使い方はまた別にまとめます.)
1.前提
- Linuxディストリビューション上で動作させる
- Java SE 8, python3, jinjer2が入っている(Synthesijer,PyCoRAMに必要な環境)
- 高前田先生のPyCoRAM導入の資料の「Linuxカーネルイメージ作成」~「SDカードへの書き込み」の準備を行ったZedBoardがある
- Vivadoが導入されていて,コマンドラインからbatchモードが使える
- Vivado SDKもコマンドラインからbatchモードが使える
2.導入
とりあえずGithubからcloneしてきます.
cloneが済んだらmake init
してみてください.
このコマンドでSynthesijerとPyCoRAMがプロジェクト内にクローンされます.
いちおう,make test
というコマンドを用意しています.サンプルプロジェクトを展開してビルドしてcleanするというもので,
きちんと導入できているか確認するのに使えます.が,マシン次第でとても時間がかかることがあるので注意してください.
3.ハードウェアの開発
テスト用に作ったサンプルプロジェクトがtestディレクトリ内にあります.
testフォルダをルートに読み替えた感じでコードを配置することになります.
すなわち,
- Synthesijer関連:プロジェクトルート直下
- PyCoRAM関連:pycoram直下
- Vivado関連:vivado-autobuilder下
となります.
シンプルなプロジェクトならば,PyCoRAM周りはtestのプロジェクトをコピペで作るのが楽かと思います.
4.ビルド
ルート直下のMakefileの最初のほうに設定項目があります.
- TOP:Synthesijerのトップモジュールのファイル名
- MODULES:Synthesijerで書いたモジュールのファイル名一覧
- WRAPPERS:Verilogコードを使っている場合,SynthesijerによるそのWrapperのファイル名一覧
- VERILOG_MODULES:Verilogで記述したモジュールのファイル名一覧
たとえば,testプロジェクトだと次のような記述になります.
TOP=SumTestTop.java MODULES=SumTest.java Dummy.java WRAPPERS= VERILOG_MODULES=
PyCoRAM関連のソースコードのファイル名はtestプロジェクトと同様にしていれば特に設定の必要はありません.
もし必要があれば,Makefileのマクロを書き換えてください.
開発途中,Javaの合成だけしたい!とかそういう場合はsynthesijer_build
,pycoram_build
などの
makeコマンドを使うとよいです.
さいごに
PyJerではJavaとPythonで簡単なヘテロジニアスなプロセッシング環境のプロトタイピングができます.
複数のセンサやモータを取り回すようなものづくりに使えるように書いてみました.
サクッと書けてCIも回せるので良い感じだったと思います.(締めが雑)
Synthesijerの三好さん,PyCoRAMの高前田さん,お世話になりました.ありがとうございます!
というわけで,ツールを書いたお話でした.
それでは,今回はこの辺で ノ
まるさ