kitune-sanの日記: PC/XTのDMAとDRAMリフレッシュ 4
8237AをSystemVerilogで書き始めるにあたって、
理解がおざなりになっていたDMAとDRAMについて調べた。
回路図とデータシートを眺めてわかってきたことのメモ。
PC/XTのDMAには8237Aが使われている。
DMA0がDRAMリフレッシュに割り当てられており、その他のDMA1-DMA3はXTバスを通して外部から使用できるようになっている。
8237Aへのクロックは8284AのCLKから直接接続されておらず、ディレイラインと若干ややこしいゲートを通って供給されている。これはクロックのHIGH時間を長くするように働く。
調べていくうちに、どうやら8237Aの制約によるものらしいことがわかった。8237Aへ供給するクロックのTCHおよびTCLはそれぞれ80nsと67ns以上にする必要があり、
4.77MHzの周期の1/3の時間の69.88nsのHIGH出力では、使用条件を満たすことができないからである。
DRAMリフレッシュは、インターバルタイマ8253のタイマ1で生成される周期で実施される。インターバルタイマのOUT1はDMAのDREQ0に接続されている。
DMA0を受け付けるとDACK0が出力される。DACK0信号は、DRAMの/CAS=H,/RAS=L(アクティブ)にする。
webを巡回して、Wikipediaのメモリリフレッシュの項目を見つけた。どうやらRAS only リフレッシュというものっぽい。
RAS onlyリフレッシュである場合、行アドレスを与える必要がある。おそらくブロック転送モード/読み取り転送モードで動作するようになっていると思う。
最初はベリファイ転送モードで動作するかと思ったが、/XMEMRか/XMEMWをLOWにしないとアドレス選択信号ADDRSELが出力されない。DRAMへアドレスを入力する必要があるならば、読み取り転送モードにしなければならないように思う。
なお、DMA転送中(HRQ=H)は、/AEN=Hとなるため/IOWがLOWとなってもメインボード上のIOが書き込まれる心配はない。
ただまあ、ここらへんの動作や設定が実際どうなっているか答え合わせをするにはBIOSのコードを見てみないとわからない。
2021/8/25 追記
ADDRSELを出力しなければいけないと書いたが、列アドレスを指定する必要がないため不要だった。
/XMEMRをアクティブにすることが読み取り転送モードにする理由だろう。
nekopon様のコメントにある資料より、新しいことが分かった。
まず、ブロック転送モードではなく、シングル転送を15usの周期で行っているようだ。
そして転送毎にアドレスをインクリメントしており、リフレッシュをするDRAMの行アドレスが0,1,2…255,0,1…と切り替わるようになっている。
転送アドレス自体は、0H~FFFFHであるが、行アドレスは8ビットのため0~255を繰り返す。FFFFHをロールオーバーすると自動初期化設定により再度0から始まる。
(/XMEMRをアクティブにするため、上位8ビットも行アドレスとして送信されるように思えるが、特に問題ないのだろう)
IBM 5150 (スコア:1)
// #4098310殿: RAS=Row Address Strobeなので第2節のRASは1つを除きRowに修正されるべきですね
Re:IBM 5150 (スコア:2)
ありがとうございます。
回路図を見るだけではわからない内部の動作が説明されていて、とても参考になります。
リフレッシュ (スコア:0)
その時代のDRAMにはRAS Onlyリフレッシュしかなかったのではないか。
要するにDRAM側にはリフレッシュ用の仕組みがない。
DRAMは破壊読み出しなので、どこかのアドレスにアクセスすると、
(というか、RASをアクティブにすると、のはず)RAS全体を
RASバッファに格納する。そしてRASを落とすとバッファから
メモリに書き戻す。だからRAS内の1アドレスを読めば、そのRASは
リフレッシュされる。期間内に全RASへのアクセスをすれば
終わり。
リフレッシュだけでよければCASはいらないけど、あってもいい。
Re:リフレッシュ (スコア:2)
アクセス(読み取り)と同時に書き戻す仕組みを利用しているのですね。
ちょっと調べてみた感じ、
今だとオートリフレッシュがDRAM(というかSDRAM/DDR)側にあって、特定のコマンドを定周期で送ってあげれば、
あとはチップがよろしくやって(順番にリフレッシュして)くれる感じっぽいですね。
こういう回路がチップに格納されていない時代のものは、動作が想像できて勉強になるので好きです。