(2012-12-12:なぜか(3)をアップし忘れていました。追記します)
(2012-12-12:ここから追記)
FPGAボードDE0 の上に回路を作るにあたり、まず簡単な回路で一通り動作することを確かめてみる。
QuartusII を立ち上げて、新規のProject を作る。トップモジュールを設定するだけで、とりあえずOK。
その後に、QuartusII を実行しているディレクトリの〜.qsf をエディタで直接修正して、ピンアサインなどをしていく。
GUI経由でピンアサインなどは出来るんですが、エディタで修正する方が手っ取り早いので。
ピンアサインをする時は、通常は図面を見ながら、なんですが、今回は DE0 のCDROMに入っている Demonstorations のファイルをコピーして使うことにするんだけど...
Demonstorations に入っている、〜.qsf のファイルの内容がショボい。ピンアサインしかしとらんやんー。
(辛うじて空きピンの処理は入っているが...)
結局、いろいろ追加修正して出来たのが、このファイルです。
テスト用 qsf ファイル ついでに、トップモジュールがこれ。
テスト用トップモジュール qsf ファイルで追加した設定は、以下の通りです。
・292行〜
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" ピン名
→I/Oバッファの明示的な指定。
デフォルトになっているので、不要かも知れませんが、念の為。
・351行〜
set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to ピン名
→I/Oバッファのドライバビリティ(駆動能力)の設定
デフォルトは8mA なので、必要のないバッファは4mA にする。
VGA出力は8mA が必要なようです(Xilinx Spartan-3 Starter Kit のマニュアルがそうなってました)。
・410行〜
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to ピン名
→信号のプルアップ抵抗の指定
基板上で双方向信号になっているものは、外部からドライブされる可能性があるため、固定値を出力するのではなく、プルアップにしておくため。
・416行
set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED WITH WEAK PULL-UP"
→定義されていないピンを入力モードで内部プルアップにする。これもデフォルトだが念の為。
基板上で使っていないピンは、プルアップなしで入力ピンにすると、FPGAに悪影響があるため、出力にするか、プルアップにするのが普通。
出力にすると、使っていないと思っていたピンが、外部からドライブされると、ショートするため、プルアップ付きの入力にすることにする。
(注:qsf ファイル内のピン名に、ワイルドカードを使用するのはOKなんですが、QuartusII のGUIのPin Assignment を呼び出すと、ワイルドカード指定を無視するようです。Pin Assignment を使わなければ問題ありません。もしくは1ピンづつ指定するか、です。)
FPGA の入出力ピンとして、周辺回路に対しては、次のようにする必要があります。
FPGA => 周辺回路への出力:FPGAから何らかの信号を出力する。オープンにしたり、入力ピンにするのはNG。
FPGA <= 周辺回路からの入力:FPGAは入力ピンにする。この信号をドライブする素子が、ドライブしない可能性がある場合は、プルアップ付きにする。
FPGA <=> 周辺回路への入出力:通常に使用する時は、適切なタイミングで入力と出力を変える。Hi-Z になる時があるので、プルアップ付きの双方向信号に指定する。使用しない時は、プルアップ付き双方向信号指定で、Hi-Zを出力する。
FPGA 空きピン:プルアップ付き入力、もしくは上記の『定義されていないピン』の通りにする。
Demonstration の回路は、この指定が全く出来ていません。そのため、入力信号がフローティングになっている箇所が多数あります。ちと酷い...
テスト用の qsf ファイル、テスト用トップモジュールは、基板の図面とにらめっこして、その辺りをケアした設定になっています。
なのですが...(次に続く)
(2012-12-12:ここまで追記)
テスト用の qsf ファイル、テスト用トップモジュールで、入出力信号を適切に設定して、基板として問題ないと思ったんですが...
レイアウト後の QuartusII が出力した、PIN ファイルです。
テスト用レイアウト後のPINファイル 一見問題ないようですが、Pin Name に『GND+』と書かれているピンが問題です(A11,A12,B11,G1,G2,G22,T1,T2,T20,T21)。
GND+ で記載されている説明を見ると...
-- GND+ : Unused input pin. It can also be used to report unused dual-purpose pins.
-- This pin should be connected to GND. It may also be connected to a
-- valid signal on the board (low, high, or toggling) if that signal
-- is required for a different revision of the design.
『使っていない入力ピンです。GNDに固定すべきです。(以下略)』
DE0 のボード上では、どこにもつながっていません。また、改造してGND に落とすのも(ほぼ)不可能です。
上記のピンは、入力クロック専用のピンのため、内部でプルアップ抵抗を設定したり、出力したりすることが出来ないピンです。
・基板上でどこにもつながっていない。
・FPGA では、入力ピンにしか設定できず、プルアップも出来ない
↓
入力フローティングを回避できない!!
これは、DE0 の設計のミスですね。使っている時に壊れないように祈るばかりです。
同様に、GPIO1_CLKIN[1]、GPIO1_CLKIN[0]、GPIO0_CLKIN[1]、GPIO0_CLKIN[0]、の4ピンも、問題です。
ただし、こちらは外部コネクタにつながっているので、そのコネクタからドライブするか、基板を改造して、プルアップ抵抗かプルダウン抵抗を付けるか、で対策が立てられます。
入力フローティングの信号で、さらに長い線がつながっているので、ノイズの影響を受けやすいので、こちらは対処した方がよさそうです。
3.3V 以外でも使うかも知れないので、プルダウン抵抗(10KΩ×4)を付けて、対策しました。

動作的には、何も変わらないんですけどねー。