18 |
FM-7 ROM吸出し器の改版 (4) |
DRAMのリフレッシュタイミング
本来は基板設計の前にタイミングを検討しますが、開発環境と合わせて基板を紹介したため、後になっています。まずMB8265-15のデータシートを入手します。以下にZ80によるリフレッシュ手法である$\overline{\text{RFSH}}$リフレッシュタイミングを示します。
Parameter | Symbol | MB8265-15 | |
---|---|---|---|
Min | Max | ||
$\overline{\text{RFSH}}\text{ Set Up Time Referenced to }\overline{\text{RAS}}$ | $\text{t}_\text{FSR}$ | 100 | - |
$\overline{\text{RAS}}\text{ to }\overline{\text{RFSH}}\text{ Delay}$ | $\text{t}_\text{RFD}$ | 100 | - |
$\overline{\text{RFSH}}\text{ Cycle Time}$ | $\text{t}_\text{FC}$ | 270 | - |
$\overline{\text{RFSH}}\text{ Pulse Width}$ | $\text{t}_\text{FP}$ | 150 | - |
$\overline{\text{RFSH}}\text{ Inactive Time}$ | $\text{t}_\text{FI}$ | 100 | - |
PICのプログラム
DRAMのタイミング要求からPICのプログラムを検討します。PICの書き込み自体もArduino(Z80側)にやらせることもできそうですが、動作しない等のトラブルの可能性を考え、今回はPicKit4を用いたIn Circuit Programmingを行います。PicKit4上で書き込み、書き込み済みのPICをボード上のソケットにはめ込むことにしました。
PICのプログラムは基本的には前稿のようになります。Xrefckを4回アサートする場合、PICに対して16KHzでタイマー割り込みをかけ、以下のisr (interrupt service routine)を実行します。
初期化
- 各種レジスタ設定。
- Rfreq=L、Xrefck=Hを出力(ネゲート)。
- Z80Wを監視し、Z80WがLのときにのみ割り込み許可。
割込みルーチン(ISR)
- Rfreq=H、Xrefck=Hを出力 //リフレッシュ要求
- Rfgnt=Hを待つ
- Rfreq=H、Xrefck=Lを出力
- Rfreq=H、Xrefck=Hを出力 (3, 4を4回繰り返す)
- Rfreq=L、Xrefck=Hを出力
- リターン
1命令1サイクルでないため、命令数のカット&トライが必要です。
Arduino(Z80側)のプログラム
一方、Arduino(Z80側)ではPICのRfreqを監視し、Rfgntを発行することでバス調停を行います。
過去記事には、
Z80カードは、FM-7の内部バスに対して、別のバスマスタを使用可能にするものであり、メインCPUである6809から$FD05のLSBを1にすれば、メインCPUにHALTがかかり、外部バスマスタであるZ80による内部バスアクセスが可能になるものです
ということから、
- \$FD05に1を書き込み、6809にHALTを要求する。FM-7内部では*GH($\text{Go}/\overline{\text{Halt}}$, 負論理のHALT信号)がアサートされ、6809がBA=BS=Hとし、バスを明け渡す。
- Rfgnt=H (初期値)
- アクセス前に
・Rfreq=Lを待つ (リフレッシュ優先のため)。
・Rfgnt=Lとする。 - アクセス(アドレス出力、データ出力、EB/QB出力、データ入力)
- アクセスの終了時に
・Rfgnt=Hとする。 - 終了時にはアドレスに\$FD05をセットし、EB/QBをアサートせずに6809にバスを明け渡す。
となります。このうち3, 5が今回追加したアクセス法です。このように、お互いに待つ場合はデッドロックの可能性があるため、背理法により無いことを証明しておきます。
- Aruduinoが待つ場合は、上記3.からRfgnt=Hとした上でPICを待つ
- 上記からデッドロックがあるとすれば、Rfgnt=Hのとき、PICがRfgnt=Lを待つ場合
- ところが、PICが待つのはRfgnt=Hであることから、矛盾、よってデッドロックは存在しない