CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

DRAM制御修正

ROMライタ上のI/Oポート0x200008番地を叩き続けるループを回したときの波形です
 
上から空き、/CS1、/CS2、/HWR、/RDですがI/Oポートがある/CS1がアサートされる期間もDRAMの/CS2がLowになりっぱなしになっています
これではDRAMのデータと衝突する可能性があります
 
イメージ 1
 
あらためて内部レジスタの初期化を見直すとDRAM制御レジスタ/RASダウンモードに設定されていることがわかりました。
これは同じブロックにあるDRAMを連続してアクセスする場合/RAS(/CSn)をアサートしたままにしておいてバースト読出しを継続できるようにするしくみのようです。
 
マニュアルにも
「外部空間にDRAM 以外のデバイスを接続し、HWR、LWRをライトストローブとして使用する場合、RASダウンモードは使用できませんので注意してください。」ときちんと書いてありました
 
イメージ 3
 
DRAM コントロールレジスタA(DRCRA)は元々、サンプルプログラムをそのまま持ってきて0x3Cをセットしていましたがビット2: RAS ダウンモード(RDM)を0にした0x38に修正。
同じループを回してみると、今度は/CS1がアサートされる期間中は/CS2がHighに戻りバスの競合なくなったことがわかります
 
 
テストプログラムも正常に動作するようになりました。
 
イメージ 2
 
マイクロコントローラにはすでにいろいろI/Oが内蔵されているので普通はI/Oを外部拡張してまでして使うことは少ないですが、さらにDRAM制御も共存したために起きた失敗でした