”Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過6(DCMやBUFGの配置)”でDQやDQSの配置は終わったと思っていた。SD_LOOP_INの信号を使用して非同期FIFOにライトイネーブルを入れようと思うと、DQS0とDQS1の遅延の差が気になる。DQS0とDQS1の間には0.62nsの遅延差がある。遅延差があると、SD_LOOP_INは1つなので、どちらかにずれが出てきてしまいそうだ。と言うわけで、お間抜けで、せっかく確定したのではあるが、DQ8~DQ15のクロックをDQS1からDQS0に変更しようと思う。DQS1の入力は使用せずにライト時のクロック出力だけとする。
注:途中まで書いたのが消えてしまったのでもう一度書きますが、完全には文の一貫性が取れない場合があります。本当に悲しいです。ブログのオートセーブは新規投稿だけでした。
すべてのDQのクロックをDQS0に書き換えたところ、DQS0のクロック遅延が増えてしまった。3.597ns になってしまった。DQ0のセットアップ時間は1.592ns 。

これは、ddr2_cont_iob_inst/dqs_clk_node<0> が1.145ns から1.360ns になったためだ。Floorplan Editorで見てみると、下図のようになった。

BUFGの位置をなるべく近いほうがよいかと思って、いちばん上にして見たところ、その下よりも遅延が大きいようだ。やはり、位置では遅延は予測できないというのがよくわかった。
上のFloorplan Editor図を見るて、気がついたがddr2_cont_iob_inst/dqs_clk_node<0>のネットの遅延が違っている。よく見るとTiming Analyzerの遅延値はデータパスがMaximum値でクロックパスがMinimum値だった。これではDQ0のセットアップ時間は1.592nsは標準値ではさらに悪くなることが考えられる。これではだめなので、DQのIBUF_DELAY_VALUEを1にすることにした。IBUF_DELAY_VALUEを1にすると約1ns 程度遅延するので、少し遅延が大きすぎるきらいもあるので、BUFGまでネットの遅延が少し大きいBUFGを使用することにした。
いろいろやってみたが真ん中あたりのBUFGを使うとBUFGまでのネットの遅延が大きいようなので、上から4番目のBUFG (BUFGMUX) を使うことにした。これの状態でのDQ0のTiming Analyzerの解析結果は下図のようになった。

ddr2_cont_iob_inst/dqs_clk_node<0>ネットの遅延は1.436ns。
DQ0のセットアップ時間はクロックパス遅延3.675ns - データパス遅延2.962ns = 最小のセットアップ時間0.713ns となった。これより小さくなることはないので、これで大丈夫だろう。。。
さて次に、非同期FIFOのwr_en の設定を確認する。Timing Analyzerで確認したsd_loop_inのネットだが、本当にたくさんある。ちなみにsd_loop_outにリードのタイミング信号(CAS LATENCYだけ遅れた)を出力してDDR2 SDRAMのあたりまでいって戻ってきて、sd_loop_inに戻ってきた信号をリード・データの書き込みタイミングとして使おうという戦略だ。

これでは多すぎるので、とりあえずこのネットを減らすために、今まで、8ビット幅分散RAM使用非同期FIFO4個から、16ビット幅分散RAM使用非同期FIFO2個に変更した。パラメタライズド記述は望めないだろうから、なるべくロジックを減らそうとしてみた。これでインプリメントしてみたところ下図のFloorplan Editorに示すように、かなりロジックセルが減少した。ロジックセルは薄い紫で染められた部分。

以前の8ビット幅分散RAM使用非同期FIFO4個から比べるとだいぶロジックセルが減っている。下に以前のFloorplan Editorでみたロジックセルを示す。

これでよかったのだが、以前苦労してかけたIOパッド(IOB)から非同期FIFOまでのネットの遅延制約がインスタンスが変わってしまったので、エラーになってしまった。やり直し。。。面倒だ。。。面倒がっていても仕方がないので、Floorplannerでやり直した。
よし全部OK。
今度はSD_LOOP_INだが、セットアップ時間を1.5ns にした。これも制約をかけてクリアした。

次はこのIOBと非同期FIFOの部分だけでシミュレーションしてみることにする。
- 2009年04月04日 19:13 |
- その他のFPGAの話題
-
| トラックバック:0
-
| コメント:0