編集履歴一覧に戻る
uchanのアイコン画像

uchan が 2024年10月01日17時28分03秒 に編集

初版

タイトルの変更

+

Gowin FPGA の OPEN_DRAIN の挙動

タグの変更

+

FPGA

+

Gowin

+

Tang-Nano

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

セットアップや使用方法

本文の変更

+

Tang Nano 9K に搭載されている Gowin の FPGA(GW1NR-9)について、I/O に設定可能な `OPEN_DRAIN` というオプションの挙動を確認しました。結論としては、`OPEN_DRAIN` の ON/OFF によらずプルアップ抵抗の有無が選択できること、0 を出力すると 0V が出力されることが分かりました。 ## `OPEN_DRAIN` オプション Gowin の FPGA は(他のメーカーでも同様だと思いますが)I/O をオープンドレインに設定できます。物理制約ファイルに次のように記述します。 IO_PORT "sig" IO_TYPE=LVCMOS33 PULL_MODE=NONE OPEN_DRAIN=ON; `OPEN_DRAIN` は ON か OFF を指定できます。デフォルトでは OFF でプッシュプル出力です。 `OPEN_DRAIN=ON` に設定した I/O に対し 0 を書くと NMOS が導通し 0V が出力されます。1 を書くと NMOS が遮断しハイインピーダンスとなります。 ## `PULL_MODE` との組み合わせ `PULL_MODE` は I/O のプルアップ/プルダウンを制御します。UP、DOWN、KEEPER、NONE のいずれかを指定できます。デフォルトでは UP のようです。一般的にプルアップ/プルダウンは入力ポートで使う機能ですが、GW1NR-9 では出力に設定した端子でも `PULL_MODE` は有効に機能するようです。 `OPEN_DRAIN=ON` かつ `PULL_MODE=UP` と設定する(あるいは `PULL_MODE` を設定せずデフォルトとする)と、0 を書くと 0V が、1 を書くと電源電圧(バンクにより異なる)が出力されます。 `OPEN_DRAIN=ON` かつ `PULL_MODE=NONE` と設定すると、0 を書くと 0V が、1 を書くとハイインピーダンスが出力されます。オープンドレイン出力と言うとき、一般的に想像するのはこちらの設定かなと思います。 ## 1=0V じゃなくて 0=0V だ! オープンドレイン出力は NMOS のゲートを制御するわけですから、電子回路的に考えれば 1 を書くと 0V が、0 を書くとハイインピーダンスが出力されるように思えます。しかし、実験の結果、そうではありませんでした。 ![FPGAの端子の出力回路想像図](https://camo.elchika.com/79497ac435e9846a02db45819d6e3137b89870aa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f65346233356164372d663737332d343430612d623336392d313836353761346431363663/) FPGA の I/O の出力部分はおそらく上図のようになっていて、オープンドレイン出力のときは Q3 が無効化される仕組みなのだと思います。([Kenta IDA さん](https://x.com/ciniml)がヒントをくださいました) プッシュプル出力のときは 0 を書いたら 0V が、1 を書いたら VDD が出力されて欲しいですから、そのために Q1 と Q2 を使って論理を反転しなければなりません。その回路の影響で、オープンドレイン出力に設定しても 0 で 0V が出力される、と考えると納得できますね。