LVDS DDRでP/Nを逆に配線したら何が起きるのか

差動信号を扱っていると、一度はやらかすのがこれです。

P/Nを逆に配線してしまう。

ぱっと見は「終わった…」と思いがちですが、実際にはもう少し整理して考えることができます。
特にDDR受信では、データとクロックで影響が異なるのがポイントです。

基板設計の際に注意してほしいものですよね~


結論(先に)

一般的には、次のように考えられます。

  • データだけP/N逆
    → ビット反転のみ(順序は変わらない)
  • クロックだけP/N逆(DDR)
    → 偶奇エッジが入れ替わる(データ順序が崩れる)

前提

本記事では以下の条件を前提とします。

  • インタフェース:LVDS
  • 受信方式:DDR(立上り・立下りでサンプリング)
  • データ列:D1 → D2 → D3 → D4(時間順)
  • デバイス:Efinix Titaniumでの動作確認ベース

※一般的なLVDS DDRでも同様の挙動になると考えられますが、最終的にはデバイス依存です。


データだけP/N逆の場合

まずはシンプルなケース。

起きること

差動受信は

Vdiff = Vp - Vn

で判定されます。

P/Nを逆にすると、

Vdiff → -Vdiff

となるため、

👉 論理レベルが反転します。

結果

D1 D2 D3 D4 → ~D1 ~D2 ~D3 ~D4

ここで重要なのは、

  • サンプリングタイミングには影響しない
  • データの並び順は変わらない

という点です。

つまり、

  • 順序:そのまま
  • 値:反転

という非常に素直な挙動になります。


クロックだけP/N逆の場合(DDR)

こちらが本題です。

起きること

クロックのP/Nを逆にすると、

👉 クロックが180°位相反転します。

DDRでの影響

DDRでは、

  • 立上りエッジで1ビット
  • 立下りエッジで1ビット

を取得します。

クロックが反転すると、

👉 どのエッジでどのデータを取得するかが入れ替わる

ことになります。


具体例

元の想定:

立上り → D1  
立下り → D2
立上り → D3
立下り → D4

クロック反転後:

立上り → D2  
立下り → D1
立上り → D4
立下り → D3

結果

D2 D1 D4 D3

完全にランダムになるわけではなく、

👉 偶数・奇数のペア単位で入れ替わる

という挙動になります。

この「それっぽく見えるけど微妙におかしい」感じが、デバッグをややこしくします。
ここで私もハマりました orz


対処方法

FPGAであれば、一般的には次の対応になります。

  • データ逆接
    → NOTで補正
  • クロック逆接
    → PLLなどで位相補正、または受信設定で調整

ただし、

  • グローバルクロックに載せられるピンか
  • PLLに接続可能か

などの制約はあるため、ピン配置の時点で回避できるのがベストです。


まとめ

整理すると次の通りです。

  • データP/N逆
    → ビット反転のみ(順序は維持)
  • クロックP/N逆(DDR)
    → 偶奇エッジ入れ替わり(順序が崩れる)

最後に

この手の問題は、

  • テストパターンを流す
  • ILAやロジアナで確認する

のが最も確実です。

理屈通りに見えることもあれば、
実装(配線遅延・スキュー・IO設定)依存でズレることも普通にあります。

「なんかそれっぽく動いてるけどおかしい」状態にハマったら、
まずはP/N逆接を疑うのがおすすめです。


良きハッピーハードウェア開発を。

コメント