2011年11月20日日曜日

(LP)DDR-SDRAMCの作成

AvnetのSpartan6 FPGA LX9 MicroBoardはLPDDR-SDRAMが実装されていて、これをTargetにして(LP)DDR-SDRAMCの作成に挑戦している。 (LP)の意味はLPDDRの特徴である省電力機能(部分的SelfRefresh等)の利用を特に意識していないためである。 で、一応RTLは出来た。自作のSDRAMCとしてはDDR2-SDRAMCとSDR-SDRAMCがあるが、今回はSDR-SDRAMCのRTLを元にDDR用に発展させる形にした。下図がブロック図である。


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 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...