FPGAの部屋

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: FPGAからクロック出力

FPGAから出力するクロックの位相FPGAから出力するクロックの位相2FPGA出力クロックの解析でFPGAから他のデバイスへクロック供給について考察?(そんな良いもんじゃないという話もあるが)したが、結局外部フィードバックをするとDCMへのクロック入力遅延とフィードバック入力遅延が合わずにFPGA外部に出力するクロックの位相が入力クロックと合わずに困ることがあった。
やはり外部フィードバックはやめて内部フィードバックで行くことにした。これだと遅延が計算できる。ディフォルトだとクロックパスは遅延をキャンセルするように自動調整されるので出力用DDRレジスタと出力パッドの遅延分だけキャンセルすればよいようだ。実際に計算して設定してみたら動作したので、書いてみたいと思う。

FPGA FAQからヒントを得てフィードバックを使用しないでFPGAからクロックを出力する方法を試してみた。図1にFPGA出力クロック生成回路を示す。
237b298e.png


以前の回路はクロック出力から出力したクロックをフィードバック入力から入力して入力クロックに出力クロックの位相を合わせる予定だったが、FPGA内のクロック入力パスとフィードバック入力パスの遅延が合わないので位相が合わなくなっていた。
今回はDCMのフィードバックはチップ内で行う。その代わり、フィードバックでキャンセルできないデータパス遅延(DDRレジスタと出力パッドの遅延、Tdatapath)はタイミングアナライザから割り出した遅延分をDCMの位相シフトで保障することで0ディレイを保証する。
DDRレジスタのFF0とFF1までのクロックパス(Tclkpath)の遅延の差が0.2ns程度あるようだが、より早いFF1の方で遅延を計算する。実際にタイミングアナライザで算出したPPC_CLK_OUTのクロックパス、データパスの遅延を図2に示す。

81cc8f9f.png


図2でデータパス遅延とクロックパス遅延を足して実力係数(0.82)を掛けた遅延値をDCMの位相シフトで戻せば入力クロックと出力クロックは0ディレイになるはずである。戻すべき位相シフト値をTphとして下の式より計算する。

・PPC_CLK
Tph = (Tclkpath + Tdatapath) × 0.82 = (1.546 + (-0.378)) × 0.82 = 0.958ns
位相シフト値はクロックの周期をTとすると (Tph/T)×256 = (0.958/15)×256 = 16
PPC_CLKの位相シフト値は12(SDRAM_CLK0を位相0とするため)なので実際の位相シフト量は以下の値になる。
実際の位相シフト量 12 – 16 = -4

・SDRAM_CLK0
Tph = (Tclkpath + Tdatapath) × 0.82 = (1.551 + (-0.379)) × 0.82 = 0.961ns
位相シフト値はクロックの周期をTとすると (Tph/T)×256 = (0.961/15)×256 = 16
SDRAM_CLK0の位相シフト値は0(SDRAM_CLK0を位相0とするため)なので実際の位相シフト量は以下の値になる。
実際の位相シフト量 0 – 16 = -16

・SDRAM_CLK1
Tph = (Tclkpath + Tdatapath) × 0.82 = (1.527 + (-0.373)) × 0.82 = 0.946ns
位相シフト値はクロックの周期をTとすると (Tph/T)×256 = (0.946/15)×256 = 16
SDRAM_CLK1の位相シフト値は6(SDRAM_CLK0を位相0とするため)なので実際の位相シフト量は以下の値になる。
実際の位相シフト量 6 – 16 = -10

実際に位相を測定して計算値とどのくらいの誤差があるか調べてみた。やり方は今まで同様にテストポイントに各クロックをFPGA EditorのProbe機能を使用して接続してオシロスコープでPCIXクロックからの位相差を測定するという手順で行った。各クロックのテストポイントまでの遅延をタイミングアナライザで測定して実力係数をかけ実力値を求める。実力値にディフォルトでの位相シフト分を上乗せして実測値と比べてみた。それが表1だ。
0eede745.png


