FPGAでDDRの出力

DCMのCLKFXでクロックを合成する必要があるので、まずはDCM再訪。


CLKFBへのフィードバックが必要な場合

CLK0,CLK2X,CLK2X180,またはCLKDV出力を使用する場合はCLKFBへのクロックフィードバックループが必要。フィードバックソースとしてはCLK0またはCLK2Xのみを使用可能。


CLKFBへのフィードバックが不要な場合

CLKFXまたはCLKFX180の出力のみを使用する場合は、フィードバックは不要。理由はCLKFXとCLKFX180の出力はデジタル周波数合成(DFS)ユニットで生成されているためで、このDFSには既にCLKINに基づいたフィードバックパスが使用されている。もちろん伝送経路のスキュー除去にはフィードバックループが必要である。


ここから本題

DDRクロックの生成-出力バッファのDDRを使用した場合

DCMの1つのクロック出力を、DDR出力フリップフロップで2つのクロックを出力している。1つはそのまま、もう1つは反転して出力される。DCMからの出力はデュティー比50%に調整されているが、FPGAのクロックネットワークを通過する際、多少の歪みが発生する。この歪んだ状態で反転されるので、DDR出力フリップフロップで反転されたクロックの立ち上がりエッジは、本来のエッジよりズレた位置でトリガーされる。


DDRクロックの生成 DCMの位相シフトを使用した場合

DCMから位相シフト無しのクロックと180°位相シフトしたクロックの2つを出力させる。この方法であれば、クロックネットワークで歪みが発生しても、両クロックの立ち上がりエッジは正確にクロックの1/2周期でトリガーできる。これによりデューティーサイクルの歪みを約300ps削減できる。


DCMを使用してODDR2を駆動する高速クロックを生成する場合、周期ジッタを最小限に抑えるためCLKFXにはBUFGMUX_X1Y1,CLKFX180にはBUFGMUX_X2Y0の使用が推奨される。


まとめ

DCMの項目では、「DCM位相シフトを利用したデザインを推奨する」ニュアンスを感じるが、DDR出力バッファの項目では、「どちらも使用可能だが、より低スキューを目指すならDCM位相シフト方式を使用する」と少しニュアンスが違う。
ポイントはリソースと300psのスキュー。リソースに余裕があればDCM位相シフトを使えばいいと思う。リソースに余裕が無くて300psのスキューが許せるなら出力バッファのDDRを使えばいいと思う。


○参考
Xilinx Spartan-3ジェネレーション FPGA ユーザー ガイ ド