1. Zynq LinuxからFPGAを利用するって?

ZynqはARMコアが載っていて、FPGAとつながってるわけです。
当然やりたいのは「ARMで動かしてるLinuxからFPGAを使う」ことです。
これができたらFPGAにちょっとした難しい処理をするハードウェアを作っておいて、
使い慣れているC言語やNode.jsのソフトからその回路を使うことで簡単に高速化などが出来ちゃいます。

つなぐってどうやって

Zynqの中はPL部(ARM)とPS部(FPGA)で、できていますね。
PL部に自分で回路を作って、ピンにアサインして外の電子部品を制御することも可能です。
もちろん外部に出さないで、高速な画像処理回路を組んでどことも繋がないということもできます。
Screen Shot 2015-01-11 at 19.19.44

この回路にPS側から(つまりLinux)からアクセスするにはどうしたらよいでしょうか。
PSとPLは接続可能で、PL部をメモリにマッピングすることが出来ます。

Screen Shot 2015-01-11 at 19.21.42

 

マイコンをよく使う人には分かりやすいでしょう。メモリというのは全部RAMってわけじゃなくて、ある番地はUARTの受信、ある番地はI2Cの制御レジスタなど、連番だけど、いろんな機能が割り振られています。
同じようにPLに作成した回路もメモリにマッピングできます。RAMに書き込むつもりでメモリに書き込むと実はPLのその番地に接続されているある回路にデータがおくられて、RAMからデータを読むつもりで読み取っても実はPLからデータを受け取っているということが出来ます。こんなイメージね。

Screen Shot 2015-01-11 at 19.23.03

これができるとLinux側はただメモリにアクセスして読み書きすればいいことになります。
ただ、実際は決められたアドレスにアクセスするのは危険ですし、権限の問題もあるので、デバイスドライバを作成して、メモリへの読み書きをファイルへの読み書きでできるようにします。
fopenで開いてfreadで読み取ってというどっかでやったことあるやりかたでFPGAからPLに接続できます。

チュートリアルがあります

DigilentからZYBOのボード用に「LED4個をPLに追加してLinuxもコンパイルしてLinuxから使ってみる」というチュートリアルがありますのでそれをやります。
http://www.digilentinc.com/Data/Products/ZYBO/ZYBO-Embedded_Linux_Hands-on_Tutorial.pdf

また、以下の2つの日本語サイトもすごく参考になると思います。
http://nerdengineer.com/jp/blog/files/09c7e46c28ab96e4ecce1800b9b11575-3.html
http://marsee101.blog19.fc2.com

それぞれ、Ubuntu上で全てやったり、WindowsとUbuntuを使ったりしていますが、
僕はWindowsとUbuntuで、ただし、UbuntuではVivado無しでGCCのみで作業をします。

では、早速やってみましょう。

Digilentからプロジェクトをもらってくる