
SDRAMは200MHz、FPGA内部(MPIF側)は100MHzで動作させる。 MPIF側のBus幅は64bitにした。MPIFのI/F仕様はbit幅が広がった点を除いてこれまでと同様だ。

PHY_CP部は以下のようにした。

最下部のassignで#3.29の遅延を付けているがこれはSimulation用に付けており、実回路での遅延を目的としているものでは無い。
PHY_DP部のWrite側は以下のようにした。

今回はSpartan6をTarget Deviceとしているが、別種FPGAへの移植も一応念頭においてRTLを作成した。具体的にはDDRの部分はDeviceによって細部が変わる可能性があるためdc_ddrio, dc_ddroというmoduleにした。
そのdc_ddrioであるが、現状以下のようになっている。
(出力系)

Spartan6では出力信号をODDRから出す場合、OEN信号もODDR出力でなければならないようだ。(Spartan3Aの場合はそういう制約はなかった。) また、Clockも共通になる。
(入力系)

IOBUFからIDELAYを通ってIDDR2に行く。
本DDR-SDRAMCではDQSではなく、DQの位相を制御する。
このIDDR2の出力を受けるPHY_DPのRead系は以下のようになっている。

Clock生成はDCMではなくPLLを使う。

PLLでmclk(200MHz)、mclk_270 (mclkの270°遅れ位相)、vclk (25MHz)を生成している。 bclk(100MHz)は、PLLの外でmclkを分周して作成している。これはClock載せ替えのGearBoxでbclkのValid Timing信号(bc_vldで、これ自体はmclk同期)が必要で当然bclkとH/Lの関係が確定している必要があるためこのようにしている。
以下はWriteのSimulation波形だ。

Writeの場合DQSとDQ,DMは90°の位相差が必要だが、このCONTROLLERではDQ,DMの位相をずらしている。(つまり、DQSはCK_Pと同位相)
以下はReadのSimulation波形だ。


MPIF側のCommand受信からRead Data出力迄のLatencyはBankが閉じている場合(Bank Activeが発生する)は13、開いている場合(Bank Activeは発生しない)は11になる。
合成でTimingはMetした。

さてさて、後は実機に流して動作確認になるが、上手く動くか?
IDELAYのCalibrationが必要になると思うがこれからかな?
0 件のコメント:
コメントを投稿