隣の信号は本当に \"盗み聞き\" するのか — PCB のクロストークと GND ガードを Python で見てみる

  • pcb
  • python
  • signalintegrity
  • 電子工作
  • fdtd

盗み聞きする上のトレース

はじめに — 隣の信号は本当に「カブる」のか

若いころ、先輩にこう言われたことがあります。

「高速信号の隣を走らせる線はちゃんと GND で囲め。隣にカブるぞ。」

前回 の 90 度コーナーに続いて、今回もこの手の「先輩が言ってた話」を Python で確かめてみます。

当時は半信半疑でした。配線同士は触れてもいないのに、なぜ「カブる」のか。GND の線を 1 本添えただけで、本当にそんなに変わるものなのか。

今回も、自作の小さな 2D FDTD ソルバで電界がどう振る舞うかを見てみます。前回作ったソルバ本体(fdtd.py)は流用して、配線の置き方と観測点の取り方を入れ替えました。リポは github.com/logicia32/lab-pcb-crosstalk-guard に置いています。

隣の信号がカブるって、本当はどうなんだろう

PCB 上で 2 本の配線が並んで走っているとき、片方に信号を流すと、もう片方に何も流していないのに電圧の揺れが現れる ── これがクロストークです。

物理的に何が起きているかというと、信号を流している配線(aggressor、信号を入れる側)の周りには電界と磁界が広がっています。隣の配線(victim、隣で観測する側)はその電界の中に置かれているので、揺れがそのまま乗ってきてしまうわけです。

イメージとしては、静かな図書館で隣の席に座っている人の独り言が、本人にその気がなくても聞こえてしまう、あの感じに近いかもしれません。配線同士は直接触れていなくても、空間を介して情報が漏れる ── これが PCB レイアウトで一番気を遣う現象の一つです。

なお、実 PCB のクロストークは電界の漏れだけではなく、磁界の結合(容量性 + 誘導性)やリターン電流経路の乱れも同時に効きます。本記事ではまず直感を掴むため、ヒートマップで見える 電界の滲み に絞って観察します。

Python で並走配線を観察する

前回作った 2D FDTD ソルバを使い回します。違うのは導体の置き方だけです。

# 並走する 2 本の信号配線 + 間に GND ガード(任意)
layout = default_layout(grid, separation_cells=32, trace_width=6)
# layout.aggressor_y, layout.victim_y, layout.guard_y が決まる

# GND ガードのスタイルを切り替える
pec = PEC(mask=guard_mask(grid, layout, style="none"))         # ガードなし
pec = PEC(mask=guard_mask(grid, layout, style="solid"))        # 連続 GND 壁
pec = PEC(mask=guard_mask(grid, layout, style="fence",
                          via_pitch=12))                       # via 柵

aggressor 側にだけガウシアンパルスを 1 発励起して、victim 側に Ez(電界の鉛直成分)がどれくらい乗ってくるかを観察します。

ヒートマップは前回と同じ inferno カラーマップ、明るいほど電界が強い、サーモグラフィー風です。シアンの細い線が信号配線の輪郭、白い線が GND ガードの輪郭です。

少し補足しておくと、本モデルでは信号配線を導体としては置かず、配線の位置で Ez を励起・観測する形にしています。終端や 3D リターン経路は持ちません。得られる dB は実 PCB のクロストーク量(NEXT / FEXT)の絶対値ではなく、各構成の相対的な効きを比べるための代理指標 とご理解ください。配置イメージとしては、上下を GND に挟まれた内層配線(ストリップライン)に近い物理が出ます。

まずはガードなしで観察してみる

何も間に置かない素のままから始めます。

ガードなし

上が aggressor、下が victim です。aggressor からパルスが広がっていって、下の victim 側までかなり届いています。両方ほぼ同じくらい明るく光っていて、隣の信号は文字通り「ほぼ素通し」で乗ってきている状態です。

victim 上の電界の最大値を aggressor 比で測ると、-0.4 dB でした。デシベルでほぼ 0、つまり Ez 振幅で見るとほぼ素通し、というのがこのモデルでの結果です。

