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

●MOV回路を大幅に変更してしまいました

前回、メモリの書き込みタイミングについて少し書きました。
これはひょっとすると、MOV命令の回路が簡単になってしまうかもしれない、と考えたので、ぜひともトライしてみたくなりました。
そこで本日は一日がかりで回路の大幅変更作業を行いました。
こんな調子です(疲れた)。



え?かえって複雑になってしまったんじゃないか、ですか?
手術みたいなものです。
不要になったからといって、バッサリ切ってそのまま、ってわけにはいかないでしょう?
トラブルのもとになったりしないように、いろいろ押さえておかなくてはいけませんし、余っているゲートを利用しようとしても、とんでもないところにあったりすると、こんな具合にあっちこっちジャンパ線だらけになってしまいます。

大手術の結果は?
MOVについては、メモリに対する命令も含めて、これだけになってしまいました。



[第40回]にお見せしたMOV命令の回路図にはMVI命令やHLT命令もはいっていましたから、単純に比較はできません。
そこからMOV命令のみを取り出した回路図がこちらでした。

1)MOV r,r’の回路図([第40回])
2)MOV r,Mの回路図([第42回])
3)MOV M,rの回路図([第44回])

今回の回路図は1)のMOV r,r’の回路図に近いですが、それよりももっと簡単になっています。
2)と3)の回路は完全に不要になってしまいました。

勿論何の細工もしないで、そのようにできるわけがありません。
当然ここが簡単になった代わりに、他の部分に手を加えてあります。
どのように手を加えたかを説明する前に、まずタイミングチャートを見てみましょう。

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

改造後のMOV r,Mのタイミングチャートは下図左です。
改造前のMOV r,Mのタイミングチャートは下図中で、MOV r,r’のタイミングチャートが下図右です。


MOV r,r’と同じタイミングになったことがわかると思います。
信号もMOV r,r’のときのregRDのタイミングでHLselとMEMRDをアクティブにしているだけですから、これなら簡単な回路追加で実現できそうです。

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

改造後のMOV M,rのタイミングチャートは下図左です。
改造前のMOV M,rのタイミングチャートは下図中で、MOV r,r’のタイミングチャートが下図右です。


MOV M,rについても、MOV r,r’と同じタイミングになったことがわかると思います。
しかし、こちらの改造はちょっと大変です。
どこが大変かというと、dataOUTなのです。

●MEMWRからdataOUTをつくる

dataOUTは内部データバスから外部データバスへデータを送り出すために、74HC245をアクティブにする信号でした。
この信号をregWR(MEMWRと同じタイミング)と同じにすると、MEMWRの立ち上がりと同時にデータバスがハイインピーダンスになってしまいます。

確かに東芝TC55257(32KBスタティックRAM)のデータシートでは、WR信号の立ち上がりとデータが不確定になるタイミングはミニマムで0になっています。
だからといって、dataOUTをMEMWRと同じタイミングの信号にしてしまう、というのはいかにも乱暴です。

もしもほんのちょっとしたタイミングでMEMWR信号がほんのわずか、たとえば数nsとか十数ns、データバスよりも遅れただけで、メモリにデータが書きこまれないことになってしまいます。
あるいはときたまデータのビットがいくつか誤書き込みされてしまう、といったようなことが起きかねません。

いずれにせよ、まったく余裕がないというような回路は作るべきではありません。
とするならば、やはりdataOUTは、このタイミンクチャートにあるように、regRDと同じ幅であることが求められることになります。
しかし、regRDからdataOUTをつくるわけにはいきません。
(なぜって?それはロジックが違うからです)

ここはどうしてもregWR(MEMWR)から、dataOUTを作り出すしかありません。
さて、どうしたらよいでしょうか?

●RCは使わない方がいい

こういうと失礼ですけれど、こういう場合、初心者の方は、たいてい74HC123などを使ってワンショットパルスを作ろうとします。
私にもそういう経験があります。

でも、これは、やめたほうがいいです。
R(抵抗)はともかくとして、C(コンデンサ)は信用しないほうがいいと思います。
経年変化や、温度などで変化しますし、劣化したり、容量抜けの可能性もあります。

そんな頼りないもので、ns単位のパルスをつくるというのは、いかにも「おそろしい」ことです。
せっかくクロックがあるのですから、ここはやっぱりへんな細工をしないで、堂々とクロックを使って、作り出しましょう。

●MEMWR、MEMRDの回路図です

regRDからMEMRDを作ります。regWRからMEMWRとdataOUTを作ります。
これが、その回路図です。



RDの方は簡単です。
s2〜s0が110のときに、regRDがアクティブな期間、74HC138のpin9からHLsel信号とmemRD信号が出るようにしました。
これだけで、メモリからデータが読み出せるようになります。

なお改造前の回路図([第27回])では、74HC138のpin9からはフラグレジスタのセレクト信号(FregRD)が出ていました。
FregRDは下の74HC138に移動しました。

さてWRの方です。
d2〜d0が110のときに、regWRがアクティブな期間、74HC238のpin9からmemWR信号が出るようにしました。

RD信号と同様に、改造前の回路図([第27回])では、74HC238のpin9からはフラグレジスタのセレクト信号(FregWR)が出ていました。
FregWRは下の74HC238に移動しました。

