2015年7月26日日曜日

DRAMと遊んでみる。


昨日1日、花火大会も行かず部屋に閉じこもり、21世紀にもなるのにDRAMのテストを行う。
SRAMと違ってかなり面倒なのは予想できたが…

DRAMにはアクセスする方法により、
Read,Write,Read-Write and Read-Modify-Write,RAS-Only Rifresh,Page-Mode Read,Page-Mode Write,CaS before RAS Refreshなど様々な方法がある。
それぞれ高速化の為の工夫だったりするのですが、複雑な手順はタイミングもシビアなのでここでは単純なものを実装してみました。
といってもArduinoが遅いのでこれでも厳しいようで全アドレスにアクセスするとデータが化ける。


今回の実験で知りたかったのは、リフレッシュ動作の挙動で、まずは必要なの?というのと実際どのくらいの頻度でやれば良いの?というずっと引っかかっていた点。
結果からすると、アクセス中は当然リフレッシュはできないから不要。
そして以外にも5秒や10秒間隔でもデータが飛ぶことはなく、30秒くらいで怪しくなるので(どれも通電中)、
電源切って30秒待つというのはあながち外れではないのかも。



こんな感じで実験中・・・





作成したプログラムはこちら。
https://github.com/・・・/blob/master/arduino_dram_test.ino
使用したDRAMはこれです。
http://www.datasheetarchive.com/・・・/Datas・・・/DSAP0024050.pdf



DRAMがXXXWord x 1bbitってなんで1bitなんだろ?と思っていたけど、
DRAMって1bitのメモリセルが正方形に並んでいて、縦横アドレスを指定してそのなかにある1bitを取り出すんですね。
てっきりクロックに同期して8bit分シリアルか何かで取り出すのかと。
あと、入力端子と出力端子が別、なんらかのモード切替で切り替えているのではなく、アクセスするタイミングだけでモードを判断している。読み書きだけでも16ものタイミングが決められているなど色々勉強になった。
タイミングは遅ければ待ってくれると思ったけど、最大時間が規定されているので、それを超えると動かないのは地味に嵌った・・・

リフレッシュは全セルを規定時間内に舐めないといけないのでマイコンには重い処理ですね。
あと、どうせ行アドレスと列アドレス連続アクセスするんだから毎回セットは面倒だなぁと思ってたら、それが後のEDOとかにつながるんですね。
仕事にも何にも役に立ちそうに無いですが、色々わかったのでよし(笑)

行アドレス指定してRAS下げて、列アドレス指定してCAS下げて。
でも立下りで読んでいるわけではなく、規定時間待ってから操作しないといけなかったり、データが出てくるまで少し時間がかかったりデジタルなのに挙動が面倒。

入出力が1bitなので、アドレス変えながら8bit分とってきてバイト変換して・・と結構苦労しました。
SIMMとかどうやってたんだろ?と回路図調べてみたら8個並べてたんですね。アドレス線共有して。
10進<->2進変換とかCでの文字列操作とかすっかり忘れてたよw

0 件のコメント:

コメントを投稿