今回は/RFSH信号の合成部分です。この変換基板の製作のメインの部分と言っていいと思います。
前回も出てきましたが、KL5C8400にはZ80の/RFSHという信号がありません。これはDRAMのリフレッシュに使用する信号です。
DRAMはコンデンサの電荷の有無でデータを保持していて、その電荷は時間とともに低下していきます。このため定期的に電荷を補充(リフレッシュ)する必要があります(Dynamic Random Access Memory - Wikipedia)。そのための機能がZ80にはあり、その信号の一つが/RFSHです。
/RFSH信号がActiveの時にリフレッシュ(電荷を補充)するメモリのアドレス(下位7bit分)がアドレスバスに出力されます。そして/MREQ信号のタイミングでメモリにリフレッシュアドレスが取り込まれ、メモリ内でリフレッシュ動作が起きるという感じです。
つまりKL5C8400に/RFSH信号がないというのはDRAMのリフレッシュが出来ないことを意味します。ですのでKL5C8400は本来リフレッシュ動作の必要のないSRAMを使ってシステムを構成する想定で作られているCPUということになります。
当時CPUのサポートする33MHzの高速クロックでノーウェイトで動作させられる(つまりこのCPUの真価を引出せる)DRAMがなかったまたは高価だったのかもしれません。そしてSRAMのほうはというと高容量(64KBあるいはそれ以上)のものが安くなってきていたのかもしれません。
しかしながらタイミングチャートを見る限りそのほかのリフレッシュに必要な信号はそろっているようです。つまり/RFSH信号さえ合成できればDRAMシステムでも動作するのではないかと期待しました。
下の図はオペコードフェッチサイクル(M1サイクル)のチャートです。左は本家Z80のマニュアルから、右はKL5C8400のデータシートからコピーしてきました。
DRAMのリフレッシュのための信号はこのM1サイクルの時だけ出力されます。マシン語の命令を読み込むサイクルで、複数バイトの命令ではさらにメモリを読み込むサイクルなどがあります。いずれにしても命令を実行する最初に必ずM1サイクルがあり、そのたびにリフレッシュ動作があります。リフレッシュアドレスはそのたびに1増える動作のようです。
チャートに話を戻すと、CLKのT2とT3の間にWAITのクロックがあってもなくても影響はなく、"T3"で/M1が非アクティブになると同時にリフレッシュアドレスがアドレスバスに出力され、半クロック後に/MREQがアクティブになっています。この赤い丸で囲った部分が同じなのでリフレッシュに必要な他の信号は出ていると理解しました。
チャートを眺め、/RFSH信号は本家Z80と同じように"/M1の非アクティブ(立上がり)と同時にアクティブ(立下り)にし、2クロックそれを維持すればよい"と理解しました。
ところで左の図でM1サイクルの直後のT1で/M1が再度アクティブになっているようななっていないような?という図になっています。これがアクティブなら/RFSHは/M1の反転でよいのでは?と見えます。このT1は次のサイクルの最初のクロックで、先の命令が1バイト命令の場合、続けてM1サイクルが来るので/M1がアクティブになります。しかし複数バイト命令の場合M1サイクルではないので非アクティブのまま。つまり場合によるので単純な/M1の反転ではよくないことがわかりました。
話を戻して/RFSHをどのように合成するかについて、/M1の立上りを/RFSHの立下がりとする。/RFSHの立上りはその2クロック後(/M1の立上り2クロック遅延を使う)という方向でやってみることにしました。FF(フリップフロップ)が2つあればいいというのとGALを使えば部品規模的にも小さくできそうと考えました。これが最適かどうか自信はないです。ちなみにGALは使ったことがなくすでに消えたデバイスと思っていたくらいですので現行製品があることに驚いた次第です。
この場合必要な信号は/M1とCLKのみです。手書きの図ですが下記のように合成することにしました。「/M1」と「その2クロック遅延信号の"反転"」の論理積を取って(両方HIGHの時だけHIGH出力)それをさらに反転させたものが/RFSHという具合です。このようにチャートを眺めて「この信号がこうなれば・・」みたいな見つけ方をしたので最適かどうか自信がないわけですが、/M1信号を使うことはリフレッシュ出力があるのがM1サイクルの時だけなので少なくともこれを使うことはあっていると思います。FFを使う以外の方法があればよいかもしれません。
写真は/RFSH信号の合成回路を製作、実験しているところ。ATMEL(現Microchip Technology社)のATF16V8Bを使用してRFSH/信号を合成し出力しています。Arduino Nano(互換品)は/M1とCLK信号をシミュレートしています。
動作させたところをオシロスコープで見てみました。合成した/RFSH信号は/M1の立上り時に立下り、2クロック後に立上がる動作になりました。また/M1の立下りで誤って動作することもなくよさそうに見えます。紫の信号は無視してください。
たった十数行の説明で/RFSH信号が出来てしまったかのように書いてますが、実際は初めて使用するGALのため、Lチカから始めましたし、動作を記述するCUPLやそのアプリケーションであるWinCUPLとそのシミュレータの使い方もわからないところから始めているのでそれなりの試行錯誤の時間がかかりました。
さらに言うならばZ80のタイミングチャートを解釈したりそこから/RFSHを合成する方法を見つけるのにも時間を要しました。できてしまうと割とシンプルに見えるのですが、自分にとっては大冒険となったことを白状しておきます。
次回は最初の変換基板の作成です。