今の基板のクロックの配分は水晶発信器からFPGAへ入力し、FPGAのDCMを使って0ディレイで、その他のデバイスに供給している。
そのやり方はVirtex2pro users guide ver.4.0の91ページに図がある。下に転載する。

このように出力したクロックを他のデバイスに供給するが、またFPGAの入力に戻しフィードバックをかけ、ディレイをキャンセルする。
Spartan3でもXAPP462(v1.0)の31ページに外部クロック信号でのスキュー削減方法が載っている。下に図を転載する。こちらは外部バッファのディレイもキャンセルして良いようだ。

このようにしてプリント基板でクロックを分配することにする。分配するのはSDRAM4個とPowerPCだ。
初めにFPGAの1つの出力からフィードバック(FB)と全てのデバイスにクロック(133MHz)を供給することにする。トポロジーは一筆書き。PowerPCへのクロック配線はセットアップ時間の関係から約7cm(400ps)余計に長さを増やしてデータより遅延させることにする。以下の図ではダンピング抵抗と水晶発信器を省略してある。

上図でクロック出力は緑の点、クロック入力は赤の点だ。FPGA内にはDCMを最上図のFigure3-23に様に実装する予定だ。シミュレーション時に、これだと特に真ん中のSDRAMの波形が乱れ、波形がなくなってしまうような感じになるようだ。この辺のトポロジーをいろいろ変えてもらったが、やはりだめだった。やはり後ろのPowerPCの負荷が重いとのことだったので、PowerPCだけ専用のDCMを使用することになった。これだとDCMを2個使用することになる。それは出力を2つ出すとFPGA内の配線ルートが異なるので内部遅延が異なり、FBがかかっているクロック出力とそうでないのとで、クロックの位相が変化してしまうからである。
そこでDCMを2つに増やして負荷を減らし波形の改善を試みる。さらにSDRAMだけになったので分岐配線にした。

今度はPowerPCへの配線に余分な長さはない。波形も乱れるし専用DCMなので位相をシフトして辻褄を合わせることにする。
FPGAの出力プロパティはFastの24mAだが、SDRAMは負荷が重いのか波形の立ち上がり、立下りがかなりなまっている。SDRAMの規格からCLK High time、CLK low timeは両方とも2.5nsだが、CLK low timeの方は規格に入らない。
そこで仕方が無いので、DCMを3個使うことにしてSDRAMを2個ずつに分けることにした。

これでシミュレーションによる波形もだいぶ良くなり、これで行くことになった。DCMを3個も使用することになってしまったが。。。
FPGA出力1個に付きSDRAM1個負荷のシミュレーションもしてもらったが、さらに立ち上がりが良くなっていた。これが理想なのだが、ちょっと無理である。
これは余談だが、DDR SDRAMコントローラのタイミングを書いた文書
ftp://ftp.xilinx.com/pub/applications/misc/ar19385.pdfの3ページ目の図にもあるがIOBのDDRレジスタで送信クロックを生成している。こうするとFPGA内部のクロックに対してもDDRレジスタなどの遅延が発生するが、これらの遅延をDCMにフィードバックすることによってキャンセルすることが出来ないだろうか?
キャンセルすることが出来れば、IOB間のスキューは残るがDCM1個でSDRAM1個に対して1個のピン(IOB)を割り当てられるのではないか?
具体的には下の図のような構成である。

