標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第132回]
●74HC283の真理表の説明です
あっというまにクリスマスが終わってしまいました。
それでは、落ち着いて何かができるか、といいますと、なんたって「師走」っていうくらいですから、もう、気ぜわしくてたまりません。
じきに大晦日です。
除夜の鐘をつきにいって(近くのお寺で、一回10円でつかせてくれるんですよ)、それでもう「あけましておめでとうございます」です。
なんだか、もう、あれこれ、書いている気分ではありませんね。
そんな状況ですから、当連載も、落ち着かず、細切れ状態で、年を越してしまいそうです。
で、細切れの続きです。
前回、4bit Full Adder74HC283の真理表の説明を予約いたしました。
74HC283の真理表は前回お見せしましたが、もう一度、再掲いたします。
[出典]National Semiconductor社MM74HC283DataSheet
ちょっと見ただけでは、いったい何が書いてあるのか、よくわかりません。
この表は、本当は別々に書くところを、まとめてひとつにしてしまったものです。
A1、A3やB1、B3のように、ひとつの列に2つの端子名が書いてあります。
ここは
A1 | B1 | A2 | B2 | (C0=Lの)Σ1 | Σ2 | C2 | (C0=Hの)Σ1 | Σ2 | C2 |
と、
A3 | B3 | A4 | B4 | (C2=Lの)Σ3 | Σ4 | C4 | (C2=Hの)Σ3 | Σ4 | C4 |
の2つのグループの表をひとつにしてしまったものです。
この2つの表はまったく同じ値になるので、そのようにしてしまったのでしょう。
え?
やっぱり、わからない?
この表はA1〜A4の4ビットと、B1〜B4の4ビットを加算したときの、入力と出力の関係を示したものです。
A1〜A2+B1〜B2の下位2ビットどうしの加算と、A3〜A4+B3〜B4の上位2ビットの加算は、2ビットの計算として切り離せば同じことなので、そのような表になっているのです。
10進数の計算でも、たとえば1234+5678の計算は、桁上がりを考慮しなければ、12+56、34+78と2つに分けて計算することが可能で、その場合に、上位2桁と下位2桁の計算ルールは全く同じです。
ちなみに、その計算は、34+78=112、12+56=68で、下位からの繰り上がり(キャリー)を上位の結果に加算して、69と12を合体させた、6912が答えになります。
さきほどの表の前のグループは、A1〜A2+B1〜B2の下位2ビットの加算について、その下の桁からのキャリーがない場合(C0=L)とキャリーがある場合(C0=H)のそれぞれについて、計算結果の2ビット(Σ1、Σ2)と上位桁へのキャリー(C2)の値を示したものです。
後のグループは、A3〜A4+B3〜B4の上位2ビットの加算について、その下の桁からのキャリーがない場合(C2=L)とキャリーがある場合(C2=H)のそれぞれについて、計算結果の2ビット(Σ3、Σ4)と上位桁へのキャリー(C4)の値を示したものです。
計算のルールが同じなので、表の中身も同じになるのです。
●表のH、Lを1、0に置き換えてみます
表の意味はそういうことなのですが、でもやっぱり、よくわからない、かもしれません。
もう少し、わかりやすくしてみましょう。
すでに説明しましたように、下位2ビットの計算と、上位2ビットの計算は全く同じですから、下位2ビットについてだけ、考えてみます。
(本当は2ビットに分けないで、1ビットずつに分解して考えても、各ビットは同じになってしまうのですけれど、それについては、またあとで説明をいたします)
C0=0 | C0=1 | ||||||||
A1 | B1 | A2 | B2 | Y1 | Y2 | C2 | Y1 | Y2 | C2 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
加算回路なのですから、このように、H、Lではなくて、1と0に置き換えたほうがわかりやすくなります。
この表をさらに、下のように並べ替えます。
C0=0 | C0=1 | ||||||||
A1 | A2 | B1 | B2 | Y1 | Y2 | C2 | Y1 | Y2 | C2 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
0 | + | 0 | = | 0 | |||||
1 | + | 0 | = | 1 | |||||
0 | + | 1 | = | 1 | |||||
1 | + | 1 | = | 2 | |||||
2 | + | 0 | = | 2 | |||||
3 | + | 0 | = | 3 | |||||
2 | + | 1 | = | 3 | |||||
3 | + | 1 | = | 4 | (0+C) | ||||
0 | + | 2 | = | 2 | |||||
1 | + | 2 | = | 3 | |||||
0 | + | 3 | = | 3 | |||||
1 | + | 3 | = | 4 | (0+C) | ||||
2 | + | 2 | = | 4 | (0+C) | ||||
3 | + | 2 | = | 5 | (1+C) | ||||
2 | + | 3 | = | 5 | (1+C) | ||||
3 | + | 3 | = | 6 | (2+C) |
A1、A2とB1、B2が隣同士になるように、並べ替えました。
AもBも2ビットですから、その組み合わせは、それぞれ、00、01、10、11の4通りです。これを10進数に直せば、0、1、2、3になります。
つまり、この表は0〜3+0〜3の計算の全ての場合を示しているのです。
表の下に上の各行の計算を10進数の計算に直したものをつけ加えました。
まずは下位桁からのキャリーがない場合(C0=0)について示してあります。
計算結果が3よりも大きくなると、上位桁への繰り上がり(キャリー、C2)が発生します。
表で、結果が4〜6のときは、その後ろに()で、結果の2ビットが、0〜2になって、キャリー(C)が発生することを、示しています。
次に同じことを、下位桁からのキャリーがある場合(C0=1)について示します。
計算結果はもとの表の右側(C0=H)の部分になります。
C0=0 | C0=1 | ||||||||
A1 | A2 | B1 | B2 | Y1 | Y2 | C2 | Y1 | Y2 | C2 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
0 | + | 0 | + | 1 | = | 1 | |||
1 | + | 0 | + | 1 | = | 2 | |||
0 | + | 1 | + | 1 | = | 2 | |||
1 | + | 1 | + | 1 | = | 3 | |||
2 | + | 0 | + | 1 | = | 3 | |||
3 | + | 0 | + | 1 | = | 4 | (0+C) | ||
2 | + | 1 | + | 1 | = | 4 | (0+C) | ||
3 | + | 1 | + | 1 | = | 5 | (1+C) | ||
0 | + | 2 | + | 1 | = | 3 | |||
1 | + | 2 | + | 1 | = | 4 | (0+C) | ||
0 | + | 3 | + | 1 | = | 4 | (0+C) | ||
1 | + | 3 | + | 1 | = | 5 | (1+C) | ||
2 | + | 2 | + | 1 | = | 5 | (1+C) | ||
3 | + | 2 | + | 1 | = | 6 | (2+C) | ||
2 | + | 3 | + | 1 | = | 6 | (2+C) | ||
3 | + | 3 | + | 1 | = | 7 | (3+C) |
どちらの表も、いまひとつ、数の並びが面白くありません。
これは、もとの表が、A1、B1、A2、B2の並びになっていて、それを4ビットの入力信号として扱っているためです。
数の加算回路なのですけれど、ANDやORなどの論理回路と同じ扱いなのですね。
●じつは、論理回路なのです
というのも、このレベルでは、数値演算回路というよりも、論理演算回路といったほうがなじみやすいレベルなのです。
計算結果の表なのに、HとLを使って、真理表(Truth Table)などと表現しているのは、多分そういった意味合いからなのだと思われます。
そこで、そのあたりをもう少し掘り下げて、考えてみたいと思います。
●加算回路の論理的考察
なんて、格好つけてしまいました。
上の方で、「じつは1ビットに分解できる」と書きました。
そこで、まず、1ビットと1ビットの加算について考えてみます。
さきほどの表で、A1+B1=Σ1(とキャリー)のところだけ、抜き出してみます。
A1 | B1 | C0 | Y1 | C1 |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
まずは下位桁からのキャリーは無い場合(C0=0)について考えてみます。
C0が邪魔ですから、外してしまいましょう。
そうすると、こうなります。
A1 | B1 | Y1 | C1 | |
0 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 | |
0 | 1 | 1 | 0 | |
1 | 1 | 0 | 1 |
この表って、どこかで見たような…。
ほら。
A1 | B1 | Y1 | C1 | |
0 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 | |
0 | 1 | 1 | 0 | |
1 | 1 | 1 | 1 |
入力がA1とB1で出力がY1という、この表は?
そうです。2入力ORゲート(74HC32など)の真理表です。
あっと、残念。一番下だけ、結果が逆になっています。
でもよく、似ていますね。ORは日本語では、「論理和」といいます。やっぱり足し算なんですよ。
そして、C1に注目すると。
A1 | B1 | Y1 | C1 | |
0 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | |
0 | 1 | 0 | 0 | |
1 | 1 | 1 | 1 |
この表のY1が、C1と同じになっています。
では、この表は?
もう、わかりますよね。2入力ANDゲート(74HC08など)の真理表です。
すると、A1+B1=Y1+Cという回路は、みんながよく知っているゲートICで簡単に組めてしまうことがわかります。
はい。こういう回路になります。
●Half Adder回路
上位桁へのキャリー出力はありますが、下位桁からのキャリー入力はありません。ちょいと中途半端ですから、Half Adder(半加算)回路です。
キャリー出力はAND回路からの出力そのままです。
結果の出力Y1はOR回路の出力に近いのですが、残念ながら、A1=1、B1=1のときだけ結果が0になっていました。
A1=1、B1=1というのは、C1=1のときですから、ANDの出力を利用して、図のように、C1=1のときは、Y1=0になるようにしてやれば、上の真理表のとおりになります。
ほうら、加算回路なんて難しそうに思っていたかもしれませんけれど、わりと簡単な論理回路になってしまいましたでしょ?
さて、この次は、下位桁からのキャリーを含めた、Full Adder(全加算)回路の説明にいくわけなのですが、時間がなくなってしまいました。
この続きは、また次回にいたします。
2008.12.26upload
前へ
次へ
ホームページトップへ戻る