第7回: ALU(その2)
加算器をベースとしたALUの構成
前回つくった、S1, S0でいろいろな演算を選べる算術演算回路で、
各桁ごとに独立に演算をする(つまり下の桁のキャリーは入らず、
次の桁へキャリーを伝えない)ことを考えましょう。
すると各桁の加算の結果は、S = A + B + Cinですが、
Cin=0とすれば、S = A + B (算術和)、つまりS = A
B
(排他的論理和)となります。
これに、前回の(S1, S0)によってBから「すべて1」などを
作る機能ブロックを通したあとのBを加えるとすると、
(S1, S0)の値によって次のような演算が行われることになります。
S1 | S0 | A | B | X = A B | 演算 |
0 | 0 | A | 0 | A | そのまま |
0 | 1 | A | B | A B | EXOR |
1 | 0 | A | /B | A /B | EXNOR |
1 | 1 | A | 1 | /A | NOT |
このように、EXORとNOTはすでに得られていますから、
残りのANDとORを考えてみましょう。
OR演算
(S1, S0) = (0, 0)のとき、AそのものがXであったわけですが、
このAの代わりに「A + B」(AとBの論理和)を与えることを考えてみましょう。
つまりあの演算回路の入力Aのところに、1つORゲートを置くわけです。
すると、このときのXは、X = A + B と、論理和が求められることになります。
AND演算
(S1, S0) = (1, 0)のとき、AとBのEXNOR、つまり X = A・B + /A・/Bが
得られています。
そこで、やや天下り的なのですが、Aの代わりに「A + K」(AとKの論理和)
を与えることを考えてみましょう。
つまりあの演算回路の入力Aのところに、1つORゲートを置くわけです。
すると、このときのXは、次のようになります。
- X = (A + K)・B + /(A + K)・/B = A・B + K・B + /A・/B・/K
ここで、K=/Bとしてみましょう。
すると、K・B = /B・B = 0で、/A・/B・/K = /A・/B・B = 0 となり、
X = A・B となってしまいます。
つまり、(S1, S0) = (1, 0)のときに、Aの代わりに「A+/B」をAに
与えれば、出力Xは論理積A・Bとなる、というわけです。
加算器をベースとしたALU
もう1つの機能選択信号S2を用意し、
- S2 = 0 のときは、算術演算回路
- S2 = 1 のときは、論理演算回路
となるようにしてみましょう。
つまり次のような機能ですが、ここまで見てきたことを総合すると、
特に論理演算を行うときには、A, Bをそれぞれ次のようなものに
代える必要があります。
S2 | S1 | S0 | Cin | A | B | X | 演算 |
0 | 0 | 0 | 0 | A | 0 | A | そのまま |
0 | 0 | 0 | 1 | A | 0 | A+1 | increment |
0 | 0 | 1 | 0 | A | B | A+B | 加算 |
0 | 0 | 1 | 1 | A | B | A+B+1 | |
0 | 1 | 0 | 0 | A | /B | A-B-1 | |
0 | 1 | 0 | 1 | A | /B | A-B | 減算 |
0 | 1 | 1 | 0 | A | 1 | A-1 | decrement |
0 | 1 | 1 | 1 | A | 1 | A | そのまま |
1 | 0 | 0 | 0 | A+B | 0 | A+B | 論理和(OR) |
1 | 0 | 1 | 0 | A | B | A B | 排他的論理和(EXOR) |
1 | 1 | 0 | 0 | A+/B | /B | AB | 論理積(AND) |
1 | 1 | 1 | 0 | A | 1 | /A | 否定(NOT) |
さてこのようなA, Bと、1桁分の下の桁からのキャリーCinは、(S2, S1, S0)に応じて、それぞれ次のように代わります。
- A : S2=0のときはA。S2=1のとき、 S1=S0=0→A+B、S1=1,S0=0→A+/B
- B : (S2に無関係)、S1=S0=0→0, S1=0,S0=1→B, S1=1,S0=0→/B, S1=S0=1→1
- Cin : S2=0のときCin(下の桁のCout)、S2=1のとき0
全体としては、次の図のような構成をとって、
A, B, Cinを、S2〜S0の値に応じて変える、と考えるとよいでしょう。(1ビット分)
これから、1ビット分の加算器のA, B, Cinに与えるべき
A', B', Cin'は次のような論理式となるでしょう。
- A' = A + S2・/S1・/S0・B + S2・S1・/S0・/B
- B' = S0・B + S1・/B
- Cin' = /S2・Cin
これをそのまま論理回路にして、全加算器につなげてあげれば、
本物のALUが完成することになります。
課題2
この方法で、機能が(S2, S1, S0)で上記のように選ばれる2ビットのALUを
設計し、その論理回路図を、それが導かれる詳細な過程の説明とともに
示してください。
なお全加算器はFAと記したブロック図のままで構いません。
また多ビット加算器の構成はRCAで構いません。
- 提出方法:レポート用紙(できればA4版)に、名前、学科、名列番号を明記の上、上記内容の解を、2B714室前のポストまで
- 期限:11/28(月)18:00
- 注意:誰かと相談した場合や、書籍やWebページなどを参考にした場合は、
その旨(出典)を明記すること
解答例
シフト演算
論理演算の一種に「シフト演算」があります。
これは、C言語で「>>」や「<<」という演算子であらわす演算で、
2進数としての変数の値を、全体に右あるいは左にシフトするものです。
(シフトしてあいたビットに入れる値によって、論理シフトと算術シフトの
2種類がある)
このシフト演算は、例えば2n倍の乗算に使えたりと、
いろいろと使える場面が多いので、専用の演算回路として持っている
プロセッサ(特にDSP)も多いようです。
シフト演算回路(シフタ)の構成にもいくつかありますが、
最も効率のよい回路として「バレルシフタ」と呼ばれるものが
知られています。
この図は、4ビットの2進数[a3:a0]を、右に[s1:s0]ビット分(2進数表現)
シフトした結果[x3:x0]を求めるためのバレルシフタの回路です。
□ブロックはセレクタを表します。
バレルシフタでは、このように1ビット, 2ビット, 4ビット, ・・・という
2nのシフトを行うか行わないかを、
1段ごとのセレクタで選択し、実際の「シフト」は、2nビット分
シフトした先に配線がつながっていることで行われていることになります。
左シフトや算術シフトも同様に構成することができます。
この回の配布資料(第6回・第7回分)
この回のソボクな疑問集
戻る