はじめに
ビットストリームを生成しては書き込んでを繰り返していると、突然"Gowin device not found"とエラーメッセージが出て書き込みどころかデバイスとの通信自体ができなくなってしまいました。
対処方法が分かればなんということはないのですが、一見すると「デバイスが故障してしまったのではないか?」と慌ててしまいます。結果的に解決したのですが、調査の過程や問題発生の原因にも学びがあったので記事にしました。
開発環境は以下のとおりです。
- FPGA: GW1NR-LV9QN88PC6/I5
- EDA: Gowin V1.9.8.09 Education Edition (Windows)
- OS: Windows11
トラブル別の解決法
公式サイトのこちらで様々なトラブル別に説明があります。こちらの情報で解決することも多そうですが、いろいろ試してみましたが私の場合は解決しませんでした。
JTAG通信を回復する
こちらには今回に似た"No Gowin devices found"について書かれている箇所がありますが、別機種に関するもののようで参考になりませんでした。
USBコントローラーまでは見えているようなので、その先のJTAG通信がうまくいっていないようでした。ここまでくるとなんとなく心当たりがあったので、なんとかJTAG通信を回復させる方法はないかと思案しました。するとピン配置図のPIN4_IOL5A_JTAG_SEL_S2_1V1
が目に止まりました(JTAG_SEL
というのがそれっぽい)。
これをGNDに落とせば(つまりS1を閉じれば)何か変化があるのではないかと思い、S1を押しながら書き込みを行ったところ、無事に書き込むことができました。
なぜ書き込み不能になったのか
この問題の原因は基板に実装されているスイッチを入力に使おうとしたことでした。件のS1はFPGAの4番ピンに接続されておりGPIOとしても使用可能ですが、通常はJTAG通信に使われています。
そのため、GPIOとして使う場合(他の兼用ピンの場合も同様)はメニューバーのProject > Configuration
で開くダイアログからDual-Purpose Pin
を選択し、次のように明示する必要があります。
明示しなかった場合はビットストリームを生成しようとすると次のようなエラーが出力されます。
ERROR (PR2028) : The constrained location is useless in current package
ERROR (PR2017) : 'reset' cannot be placed according to constraint, for the location is a dedicated pin (JTAG)
私はビットストリーム生成時のエラーを抑制するために設定するものだと思い込んでいました(実際、その通りなのですが)。そして生成したビットストリームが書き込み終わると実行が始まり、その瞬間から4番ピンはGPIOとして機能し始めるため、JTAG通信ができなくなり書き込みできなくなったということでした。
問題のビットストリームを書き込むまでは問題なかったため、何もしていないのに壊れたように見え、また通信不能になったため原因にたどり着くまで時間がかかってしまいました。
おわりに
問題が発生してから解決まで数時間を要しましたが、無事に復旧することができて良かったです。同じように困った方の参考になれば幸いです。