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ではそこまで行わない。