ただし、これは「実 PCB でガードなしだと必ずこうなる」という意味ではありません。本モデルは直下に GND プレーンを持たないため、電磁界が 2D 平面に自由に広がって結合が強めに出ています(実 PCB の baseline は条件にもよりますが -20 dB 程度から始まることが多いです)。それでも 「対策の有無で劇的に変わる」 という相対的な傾向は、実機でも同じ方向に並びます。

間に GND の壁を立ててみる

では、間に連続した GND の帯(連続した銅)を 1 本入れてみます。

連続 GND 壁

これは劇的に変わります。aggressor 側(上半分)の電界は強く広がっていますが、GND 壁の下に行くとほとんど真っ黒、つまり電界がほぼゼロに落ちています。victim 側はほぼ完全に守られている 状態です。

数値で見ると -43.5 dB。さっきの -0.4 dB と比べて、約 43 dB の改善 ── Ez 振幅の二乗で見れば 2 万分の 1 まで落ちました。GND を 1 本入れるだけでここまで効くのか、と少し驚きました。

ただ、これはあくまで「連続した銅の壁」を立てた理想的な場合です。実際の PCB ではもう少し事情が違います。

でも実際は "via の柵" を立てるのが普通

実機の PCB で「GND ガード」と呼ばれているものは、多くの場合こうなっています:

GND ガード + via fence の物理イメージ

信号配線と並走する形で表層に GND の配線(guard trace)を引き、その GND 配線から裏面の GND プレーンに向けて via(穴)を一定間隔で打つ。via の列が「柵(fence)」のように並ぶので、これを via fence(via 柵) と呼びます。

なぜ連続した銅の壁ではなく via の柵なのか。実機ではいろんな理由がありますが、ざっくり以下の通りです:

  • 配線層は基本的に 1 本ずつの線で構成されている。連続した広い銅の領域を表層に作るのは現実的でないことがある
  • 裏面に広い GND プレーンがあるので、表層の guard trace を via で頻繁にその GND に縫い止めれば、実質的に連続壁に近い効果が得られる
  • via 間隔(pitch)を信号の波長の 1/10 程度より小さくすれば、ほぼ連続壁と見なせる、というのが業界の経験則

このシミュは 2D 俯瞰なので、本来 z 方向の現象である「via で裏面 GND に接続」を直接は表現できません。間にある GND の柵を PEC(完全導体)ドットの列として 2D 平面に置き、ドットの間隔を変えて観察します。連続した guard trace 部分はモデル化していません ── 「GND に縫い止められた点」だけが置かれている状態です。

via 間隔が広ければドットの隙間から電界が抜け、狭くすれば連続壁に近づくはずです。本当にそうなるかを確かめます。

疎い via 柵(4 mm 間隔)

疎い via 柵

via の間隔を 4 mm くらい(このシミュ設定では 40 セル)にしてみると、PEC ドットが点々と並んでいるのが見えます。aggressor 側はちゃんと明るいですが、ドットとドットの間からじわっと電界が漏れて victim 側にうっすら届いています。

数値で -5.5 dB。ガードなしの -0.4 dB より少しは良くなりましたが、まだまだ「カブってる」状態です。これだと先輩から「ちゃんと囲め」と言われそうです。

密な via 柵(1.2 mm 間隔)

密な via 柵

間隔を 1.2 mm まで狭めると(12 セル)、状況はかなり良くなります。ドットの列がほぼ連続して見えて、victim 側はだいぶ暗くなりました。

数値で -19.7 dB。疎い柵から 14 dB 改善、Ez 振幅の二乗比で見れば約 25 分の 1 です。連続壁にはまだ及びませんが、ピッチを狭めると桁違いに効く という傾向はここで見えました。実機での絶対値は誘電体・終端・周波数帯・3D 効果によって変わりますが、向き(疎い柵 → 密な柵 → 連続壁の順に効く)は同じです。

少しだけ波長との対応も補足しておきます。このシミュで使っているガウシアンパルスの主な周波数成分は概ね 50 GHz 付近、真空中の波長 λ は 6 mm くらいです。これで言うと 密な柵 1.2 mm は λ/5、疎い柵 4 mm は λ/1.5 にあたります。先ほど触れた経験則の λ/10(≈ 0.6 mm)はあえて厳密には満たしていません ── 連続壁と比較したときにまだ差が残るあたりで、観察を止めたかったためです。

