• 4. Zynq VivadoでZYBO向けプロジェクト作成からBitstream出力まで

    とりあえずプログラムやFPGAを書き込めるようになりたいですよね。
    サンプルとしてLinuxとシリアル通信でHello worldを送るっていうのが元々用意されていますので。
    それを使ってFPGAを使わずにHello worldだけを出してみましょう。

    ZYBO用ファイルを手に入れる

    VivadoでZYBOで動くものを作るわけですが、ZYBO用の設定が必要になります。
    どういう周波数でこのピンはこうなっててみたいなやつですね。
    残念ながらまだ今はVivadoに最初からZYBOの設定は入っていません。
    ZYBOのサイトから必要なものをダウンロードします。
    DigilentのZYBOのサイトへ行きます。
    http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,1198&Prod=ZYBO
    ここにはZYBOの回路図などもあるので後々役に立つかもしれません。
    今回はVivado用の2つのファイルをダウンロードします

    1. ZYBO Board Definition File for configuring the Zynq Processing System core in Xilinx Platform Studio and Vivado IP Integrator.
    2. ZYBO Master XDC File for Vivado designs.

    です
    vivado19

    zipファイルになってますから、解凍してわかりやすい場所においておきましょう。

    Vivadoプロジェクトを作る

    では、Vivadoを開きましょう。
    最初はこんなのが開くと思います。
    すべてのファイルはプロジェクトで管理されますので、プロジェクトを作ります。
    そのプロジェクトに「こういう回路なんだよ〜」「こういうFPGAを作ってね〜」と設定していく感じです。
    ではCreate New Projectを押してください

    vivado12

     

    説明だけの画面が出てきますが Next

    vivado13

     

    プロジェクトの名前とプロジェクトのフォルダを聞かれます。例えば名前をnameにしてLocationをC:¥projectsにしたら
    C:¥projects¥name
    というフォルダが作られて、そこにすべてが入ります。(Create project subdirectoryにチェックが入っていればね)

    vivado14

     

    次に聞かれるのはどんなプロジェクトを作るかです。
    RTLを選択してNextを押します。

    vivado15

    次の2つはスキップします。SourceとExistingIPです

    vivado16

    vivado17

    ただし、Constraintは設定をします。さっきZYBOのページからDLしてきたやつを設定します。

    Add Constraintを押してください。

    vivado18

    ダウンロードした2つのうちZYBO_Master.xdcというのを選択します。

    vivado20

    そうするとリストに出てくると思います。

    下にプロジェクトフォルダにこれをコピーするかどうか聞かれていますが、基本的にプロジェクトで使うファイルというのはプロジェクトと同じ場所にもあったほうが良いのでチェックを入れておきましょう。

    vivado22

    次に出てくるのがどのチップを使うかです。

    ZYBOに載っているのはこの中で言うと
    xc7z010clg400-1というやつです。
    リストには色々なチップがありますが、FamilyやSub-Familyなどでリストから絞れます。

    vivado23

    ここまでくればOKです。
    「プログラムとIPがなにもないけど、あとから追加するんだよね?」という警告が出てますがそのとおりなのでこのまま「Finish」押します。

    vivado24

    これでプロジェクトファイルは作成できました。

    ZYBO用BlockDesign

    今回の目標はFPGAガン無視でHelloWorldを出すことです。
    「IPって何?」って人もいると思いますが、ちょっと説明は軽いものだけにしてプロジェクトを作り終わるところまでやっていきたいと思います。
    ZYBO用のブロックデザインを作ります。

    左側のペインが「Flow Navigator」というプロジェクト全体に関するものです。
    この中に「Create Block Design」というのがあると思います。
    これを押してDesign nameを適当に決めてOKを押してください。

    vivado25

    OK押すとDesignっていう中央上のエリアにあなたが名前をつけたものが出てくると思います。
    Blockと言うのは簡単に言うとzynqの中の配線や外との配線を決めるためのものです。実際の配線情報などはDiagramで設定します。今、右側のDiagramの中は真っ白で何も無いですが、ここにZynqのプロセサIPを追加しましょう。

    vivado26

    ICっぽい絵にプラスのマークが付いているのがIPの追加です。
    zynqって検索窓に打つと2つぐらい出てくると思いますが 「ZYNQ 7 Processing System」ってのを選びます。

    vivado27

    すると、Diagram画面にZynqチップが出てきます。

    vivado28

    ただ、このzynqプロセサはZYBO用の設定になっていないプレーンな状態なので、ZYBO用にカスタマイズします。
    このチップをダブルクリックするとこのチップの設定に入れます。

    vivado29

    無駄にカッコイイ画面が出てきますが、これがZynqチップの中のブロックデザインになります。
    上の方に「Import XPS Settings」ってのがあると思います。これでZYBOのサイトからダウンロードしてきたもう1つの方のファイルを選択肢します。「ZYBO_zynq_def.xml」というファイルです。
    読み込むとさっきまで無かったチェックマークがUARTに入ったりクロックの設定が変わったりします。
    これらが正しく変わらないとまともに使えないので、今後新しいプロジェクトを作るときも忘れないようにしましょう。終わったら「OK」押して閉じます。

    vivado31

    すると、さっきと違って右側の数が増えていると思います。
    これらはzynqの入出力で、基本的には左が入力で右が出力です。
    マウスで配線できます。1つやってみましょう。
    今回は使わないのですが左側にある1つだけのやつがFPGAのクロック(入力)になります。
    右側のFCLK_CLK0というのがクロック出力ですのでそれらをつなぎましょう。
    マウスを持って行くとマウスがペンのマークに変わります。そのまま2つをつなぐとこうなります。

    vivado32

    これでFPGAにクロックを供給できます。また、DDRとFIXED_IOに何も繋がってませんが、ここにはメモリなどがZYBO上では繋がってますのでIOとして出してあげます。
    それぞれ右クリックして「Make External」を押します。

    vivado37

    それぞれ追加するとIOとしてzynqから出ているのがわかると思います。

    vivado38

    ちなみにDiagramが正しいかどうかはValidation機能でチェックできます。
    IP追加ボタンの少し下にValidationというのがあるので押してみましょう。下のようなダイアログが出ればOKです。

    vivado34

    論理合成

    論理合成までは3 stepが必要です。実はまだFPGA用のHDLすら書けない状態です。
    まず、HDLを記述出来るようにしましょう。そのためにはCreate HDL Wrapperが必要です。
    中央上のエリアはタブで切り替えられるようになっています。「Source」というタブにします。
    そこであなたが付けた名前のDesignSourceがあると思います。それを右クリックして「Create HDL Wrapper」を選びます。

    vivado35

     

     

    すると、2つの選択肢が出てきます。
    作成するWrapperの管理を自分でするのがVivadoに任せるのかということです。
    Vivadoに任せるので「Let Vivado manage wrapper and auto-update」を選びOKを押します。

    vivado36

    すると、SourceのHierarchyの中にVerilog-HDLかVHDLのファイルが作成されます。
    ここに来て初めてFPGAをいじれるようになったわけです。
    そして、このHDLファイルにはDDRとFIXED_IOの情報がちゃんと載っています。ただ配線情報だけが載っていて何もしないですけどね。

    次に一番左にある「Generate Block Design」を押します。特に選択肢もないのでそのままGenerateを押します。

    次に最後の論理合成です。
    もちろん論理合成だけできますが、今回はBitstreamを作ってSDKに渡して、SDKからHelloworldを書き込むのでBitstreamを出しましょう。
    Generate Bitstremを押します。すると、「論理合成してないけど、やりましょうか?やってからbitstrem出しますよ」と聞かれるので「OK」を押します。
    すると数分とかでbitstreamの作成まで終わります。
    正常に完了するとダイヤログが出てきて「View Log」と「Open Hardware Manager」みたいなのが出てきます。どっち選んでもいいですがCancelで閉じても良いです。

    Export

    作成されたBitstreamを出力します。
    「File」->「Export」->「Export Hardware」を選びます。
    ここで 「Include bitstream」にチェックを入れて出力します。

    vivado42

    出力する場所はプロジェクトの場所で大丈夫です。

     

    今回Vivadoでやるのはここまでです。
    最初だしどれも謎だしでちょっと大変ですが、もうすぐ終わります。
    次回はBitstreamを使ってSDKからHelloworldまでやります。

     

  • 3. Zynq 開発環境「Vivado」を入れる

    XilinxはFPGAの開発ツールであるVivadoを出しています。「ヴィヴァドゥ」って読むんだと思いますが、すげー楽しそうですよね(笑)
    さて、これにはプランがあって有料のと無料のがありますvivado_plan

    WebPackというのは無料です。デバイス制限がかかってますが、ZYBOのチップは大丈夫です。LogicAnalyzerなどが入ってないですが、とりあえず無くても普通に使えますからWebPackを入れましょう

    Vivado WebPackとSDKを入れる

    Downloadはこちら
    http://www.xilinx.com/support/download.html

    ise1

    Windows用とLinux用、あと32bitと64tbit版があります。あなたの環境に合わせてダウンロードして下さい。
    ダウンロードするときにユーザーアカウントの作成を求められます。住所とかも必要に鳴っているので記入しましょう。
    ise2

    登録が完了するとダウンロードできるようになります。
    問題なくダウンロードしたら早速ダブルクリックしてインストールしましょう。
    インストールしている時に何度か「・・のブロックを解除しますか?」とか聞かれると思います。
    許可しないとまともに動かないのでXilinxを信頼して許可しましょう。
    vivado0

    ここからはダイヤログに従って行くだけです。
    最初は環境の確認ですこういうOSでしかつかないですよ〜ってものです。
    赤い文字で「インストールの時間を短くするためにウイルス対策ソフトを切っておいてください」って言ってます。

    vivado1

    Nextを押すとさっき作ったXilinxのUserIDとPasswordを求められます。記入してNext

    vivado2

    問題なく進むとライセンスに同意するかどうかを聞かれます。それぞれのライセンスは青文字をクリックすることで開けます。読んで問題なければ I Agreeにチェック入れてNext

    vivado3

    次に「何を入れるか」を聞かれます。
    これはライセンスにも依存しています。
    我々が入れたいのは無料のVivado WebPACKなので一番上にチェックを入れたままNext

    vivado4

    次に「じゃあ実際何を入れるのか」を聞かれます。ここでだいたいのものにチェックが入っているはずですが、以下の写真のように出来れば全部にチェックを。特にSoftware Development Kitはチェックが外れているかもしれませんが、これは必要ですからチェックを入れてください。
    ちなみに容量が19GBぐらい必要です。結構食うのでもし容量が足りない人は頑張って空けましょう。

    vivado5

    そうすると、次はインストールが開始されます。何度かWindowsから「こいつこんなコトやろうとしてますぜ」っていわれますが、気にせず「許可」を押します。
    また、別のインストールダイヤログが開くこともありますがそれらもインストールしてください。

    vivado6

    これでインストールが完了します。

    ライセンス

    インストール完了と同時にライセンスマネージャーが起動します。

    vivado7

    WebPackを入れたからといっていきなり無料で使えるわけではありません。
    無料のライセンスをあなたのパソコン用に発行して、それを使わないといけないのです。
    なので、パソコンを変えるときにはライセンスももう一度発行しないといけなくなります。

    ライセンスマネージャーから「Get Free Lisence」を選んで「Connect Now」を押します。
    するとブラウザが開いてXilinxのページが開くと思います。Xilinxのライセンス作成ページでは色々なライセンスが選べます。今回はVivadoのWebPackです。終了日が30daysとかじゃなくてnoneのやつを選び作成してください。

    作成が完了するとライセンスマネージャーが自動的にライセンスファイルを受け取り保存してくれます。ちなみにメールでもライセンスファイルは送られてきます。
    自分のライセンスページから何度でもダウンロードできますので無くしたりPCを再インストールしても大丈夫です。

    vivado9

    ここまででVivadoのインストールは完了です。
    ライセンスも入ったので普通に起動してずっと使えます。

    次回はプロジェクトを作成してBitstreamを作成するまでやってみましょう。

  • 2.Zynqの電源を入れる

    さて、買ってきたzynqですが、ボタンも沢山あって電源の入れ方すらわかりません。
    最初の人のためのドキュメントはここにあります。
    http://www.digilentinc.com/data/products/zybo/zybo_rm_b_v6.pdf
    電源の入れ方などボードの基本的なところを見てみましょう。

    電源について

    1. USB
    2. PowerJack
    3. PinDirect( Battery )

    の3通りで使うことが出来ます。説明書によるとこうなっています。Screen Shot 2014-12-27 at 22.57.04出典: Digilentic

    写真だとこの切り替えスイッチ的なのはこれですね。

    Untitled__2014-12-27_23_16_58_copy_

    この青いのが下側についてショートするとUSBが電源として、上につけてショートするとDCJackが電源として使われます。バッテリーなど外部につなぐ時は青いのを外して真ん中のピンと右側のピンを使います。間違っても真ん中と右側のピンを繋がないでくださいね。プラスとマイナスがショートします。

    で、左側にあるのがボードの電源スイッチです。上でONです。

    電源はこれだけです。便利なので僕はUSBをつなぎます。
    このボードはidle状態で0.2Aで、ちょっとしたサーバーをLinuxで動かすだけだと0.38Aぐらいになるそうです。
    USB2.0のあるマシンなら0.5Aまではいけるので大丈夫だとは思いますが、気になる人はiPadの電源とか使いましょう。
    2014-12-27 23.17.34
    iPadの電源は1Aまで行けますのでまだ安心。皆持ってるしね。持ってるよね?

    ちなみに、電源が正常に入ると(ただ、電源があるかどうかじゃなくて全ての電源ラインが正常な電圧だと)LED11が点灯します。
    2014-12-27_23_16_58_jpg

    コンフィグレーションについて

    ハードディスクなどはつないでませんから、CPUが動くといっても何も無いと話になりません。
    このボードは電源が入ると以下の流れで起動します。

    1. CPU0がBootROM(read only)から最初のプログラムを読んで動き出す
    2. JP5を元にFSBL(First Stage Bootloader)をSRAMに読み出す
    3. 読み出されたFSBLが初期設定やFPGAの設定をする
    4. FSBLがユーザーアプリケーションを実行する

    という流れになっています。

    そのFSBLの置き場所(読み込み先)ですが、3通りあって

    1. SDカード
    2. Quad-SPIのオンボードメモリ(128MB)
    3. JTAG

    から行えます。それをJP5で切り替える事ができます。

    2014-12-27_23_16_58_jpg

    SDカードはXilinxの開発ツールから作ったイメージを書き込んで使うことが出来ます。
    Quad-SPIも上書きできます。買ってきてすぐの状態だと一応デモンストレーションアプリが入っています。だから最初のピンの位置もQSPI(Qual-SPI)なんですね。
    JTAGは完全にデバッグ用ですね。最初のうちは一番使うと思われます。あの電源に使うUSBからJTAGでzynqにつながってます。なのでPCにつないでそのままデバッグも出来ちゃいます。

    ちなみにコンフィグレーションが終わるとコンフィグレーション終了LEDがつきます。
    電源が入ってちゃんとコンフィグまで行ったかどうか確認できます。

    2014-12-27_23_16_58_jpg

    とりあえず起動

    起動してみましょう。

    1. JP7をUSBに切り替える
    2. (スイッチはOFFにして)USBつなぐ
    3. JP5をQSPIにする
    4. HDMIつなぐ(デモを確認するため)
    5. スイッチ入れる

    これでQSPIからデモ用のアプリがロードされてデモが動きます。
    LEDも電源用コンフィグ用どっちも点灯して

    2014-12-27 23.19.01

    HDMI繋いだ液晶にはこんなふうにパターンが出るはず

    2014-12-27 23.19.24

    いいですね!

    次回はXilinxのツールからFPGAをコンフィグしてみましょう。

  • 1. Zynqって?

    ZynqとはXilinxの出しているFPGAなんですが、よくあるFPGAとちょっと違うのは

    • CPUがFPGAと一緒に最初から入っている
    • CPUのメモリはもちろん、2時キャッシュもFPGAとつながっていてFPGAから利用できる
    • FPGAのコンフィグレーションをCPU側から行える
    • ペリフェラルをFPGAを通るように切り替えられる。

    FPGAにCPUが付いているというよりはCPUにFPGAが付いているような感じです。
    やりたい計算をするFPGAを作ってCPUに深くつなぐような感じ。
    だから、CPUじゃなくてもいいようなデータを一斉に計算したり等、特に画像処理などがイメージしやすいと思います。
    Linuxを普通に動かすことができるので、そういう意味でも扱いやすいですね。
    今までのFPGAではCPUを中に作ったり、SPIなどで繋いだりしていましたが、zynqだと元々入っているCPUですから性能が良いです(今回紹介するZYBOはARM-CortexA9が2Core入っていて650Mhzで動きます)。それにFPGAの中にCPUを作った時のようにコアな部分とFPGAを繋げられるので、工夫次第でめちゃくちゃ早い処理も可能となります。

    ZYBOについて

    CQ出版のDesignWaveをきっかけに知ったのですが、

    これで紹介されているボードはちょっと高いので、秋月でも売っているZYBOというZynqが載っている開発ボードを使うことにしました。

    2014-12-27 23.16.58購入先: http://akizukidenshi.com/catalog/g/gM-07740/

    これなら2.2万ぐらいで買うことが出来ます。
    HDMIやUSBなども揃っていますしね。性能的には

    • CPU ArmCortex-A9 (Dual core 650Mhz)
    • FPGA Z-7010 LUTが17,600個(ということはフリップフロップが35,200個)

    となっていて、LUTの数はCQ出版で紹介されているZ-7020のちょうど1/3です。

    とにかく秋月で買えるのはいいですよね!
    早速買ってみましょう。
    次回から電源の入れ方やコンフィグレーションのやり方など書いてきます。

     

  • Node.jsをpm2でデプロイするためのAnsible Playbook

    Node.jsアプリの継続動作には今までforever使ってたんですが、pm2は色々親切で高機能なので乗り換えることにしました。pm2を使うようにデプロイしてみましょう。

    Ansible

    デプロイするためには普通sshで入ってgit pullしてとかやらなきゃいけないですが、1個1個手でやるのは忘れやすいし間違いやすいのでAnsibleを使います。
    Ansibleはあれやってこれやってを列挙しておけるもので、それを実行すると順番に全部やってくれます。
    詳しくはhttp://yteraoka.github.io/ansible-tutorial/とか見てください。

    では、node.jsもgitも何も入っていないubuntuに手元のnode.jsを入れるとします。
    ただし、sshでは入ることが出来るように公開鍵はセットされてて、sudoはパスワード無しで出来るユーザーだとします。ここまではよろしくね。

    apt-get

    まず。

    1. Node.js
    2. npm
    3. pm2
    4. Git

    を入れます。

    
    ---
    # Install Node.js(include npm) pm2
    - name: Prepare Install Node.js
      apt: name=python-software-properties
    
    - name: Prepare Install latest Node.js by adding repo
      apt_repository: repo='ppa:chris-lea/node.js'
    
    - name: Update apt-get packages using apt-get update
      apt: update_cache=yes
    
    - name: Install Node.js
      apt: name=nodejs state=present
    
    - name: Install pm2
      npm: name=pm2 global=yes state=latest
     
    # Install Git
    - name: Install Git
      apt: name=git state=present
    
    

    ここまででapt-get系は終了です。
    apt-getするので、sudo=yesがplaybookに必要です。
    ちなみにnode.jsとnpmは一緒に入ってきますのでご心配なく。そしてそれが入るとAnsibleのnpmモジュールでnpmの操作ができるようになります。
    こうやって何かが入っていないと実行できない場合は -checkをつかったテスト実行だと失敗しますが、ちゃんとした実行だとnpmも入るわけですからうまく動きます。
    また、今回は最新のnode.jsを入れたかったのでchris-leaのリポジトリを利用しています。

    git pull

    node.jsアプリをgit 経由でデプロイしましょう。
    git pullする時に気にするのは鍵です。公開リポジトリならいいですが、そうでない場合対象となるサーバーがリポジトリにアクセスできるかが問題になります。方法として

    1. deploy用の秘密鍵をそもそも自分で秘密鍵を入れておく
    2. deploy用の秘密鍵をAnsibleで入れて使うようにする
    3. 手元の秘密鍵をforwardする

    などの手があります。2とかがキレイですが、どうせ手元からしかやらないのであれば3はオススメです。そのための設定がいるが必要でansible.cfgをplaybookと同じディレクトリに置きます。内容は

    
    [ssh_connection]
    ssh_args = -o ForwardAgent=yes
    
    

    とします。
    また、ansible-playbookする時に

    
    --private-key=~/.ssh/id_rsa
    
    

    といった感じでリポジトリにアクセスできる秘密鍵を指定するようにします。これで手元の秘密鍵がgit pull の時に使われるので問題なくpullできます。

    実際のtaskは

    
    ---
    # Deployment
    - name: Create Target Directory.
      file: state=directory path={{app_dir}}/{{app_name}} mode=0755
     
    - name: Change Owner
      file: owner={{deploy_user}} state=directory path={{app_dir}}/{{app_name}} recurse=yes
    
    - name: Pull code from Repository
      sudo: no
      git: repo={{repo_url}} dest={{app_dir}}/{{app_name}} version=master accept_hostkey=yes
    
    - name: npm install
      npm: path={{app_dir}}/{{app_name}}
    
    - name: List of Node.js apps running.
      sudo: no
      shell: pm2 list
      register: node_app_list
      changed_when: false
      tags: restart
    
    - name: Stop old process if exist
      sudo: no
      command: pm2 stop {{app_process_name}}
      when: node_app_list.stdout.find('{{app_process_name}}') != -1
      tags: restart
     
    - name: Start process with pm2
      sudo: no
      command: pm2 start {{app_dir}}/{{app_name}}/bin/www --name {{app_process_name}}
      tags: restart
    
    

    こんな感じです。
    同じくsudo=yesが必要です。
    ここまでやるとhttp://入れた場所:3000/ とかで動きます。
    ちなみにpm2で手動的にプロセスを再起動していますが、pm2にはファイルの変更監視をして変更されてたら再起動するようなwatch機能があるのでそれを使って更新することも可能です。

    後はnginxの設定などで特定のサブドメインだったらこのnodeのアプリとかやるといいですね。