もうひとつ、memWRと同じ信号が上の方のフリップフロップ回路にも入っています。
ここでHLsel信号とdataOUT信号が作られます。

●RSフリップフロップ

NANDゲートが2つ、互いに絡み合った形の回路があります。
これがRSフリップフロップです。
誰がこんなものを考えたのでしょう?

これはゲート2個で作るレジスタです。
ちゃんとデータ(といっても1ビット、1個だけですけれど)を保持することができます。

その動作をみていきましょう。

最初にT0のタイミングで下側のゲートのpin2にL信号が入ります。NANDゲートは、2つある入力の片方だけでもLになると、出力はHになります。ですからpin2にLが入力されると、それだけでpin3からはHが出力されます。
pin3の出力は上側のゲートのpin12につながっています。
pin3の出力がHですから、pin12の入力もHになります。

うーん。いちいち回路図に戻るのは面倒ですねぇ。RSフリップフロップの部分だけ切り取って、もう一度お見せすることにします。

これで、わかりやすくなりました。

上側のNANDゲートのもうひとつの入力pin13には、memWRがつながっています(この図は全体の回路図をRSの部分だけ切り取ったので、線だけしか見えませんが、全体の回路図では、そうなっています)。
でもまだT0のタイミングですから、当然memWRはまだ出ていません。ですから、この入力もHです。
するとNANDゲートの2つの入力(pin12、pin13)がともにHですから、pin11の出力はLになります。

pin11の出力は下側のゲートのpin1につながっています。
pin11の出力はLですから、pin1の入力もLです。
この状態でT0の期間が終わって、pin2の入力がHになっても、下側のNANDゲートのもう一方の入力、pin1はLですから、pin3の出力のHはそのまま保持されます。
ということは、pin11の出力のLもこのまま保持されますので、HLselもdataOUTもH(非アクティブ)のままになります。

ここでmemWRがLになるとどうなるでしょうか。
さきほどの動作と逆のことが起こります。
pin13入力がLなのでpin11はHになります。
HLselとDataOUTがアクティブ(L)になります。
T0の期間は過ぎているのでpin2の入力はH、pin1もHなのでpin3はLになります。
したがってpin12の入力もLになります。
memWRの期間が過ぎて、memWRがHになっても、pin12の入力はLのままなので、上側のNANDゲートの出力、pin11はHのまま保持されます。
pin11がHである限り、HLselとdataOUTはアクティブ(L)のままになります。

しかし、もちろん、ずっとそのままでは困ります。
MOV M,rのタイミングチャートを見てください。
memWRはQaがLの期間だけアクティブになっていますが、HLselやdataOUTは、そのあと、QaがHになって、それから、QaがHからLに変わるときまでアクティブになっています。
今度はこのQa信号を利用します。

●次はDフリップフロップの出番です

T0に代わって74HC74(Dフリップフロップ)がRSフリップフロップをリセットします。
ついでですが、RSフリップフロップのRSというのは、Reset、Setの頭文字から来ています。
交互にセット、リセットする、という意味だと思います。

memWRの入力が74HC74のCLR(pin1)に入っています。
つまり、memWRがLになると同時に、反転出力(pin6)はHになります。
これは、RSフリップフロップの出力(HLselやdataOUTの出力)が、途中でリセットされてしまわないための対策なのです。

あ。もう一度、回路図を切り取ってお見せします。


もしもpin1のCLR入力が無くて、pin6がL出力になっていたとすると、RSフリップフロップのpin2がLのままになります。
この状態のまま、memWRが入力されても、RSフリップフロップのpin11はLからHに変わって、HLselとdataOUTがアクティブになります。
ところがmemWRの出力期間が過ぎてpin13の入力がHになったときに、まだpin2の入力がLのままだったとすると、pin12の入力もHなので、pin11の出力はHになってしまいます。
memWRがHになると同時にHLselとdataOUTもHになってしまうというのでは、なんのためにわざわざRSフリップフリップ回路を追加したのか、その意味がなくなってしまいます。
そのようなことにならないように、memWRがLになった時点で、74HC74のpin6出力をHクリアするために、pin1のCLR入力にmemWRをつないでいるのです。

D入力(pin2)にはRSフリップフロップのpin11がつながっています。pin11はHLsel、dataOUTがアクティブな期間H、それ以外はLという信号です。
クロック入力(pin3)には、Qaをインバートしたパルスが入力されます。

74HC74はクロック入力がLからHになる瞬間のD入力の状態をラッチします。
反転出力pin6からはラッチされたD入力の反対の状態が出力されます。

クロック入力pin3にはQaをインバートしたパルスが入力されますから、QaがHからLになるときのD入力の状態がラッチされることになります。
HLselとdataOUTがアクティブな状態(L)のときに、D入力(pin2)はHになってますから、QaがHからLになると、そのときのD入力のHがラッチされ、反転出力のpin6からはLが出力されます。

74HC74のpin6は、RSフリップフロップのpin2につながっていますから、RSフリップフロップがリセットされ、HLselとdataOUTは非アクティブになります。

この回路に落ち着くまでに、いろいろ試行錯誤したために、D入力にRSフリップフロップのpin11がつながってしまいましたが、この回路の場合には、D入力はVccにつないでおくだけでも、問題なく機能します。
2008.8.23upload
2008.8.24●RSフリップフロップ以降追記&再編集
2008.8.25同上

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