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

●ADD、SUB、CMP命令の回路の説明(キャリーフラグを中心に)

ADD〜CMP命令の回路の説明は、[第191回]で、その中心になる加算回路の回路図や、タイミングチャートなどをお見せして、概略の説明をしました。
加算回路は4ビットのアダー(74HC283)を2個使えば簡単にできてしまいます。
ところが簡単ではないのは、キャリーフラグの処理です。

減算命令のSUBは、引く数を「1の補数」とキャリーフラグに置き換えて、加算に直すことで、加算回路をそのまま利用することができます。これは[第193回][第194回]で説明しました。

下位桁からのボローを含めて減算するSBB命令では、引く数を「1の補数」に置き換えて加算に直すところまではSUB命令と同じですが、ボローがあるときと無いときで、ボロー(キャリーフラグ)の状態を反転させて加算する、という説明を[第196回][第197回]でしました。

加算命令のADDは、キャリーフラグを無視して、足される数と足す数だけの加算を行いますが、ADC命令は下位桁からのキャリーを含めて加算を行います。
ADD命令もADC命令も、加算の結果、上位桁への桁上げ(キャリー)が発生したときは、キャリーフラグをセットし、キャリーが発生しなかったときは、キャリーフラグをクリアします。
このあたりの説明は[第192回]でしています。

減算命令のSUBやSBBも、減算の結果、上位桁へのボローが発生したときは、キャリーフラグをセットし、ボローが発生しなかったときには、キャリーフラグをクリアします。
しかし、減算命令は引く数を「補数」に変換することで、減算を加算に直して計算するため、キャリーフラグのセット、リセットの仕方が、ADD、ADC命令のときとでは、逆になります。
SUBやSBB命令では、「補数」を使った加算の結果、上位桁への桁上げが発生したときは、キャリーフラグをクリアし、桁上げが発生しなかったときは、逆にキャリーフラグをセットします。
このあたりについては[第194回]で説明しました。

加算命令(ADD、ADC)も減算命令(SUB、SBB)も、同じ加算回路を使いますが、計算前のキャリーフラグを加算に加えるか、加えないかの区別があって、それが加算命令と減算命令では加え方が異なります。
また計算の結果、上位桁へのキャリーが発生した場合と、しなかった場合のキャリーフラグのセット、リセットの仕方も、加算命令と減算命令では逆になります。
そのキャリーフラグの交通整理をしているのが、[第191回]の回路図にある、74HC157の回路です。

74HC157の回路は、74HC283(adder)に加えるキャリーと、加算の結果発生するキャリーの両方の交通整理をしています。
順番に見ていくことにします。

74HC157はA入力とB入力をセレクト端子(pin1)の状態によって選択してYに出力します。
pin1がLのときにA入力がYに出力され、pin1がHのときにB入力がYに出力されます。
74HC157には、このA、B、Yの選択回路が4組はいっています。

●キャリー無し加算、減算のためのC0入力

まず、3A、3B、3Yについて説明します。
4組のA、B入力の選択は全て同じpin1のH、Lによって行われます。
pin1には、OPコードのビット4(OP4)が入力されています。
加算命令、減算命令のOPコードは、[第179回][第191回]にありますが、またまた時間がたってしまいましたから、もう一度お見せして説明することにします。

ADD、ADC、SUB、SBB、ANA、XRA、ORA、CMPは、命令コードの上位2ビットが10の命令群です。
ニーモニック 命令コード
ADD 10 000 sss
ADC 10 001 sss
SUB 10 010 sss
SBB  10 011 sss
ANA  10 100 sss
XRA 10 101 sss
ORA 10 110 sss
CMP 10 111 sss

sssはレジスタA〜L、M(メモリ)を示す、000〜111の値

ADD〜CMPは、さらに、命令コードのOP5〜OP3の3ビットによって選択されます(上の着色した部分の命令)。

レジスタではなくて、定数とAレジスタの間の演算をおこなう、ADI、ACI、SUI、SBI、CPI命令は、上位2ビットが11で、かつ下位3ビットが110の命令群です。
ニーモニック 命令コード
ADI 11 000 110
ACI 11 001 110
SUI 11 010 110
SBI  11 011 110
ANI  11 100 110
XRI 11 101 110
ORI 11 110 110
CPI 11 111 110

ADI〜CPIが、命令コードのOP5〜OP3の3ビットによって選択されることは、ADD〜CMPと同じです。

上の表の、命令コードを見ると、ビット4(OP4)が0はADD、ADC、ADI、ACIの加算命令で、ビット4が1はSUB、SBB、SUI、SBIの減算命令と、CMP、CPIの比較命令になっていることがわかります。

