FPGA のドライブ強度 4mA/8mA/12mA は何を変えているのか
「ドライブ強度 8mA」は、8mA までしか電流を出せないという意味ではありません。VOL/VOH の規定点で保証する電流であって、実体は出力段の並列トランジスタの本数、つまり出力抵抗とスルーレートです。強くすればリンギングと GND バウンスが増え、弱くすれば配線容量の充電が遅れます。
「8mA」は上限ではなく、規定点での保証電流
LVCMOS33 の出力に「ドライブ強度 8mA」を選ぶと、その出力は 8mA しか流せなくなる、と誤解されがちです。実際には逆で、VOL/VOH という電圧の規定点で、最低でもこれだけの電流を保証するという意味です。JEDEC の JESD8-B(LVCMOS の電気的特性)でも、VOL は「このスペックの IOL を流したときに VOL 以下になる電圧」として定義されていて、IOL は上限ではなく保証条件の一部です。
出力段の中身は、ゲート幅の違う(あるいは本数の違う)プッシュプルの MOSFET を並列に並べたもので、ドライブ強度の設定はそのうち何本を同時にオンにするかを切り替えているだけです。本数が増えれば並列合成の抵抗が下がり、同じ電流でも電圧降下が小さくなる。VOL/VOH の規定点を満たす電流(=カタログの「〇〇mA」)が大きいほど、本数が多く、出力抵抗が低いということです。
実際に流れる電流は、負荷が要求する分だけです。LED を 1 個光らせるだけなら、12mA 設定でも実際に流れるのは数 mA です。「強度」が変えているのは電流の上限ではなく、出力インピーダンスとスルーレートで、これが配線への影響を決めます。
強度ごとの出力抵抗の目安
出力抵抗は VOL(または VDD − VOH)を、その強度で保証する電流 IOL で割ったものとして概算できます。Rout ≒ VOL ÷ IOL です。LVCMOS33 で VOL の規定が 0.4V の場合の目安を計算します。
| ドライブ強度 | Rout ≒ VOL ÷ IOL | 50Ω 配線との関係 |
|---|---|---|
| 4mA | 約 100Ω | かなり不整合。反射が大きい |
| 8mA | 約 50Ω | ほぼ整合。ダンピング抵抗なしで済むことが多い |
| 12mA | 約 33Ω | 低インピーダンス側。ダンピング抵抗を足して整合させるのが前提 |
| 16mA | 約 25Ω | さらに低い。ダンピング抵抗がほぼ必須 |
これは VOL 規定点からの逆算であって、実際の小信号出力抵抗(IBIS モデルの V-I カーブの傾き)とは近いですが一致しません。配線設計で本当に必要な精度で出力抵抗を知りたいときは、ベンダーが配布する IBIS モデルの Pulldown/Pullup テーブルを直接読んでください。読み方は別記事「IBIS から出力抵抗を読む」にまとめてあります。
強くしすぎるとどうなるか:リンギングとオーバーシュート
出力抵抗が配線の特性インピーダンス Z0(基板の 50Ω 配線が一般的)より低いと、送端で反射係数が負になり、受端が開放(ハイインピーダンス入力)なら、そこでもう一度反射して波形が跳ね上がります。
送端の立ち上がり直後の電圧は Vlaunch = VDD × Z0 ÷ (Z0 + Rout)、受端の開放端での最初のピークはその 2 倍に近づきます。VDD = 3.3V、Z0 = 50Ω で計算すると、16mA(Rout ≒ 25Ω)でおよそ 4.4V、12mA(33Ω)で 3.98V に達します。8mA(50Ω、ほぼ整合)だとちょうど VDD の 3.3V で収まります。
3.3V 系 IC の絶対最大定格は 3.6V が多く、4.4V も 3.98V もこれを超えます。実機での症状は、オシロで見える波形のオーバーシュートだけでなく、受信側の保護ダイオードに繰り返し電流が流れることによる長期的な劣化、そして波形がスレッショルドを何度も横切ることによる二重クロック・誤カウントです。配線が「臨界長」を超えて伝送線路として振る舞う条件は、別記事「配線は何 mm から「伝送線路」になるか」で扱っています。
強くしすぎるとどうなるか:同時スイッチングノイズ(SSN)
もう一つの効きどころは、複数の出力ピンが同時に切り替わるときです。GND ピンとダイの GND の間には、ボンディングワイヤやパッケージ内配線、BGA のビアによる寄生インダクタンス Lgnd が必ず存在します。N 本の出力が同時に切り替わると、そこに流れる電流変化 di/dt がすべて足し合わされ、V = Lgnd × (dItotal/dt) だけダイ側の GND 基準電位が跳ね上がります。これがグラウンドバウンス(Ground Bounce)で、SSN(Simultaneous Switching Noise)の主な原因です。
数字で確認します。10pF の負荷を 16 本、立ち上がり時間 1ns で同時にハイへ駆動するとします。1 本あたりの充電電流は I = C·V/t = 10pF × 3.3V ÷ 1ns ≒ 33mA、16 本合計で約 528mA。BGA パッケージの GND インダクタンスを 1nH とすると、バウンスは V = 1nH × 528mA ÷ 1ns ≒ 0.53V。QFP でボンディングワイヤ経由(Lgnd ≒ 4nH)だと、同じ条件で 約 2.1V にまで達します。
この電位は、ダイ内部で見ている「GND」そのものが持ち上がることを意味します。ロジック的にはまだ L のはずの他の入力ピンが、GND 側だけ浮くことで相対的に H 側へ振れて見え、同じバンクの静的な信号が誤って読み取られることがあります。DDR のような高速バスで「タイミングは合っているはずなのに特定パターンでだけ化ける」不具合の一因が、これです。
強くしすぎるとどうなるか:EMI と消費電流
エッジが速いほど、その信号が持つ帯域は広がります。目安の式 BW ≒ 0.35 ÷ tr で見ると、tr = 1ns なら約 350MHz 相当、tr = 0.5ns なら約 700MHz 相当まで成分が伸びます。輻射 EMI の測定で問題になりやすいのは、まさにこの帯域です。ドライブ強度を上げる(=出力抵抗を下げてエッジを速くする)と、狙っていなくても放射のエネルギーが高い周波数側へ広がります。
消費電流の面では、容量負荷を充放電する電流のピーク値が大きくなります。動作周波数あたりの平均消費電力(P = C·V²·f)自体は強度に依存しませんが、ピーク電流は出力抵抗が下がるほど大きくなり、電源レイヤのデカップリングに要求される ESR・実装インダクタンスが厳しくなります。ビアのインダクタンスがデカップリングコンデンサの効き方をどう左右するかは、別記事「via-inductance-decoupling」も参考にしてください。
弱くしすぎるとどうなるか:容量負荷の立ち上がり遅延とタイミング
出力抵抗が高いと、配線容量・入力容量(合わせて数 pF〜数十 pF)を充電する時定数 τ = Rout × C が伸びます。4mA(Rout ≒ 100Ω)で 20pF の負荷なら τ = 2ns、10〜90% の立ち上がり時間はその約 2.2 倍で 4.4ns 程度です。同じ負荷を 12mA(33Ω)で駆動すれば τ は約 0.66ns、立ち上がりは 1.5ns 弱まで縮みます。
この遅延は、クロックに対するセットアップ/ホールドのタイミング計算にそのまま乗ります。配線容量と駆動電流の関係、負荷容量ごとの立ち上がり時間の具体的な計算は、別記事「配線容量と、ドライバがそれを駆動できるか」で詳しく扱っています。バスの中で 1 ピンだけ強度が違う設定になっていると、そのピンだけタイミングマージンが削れる、という事故もよくあります。
ダンピング抵抗との組み合わせで過減衰になる罠
配線を整合させる定番は、送端に 22Ω や 33Ω の直列(ダンピング)抵抗を入れて、Rout + Rs ≒ Z0 にすることです。ここで見落とされがちなのが、Rout はドライブ強度で変わるという点です。
8mA(Rout ≒ 50Ω)は、50Ω 配線に対してすでにほぼ整合しています。ここに「いつもの」33Ω を足すと、合計は 83Ω。送端の立ち上がり電圧は VDD × 50 ÷ (50+83) ≒ 1.24V しか出ず、残りは反射がもう一往復してからやっと VDD 近くまで階段状に上がる、過減衰の波形になります。速くするつもりで強度を上げたのに、ダンピング抵抗を機械的に足すことで逆に遅くなる、というのがこの罠です。
一方、16mA(Rout ≒ 25Ω)に 33Ω を足すと合計 58Ω で、Z0 = 50Ω にかなり近く、ダンピング抵抗の本来の使い方(低い Rout を整合点まで持ち上げる)になっています。ダンピング抵抗の値は、ドライブ強度が決まったあとに Rout の目安を引いて選ぶもので、強度によらず 22Ω や 33Ω を固定で使うものではありません。
スルーレート設定(SLOW/FAST)との違い
FPGA の I/O 属性には、ドライブ強度とは別に SLOW/FAST のスルーレート設定があります。ドライブ強度が出力抵抗(=静的な電流駆動能力)を決めるのに対し、スルーレートは同じ出力抵抗のまま、立ち上がり時間 tr だけを変える設定です。出力段の駆動段を電流制限してゲート容量の充放電を遅らせる、といった内部回路で実現されています。
SSN への効き方は 2 乗で違います。dI/dt と、GND インダクタンスに乗る電圧の両方に tr が分母で入るため、バウンス電圧はおよそ 1/tr2 で増えます。先ほどの 16 本同時・10pF・Lgnd = 1nH の条件で、FAST(tr = 0.5ns)なら約 2.1V、SLOW(tr = 2ns)なら約 0.13V です。「そこまで強度を上げる必要はないが、少しでも速くしたい」というときは、強度を上げるよりスルーレートを SLOW から FAST に上げる方が、SSN への影響を抑えたまま速くできる場合があります(逆に、SSN が問題ならまず SLOW を疑う)。
同じ「強度 8mA」でも SLOW と FAST でリンギング量が変わる品種があります。Rout は同じでも tr が違えば、配線の臨界長に対する余裕も変わるためです。強度とスルーレートは別々に確認してください。
決め方の手順
- 配線の特性インピーダンス Z0(基板スタックアップから、マイクロストリップなら 45〜55Ω が一般的)を確認する。
- そのバスの負荷容量(配線容量+受信 IC の入力容量)と、必要な立ち上がり時間の上限(タイミング制約から逆算)を確認する。
- 弱い強度から、その立ち上がり時間を満たす最小の強度を選ぶ(不要に強くしない)。
- IBIS モデルまたは VOL/VOH の目安から Rout を求め、ダンピング抵抗を足すかどうか、足すならいくつにするかを Rout + Rs ≒ Z0 で決める。
- 同一バンク・同一タイミングで同時に切り替わるピン数を数える。バス幅が広いほど、また同時にトグルしやすいデータパターンほど SSN が厳しくなる。
- SSN が厳しい場合は、強度を下げる、SLOW に落とす、GND ピンを増やす(VRM/GND の割り当てを見直す)、スイッチングをずらす(OSERDES など出力段でわずかに位相をずらす機能がある品種もある)のいずれかで対策する。
- 実機でオシロを当て、受端の波形(オーバーシュート)と、隣接ピンの誤トグル(SSN)の両方を確認してから確定する。
よくある質問
ドライブ強度を上げると本当に消費電力が増えますか。
全ピンを弱い設定にしておけば安全ですか。
IBIS モデルがないベンダーの石ではどう見積もればよいですか。
ダンピング抵抗を入れたのに、まだリンギングが残ります。なぜですか。
同時スイッチングを減らすなら、GND ピンを増やす以外に何ができますか。
参考にした規格・資料
- JEDEC JESD8-B, "Interface Standard for Nominal 3V/3.3V Supply Digital Integrated Circuits" — LVCMOS の VOL/VOH/IOL/IOH の定義
- 各 FPGA ベンダーの I/O 規格資料(LVCMOS の DRIVE / SLEW 属性の説明) — ドライブ強度・スルーレート設定の選択肢と、IOSTANDARD ごとの組み合わせ
- 各 FPGA ベンダーが配布する IBIS モデル(.ibs ファイル) — Pulldown/Pullup の V-I テーブルから実際の出力抵抗を読む一次情報
- IBIS Open Forum, "I/O Buffer Information Specification (IBIS)" — IBIS モデルのフォーマットと V-I/V-T テーブルの定義