さて、Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメントはDDR2-300に目標を変更してインプリメントを行っている。
1つクリティカルパスをつぶしたところ、タイミングが満足した。それは、ddr2_ckeを出力するためのカウンタだが、そのイネーブルを180度位相のクロックからとっていたのが、問題だった。+1するので、キャリーチェーンが伸びているのだが、そこが半分のクロックのパスとなり、タイミングが満足できなかった。イネーブルを0度位相のクロックで一度ラッチしたらクリティカルパスではなくなった。
インプリメントの結果は無事にタイミングを満足した。クロック周波数は150MHz。下にSummaryを示す。

さて、よく考えてみると制約を忘れているところが。。。それはDQをサンプルする非同期FIFOのライトイネーブルになるsd_loop_inの制約だ。これは150MHzの周期6.67nsの半分タイミングでサンプルされるので、少なくとも3.34ns - 分散RAMのWEのセットアップタイムである必要がある。(入力パッドの遅延時間はDQも入っているので相殺されるとします)
とりあえず制約がかかっていない状態をFPGA Editorで見てみよう。Project NavigatorからFPGA Editorを立ち上げ、sd_loop_inの入力パッドからのネットsd_loop_in_IBUFをハイライトしてみてみた。

遅延も0.753nsから3.041ns まで幅がある。
これでは困るので、制約をかけてみよう。かけるのはMAXDELAYとMAXSKEW。
Project NavigatorのProcessesペインのUser Constraintsを開いて、Create Timing Constraintsをダブルクリックする。

するとタイミング制約用のContraints Editorが立ち上がる。左のConstraint TypeからExceptionsを開いてNetsをクリックする。そして右側上のdouble click to add a new constraint.. をダブルクリックして制約を追加しよう。

ダイアログが開く。
1.Filter:のところにsd_loop_in_IBUF と入れて、Findボタンを押すとsd_loop_in_IBUFがAvailable nets:のところに表示される。
2.sd_loop_in_IBUFを選択し、真ん中の>ボタンを押してNet Targets: のところにsd_loop_in_IBUFを入れる。
3.MaxDelay & MaxSkewのラジオボタンをクリック。
4.MaxDelayに1.51ns、MaxSkewに0.865nsを入れる。

6.OKボタンをクリックする。
そうすると、MaxDelay & MaxSkewが表示されるので、SaveしてContraints Editorを閉じよう。ちなみに制約がやけに細かいのは、一旦やってみて様子を見てからブログを書いているからなのだ。ぶっつけ本番でブログを書くこともあるし、様子を見てから書くこともある。
さて、これまでの作業で実際に追加された制約を下に示す。
NET "sd_loop_in_IBUF" MAXDELAY = 1.51 ns;
NET "sd_loop_in_IBUF" MAXSKEW = 0.865 ns;
これでもう一度インプリメントをしてみよう。インプリメントしたら制約はすべて満たされた。
FPGA Editorでもう一度sd_loop_in_IBUFネットを見てみたのが下の図。

上の制約がないsd_loop_in_IBUFの配線よりもすっきりしている。
遅延は0.808ns~1.492nsの0.684nsの間に収まっている。
これでインプリメントは終了したので、実機で動かしてみることにする。わくわく、ドキドキだ。すぐに動かし見たいような、でも結果を見るのが怖いような。。。複雑な気持ち。。。でも、今日中にはやってみようと思う。その前にUCFのIOパッド番号だけでももう一度チェックしよう。。。
- 2009年06月13日 13:16 |
- Spartan3A Starter Kit
-
| トラックバック:0
-
| コメント:0