コマンドライン?
はい、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