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

●RLC、RRC、RAL、RARの回路図の説明です

RLC、RRC、RAL、RARの回路図は前回お見せしましたが、少し複雑な回路ですので、もう一度、掲載いたします。



回路図の上部中ほどにシフトレジスタ74HC194が2個つながっています。
上側が上位4ビット(D7〜D4)、下側が下位4ビット(D3〜D0)を受け持ちます。
下位側のQD出力(つまりD3出力)が上位側のR入力につながっています。

前回にもお話ししましたが、74HCと8080ではビット表現のRight(右)とLeft(左)が逆になっています。
74HC194のR入力には、shift right serial inputと書いてあります(前回[第168回]MM74HC194datasheet参照)。
74HC194でいうところのshift rightというのは、D4→D7の向きに1ビットシフトすることで、これは8080ではrotate leftなのですが、表現の違いはしばらく置くとして、とにかくD0→D3、D4→D7の向きにシフトするときには、上位側のR入力に下位側のD3出力をつなげば、上下がうまくつながることになります。

同様の考えで、上位側のQD(D7)出力は、下位側のR入力につなげばよいことになります。
ところが回路図を見ると、上位側のQD(D7)出力は、下位側のR入力には、直接はつながっていません。
間に74HC51のAND−NORゲートが入っています。
なぜこんな面倒な回路になっているのでしょう?

D0→D7の向きにデータをシフトさせる命令は2通りありました。
RLCとRALです。
RLCは、D7がD0に入りますが、RALはD7ではなくてC(キャリー)フラグがD0に入ります。
どちらの命令であるかによって、下位側のR入力には、D7出力かC(キャリー)出力かを選択して接続する回路が必要になってきます。

RLCのマシン語コードは00000111、RALのマシン語コードは00010111です。
bit4(OP4)の1、0によって、どちらの命令であるかがわかります。
RLCはOP4=0で、そのとき下位側のR入力には、上位側のD7出力が入ります。
RALはOP4=1で、そのとき下位側のR入力には、CF(キャリーフラグ)が入ります。
74HC51によって、そのようにセレクトされます。

[09.2.25追記、訂正 ここから]

回路図の左下で、CF(キャリーフラグ)がDフリップフロップ74HC74によって、T4のときにラッチされています。
しかし、このラッチは無用でした。

ローテイト命令はその命令の実行前のAレジスタのD7かD0のいずれかが、命令実行後のC(キャリー)フラグの値になります。

この「追記」を書く前は、

ローテイト命令の実行によって、D7もD0も変化してしまいますので、命令実行前のT4のタイミングでC(キャリー)フラグをセットまたはリセットしておく必要があります(74HC194のシフト動作はT5の終りに行われます)。
その一方で、RALとRAR命令では、命令実行前のC(キャリー)フラグが必要になります。
そういうわけで、T4のときに、命令実行前のC(キャリー)フラグをラッチしているのです。

と書いていたのですが、この文には、複数の間違いがありました。
正しくは、以下のように書くべきでした。

ローテイト命令の実行によって、D7もD0も変化してしまいますので、命令実行前のT4のタイミングでD7とD0をラッチしておく必要があります(74HC194のシフト動作はT6の終りに行われます)。
そういうわけで、T4のときに、命令実行前のD7とD0を、図右側の74HC74にラッチしているのです。

このときにラッチされた情報(右回りならD0、左回りならD7を選択する、ということも含めて)は、ローテイト動作が完了したT8のタイミングで、C(キャリー)フラグをセット、リセットする信号として出力されます。

自分でそのようにしっかり考えて設計したのに、すぐにそのことを忘れてしまい(もう、完全な痴呆の症状ですなあ)、まったく無駄なCフラグの保持回路を追加してしまいました。

「おーい。かあさーん。晩御飯はまだかねー」
「あら、やだ。晩御飯は、ついさっき、食べましたでしょ」
「お、お、お。そうだった。…。ところで…。今日の晩御飯は、いつ、食べさせてくれるのかね?」

