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

●INR/DCRのオーバーフローフラグ回路

本日は前々回にお約束した、INR/DCRのオーバフローフラグのセット、リセット回路の説明です。
この回路については前々回に回路図の写真をお見せしました。
8080にはオーバーフローフラグの機能がなかったことがわかってしまいましたので、この回路は削除してしまいます。

しかし、せっかく設計してしまったことですから、このままただ削除してしまうのは、いかにももったいない話ですから、その回路図を使って、(Z80のように)INR/DCRにもしオーバーフローフラグの機能があったならば、それはこんな回路になりますよ、という説明をいたしましょう、というのが、今回のテーマです。

前々回お見せした写真の回路図は他にもいろいろついていて、そのままではかえって理解しにくいと思いますから、余計な回路は外してしまって、INR/DCRのオーバーフローフラグのセット、リセットに関係する回路部分だけにして、お見せすることにしました。



●まず、DCR回路について説明しましょう

DCR回路の方がわかりやすいと思いますから、まず先にDCR命令でのオーバーフローフラグセット、リセット回路について説明することにします。図の下半分がDCRのオーバーフローフラグ回路です。
なおこの回路図はINR、DCR命令の全体の動作についての回路図ではありません。
オーバーフローフラグの回路図でもありません。
INR、DCR命令でオーバフローフラグのセット、リセットをする部分だけの回路図です。

前々回、DCR命令でオーバーフローが発生するのは、命令実行後の値が7Fになったときである、と説明しました。
この図の回路は、その言葉通りの回路です。
iB0〜iB7は内部データバスのビット0〜ビット7です。
ここに、DCR後のレジスタの値が出てきます。
図の左下の3入力ANDゲート2つ(74HC11)でビット0〜ビット5までのANDをとっています。その右上の2入力ANDゲート(74HC08)にはビット7を74HC04のインバータで反転した信号とビット6とのANDをとっています。これら3個のANDゲートの出力は、74HC11の残りの3入力ANDゲートでもう一度ANDをとって、その結果が出力されています。
ビット7のみが反転されて、その他のビットはそのままですから、このANDが全部成立するのは、iB0〜iB7に01111111(7F)というコードが乗っているときだけということがわかると思います。
最終的なAND出力は、そのままの信号と、その信号を反転したものとの2信号に分けられます。ANDが成立した方の信号は、オーバーフローしたことを示していますから、オーバーフローフラグをセットする信号(PVFset)になります。
一方その信号を74HC04で反転した信号は、コードが7F以外のときに1になります。つまり、それはオーバーフローしていないとき、ということになりますから、オーバーフローフラグをリセットする信号(PVFres)になります。

内部データバスiB0〜iB7にはいつもDCR実行後の値が乗っているわけではありません。命令の実行にともなって、クロックごとに異なった値が往来します。つねに変動している値に対してオーバフローフラグがセットされたりリセットされたりしては使い物になりませんから、ちょうどDCR実行後の値が内部データバスに乗っているときだけ、最終段のNANDゲートがアクティブになるように、この回路は考えてあります。
そのための信号がDCRFsetです。この信号は、DCRのメイン回路でつくられます。DCR実行後のタイミングにあわせてLになる信号です。負論理信号(アクティブになるときに信号がL)なので、74HC04で反転して、正論理(アクティブになるときの信号がH)に直して74HC03の入力信号にします。

●INR回路はこのままではわかりづらい

INR回路も今説明したDCR回路と考え方は全く同じです。
DCRと違うところは、DCRが命令実行後の値が7Fのときにオーバーフローするのに対し、INRは命令実行後の値が80のときにオーバーフローすることだけです。
なぜ、INR回路はわかりづらいのでしょう。

それは条件一致データの検出回路のせいです。
DCRはオーバーフローする条件である、内部データバスが7Fのときを検出するのに、AND回路を使いました。
ビット7のみが0で、ビット6〜ビット0が全て1のとき、という条件ですから、AND回路はぴったりです。

ところが、INR回路はこれとは全く逆の条件になります。ビット7だけが1でビット6〜ビット0が全て0のときに条件が成立します。
DCR回路と同じ考えの回路にするならば、ビット6からビット0を全部74HC04で反転してからANDゲートにいれなければいけません。それはあまり賢い回路ではありません。
こういうときには、実はデータを全部反転する代わりに、図の回路のようにORゲートを使って、「AND」と同じ働きをさせることができます。

●ORゲートがANDになる?

あるていどロジック回路を学んだ方ならば、ああ、そういうことか、とすぐにおわかりだと思います。
ORゲートにはじつは別の顔があるのです。
それは、「負論理のAND」ゲートです。
上の図はわかりづらいので、「負論理のAND」ゲートを使って描き直してみることにします。



さて、今度はどうでしょうか(ゲートの端子番号やIC名称がもとの図と少し違っているのは、ゲート回路図のパーツを「既製品」で間に合わせたためです)。

こんなゲートは見たことがない、という方もいるかもしれません。
じつはこれも74HC32(2入力ORゲート)なのです。
どこがORだ?ANDじゃないか。いや、小丸がついているからNANDか?いや、NANDとも違うなぁ。

これはいったい何なのか?

普通一般的な論理回路は、信号がH(1)のときに意味があります。
たとえばさきほどのDCR回路では、iB0が1でiB1も1でiB2も1のときに図の一番下の3入力ANDゲートの出力がHになります。信号がH(1)のときに意味がある回路なのでこういう回路のことを正論理の回路といいます。

それとは全く逆の考え方の回路が、この2つめの図の回路です。
図の回路のように、ゲートの前や後ろに丸印がつくと、その信号はLのときに意味があるという印になります。
ですから図の一番上のゲートの回路の意味は、iB5がL(0)で、iB4もL(0)のときだけ出力がLになる、という「AND」回路なのです。
なぜ、そういう考え方ができるのでしょうか?

真理表を使って説明しましょう。

入力A 入力B 出力Y

OR回路(74HC32)の真理表です。これはわかりますね。
入力Aと入力Bのいずれか片方かまたは両方の入力が1のときに出力Yが1になります。たしかにORです。
では、同じ表を今度は0に注目して考えてみましょう。
すると、
入力Aと入力Bの両方が0のときだけ、出力が0になる。
ほーら、ANDなのですよ。

このように回路によっては、一般的なゲート図ではなくて、小丸印をつけた負論理のゲート図を使った方がうんと理解しやすい場合があります。
ただ、回路によっては、1と0の両方に意味がある信号もあって、その場合にはどちらのゲート図を使ってもなんとなくしっくりしない場合もあって、こうすべきである、と一概には断定できないとも思えます。
そこで、今回の企画では、とりあえず通常の正論理の表現に全て統一することを原則としました。
ただ、今回のように回路図を用いて説明をする場合に、そのままの回路図では理解しにくいと思われるような場合には、適宜負論理図も用いて説明することとします。

さて、INRの回路図ですが、そこまで理解できれば、iB0〜iB7が10000000(80)のときにオーバーフローフラグがセットされ、それ以外のときにリセットされる、ことは簡単に理解できたことと思います。
2008.7.29upload

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