無からはじめるFPGAプログラミング (1)

色々あって、Zynqを使うことになって、色々つらい思いをしている。


VivadoもQuartusもはっきり言ってひどいとしか言いようがない。HDLで書いたモジュールをTcl(!?!?今は21世紀だぞ??)でラップして作ったブロックをくっつけていくという設計は狂っているし、合成配置は遅すぎるというツール実装の問題もある…まあこのへんの話はまたそのうち。


最初は全くわからなかったけど、色々つらい思いをしたおかげで、大分理解してきたのではないかと思う。理解すればそんなに難しくない。もちろん、微妙にアナログの問題が出るとか、FPGA特有の難しさはある、が、まあそれは仕方無いだろうと思う。


以下、僕と同じように、ボトムアップに問題を理解していくのが好きな人向けに書いている。ちゃんとしたチュートリアルhttp://www.zynqbook.com/download-tuts.html にあるので各自読んでおいて。


環境として、手元では、Parallella の Micro-Server を使っている。これは、FPGA側のI/Oは、CPUとEpiphany以外には繋がっていないので、Lチカできないし、あんまり勉強用に向いてる感じではない。まあでも安いし、Epiphanyがおまけで付いてくるし、Lチカがやりたいとかでなければまあいいんではないかな。


Parallella 固有の問題として、以下手順が必要

  • /dev/xdevcfg が有効になってない。自分でカーネルビルドして有効にしたほうがいい。
  • よくわからんけど、レギュレータのisl9305というドライバが入ってる状態で、ちゃんとしてないビットファイルをロードするとハングする。isl9305 と epiphany はモジュールにしておいて、bit ファイル変更するときは外せるようにしたほうがいい

それ以外はZedboardでも変わらないんではないかな。Zedboardは会社に返却したので確認してない。

/dev/xdevcfg

Vivado とかで作ったbitファイルは、/dev/xdevcfg に cat とかで流し込むと、回路を書きかえられる。やったね!これで君も今日からFPGAを使った再構成プログラムによる画像処理の高速化などといったアレがソレになるね!

Vivado 使いかた

Zynq Book Tutorial では、ポンポンとIPを置いていくだけでプログラムができるみたいな内容になっているが、はっきり言って、初めてやる人が、これをやって何か理解できるとは思えないんだよな。これを読んでも、HDLをどこに書いたらいいのか全くわからないという…(文法がわからないとかではなく、そもそもどのファイルに書けばいいのかとかわからない)


ちゃんと理解できるまでは、IPブロックをポコポコ置いていくスタイルはあんま良くないのではないかな…以下のようにすれば、簡単なHDLは簡単に書けるようになるので、Zynq Book Tutorial 全く理解できなかった人は以下のようにやるとよさそう。(逆に、以下のようなやりかたがよくわからないという人は、ちゃんとZynq Book Tutorialを読んだほうがいいかもしれない)


まず、Zynq Book Tutorial と同じように、新規プロジェクトを作成する。この時、この画面で、チップかボードかを選ぶ。Parallella MicroSever と Desktop は xc7z010clg400-1、Embedded Platform は xc7z020clg400-1。ZedBoardや、ZC702の人は、ボードを選べる。

チップかボードを選んだときの違いは、外部IOピンに、名前が付くかどうか、みたいな違いだと思う。例えば、ZedBoardを選ぶと、leds_8bitみたいなのが見えるようになるが、実際にはこれは"D14"とかみたいなチップのよくわからないピンの名前と対応してて、その対応が決まったりする(もうちょっとなんか便利になってる気がする)。まあ外部ピンの話はそのうち(と言っても、手元のParallella MicroServerでは確認できないけど)。


さて選んだあと、Zynq Book Tutorial では、Create Board して、HDL Wrapperを作って、"Let Vivado manage wrapper and auto-update" を選べ、と書いてあるが、HDLを1から書きたいのであれば、ここで、"Copy generated wrapper to allow user edits" を選ぶ。

ここで出てくるHDLこそが、トップモジュール、つまり、C言語でいうmainみたいなもので、Vivado managed なコードを出すと、その部分がVivadoに奪われてしまうのでよくない(そのかわり、マウスでぽちぽちしたIOが、外と自動で繋がるようになる)。


Copy generated すると、名前デフォのままにしてれば、design_1_wrapper.v みたいな名前で、

module design_1_wrapper
   ();


  design_1 design_1_i
       ();
endmodule

こんな感じのVerilogが出てると思う。この、design_1 が、マウスポチポチして作ったデザインと対応している。上のは、何もポチポチしないで生成したので、空のデザインが置いてある。


今は、ポチポチしないでbitファイル作るのが目標なので(そうなの?)、このdesign_1 とかいうのを消す。かわりに、PS7 というのを置こう。

module design_1_wrapper
   ();

  PS7 ps7();
endmodule

PS7 が何か、というと、なんかprimitiveとか言うので、デバイス依存の物体を、回路上に置くことができる。C言語で言うとインラインアセンブリみたいなもの。PS7 は、Zynqの固定回路部分に該当していて、これを置くことで、PS7 と自分で作った回路を接続できるようになる。Zynqで使えるprimitive一覧は、
http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_7/7series_hdl.pdf
にある。また、それぞれの要素の細かい説明は、
http://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html?resultsTablePreSelect=documenttype:User%20Guides#documentation
にある。

(しかしPS7 primitiveの説明が見当たらないのでundocumentedの可能性がある)

(明日に続く http://d.hatena.ne.jp/w_o/20160519#1463655946 )