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

●ADD、SUB、CMP命令の回路の説明(タイミングチャートを見ながら)

ADD〜CMP命令の回路で大変だったのはキャリーフラグの処理でした。
回路そのものを考えるよりも、それを説明する方が、なかなかに大変でした。
でも、それも、やっと前回まででなんとか終了いたしました。

もう、これで、算術演算命令回路の説明は終わり!
というつもりで、前に戻って読みなおしてみましたら、タイミングチャートのあたりは、お見せしただけで、どうも素通りしてしまったようです。
キャリーフラグの処理さえ片付ければ、その他の回路は簡単なものですし、タイミングチャートも、とりたてて複雑なものではありません。
ざっと目を通していただければ、特に難しいところは無いと思いますけれど、でも、まあ、仕上げのつもりで、簡単に説明をすることにいたします。

●ほとんどの回路は、論理演算命令と同じ

論理演算命令と同じ、共通の回路部分については、[第179回]で説明をしました。
ずいぶん前のことになってしまいましたから、私同様に少々痴呆気味で、もうすっかり忘れてしまったよ、とおっしゃるお方は、もう一度、ざっと読み直してくださいませ。

ALU回路は、AND、OR、XORとADD(加算器)の回路が、演算の中心回路で、その入り口部分で、Aレジスタの値を、ALUのレジスタ”A”に格納し、演算のもう一方の値である、レジスタかメモリか定数値を、レジスタ”B”に格納すれば、その二つの値の間の演算は、それぞれの演算回路によって、タイミングとは無関係にただちに行われ、その演算結果は、結果の出力をゲートしている、それぞれの演算回路の終端の74HC244の入力に、そのまま伝えられます。

このレジスタ”A”とレジスタ”B”にそれぞれの値をセットするところまでのタイミングチャート、回路は、どの命令もほとんど同じです。
ただ、SUB、SBB、SUI、SBI、CMP、CPIの減算および比較命令は、レジスタ”B”に、そのときの内部データバスの値を反転して格納するために、インバータ回路を通すところだけが少し異なっています。

算術演算命令のタイミングチャートは、[第191回]●ADD命令、ADC命令、ADI命令、ACI命令のタイミングチャート、および●SUB命令、SBB命令、SUI命令、SBI命令のタイミングチャート、および●CMP命令、CPI命令のタイミングチャート、で説明をしていますので、そちらを参照していただきながら、下の説明を読んでいただくと、よりわかりやすいと思います。

M2の期間にAレジスタの値が内部データバスに読み出され、T4のreg”A”WR信号によって、ALUのレジスタ”A”に書き込まれます。
次のM5の期間には、命令によって、A〜Lレジスタか、メモリか、OPコードの次のメモリアドレスにある定数値、のいずれかが内部データバスに読み出され、T6のreg”B”WR信号によってALUのレジスタ”B”に書き込まれます。
ここまでの回路はALU関係の全ての命令に共通しています。
その共通部分の回路図は[第179回]●ALUのレジスタ”A”とレジスタ”B”の回路、および●ALU命令のデコード回路、にあります。

ただし、すでに説明しましたように、減算命令(SUB、SBB、SUI、SBI)と比較命令(CMP、CPI)では、M3のときにINVselがアクティブになり、それによって内部データバスの値が反転されてALUのレジスタ”B”に書き込まれます。
そのINVselを含めて、算術演算命令だけの回路部分については、[第191回]でお見せしていますので、そちらも参照していただくと、よりわかりやすいと思います。

●算術演算命令の回路の説明

その回路は、SUB、SBB、CMP(およびSUI、SBI、CPI)の各命令では、M3のときにINVselをアクティブにすることを除いては、演算終了後の処理を行う回路です。
演算終了後のM4で、ADDrdをアクティブにしています。
回路図ではCMP命令を含めてアクティブにしていますが、CMP命令はAレジスタを書き換えませんから、本当は74HC03(11)のpin10は74HC32(9)のpin6ではなくて、74HC32(13)のpin8に接続すべきです。
もっともADDrdによって内部アドレスバスに加算後のデータが出力されても、それをAレジスタに書き込むための、regWR信号の出力回路はCMP命令を除外していますから、CMP命令のときにAレジスタが書き換わることはありません。
CMP以外の加算、減算命令で、regWRはT8のときにアクティブになります。

じつはこの部分の基板配線図を確認してみたところ、74HC03(11)と74HC32(13)が離れていて、その間を配線するのがかなり困難なので、すぐ近くにある74HC32(9)につなぐようにしたらしいのです(自分で配線したのですけれど、もう記憶にありません)。
そういうわけなので、ここは本当は74HC32(13)のpin8に接続すべきなのですが、窮余の策で、回路図にある通りの配線になりました。


[2009.4.15追記ここから]
CMP命令のステップ動作の説明を書いていて間違いに気がつきました。
上で抹消線を引いた文が間違いに気がついた部分です。
CMP命令は結果の値をAレジスタに入れませんから、上のように考えてもよいように思えますが、実はS(サイン)フラグとZ(ゼロ)フラグは内部データバス(iB0〜iB7)に出力された値によって、セット、リセットされます([第58回]INRレジスタ回路図)。
ですから、Aレジスタに値を書き込まなくても、内部データバスには計算結果を出力する必要があったのです。
配線が困難なので、そうしたのではなくて、ちゃんと意味があって、そうしたのでした。
でも、そこのところをすっかり忘れてしまっていたのは、あー、やっぱり、ホンモノの痴呆の症状でしょーか、ねー。
[追記ここまで]

フラグについては、CMP命令を含めて、全ての加算、減算命令で、T8のときにC(キャリー)フラグとH(ハーフキャリー)フラグをセット、リセットするための、ADDFenblがアクティブになります。
ADDFenblは[第191回]の加算回路で、キャリーフラグとハーフキャリーフラグのセット、リセット信号を出力する74HC03に入力されています。

加算(ADD、ADC、ADI、ACI)、減算(SUB、SBB、SUI、SBI)、比較(CMP、CPI)の各命令では、キャリーフラグとハーフキャリーフラグだけではなくて、演算の結果、S(サイン)フラグやZ(ゼロ)フラグもセット、リセットされます。
そのため、T8のタイミングで、Sフラグをセット、リセットするSFenblとZフラグをセット、リセットするZFenblもアクティブにします。
SFenblとZFenblの回路は、[第58回]●INR(DCR)回路図にあります。
2009.4.7upload
2009.4.15訂正&追記

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