差動信号を扱っていると、一度はやらかすのがこれです。
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逆接を疑うのがおすすめです。
良きハッピーハードウェア開発を。

コメント