5.の最終算出値と6.のオシロスコープによる実測値があまり違わないので、私はこの方式が良いだろうと判断した。

<教訓>
FPGAからフードバック入力でフィードバックして出力クロックの位相を合わせようとする場合にクロック入力とフィードバック入力はFPGAダイの近くに配置する。クロック入力がダイの上、フィードバック入力がダイの下というように配置すると双方の配線遅延の差が大きくなって出力クロックの位相の狂いが大きくなる。

FPGAから出力するクロックの位相FPGAから出力するクロックの位相2FPGA出力クロックの解析でFPGAから他のデバイスへクロック供給について考察?(そんな良いもんじゃないという話もあるが)したが、結局外部フィードバックをするとDCMへのクロック入力遅延とフィードバック入力遅延が合わずにFPGA外部に出力するクロックの位相が入力クロックと合わずに困ることがあった。
やはり外部フィードバックはやめて内部フィードバックで行くことにした。これだと遅延が計算できる。ディフォルトだとクロックパスは遅延をキャンセルするように自動調整されるので出力用DDRレジスタと出力パッドの遅延分だけキャンセルすればよいようだ。実際に計算して設定してみたら動作した。
あまり関心はないかもしれないが、またレポートしようと思う。

FPGAから供給するクロックの位相2での実測値をタイミングアナライザから計算した値と比較してみる。

8192e901.png


図1のTinはクロック入力パッドからDCMのCLKINまでの遅延時間、Tfbはクロックフィードバック入力パッドからDCMのCLKFBまでの遅延時間、ToutはDCMのCLK0からDDRを通ってクロック出力パッドまでの遅延時間、TdcmはDCMでの遅延時間とする。
090572a6.png


遅延時間の関係を図2に示す。これはDCMのCLKINの位相とCLKFBの位相をDCMが比較して同一になるように制御することを前提とする。
 DCMは遅延を調整してCLKINとCLKFBの位相を合わせるため、周期(T)はTdcm+Tout+Tline+Tfbになる。Tin、Tout、Tfbをタイミングアナライザで計算して実際の性能との倍率(0.82)を掛けて実力値を計算する。そこからTdcmを計算できるのでクロック出力パッドまでの遅延(Tph)を計算することができる。
  Tdcm = T – Tout – Tline – Tfb ・・・・・(1)
  Tph = Tin + Tdcm + Tout ・・・・・(2)

>PPC_CLK
タイミングアナライザによる解析値に実力係数を掛け実力値を算出する
Tout = 4.101ns × 0.82 = 3.363ns
Tin = 2.688ns × 0.82 = 2.204ns
Tfb = 7.209ns × 0.82 = 5.911ns
Tlineを0.2nsとして式(1)からTdcmを計算する
Tdcm = 15ns – 3.367ns – 0.2ns – 5.911ns = 5.526ns
式(2)からクロック出力パッドまでの遅延(Tph)を計算する
Tph = 2.204ns + 5.526ns + 3.363ns = 11.093ns
PCIX_CLKに対する位相差は11.093 – 15 = -3.907ns

>SDRAM_CLK0
タイミングアナライザによる解析値に実力係数を掛け実力値を算出する
Tout = 3.634ns × 0.82 = 2.980ns
Tin = 2.620ns × 0.82 = 2.148ns
Tfb = 1.132ns × 0.82 = 0.928ns
Tlineを0.1nsとして式(1)からTdcmを計算する
Tdcm = 15ns – 2.980ns – 0.1ns – 0.928ns = 10.992ns
式(2)からクロック出力パッドまでの遅延(Tph)を計算する
Tph = 2.148ns + 10.992ns + 2.980ns = 16.120ns
PCIX_CLKに対する位相差は16.12 – 15 = 1.12ns

