標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第44回]

●MOV M,rの回路図です

今回もMOV命令の説明の続きです。
前回は、メモリからデータを転送する、MOV M,rの回路について説明をしました。
今回はその逆の、レジスタからメモリへデータを転送する、MOV M,rの回路について説明をします。



[第42回]で説明したMOV r,Mの回路とどこが違うかというと、右下の信号出力の部分が違っているだけです。
MOV r,Mの回路では、信号出力の条件が、s=110(データの送り元はメモリ)でしたが、今回はそこがなくなっており、d=110(データの送り先はメモリ)だけになっています。
s≠110を条件に加えなくてもよいのでしょうか?

●s≠110は条件に加えなくてもよい?

この回路のままでは、s(データの送り元)については無条件なので、MOV M,rのほかに、MOV M,Mが選択されてしまいます。
ところがMOV M,Mという命令は存在せず、d=110でs=110であるMOV命令コード、01110110はHLT命令になってしまいます。
これでは、まずいのではないでしょうか?

ここであわてて、
「間違いに気がつきました。回路図を訂正します」
などと書いていないからには、「このままでよい」のです。

実は [第42回]で説明したMOV r,Mの回路でもd≠110は不要で、s=110だけでよかったのです。
あとから気がついたのは、こちらの方だったのですが、d≠110をわざわざ外してみても配線が1本変わるだけで何の得にもなりませんから、そのままにしておいたのです。
でも、本当は下図の回路で良かったのです。


×印のラインをカットして、破線のラインにするのが正解なのですが、このようにしてもバイパスされる74HC08(1)ゲートは他の回路には必要なものなので、省略してしまうわけにはいきませんから、何の得にもなりません。
ですから、どちらでもよいのですが、本当は破線の回路が、「動作をよく理解している人が描いた回路」なのです。

なぜ、MOV r,Mではd≠110が不要で、MOV M,rではs≠110が不要なのでしょうか。
実は、その答えは、MOV回路にあるのではなくて、HLT回路にあります。
ですから、その答えは、HLT回路の説明まで、「おあずけ」です。

●MOV r,M のタイミングチャートです

MOV M,rの回路の説明に戻ります。
タイミングチャートを見ながら説明をしていきましょう。



OPコードフェッチサイクル(T0〜T3)は、省いてあります。
命令の実行部分のタイミングチャートは、T4から始まります。

W1の期間(T4〜T7の期間)HLselとregRDとdataOUTをアクティブにします。
HLselをアクティブ(L)にするので、アドレスバスA0〜A15にはPC(プログラムカウンタ)に代わって、HLレジスタの値が出力されます。
innerBUS(内部バス)には、regRDとs2〜s0によって選択されたレジスタの値が出力されます。
dataoutがアクティブ(L)になると、外部データバスと内部データバスを仕切っている74HC245がアクティブになり、同時に74HC245のゲートの向きが外部データバス←内部データバスになるので、外部データバスD0〜D7には内部データバス(innerBUS)の値、つまりsssで示されるレジスタの値が出力されます。

dataout信号と74HC245の関係は[第39回]でお見せした制御信号作成回路図と、OPコードレジスタ&内部バスゲート回路図を見ると理解できると思います。
74HC245のEnable端子(G入力、pin19)はmemRDまたはdataOUTによってアクティブ(L)になります。
しかしDIR入力(pin1)にはdataOUTはつながっていません。
どうなっているのか、というと、74HC245のDIR入力は、memRDまたはioRDがアクティブ(L)のときだけHになります(外部データバス→内部データバスの向きになる)。
それ以外は外部データバス←内部データバスの向きになっていますから、あらためてdataOUTで向きを指定する必要はありません。
常時外部データバス←内部データバスの向きになっていたりすると、外部データバスでデータがぶつかってしまうのではないか、と心配になるかもしれませんが、ご心配には及びません。
74HC245のEnable端子(G入力、pin19)はmemRDまたはdataOUTのときのみアクティブ(L)になり、それ以外のときはディスイネーブルですから、データバスがぶつかることはありません。

ここまで説明してきて、回路の間違いに気がつきました。
このままでは、ioRDがアクティブになっても74HC245はディスイネーブルのままですから、IN命令を実行してもデータをレジスタに読み込むことができません。
i/o回路の部分の基板ができた段階で、ここは修正することにいたします。

●MEMWRの出力タイミングについて

T5とT6の期間MEMWRをアクティブにしています。
回路図ではmemWRになっていて、タイミングチャートではMEMWRになっています。
memWRは回路内部で発生する信号でMEMWRはCPU回路から外に出て行く信号です。
memWRとMEMWRの間には出力をイネーブル、非イネーブルにするゲートがあって、BUSRQやRESETのタイミングには非イネーブルになるように働きます。ですけれど、ここはそれほど深く考えなくても、このタイミングでメモリに対するMEMWR信号が出力されると単純に考えてください。

T5とT6の2つの期間、MEMWRを出力にしています。
これはメモリに対して十分なWR信号を与えるためでしたが、最近のメモリは非常に高速になってきていますから、ここはT5またはT6だけでもよかったと、今は考えています。
またregWRのように、T4にすることはできない、と考えたため、MEMWRは面倒なタイミングになってしまいました。
しかしどうもこれは、私の思い違いがあったようで、そうでなければならないようなメモリもあるかもしれませんが(多分ダイナミックRAMなど)、昔はダイナミックRAMを使った回路も作ったことがあるのですが、もう忘れてしまいました。いまさら調べるのも面倒くさいので、ダイナミックRAMについては確認していませんが、ちょうど手元に東芝の32KBスタティックRAM、TC55257(多分、日立62256互換)のデータシートが出てきましたので、確認してみました。
それによるとWR信号の下がりエッジはどうも無関係なようで、上がりエッジ前の40ns程度の期間、データが確定していればよいようです。
ということは、なんだ、レジスタと同じタイミングじゃありませんか。

うーん。
Z80などの出力信号のタイミングだけをみて、「こうしなくては」と思い込んでしまった、ようですけれど、ここは、30年前は、このようにしなければいけなかったかもしれませんが、今は、レジスタと同じタイミングにしておいてもよかったようです。
あれ、まあ。
2枚目の基板もわざわざ回路を直して、ガーバーデータを、もう基板屋さんに送ってしまいました。

まあ、今回は、試作ですし、こういうタイミングも必要な場合の参考にもなると考えて、ここはこのままにしておくことにします(念のために、MEMWRの出力をT4のタイミングに変えて確認だけはしておきましょう)。
2008.8.22upload

前へ
次へ
ホームページトップへ戻る