2010年10月31日日曜日

DDR2 SDRAM controller

ようやくDDR2 SDRAM controllerのcore module のRTLが出来た。
作成しているcontrollerは以下のような構造になっている。







←この部分がcore moduleになる。

clock domain はbf_clk (bus i/f clock)、wr_clk系、rd_clk系の3つだ。
CMD QUEUE, WDT QUEUEは非同期FIFOでここでclockの乗換も兼ねている。非同期FIFOの為同期損が発生し、同期式の場合と比べてlatencyが増加してしまうが反面bus i/f側と異なる周波数に出来るので全体的な設計は容易になると考えている。また、非同期FIFOはPHY_DPにも存在する。これはread data用である。
BCはbank controllerだ。本設計ではbank単位でpage管理を行おうと考えているので4つある。CPはcommand path controllerでBCからのaccess要求を調停して勝者の要求を実効する。各BCからCPへの要求信号はhreqとlreqがあり、Bank ActiveやPrecharge等の要求はhreqに、readやwriteの要求はlreqに出す。信号名からも自明なようにhreqの方が優先度は高く、CPはhreqの方を優先して処理する。
また、単にmodule構成の話ではあるが、wr_clk, rd_clkを作るDCM部はcore module内に持つことにした。その構成は今のところ以下の方針でいこうと考えている。



dcm_srcで周波数を作り、dcm_wr, dcm_rdで位相を作る。
dcm_srcのfeed back pathはSpartan3A Starter KitではLOOP_OUTとLOOP_INというそれ用と思われる配線があるのでその経路を使うことにした。(Starter Kitのdemoの設計資料は回路図とUCFファイル以外は参照していない。)

まだ実機動作はおろか合成すらしていないのでもしかしたら修正になるかも知れないが。。。




Micronのweb siteからsimulation modelを入手してsimulationにも着手した。

これはbank0,1,2,3へのwriteが連続する場合だ。各bankのpageは閉じている状態から始めている。上述の通りBCからCPへの要求はhreqが優先されるため、各bankのactiveが連続して実行され、その後writeが連続して実行される。SD_DQ, SD_DMの初めの部分に不定がのっている(赤くなっている)のは非同期FIFO内のRAMの初期値が不定の為であり、設計不良によるものではない。


これは同一bankへの連続writeの場合だ。本設計の用途はframe bufferとしてのものなので上記のような各bankへのaccessが連続するよりも左のような単一bankへのaccessが連続する方がより現実的だろう。もちろん論理addressをDRAMのaddressにどう対応づけるかにもよるが。。。また、波形から、write latencyは12だ。(bank activeから始まる場合、bank がactiveな状態ではもっと少なくなる。)Command queueが同期FIFOであれば2cycle程度は減る筈だが上述のような理由のためやむを得ない。

これは同一bankからの連続readの場合だ。bankがactiveの状態で開始しているのでread latencyは最小の場合だ。波形から17だ。
readではCommand queue部の同期損にPHY_DP部の非同期FIFOの同期損が加わるためlatencyは悪化してしまう。また、上述のlatency値はcore moduleのみの値であるがaccessを要求する側から見れば、MULTI PORT I/F部のlatencyも加味されることになる。

4 件のコメント:

  1. こんにちは。コメントありがとうございます。頑張ってください。

    少し気になることがあります。
    LOOP_INとLOOP_OUTは、DDR2 SDRAM行き帰りの配線遅延をキャンセルするためのものだと思うのですが、DDR2 SDRAMのクロックはどう与えるのでしょうか?
    dcm_rdで動的位相シフトして、rd_clkでリードデータをサンプルするのでしょうか?もしそうだとすると、
    http://japan.xilinx.com/support/documentation/application_notes/j_xapp802.pdf
    によると、低周波数 (100MHz)の時に使用すると書いてありますので、ご注意ください。

    返信削除
  2. ご指摘有り難うございます。

    DDR2 SDRAMのクロックはwr_clkと同位相のものがODDRを介してでます。リードデータのキャプチャはご質問の通りでdcm_rdで位相をずらしたrd_clk系でIDDRでサンプリングします。IDDRの出力は直ちに非同期FIFOに書き込むつもりで居ますが、ACタイミングをMetしない可能性もあり、その場合はリピータ用のF/Fを1段経由するかも知れません。また、rd_clkの位相シフト量は、キャリブレータを作って起動時の初期化処理サイクルの中で自動で合わせ込みをしようかなと考えています。XAPPのご紹介有難うございました。参照してみます。

    返信削除
  3. このアンサーもご参照ください。
    http://japan.xilinx.com/support/answers/22414.htm

    返信削除
  4. ぉおおお、、
    重ね重ね有り難うございます。 _o_

    返信削除

自作CPUで遊ぶ 25

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