右回りか左回りかという情報は、(この文の下の方でも説明していますが)命令コードのbit3(OP3)に含まれています。
OP3が1なら右回りなのでD0が選択され、OP3が0ならば左回りなのでD7が選択されます。
D0、D7は、M2(T4、T5)の期間にAレジスタから内部データバスに出力されるiB0〜iB7のうちの、iB0、iB7を使います。
そのため、Dフリップフロップ74HC74にラッチするタイミングは、iB7〜iB0がT4の始めに出力されはじめて、それが十分確定するT4の終りまで待つ必要があります。
DフリップフロップのCK入力として、T4を反転しているのはそのためです(下図)。


[09.2.25追記 ここまで]

さて、まだ74HC194の回路について、説明は完了していません。
今度は、上位側のQA(D4)と下位側のL入力の接続について、です。

74HC194のL入力には、shift left serial inputという説明がついています(前回[第168回]MM74HC194datasheet参照)。
74HC194でいうところのshift leftというのは、D3→D0の向きに1ビットシフトすることで、これは8080ではrotate rightになります。
表現は全く逆なのですが、とにかくD7→D4、D3→D0の向きにシフトするときには、下位側のL入力に上位側のD4出力をつなげば、上下がうまくつながることになります。

同様の考えで、下位側のQA(D0)出力は、上位側のL入力につなげばよいことになります。
しかし、下位側のQA(D0)出力は、上位側のL入力には、直接はつながっていません。
間に74HC51のAND−NORゲートが入っています。
この回路は、さきほど説明した、上位側のQD(D7)出力と下位側のR入力との接続回路と同じ考え方の回路です。

D7→D0の向きにデータをシフトさせる命令も2通りありました。
RRCとRARです。
RRCは、D0がD7に入りますが、RARはD0ではなくてC(キャリー)フラグがD7に入ります。
どちらの命令であるかによって、上位側のR入力には、D0出力かC(キャリー)出力かを選択して接続する回路が必要になってきます。

RRCのマシン語コードは00001111、RARのマシン語コードは00011111です。
bit4(OP4)の1、0によって、どちらの命令であるかがわかります。
RRCはOP4=0で、そのとき上位側のL入力には、下位側のD0出力が入ります。
RARはOP4=1で、そのとき上位側のL入力には、CF(キャリーフラグ)が入ります。
74HC51によって、そのようにセレクトされます。

74HC194には、Aレジスタの値が入ります。
回路図の下の方、74HC03にM2が入っていて、出力はregRDになっています。
M2のときにregRDがアクティブになりますが、s3〜s0の出力は回路図のどこにもありません。
s3〜s0がハイインピーダンス(つまり1)でregRDがアクティブになりますから、Aレジスタから内部データバス(iB0〜iB7)にデータが出力されます。

同じM2のときに、74HC194のs1、s0につながっているORゲート(74HC32)の出力はHになります。
そしてT4をインバートした信号が74HC194のクロックに入っていますから、T4の終りのタイミングで、内部アドレスバスの値(Aレジスタから出力された値)が、74HC194にロードされます。

74HC194のs1、s0入力は、M2のときだけはともに1になりますが、それ以外のときは、OP3(命令コードのbit3)が1のときに、s1=1、s0=0になります。OP3=0のときには、s1=0、s0=1になります。

命令コード(マシン語コード)をもう一度並べてみます。
RLC       00000111
RRC       00001111
RAL       00010111
RAR       00011111
              ↑bit3

OP3(bit3)=1は、RRCとRARで、OP3(bit3)=0はRLCとRALです。
右ローテイトは74HC194では左シフトですから、s1=1、s0=0にします。
左ローテイトは74HC194では右シフトですから、s1=0、s0=1にします。
そして、T6をインバートして74HC194のクロックに入れると、s1、s0にしたがった向きにシフトが行われます。

シフト完了後のM4のときに、74HC194の出力は74HC244を通して内部データバスに出力されます。
一方、T8のタイミングでregWRがアクティブになります。
regRDのときと同じで、レジスタアドレスを決定するd3〜d0の出力回路は、回路図のどこにもありませんから、d3〜d0は1111で、Aレジスタが選択されて、内部データバスの値が、Aレジスタに書き込まれます。

なお、この回路のままで、M2のときにs3〜s0を、そしてM4のときにd3〜d0をそれぞれアクティブにする回路さえ追加すれば、Z80のように、B〜Lレジスタもローテイトすることができます。
もちろん、その動作をさせるためには、あらたなマシン語コードの追加と、そのためのデコード回路も追加することが必要になります。
2009.2.23upload
2009.2.25追記、訂正

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