ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

複数のFPGAに共通のクロックを入れる方法

一つのFPGAに入りきらない大きな回路を複数のFPGAに分割する場合、クロックについてのケアが必要になります。やり方と問題点を整理してみました。クロックの位相ずれは、シミューレションでは出ない場合もあり、時に位相あわせの必要すら忘れがちなので気を付けましょう。後に書きますが「たまたま合う」という状況もあり、一回実測して安心していると後で痛い目に会うので、最初からしっかり設計しておきましょう。

2つのFPGAに対して、位相の揃った50MHz、33MHz、25MHzの3系統のクロックが必要な場合を考えます。FPGA内蔵PLLをPLLという表現にしていますが、XilinxのDCMでも同じ事です。

個別にクロックを入れる

まずは最初の例です。

2つのFPGAに、それぞれ50MHzを入れ、FPGA内のPLLで3系統のクロックを生成しています。

全く仕様を満たしていない問題外の構成です。2つのOSCが同期していないので、FPGA内部のクロックも全く同期していません。

もう一つ忘れがちな問題があります。シミュレーションと違い、2つのOSCは厳密に「全く同じ周波数」という事はありえません。必ずどちらかが速く動きます。仮に電源投入後2つのOSCの位相を合わせることができたとしても、回路を動かしていくと徐々に位相がずれていきます。

ここからわかる結論としては「位相をそろえる必要がある場合、源振は一つにする」です。

共通のクロックをFPGAで分周する

次に50MHzのOSCを一つ用意し、それぞれのFPGAで分周する場合を考えます。

今回は本質の部分ではないの省略していますが、OSCの出力はクロックドライバ等で分配して等遅延でFPGAに送る必要があります。

33MHzは置いておいて、50MHzと25MHzの関係を見てみましょう。同じ50MHzから25MHzを作っているので位相が合いそうな気はしますが、1/2の確率で180度ずれてしまいます。FPGAのPLLは立ち上がり自体は合わせてくれるのですが、どの立ち上がりに合わせるかの情報を持っていないため、たまたま合う時と位相が合わないときが発生します。

FPGAによってはPLLの外部から立ち上がりのタイミングを制御して合わせ込む事ができます。とはいえ、その制御を行うクロックはどれを使うかとなると、また難しい問題があります。

共通のクロックをFPGAで逓倍する

逆に25MHzから33MHz、50MHzを作って見ましょう。

遅いクロックから速いクロックを作る場合、先ほどの問題はおきません。25MHzの位相が合っているなら50MHzの位相も合います。

問題は33MHzのクロックにあります。25MHzから33MHzを作るには、4/3倍する必要があるのですが、ここも電源を投入する度に位相の関係が変わります。本質的に、2倍、4倍・・・以外のクロックを使う場合は、何か仕組みを作らないと位相を合わせることはできません。

全て外部から供給する

抜本的な解決策としては、全く別の所から必要なクロックを供給する方法があります。

基板上に複数のクロックを入れる仕組みが必要ですが、クロックジェネレータさえ用意できれば任意に位相をコントロール出来ます。

いわいるFPGAプロトボードと呼ばれる物に同軸のコネクタが大量についているのは、複数FPGAに共通のクロックを入れる為の仕組みです。(動作周波数がPLLの動作範囲を超えてしまった時にも使います。)

プロトを使った検証で、回路に手を加えずに周波数を変えた時の動作を見たいという場合にも有効です。

FPGAが好きな私としては非常に残念ですが、コストや基板の操作性等を度外視するとこれがベストな構成になります。

FPGAの一つにジェネレータを作る

クロックジェネレータで好きな波形を入れるのが難しい場合もあります。その場合、私がよく使うのはこの構成です。

一つのFPGAで必要なクロックを作り、それをもう一つのFPGAへ供給します。上の方で出てきた位相ずれ問題はPLLが複数あるために発生します。PLLを一つだけ使う事で、位相ずれの問題は起きなくなります。ただし、FPGA2には遅延が入ってしまうため、遅延をキャンセルする必要があります。

遅延をキャンセルするにはいくつかの方法があります。
・FPGA2側でPLLを使い、位相を揃える。
・FPGA1で内部用/出力用の2つのクロックを生成し、位相を揃える。
・FPGA1から一度基板上に全クロックを出し、FPGA1、FPGA2にそれぞれ供給する。FPGA1は、PLLで生成したクロックを使うのではなく、外部から折り返されたクロックを使用する。FPGAが多い場合に特に有効。

まとめ

・位相をそろえる必要がある場合、源振は一つにする。
・2倍、4倍・・以外のクロックが必要な場合は、PLLも一つにする。FPGA間の遅延は何らかの方法でキャンセルする。
・ベストな方法は、全て外部から供給する