4 通りを横並びで見比べる

4 つの構成を並べてみます。

比較

構成 このモデルが表しているもの victim の最大結合量
ガードなし 2 本の信号配線の間に GND を一切置かない素の状態 -0.4 dB(Ez ほぼ素通し)
疎い via 柵(4 mm) GND に縫い止められた点(via 位置)を 4 mm 間隔で並べた状態 -5.5 dB
密な via 柵(1.2 mm) GND に縫い止められた点(via 位置)を 1.2 mm 間隔で並べた状態 -19.7 dB
連続 GND 壁 連続した広い GND 銅(GND ポリゴン、または via を極限まで密にした理想化) -43.5 dB

数値は 電界 Ez 振幅比の 20 log10(ポート電力比ではない)です。dB の絶対値は本モデルの近似に依存しますが、4 通りの順位と差の桁感は、実機でも同じ方向に並ぶ傾向の指標として読めます。

victim 上の電界の時間波形を並べると、傾向がさらに分かりやすくなります。

時間波形

ガードなし(青)と疎い柵(オレンジ)は振幅が大きく揺れていて、長く尾を引いています。密な柵(緑)はかなり小さくなり、連続壁(赤)はほぼゼロのまま、ほとんど揺れていません。

「囲めば囲むほど良い」とは、簡単には言い切れない

ここまで見て、「じゃあ全部連続 GND 壁で囲めばいいじゃん」と思いたくなります。実際このシミュレーションだけ見るとそうも見えます。

ただ、実機ではそう単純ではありません。少しだけ補足しておきます:

  • 連続した広い表層 GND を引くと配線スペースが食われる。多層基板で他の信号も通したいので、表層は意外と混雑している
  • via を打てば打つほど無条件に良いわけでもない。製造上の最小ピッチ制約、他層配線とのクリアランス、密集による局所的なプレーン形状の制約、via スタブによる共振など、別の事情が同時に効いてくる
  • 間隔が信号の波長に対して十分小さければ、via 柵は実用上「連続壁」と区別がつかなくなる。だから「λ/10 が目安」みたいな経験則が出てくる

つまり、対策として一番強いのは確かに連続壁ですが、現場では via 柵で「十分なところ」を狙うのが普通です。守りすぎず、放置せず、その間を探す感覚に近いです。

GND に守られて歩くマスコット

おわりに

「隣にカブるぞ」という先輩の言葉、何もしなければ本当にほぼフル結合で乗ってきます。GND で囲めば確かにしっかり減って、via の間隔を狭めるほど効きます。一方で、連続壁が常に最善とも限らない ── 現場の判断はそのバランスにあるようです。

ヒートマップで見ると、配線が触れていなくても電界が空間に滲んで隣に届いていく様子が直感的に分かります。「電気が線を伝わる」という素朴な絵から少しだけ視野を広げて、「電磁界が線の周りに広がっている」という見方に切り替えるのに、こういう可視化は役立つかもしれません。

昔の自分は、先輩に「GND で囲め」と言われても、どこまで囲めば「十分」なのかが分からないまま手を動かしていました。今回の絵を眺めていると、少なくとも「何を気にして間隔を決めているのか」は、少しだけ分かった気がします。それが分かるだけでも、当時の自分には救いになっていたと思います。

次回(連作 第 3 本)はインピーダンス整合と反射波を扱う予定です。なお、第 1 本では連作を 4 本予定と書いていましたが、クロストークと GND ガードは「現象と対策」で 1 本にまとまったので、3 本構成に整理し直しました。配線の終わりで信号が「跳ね返って戻ってくる」現象を、時間発展のアニメーションで観察します。

動かしたい方へ

git clone https://github.com/logicia32/lab-pcb-crosstalk-guard
cd lab-pcb-crosstalk-guard
uv sync
python scripts/run_crosstalk.py

outputs/ に PNG / GIF / 結合量サマリが出力されます。手元の i5 ノートで 5〜10 分くらいです。

この記事は Zenn に初出したものを加筆・補足したものです ── Zenn の元記事を見る