DDR2 SDRAMを非常にゆっくりアクセスしてみる
今日はDDR2 SDRAMを非常にゆっくりアクセスしてみました。
規格では、DDR2 SDRAMの最低クロック周波数は125MHzとされています。
しかし、今日はその100万分の1の速度で動かそうとしています。DDR2 SDRAMの中には、DLLという内部クロックを生成する機能があります。この機能を無効にしてやると、(デバッグ用のモードとして)非常にゆっくりと動かすことができるようになります。
なぜそんなことをしたいかというと、MITOUJTAG ProのAdvanced JTAG Function Generatorを使い、C++言語で作ったスクリプトを用いてFPGAの端子を上げ下げし、DDR2へアクセスしたいがためです。
MITOUJTAGでは、次のようなスクリプトを書けばDDR2メモリへNOPコマンドを与えることができます。
static void cmd_nop()
{
DDR2_RAS_OP = "1";
DDR2_CAS_OP = "1";
DDR2_WEN_OP = "1";
DDR2_CS_OP = "0";
DDR2_CKP_OP = "0";
DDR2_CKN_OP <= "1";
DDR2_CKP_OP = "1";
DDR2_CKN_OP <= "0";
}
こういうスクリプトをいっぱい作れば、DDR2メモリへアクセスするための複雑な波形も作れるというわけです。
作ったスクリプトの全体は次のようになります。
「ddr2_test.cpp」をダウンロード
次の図は、実際に、そのスクリプトでDDR2 SDRAMメモリの初期設定(MRSやEMRSコマンドの発行)を行い、64バイトの乱数データを書き込んで、それを読み出した際の波形です。メモリから読み出したデータは、画面下のウィンドウにダンプされて表示されています。

(クリックで拡大)
書き込みと、読み出しの部分を拡大すると、こんな感じです。リードコマンド(RAS=H、CAS=L、WEN=H)を与えてやると、SDRAMのほうからDQSを送ってきているのがわかります。

(クリックで拡大)
ところで、SDRAMはリフレッシュしなければデータが消えてしまうんではないの?と思う方もいるかもしれません。実は、そんなにすぐに消えるわけではありません。
データシート上では64ms以内に8192ラインをリフレッシュしなければならない・・などとされていますが、実際には(個体差もあるのでしょうが)リフレッシュをしなくても数秒間はデータを保ってくれます。今回試したMicronの256MbitSDRAMでは、4~5秒でメモリアレイのどこか1ビットが壊れるかどうかといったレベルなので、ゆっくりアクセスしたからといって、すぐにデータが全部壊れてしまうわけではないのです。
というわけで、バウンダリスキャンを用いて非常にゆっくりとSDRAMにアクセスしても、書き込んだデータをすぐに読み出せば、エラーなく読み出せるわけです。
こんなことして何が嬉しいのかというと、FPGAとSDRAMの間の結線を調べることができることや、FPGAのアプリケーションで書き込んだSDRAMのデータをちょこっと覗いて見ることができることです。
SDRAMの内容をちょいと見てみたいからといって、FPGAの論理回路を書き換えるのはとても面倒です。そういうときは、スクリプトを使ってFPGAの端子だけ操作して覗いてみるのがいいでしょう。論理合成もしないので、スクリプトを書き換えてから5秒程度で動きます。Additive Latencyを変えてみる実験やPosted Writeの実験などが気軽に行えます。

FPGAで本番の論理合成をする前に、スクリプトでささっと書いて、遅くてもいいからテストができれば、FPGAの開発が今よりもずっと楽になるでしょう。
| 固定リンク


コメント