CMP、CPI命令については、いままで説明をしてきませんでした。
CMP、CPI命令は、SUB、SUI命令と同じ動作をします。
CMP、CPI命令は、Aレジスタとレジスタ、定数との大小を比較する命令ですが、その方法は減算命令と同じで、Aレジスタからレジスタ、定数の値を減算し、その結果によって、S(サイン)フラグ、Z(ゼロ)フラグ、C(キャリー)フラグ、H(ハーフキャリー)フラグをセット、リセットすることで、大小の比較の結果を示します。
減算命令と異なっているのは、減算の結果のフラグのみ変化させ、結果の値は捨ててしまってAレジスタを変化させない、という点だけです。
ですから、CMP、CPI命令は、最後の計算結果をAレジスタに格納する、という部分を除いてその他のところはSUB、SUI命令と同じ回路でよいことになります。

上の表で着色されていない、論理演算命令(ANA、ORA、XRA、ANI、ORI、XRI)が実行されるときにも、加算回路が動作して、キャリーを含めた加算が行われます。
しかしその加算は意味のないものです。
論理演算命令の回路では、最後の加算結果をAレジスタに格納したり、加算結果によってフラグの状態を変化させたりする回路はアクティブになりませんから、支障はありません。

さて、説明をもとにもどして、74HC157の3A、3B入力、3Y出力の続きです。
74HC157のpin1がL(0)のときにA入力がYに出力され、H(1)のときにB入力がYに出力されます。
pin1にはOP4が入力されます。
加算命令のOP4は0で、減算命令のOP4は1ですから、加算命令のときに3A入力が3Yに出力され、減算命令のときに3B入力が3Yに出力されます。
[第191回]の回路図を見ると3AはGNDに3BはVddに接続されています。
つまり加算命令のときには、3YからはLが出力され、減算命令のときには、Hが出力されることになります。

●キャリー付加算、減算命令のためのC0入力

次に、4A、4B入力、4Y出力を見てみます。
4AにはCF(キャリーフラグ)が接続され、4BにはCF(キャリーフラグ)をインバータ(74HC04)で反転した信号が入力されています。
加算命令のときには、4Y出力はCF(キャリーフラグ)と同じになり、減算命令のときには、4YはCF(キャリーフラグ)を反転した出力になることがわかります。

その3Y、4Yの出力の先は、74HC03と74HC04の各ゲートを通って、Dフリップフロップ74HC74のD入力につながっています。
OP3が0のときに3Y出力が74HC74のD入力になり、OP3が1のときは、4Y出力がD入力になります。

さきほどの加算命令、減算命令の表を見ると、計算前のキャリーを無視するADD、ADI、SUB、SUIの各命令のOP3は0で、キャリーを含めて計算するADC、ACI、SBB、SBIの各命令のOP3は1になっています。

74HC157とその後ろのゲート回路によって、キャリー無し加算命令(ADD、ADI)のとき、74HC74のDには0が入力され、キャリー無し減算命令(SUB、SUI)のとき、Dには1が入力されます。
キャリー付加算命令(ADC、ACI)のとき、DにはCF(キャリーフラグ)の状態がそのまま入力されます。
キャリー付減算命令(SBB、SBI)のとき、DにはCF(キャリーフラグ)を反転した値が入力されます。

CMP、CPI命令はキャリー無し減算命令と同じ動作になるはずですが、CMP、CPI命令のOP3は1なので、キャリー付減算になってしまいます。
そこで、CMP、CPI命令のときは、OP4、OP3を使わないで、強制的に74HC74のD入力を1にします。

74HC74のD入力は、ALUのレジスタ”A”に、Aレジスタの値をロードするタイミングで、下位4ビットの加算器74HC283のC0(キャリー入力)に出力されます。

●加算、減算実行後のキャリー出力回路

74HC157の1Aには、上位4ビットの加算器74HC283のC4(上位桁へのキャリー出力)がそのまま入力され、1Bにはその反転信号が入力されています。
2Aには下位4ビットの加算器74HC283のC4(ビット3からのキャリー)がそのまま入力され、2Bにはその反転信号が入力されています。
先ほど説明した3Y、4Yと同様に、加算命令、減算命令のOP4によって選択された1Y、2Yの状態は、計算の終りのタイミングに、CF(キャリーフラグ)セット、リセット信号およびHF(ハーフキャリーフラグ)セット、リセット信号となって出力され、各フラグをセット、リセットします。
2009.4.6upload

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