SDRAM PLLの設定

SDRAM動作周波数を限界近くまで上げるべく、terasicのPLLが-60度に設定している、プロセッサクロックとSDRAMクロックのずれがどうやって算出されたか調べた。
算出方法自体はAlteraのドキュメントに書いてある。
SDRAMへ供給しているクロックの立ち上がりが先の場合or後の場合でリード/ライトのタイミングを求め、タイミングマージンが最大になるように位相シフト量を決めればよい。


ドキュメントに書いてある図の順で自分なりに解釈した意味

SDRAM供給クロックが先でRead
SDRAM供給クロックが立ち上がってデータを変化する前に、FPGAがデータ取り込むためにはSDRAMのデータ出力時間-FPGAのホールド時間にはFPGAクロックが立ちがる必要がある
SDRAM供給クロックが先でWrite
FPGAクロックの立ち上がり→FPGAからデータ出力→SDRAMのセットアップ時間→供給クロックの立ち上がりを満たさないといけない(Tclkから引いているのはReadの時と同じ基準で求めるため)
SDRAM供給クロックが後でWrite
FPGAクロックが立ち上がってデータが変化する前にSDRAMがデータを取り込むためにはFPGAのデータ出力時間-SDARMホールド時間にはSDRAMクロックが立ち上がる必要がある
SDRAM供給クロックが後でRead
SDRAMクロックの立ち上がり→SDRAMからデータ出力→FPGAのセットアップ時間→供給クロックを満たさないといけない(Tckから引いているのはWriteと同じ基準にするため)

この4条件に付いて求め、先と後それぞれの場合の最小値を求め、それの平均(中間点)がタイミングマージン最大のポイント。


実装されていたSDRAMの型番およびスピードグレードからデータシートを入手し、データを抽出。
FPGAのタイミングパラメータはTimeQuestのMulticorner Datasheet Reportから入手する。
とりあえず、タイミング的に一番厳しいDQだけ見ればいいと思う。


SDRAMのマニュアルからCAS Latency=3時に143MHz動作が可能ということなので、今回は140MHz(周期:7.143nS)を目指す。
上記の4条件の時間は、

先 Read
3.0ns
先 Write
2.697ns
後 Write
0.625ns
後 Read
0.657ns

となり、この中で小さい方-2.797ns(先行するので表現は負)と0.625nsの平均を求めると、-1.001nsになり、これを一周期360とすると-50.449度となる。


というわけで、terasicの-60度でもまあ動くとは思うが、どうせ算出したので今回は-50度で行ってみることとする。
また、シフト量0度(=プロセッサと同一クロックを供給)の位置もウィンドウ内だがPVT変動的とか基板パターン長の影響とかで動くかは不明。
どうせPLLは逓倍の時点で使っているので、シフトしたクロックを供給したほうがよい。


ここまで書いてて思ったが、これってTimeQuestの制約で書いたら自動で計算してくれたりしないんだろうか?
やってることはタイミング解析そのまんまだが…


DDRとかになるとストローブ信号(DQS)が新設され、それを使ってキャリブレーションとかやるロジックが入るようになるようだが、SDRAMではそこまで行わない。