上図は水晶発信器からDCMのCLKINに入力してCLK0出力からBUFGを通しグローバルクロックラインを使ってFDDRRSEのクロックに入力する。FDDRRSEのD0に1をD1に0を入れておくと入力クロックと同じクロックが出力に出る。それを5つ並べてそのうちの4つのFDDRRSEの出力をSDRAMのクロックとして出力する。残りの1つのFDDRRSEの出力は一旦FPGAの外に出して、もう一度グローバルクロック入力から入れてDCMのCLKFBにフィードバックする。
そうすると、うまく動けば入力クロックと同期したクロックがSDRAMへ出力できるはずだ。グローバルクロックラインのスキューがあるが、1個のDCMで4個のSDRAMへのクロックが同期できるはずだ。
ただしこれは構想だけで確かめたことは無いから動くかどうかわからない。誰か確かめた人がいらしたら教えてください。
自分でも、今度の基板は3個のDCMを使う構想だが、うまく動いたら一番下の図のようにDCMを1個減らして試してみようと思う。
- 2006年04月01日 06:17 |
- プリント基板の作成過程
-
| トラックバック:0
-
| コメント:7
mixiから辿らせていただきました。
はじめまして。mixiの足跡から辿らせていただきました「たに」と申します。
FPGA位相クロック同期の話は、私も仕事上、色々と苦労した経験があります。
ところで、XilinxのDCMは、チップ内外の入力クロックに対する出力クロックのジッタは今まで問題になったことはないでしょうか。
私は、Xilinxは使ったことがないのですが、使ったことがあるActelのFPGAでは、内臓PLLが位相同期を保証しておりません。マニュアル等を見る限り、位相同期をもっともらしくできそうに記述してあるのですが、実力としては、80MHz程度のクロックでジッタが20%前後出てしまう個体が10%の確率で散見されました。ハードコアIPがアナログPLLなので、安定することが難しいのかもしれませんけど。本ページの最後に載せられていたアイデア(FF出力で分配)は、興味ありますね。少なくともFPGA内部のディレイをキャンセルできそうですね。
- 2006/04/02(日) 22:03:08 |
- URL |
- たに。 #3618k6Qo
- [ 編集 ]
こんにちは。よろしくお願いします。
一応Virtex2proのDCMのCLK0jitterは±100psと書いてありましたが、チップの外にフィードバックループがあるしどうでしょうか?
現在のボードでは66MHzの動作クロックですが、Figure3-23の回路で、SDRAM4個とPowerPC駆動していますが、正常動作しています。
今度は倍の周波数のためもあってだめなようです。
最後の回路は使用するDCMの個数を少なくするためにはどうしたら良いだろうと考えたところ、これでいけるんじゃと考え着きました。今のボードでも確かめられるはずなのでやってみようと思っています。
- 2006/04/02(日) 22:43:54 |
- URL |
- marsee #-
- [ 編集 ]
FPGAの個体差の件で補足します。
実はクロックのジッタは測っていませんが、現在動作中のボード16枚ちゃんと動いているで大丈夫だと思っています。
- 2006/04/03(月) 09:39:05 |
- URL |
- marsee #-
- [ 編集 ]
Xilinxは、デジタルPLLなのでおそらく問題はないでしょうね。
私の場合、ACTELの対応は、ちょっとアレでしたが…(苦笑)
チップ外でのフィードバックループが気になるところとありますが、
確かに考えられますね。Xilinxでは、PLLを使用する際、専用のI/O、ハードワイヤというのはありますか?ACTELでは、その考え方があって、
PLLに直近のピン&専用ワイヤ(といってもローカルワイヤの一種ですが)でレイアウトされないと、ジッタが極悪になる現象が確認されてます。ツールの方で完全自動にやってくれるわけじゃなかったため、原因の特定に困りました。
- 2006/04/03(月) 23:28:02 |
- URL |
- たに。 #-
- [ 編集 ]
XilinxのVirtex2, Virtex2proではグローバルクロック入力があります。
これはグローバルバッファのちかくにあります。これらは近くにありますが、DCMはチップの上辺、下辺に散らばっているのでそこまでの経路で遅延が発生して問題になる場合があります。どのDCMを使うかによっては。
- 2006/04/04(火) 05:20:23 |
- URL |
- marsee #-
- [ 編集 ]
DCM1個でDDRを駆動
ピンフィードバックをつかって内部のDLLの位相を合わせ,かつFDDRで外部RAMを駆動する方法,弊社でも過去に製造して現在も出荷中の製品群にこの手法を使っています.
DCMはカスケードにするとジッタの重畳が問題になって,ある個数を過ぎるとロックしなくなりますが,この方法だと1つのDCMで済むので問題がクリアになりました.
複数のDCMをカスケードにしなければならないのなら,V2PROよりはV4のほうが格段に性能が上がっているので,V4をお勧めします.
が,ただ,MIXIでもかかれていらっしゃいましたが,V4はV2PROに比べてゲートvsピン数の比率がアンバランスですね.
- 2006/04/08(土) 16:48:50 |
- URL |
- まさちく #-
- [ 編集 ]
まさちくさん情報ありがとうございました。
それじゃ、この回路は実績があるということですね。今度から使うことにします。
V4はピン数の多いものが無いのでV2proしか使えません。
- 2006/04/09(日) 00:00:49 |
- URL |
- marsee #-
- [ 編集 ]