2012年6月5日火曜日

Spartan6版 DDR2コントローラの作成 4

800MHzでリードが上手くいかない件はバーストリードの最初の16bitが0になるというものだった。 以下はDRAMの0番地に0x12345678を書いて、IODELAY2の遅延値とリードデータのキャプチャタイミングを色々変えてみている様子だ。キャプチャタイミングは8が最適のタイミングだが、リードデータは下位16bitが0になっている。


当初はリード側を疑って上述のとおり遅延値を振ってみたりしたのだが、問題はライト側にあった。
(つまり、先頭データの書込みが出来ていない) 以下にライトのシミュレーション波形を示す。ここでデータバスにライトデータを出力する期間を正味の4バーストの期間のみとしていた。


これを以下のようにバスをONにするタイミングを早めた。
(間違えてリードの波形を貼っていたので差し替えました。2012/06/06)


その結果正常にリードできるようになった。
STA(静的タイミング解析)の結果ではトライステートコントロールパスの遅延はデータのパスとほぼ同じで問題なさそうにみえたのだが、どうも先頭データのDQSに対するセットアップが確保できていなかったようだ。 実際の信号の波形観測が出来ればいいのだが800MHzの信号を観測できる測定器など個人が持ってる訳ないので、推測するしかない。


合成も問題ない。



現状のSystem Architectureは以下のとおり。


以下はリードライトチェックプログラムを実行している様子だ。64Kワード(256KB)ブロック単位でライト&リードチェックを行っている。


ということでDDR2-800で動作できた。 やったー \(^_^)/  
うっれすぃー かあちゃん、おれ、やったよ。。。 ちょっと大袈裟か。


とはいえ、現状はローカルI/F側が64bit/200MHzとなっており、zumi32 (自作CPU)は精々100数十MHz程度でしかタイミングがMetしないので、CPUも含んだ回路にする場合は現状では周波数が高すぎて合成できない(タイミングがMetしない)可能性があるので、128bit/100MHz版も作ろうと思う。



0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

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