Spartan3A Starter KitのDDR2 SDRAMコントローラをどのように実装するかを考えてみる。
まずは
Spartan3A Starter Kitのユーザーガイドを見て、DDR2 SDRAMを確認する。
そうすると、どうやらDDR2 SDRAMは、Suzaku-VのDDR2 SDRAMよりも容量が2倍の512Mbit品がついている。さらにループバック信号SD_LOOPがある。これがあるとどうしようかと悩む。下にpartan3A Starter Kitのユーザーガイドの113ページの図18-1を引用する。

どうしてかというと、SD_LOOPがあるとREADの時にどのタイミングでデータが出ているかが、よくわかるからだ。つまりREADコマンドを出してからCASレイテンシ後のリードデータの確定タイミングが、内部クロックから配線遅延の往復分遅れていることが問題なのだが、それがこのループバックでキャンセルすることが出来ると思う。その場合には、DQSを1/4クロック分遅延して受けることが前提だ。そのためには、多分IOBの入力ディレイを使用する必要がある。
下のDDR2 SDRAM READタイミングチャートで、上のリージョンがFPGA内部の信号を表す。上のリージョンのCLK_FPGA、CMD_FPGA、ADDR_FPGAはFPGA内部で発生させた信号だが、DQS_FPGA、DQ_FPGAは下のリージョンのDDR2 SDRAMが出力した信号だ。下のリージョンのCLK_DDR2、CMD_DDR2、ADDR_DDR2は上のリージョンの各信号がFPGAのIOバッファ、配線の遅延 (FPGAtoDDR2_delay) を経てDDR2 SDRAMに届いた先の信号だ。DDR2 SDRAMが出力したDQS_DDR2、DQ_DDR2は配線とIOバッファの遅延 (DDR2toFPGA_delay) を経て、DQS_FPGA、DQ_FPGAに現れる。つまりFPGAから見れば、CAS Latency (CL) = 3クロック後に現れるはずのDQS_FPGA、DQ_FPGAはFPGAtoDDR2_delay + DDR2toFPGA_delay 遅延することになる。
次にFPGAから出力されたREAD_timing_outは、FPGAのSD_LOOP_OUT ピンに出力され、DDR2 SDRAM付近に行ってREAD_timing_in (SD_LOOP_INピン)に戻ってくる。この間でFPGAtoDDR2_delay + DDR2toFPGA_delay 遅延しているので、DDR2 SDRAMが出力してFPGAが受けたDQS_FPGA、DQ_FPGAとタイミングが合っていることになる。

これでREAD_timing_in を非同期FIFOのEnableとして使えば、うまくREADデータを受けることが出来るはずだ。
ブロック図を描いてみると、下の図になる。

DQSはIOBの遅延でクロックの1/4遅延させた後で各IOBのFFのクロックとして使用する。DQは同様にIOBのFFでサンプルされた後で非同期FIFOのデータに入力される。SD_LOOP_INに入ってきたREAD_timingは、IOBのFFでサンプルした後で非同期FIFOのEnableとして使用する。
とりあえず、IOBの遅延回路がどのくらい遅延を可変できるかを調べることころから始めようと思う。
内部クロックで受けるのが考えるのが一番簡単なのだが、IOBの遅延READデータが受けられるとは限らないため(うまい遅延タップがあるかわからないため)とりあえず上記の方針で作ってみようと思う。
Spartan3A は、Spartan3Eとは違って、自分の回路から8つの遅延値を動的に変更できるようだ。更にプロパティで前段の遅延をつけることが出来る。こっちはダイナミックには遅延を変更できないようだ。
2009/03/22 追記:この回路は問題がありました。
”Spartan3A Starter KitのDDR2 SDRAMコントローラの構想2”をご覧ください。
- 2009年03月01日 21:07 |
- Spartan3A Starter Kit
-
| トラックバック:0
-
| コメント:0