>SDRAM_CLK1
タイミングアナライザによる解析値に実力係数を掛け実力値を算出する
Tout = 9.383ns × 0.82 = 7.694ns
Tin = 2.632ns × 0.82 = 2.158ns
Tfb = 1.216ns × 0.82 = 0.997ns
Tlineを0.1nsとして式(1)からTdcmを計算する
Tdcm = 15ns – 7.694ns – 0.1ns – 0.997ns = 6.209ns
式(2)からクロック出力パッドまでの遅延(Tph)を計算する
Tph = 2.158ns + 6.209ns + 7.694ns = 16.061ns
PCIX_CLKに対する位相差は16.061 – 15 = 1.061ns

・PCIX_CLKと各デバイス用クロックの位相差
c7c3d5aa.png



上の表のように実測値とタイミングアナライザからの計算値が合わない。計算が間違ってる、おかしいという指摘があったらよろしくお願いします。

FPGAから供給するクロックの位相で概要は説明したが、そのデータを示そうと思う。
やり方は最近のお仕事に書いておいたがもう一度書くと。
やり方はFPGA Editorを使って、各クロックのフィードバック入力ピンをテストポイントにつないでオシロスコープでPCIXの入力クロック(これもテストポイントに出力している)に対する各クロックの位相と比較してみた。
このままではテストポイントの各クロックのテストピンに行くまでの配線遅延が違っていて比較が難しいので次の手順で行った。

1.各クロックの入力パッドから出力パッドまでの遅延量をTiminig Analyzerで出した。
2.1.の値を実測値から求めた係数をかけて実力値にした。
3.PCIXクロックの出力との差分をとった。
4.実際の位相ダイアグラムに従って補正した。


98e7e4b7.png


1.はタイミングアナライザで測定した入力パッドから出力パッドまでの遅延だ。それを実際に測定して決定したFPGA実力係数(0.82、備考参照)をかけて実際に近いと思われる実力値を決定する。それが2.だ。
次にその値をPCIXクロックからの相対値に変換する。これが実際に計測できるはずの値だが、一部位相シフトをしてあるので(4.)それを補正したのが5.だ。
5.の値が計測できるはずだがずれていたのでDCMの位相シフトで5.の値になるようにあわせた。このシフト値が6.だ。どの位、値がずれていたかを見るために4.と6.の差を取ったのが8.だ。

備考(補正値の算出方法)
内部クロックを直接テストポイントに出した信号と遅延素子を挿入した信号とを比較した。
test_point(7)とtest_point(4)の遅延の差はオシロの実測値で1.416ns。Timing Analyzerから求めた差は1.742nsなので実測値は算出値の0.82倍。

やはり実際にクロック位相はずれているようだが、なぜずれているかをタイミングアナライザから解析中だが値があわない。今度はその計算値を書くのでどこがおかしいかを指摘してほしい。

今度の基板はSDRAM2系統、PowerPC1系統のクロックをFPGAから供給している。最近のお仕事でも書いたがそのクロックを計測してみるとかなりずれていることがわかった。回路的には下の図のような回路になっている。
3a20ccc5.png


これはSDRAMの1系統だがもうSDRAM1系統とPowerPCのクロック系統がある。これらのクロック出力が予定のクロック位相よりもずれてしまったので、各クロックの位相をDCMでシフトして合わせた。(最近のお仕事参照
これは何でかと考えるとPLL専用ICと違ってクロック入力パッドからDCMまでの遅延とフィードバック入力パッドからDCMまでの遅延がかなり違っているようだ。その辺も考えて入力クロックと出力クロックが0ディレイになるように、または、規定の遅延になるようにDCMの位相シフト量を調整しないといけないようだ。この場合は当然ながらDCMとBUFGMUXの位置(出来れば配線も?)固定しておかないと出力クロックの位相が正確に決定できないと思う。ただいま解析中だ。
なかなか子供の付き添いがあってブログも書く暇がないのがもどかしいが、自分の備忘録でもあるので書いてみたい。

↑このページのトップヘ