パスワードを忘れた? アカウント作成
15437636 journal
日記

kitune-sanの日記: SDRAMコントローラをSystemVerilogで書いてみる

日記 by kitune-san

FPGA内部のRAMブロックだけでは今後容量が不足してくると思えるため、DE0-CVに実装されているSDRAM(IS42S16320F-7TL (32Mx16))へアクセスするコントローラを作ることにした。

最初は、CPU側からのアクセスのみを考えていて、シングルモードの読み書きで問題ないと考えていた。
しかし途中でビデオメモリとの共用をしたくなってきた。共用すると速度の問題からVRAM用のキャッシュが必要となり、複数バイトの連続読み出しが必要になった。
出てきた案は、
1. バースト書き込み, バースト読み出しモードを使用する。
2. シングル書き込み, バースト読み出しモードを使用する。
3. シングルの読み書きモードとし、ACK後にREAD/WRITEコマンドを連続して送信する。(毎回バンクとCOLアドレスを指定)

1の案は、バーストの読み出し回数が固定の上、書き込みは1回としたいため、廃案にした。
2の案は、当初最有力であったが、バーストの連続読み出し回数が最大8回であることと、後に3のアクセス方法を見つけたため、廃案とした。
3の案は、読み書き回数が都度指定可能で、さらに8回以上(最大1023回)連続読み出しができるのでこれを採用した。なんかデメリットがあるかもしれないけど、とりあえずこれで進めた。

で、作ったのがこれ
まだ実際にFPGAに書き込んで動作は見ていない。どうやって確認しようか考え中。シュミレータで信号の確認はした。

使い方は次のようにした、
1. アクセスをしたいアドレス(address)、連続アクセス回数(access_num)、(書き込みの場合は)1バイト目の書き込みデータ(data_in)をセットする。
2. 読み書きどちらかの要求フラグ(write_request/read_request)を立てる。

書き込みの場合
3. 書き込み確認フラグ(write_flag)が立ったことを確認したら、要求フラグを下げ、次の書き込みデータをdata_inにセットする。
4. write_flagが下がるまで、次の書き込みデータをdata_inにセットし続ける。

読み取りの場合
3. 読み取り確認フラグ(read_flag)が立ったことを確認したら、要求フラグを下げ、data_outからデータを取得する。
4. read_flagが下がるまで、次の読み取りデータをdata_outからデータを取得する。

注意点として、colアドレス(IS42S16320Fの場合アドレス末尾10バイト)と書き込み回数とを足した結果が、colアドレスのアドレス表現を超える場合には、
書き込み/読み取り途中でアクセス先が折り返される。
また、読み書き処理中に、address, access_numは、変更禁止である。

---

CPU(XTバス)からの読み書き要求とビデオコントローラからの読み取り要求の調停処理は、このコントローラより上のレイヤで作製しようと思う。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

読み込み中...