2022年10月4日火曜日

【にわかAVマニアの電荷】DRAMうごいたじょ~

本気のつもりだったけど、本気になれそうにない残念な「本気のADC」基板のDRAMを火入れ中です.前回はこちら

4秒ほどの音声サンプルデータをCOM PORT(115200bps)でPCへ送信します.
PCでフーリエ変換して歪率やノイズを検証します.

いまは秋月の4Mbit DRAMを動かしてるところです.
動きました~ (全bit verifyはまだしてない)
↓手前の縦型パーツがHM514100CZです.処分価格¥50也.

FPGAでDRAM controlerを作りました.
FPGAは50MHz clockです.PLLはせずに50MHzのままで動かします.

以下はDRAM controlerの考え方について.

refresh timing
50MHz=20nsですから、このtimingを20nsで時分割することを考えますと、こんなシーケンサを作ってやればいいことになります.refresh addressはDRAM内部で自動生成してくれるmodeですので、addressはdon't careです.
 ①CAS=LOW
 ②RAS=LOW
 ③CAS=HIGH
 ④
 ⑤
 ⑥RAS=HIGH
totalで100nsほどのお仕事です.
このrefresh procedureをどんな頻度でやればいいのか?
 ・1024発でrefresh addressをひとなめ
 ・このDRAMの電荷保持時間は128ms
ゆえに50us毎に上図のシーケンスを起動すればいい.
なぜなら、50us x 1024 = 51ms < 128ms と余裕ですから.

100us毎でも良いだろうが、あまり攻めないでおく.

ーーーー
次にread/writeについて考えますが、
 ・データレート
 ・refreshとの競合調停
が課題です.

まず、データレートについて.
 ・DRAMのdata幅は1bitである
 ・1bit readもwriteも150nsほどかかる(後述)
 ・ゆえに16bit ADC出力をDRAMにストアする所要時間は、16bit x 150ns = 2.4us 
 ・サンプリング60kHz=17us なのでDRAM速度は無問題

次に、refreshとの競合調停について.
 ・refresh中だったらread/writeは最大120ns待つかも
 ・read/write中だったらrefreshは最大150ns待つかも
 ・要するに実行中の仕事を妨げない
 ・サンプリング周期17usなので120ns待ちごときはゴミで無問題
 ・refresh間隔は50usと広大なのでwriteの妨げにならない
 ・read速度(シリアル出力)は遅くてもOKなので考るのをやめる

待ちは、request→busy になるまでの所要時間が長くかかるような見え方になります.

read timing
やたらごちゃごちゃしてますが、50MHz=20nsで時分割すると、こんなシーケンサを作ってやればいいことになります.
 ①addressセット
 ②RAS=LOW
 ③addressセット、WE=HIGH
 ④CAS=LOW
 ⑤
 ⑥data取り込み
 ⑦CAS=HIGH
 ⑧RAS=HIGH
totalで140nsほどのお仕事です.

write timing
readと似ています.50MHz=20nsで時分割すると、こんなシーケンサを作ってやればいいことになります.
 ①addressセット、dataセット
 ②RAS=LOW
 ③addressセット、WE=LOW
 ④CAS=LOW
 ⑤
 ⑥CAS=HIGH、WE=HIGH
 ⑦RAS=HIGH
totalで120nsほどのお仕事です.

ーーーー
これらのシーケンスを実現するDRAM wrapper moduleを作りました.→こちら
中央から下のsequencerがrefresh/read/writeの動作をやります.
同sequencerでは、write 16bit幅、read 8bit幅にシリパラ変換もします.
上位moduleとのやり取りのためのrequest/busyや、auto address incrementなどもあるのでいろいろとごちゃごちゃしています.
DRAMですけどランダムアクセスはしませんので、addressはいつも0~4Mまで順繰りです.

次はADC動かしますんでー

かしこ

2 件のコメント:

  1. お疲れ様です。
    ステート1個でできちゃうんですね。
    自分は、リフレッシュ、リード、ライト、コントローラーのモジュールになるのかな?と思っていました。

    アドレスはRowアドレスとColumアドレスになるので、アドレス切り替え信号が必要かと思います。
    あとシングルビットICなので、パラシリ変換とシリパラ変換も必要ですね。

    データチェックはとりあえずデータを+1ずつ増やしたデータを書き込んで、読み出しを続けていけば確認できますね。
    xilinxでは、chipscopeを使ってロジアナのようにロジックのチェックをやった事があります。(今はどうやるかわかりません)
    データを蓄えるRAM領域が必要なので、大きなデバイスでないと使えなかったりしますが、昔はそれを使ってデバッグしたものでした。
    デバッグがんばってください。

    返信削除
    返信
    1. >ステート1個で

      そんなに大変じゃないんで大丈夫です.
      これがSDRAMだとやる気にならんですけど.

      ADC dataをPCに取り込むところまで動きましたが、なんかデータが変です.

      削除