01signal.com

Quartus / Linux: コマンドラインで FPGA を書き込む

コマンドライン?

はい、GUI プログラマよりもずっと便利です。FPGA にビットストリーム (bitstream) ファイルを書き込むのは何度も繰り返す作業です。しかも、いつも同じボードの同じ FPGA に、同じコンピュータから同じファイルを書き込むだけです。それなのに GUI ツールは、これを大仰な儀式に仕立て上げてしまいます (そして、どのデバイスが接続されているのか正確に判別できないときには、私に正確なデバイス名を要求する、まるでクイズのような状態になることもあります)。

コマンドラインなら、bash の履歴からコマンドを選んで Enter キーを押すだけです。しかも驚くべきことに、コマンドラインツールは GUI ツールが聞いてくるような馬鹿げた質問はしてきません。

まずは、ちょっと遊んでみる

環境をセットアップします:

$ /path/to/quartus/15.1/nios2eds/nios2_command_shell.sh

見つかったすべてのデバイスを一覧表示するには (ケーブルは自動検出されます):

$ quartus_pgm --auto
Info: *******************************************************************
Info: Running Quartus Prime Programmer
    Info: Version 15.1.0 Build 185 10/21/2015 SJ Lite Edition
    Info: Copyright (C) 1991-2015 Altera Corporation. All rights reserved.
[ ... ]
    Info: agreement for further details.
    Info: Processing started: Sun May 27 15:06:22 2018
Info: Command: quartus_pgm --auto
Info (213045): Using programming cable "USB-BlasterII [2-5.1]"
1) USB-BlasterII [2-5.1]
  02B040DD   5CGTFD9(A5|C5|D5|E5)/..
  020A40DD   5M2210Z/EPM2210

[ ... ]

上の例のようにデバイスを一覧表示することは、ビットストリームを書き込むうえでは必要ありません。JTAG チェーン内の FPGA の位置を確認するのに便利かもしれませんが、これもボードを調べるときに一度やる程度のことです。

jtagd

このデーモンは TCP/IP ポート 1309 を待ち受けており、その存在を知っておくことが重要です。jtagd は USB バス経由で JTAG アダプタと通信する役割を担っているので、GUI プログラマもコマンドラインツールも、このデーモンに依存しています。デーモンが起動していなければ、どちらのツールも jtagd を起動します。

しかし、複数のバージョンの Quartus を使っている場合、これが混乱の原因になることがあります。特に、古いバージョンで FPGA への書き込みを試みた後、新しいバージョンを使おうとした場合です。新しいバージョンの Quartus は、古いバージョンの jtagd を使い続けるからです。そして、その古い jtagd が、新しいバージョンの Quartus なら対応している FPGA に対応していない可能性があります。つまり、何かおかしなことが起きたら、次のコマンドで直るかもしれません。試して損はありません:

$ killall jtagd

FPGA への書き込み

quartus_pgm は、出力のほとんどを緑色のテキストで表示します。一般的に、赤いテキストがなければ、すべてうまくいったということです。

$ quartus_pgm -m jtag -o "p;path/to/file.sof"

あるいは、JTAG チェーン内のデバイスの位置を明示的に指定することもできます (特に、先頭のデバイスでない場合)。この場合は @1 です。つまり、JTAG チェーンの 1 番目のデバイスという意味です。2 番目のデバイスなら @2 を指定します。

$ quartus_pgm -m jtag -o "p;path/to/file.sof@1"
Info: *******************************************************************
Info: Running Quartus Prime Programmer
    Info: Version 15.1.0 Build 185 10/21/2015 SJ Lite Edition
    Info: Copyright (C) 1991-2015 Altera Corporation. All rights reserved.
    Info: Your use of Altera Corporation's design tools, logic functions
    Info: and other software and tools, and its AMPP partner logic
    Info: functions, and any output files from any of the foregoing
    Info: (including device programming or simulation files), and any
    Info: associated documentation or information are expressly subject
    Info: to the terms and conditions of the Altera Program License
    Info: Subscription Agreement, the Altera Quartus Prime License Agreement,
    Info: the Altera MegaCore Function License Agreement, or other
    Info: applicable license agreement, including, without limitation,
    Info: that your use is for the sole purpose of programming logic
    Info: devices manufactured by Altera and sold by Altera or its
    Info: authorized distributors.  Please refer to the applicable
    Info: agreement for further details.
    Info: Processing started: Sun May 27 15:35:02 2018
Info: Command: quartus_pgm -m jtag -o p;path/to/file.sof@1
Info (213045): Using programming cable "USB-BlasterII [2-5.1]"
Info (213011): Using programming file p;path/to/file.sof@1 with checksum 0x061958E1 for device 5CGTFD9E5F35@1
Info (209060): Started Programmer operation at Sun May 27 15:35:05 2018
Info (209016): Configuring device index 1
Info (209017): Device 1 contains JTAG ID code 0x02B040DD
Info (209007): Configuration succeeded -- 1 device(s) configured
Info (209011): Successfully performed operation(s)
Info (209061): Ended Programmer operation at Sun May 27 15:35:09 2018
Info: Quartus Prime Programmer was successful. 0 errors, 0 warnings
    Info: Peak virtual memory: 432 megabytes
    Info: Processing ended: Sun May 27 15:35:09 2018
    Info: Elapsed time: 00:00:07
    Info: Total CPU time (on all processors): 00:00:03

デバイスの不一致や JTAG チェーンのスキャン失敗など、何か問題が起きた場合は、エラーが赤色で表示されるので見逃すことはないでしょう。コマンドラインインターフェースの良いところは、試行のたびにすべてを最初からやり直せることです。ボードの電源を入れ直して、もう一度試せばいいのです。

Cyclone 10 GX FPGA 開発キット

このボードは私にひと苦労させてくれたので、少しだけ説明しておきます。このボードをコンピュータに接続すると、USB ID は 09fb:6810 として見えます。ところが、次のコマンドで FPGA への書き込みを試みると (末尾の "@2" に注意)、

$ quartus_pgm -m jtag -o "p;thecode.sof@2"
Error (213019): Can't scan JTAG chain. Error code 86.

すると、デバイスの ID が 09fb:6010 に変わります。つまり、ファームウェアの書き換えが明らかに発生しています (システムログには、デバイスの切断と新しい ID での再接続が記録されます)。このボードは、Quartus の GUI プログラミングツールでは GX0000406 として認識されますが、「Auto Detect」をクリックすると「Unable to scan device chain. Hardware is not connected」というエラーになります。

では、スキャンを試してみたらどうなるでしょう?

$ quartus_pgm --auto
[ ... ]
Info (213045): Using programming cable "10CGX0000406 [1-5.1.2]"
1) 10CGX0000406 [1-5.1.2]
  Unable to read device chain - Hardware not attached

私のケースでは、起動していた jtagd が古いバージョンの Quartus によって起動されたもので、Cyclone 10 デバイスを認識できなかったのが問題だったようです。そこで、上記のアドバイスに従って jtagd を kill しました。その結果、上のコマンドでの書き込みが Quartus Pro 17.1 で動作しました:

$ quartus_pgm --auto
[...]
Info (213045): Using programming cable "USB-BlasterII [1-5.1.2]"
1) USB-BlasterII [1-5.1.2]
  031820DD   10M08SA(.|ES)/10M08SC
  02E120DD   10CX220Y
このページは英語から機械翻訳されたものです。不明な点があれば、原文を参照してください。
Copyright © 2021-2026. All rights reserved. (dcc38493)