DDR SDRAM コントローラを作った

Xilinx ISim Splash

先日復活した Spartan-3E Starter Board には DDR SDRAM が載っているので、これを読み書きする回路を自作してみました。

コードは例によって github.com に push しておきましたが、だいぶ完成度が低いスパゲッティ回路なので、 参考にはされないほうがよいと思います。

概要

Xilinx の FPGA で SDRAM を使いたければ、 Memory Interface Generator で SDRAM コントローラのハードマクロを生成するのが定石なのでしょうが、 今回はデバイスや ISE の各種ツールおよびシミュレータ (ISim) の勉強を兼ねて自分で RTL の回路設計をやってみました。 とはいっても VHDL を気のむくままに書きなぐり、 動くようになるまでいじくりまわしただけなので、 回路設計と言えるようなことはしていません。

1 週間ほど資料を読みあさっていじくった結果、 非常に素朴な何の工夫もない SDRAM コントローラが ISim 上で動くようになりました。 ストローブ信号 1 回ごとに必ず RAS/CAS アドレス設定をして、 バースト長が 2 固定のオートプリチャージつき読み書きを 1 回だけやります。 接続されている 512Mb DDR SDRAM MT46V32M16TG-6T はデータバス幅が 16bit なので、 だいたい 6 ないし 7 サイクル毎に 32bit のデータひとつを読み書きすることになります。 メモリ帯域は Spartan-3 Starter Board の 32bit 幅 10ns 非同期 SRAM にも劣る情けない代物です。

SDRAM コントローラを実機上で動かすためには それを使って実際にメモリを読み書きするアプリケーションも作らねばなりません。 今回はなるべく簡単にテストするためかつて Spartan-3 Starter Kit でやったように、 コンフィギュレーション PROM に格納した画像データを SDRAM に書き込んだ後、 それを読みだして VGA に出力するという回路にしてみました。

Spartan-3E Starter Board では PROM の空き領域が 234KB ほどあったので 2 ドット/バイトで 640×480×8色 の画像を詰め込むことができました。 画像は Wikipedia からの拾い物 を GIMP で減色し、 額縁部分はおなじみの /usr/include/X11/bitmaps/root_weave を使いました。

本当は内部クロック 100MHz (DDR 200MHz) で動かしたかったのですが、 100MHz ではどうしてもまともな読み書きができず 50MHz でしか安定動作しません。 100MHz で動かすと画面にしましまが出たりします。 今後は汚い VHDL の書き直しとタイミング解析を真面目にやって 100MHz で動くようにしたいと思います。

はまった点や Tips など

参考にしたデータシート・アプリケーションノート

以下のリンクには PDF ファイルも含まれているので注意。

感想

2015/03/23 09:26:51 JST