20260423_4


不完全定義関数

いくつかのシステムでは、入力がすべての値の組み合わせにならない場合があるため、ドントケア項として出力を決めない不完全定義関数がある

この場合

とする


半加算器

ABSum
0000
0101
1001
1110

を下の桁、をキャリー(桁上がり)として、

全加算器

半加算器にCarry inを追加した形

をキャリーとして

全加算器は半加算器2つとORひとつで表現できるらしい


多くの桁の計算をする場合は全加算器をたくさんつなげる

1の補数の加算の時は最上位のキャリーを最下位のキャリーとして入力する→桁数が多いと上の桁までキャリーするのに時間がかかる

減算機の時は引く数にNOTを付けて1を足すことで全加算器をそのまま使える


全減算機

xybibi+1di
00000
00111
01011
01110
10001
10100
11000
11111

bは桁借りの必要の有無を表す


桁上げ先見加算器

キャリーの伝播が遅い問題を解決したい

→下位の桁上がりを確認すると自身の桁が上がるかをAND-ORで計算できる(ビット数が増えると回路は大きくなる)

→計算待ちをしなくてよくなる

16bitの計算は4bitごとに分けて桁上げを予測するなどの工夫ができる

さらに大きくするときはcarry-lookaheadを重ねることで遅延を減らすらしい


回路を小さくするためには論理式を簡単化するが、計算時間を短くするためには回路を大きくすることをすることもある


5章 カルノー図

ブール代数で頑張ることもできるが、扱いにくいt

→分かりやすくて扱いやすいカルノー図を使おう


最小の式とは?

積和形なら

  • 項数が最小
  • リテラル数が最小
    和積形でも
  • 項数が最小
  • リテラルが最小

これまではブール代数で論理式を簡単化してきたが、冗長な項を追加してから項を消去したりしていた←難しい

カルノー図を用いて簡単に操作したい


2~3変数カルノー図

隣り合っているマスは1変数だけ値が違う

A=0A=1
B=010
B=110

1になっていて隣になっているところは併合の定理が使えることがわかる

A=0A=1
BC=00000100
BC=01001101
BC=11011111
BC=10010110

のときは以下のようになる

A=0A=1
BC=0000
BC=0111
BC=1110
BC=1000

このように並べると表の上下も隣接しているものとして考えられる

個の塊で併合することが可能

書き込むときはそれに従って書けばいい

カルノー図から論理式を出すときはできる限り大きい塊を書き出せばいい(1の最小項は同一則より複数回使用できる)

コンセンサス項はカルノー図上でも冗長な項として出てくる


4変数カルノー図

→二つずつまとめる

AB=00AB=01AB=11AB=10
CD=0004128
CD=0115139
CD=11371511
CD=10261410

トーラスとしてとらえられる(カドは集まる)

ドントケア項については都合よく0とも1ともとらえて囲んでいい

和積形を作りたいときは0を囲んでの積和形を作ってからドモルガンすればいい


主項

  • ほかの項の内項にならない項が主項
graph LR
A[まだ包含されていないXを選択]
B[選択したXについて隣接するすべての1とXを探す]
C{単一の項が選択した最小項と隣接するすべての1とXを包含するか?}
D[その項を必須項として選んでループで囲む]
E{包含されていない1を全て調べたか?}
F[カルノー図上に残る1を包含する最小の主項の集合を見つける]

A-->B
B-->C
C--YES-->D
C--NO-->E
D-->E
E--YES-->F
E--NO-->A