今回が初投稿になりますがよろしくお願いします.
もし間違いや誤字等ございましたらお知らせいただけると幸いです.
計算機の基礎として学習する半加算器,全加算器等を用いて16bitのCPUを設計してみようと思います.
今回は序論ということで
- 半加算器の作成
- 全加算器の作成
について書いていこうと思います.
半加算器の作成
まず,半加算器について学んでいきましょう.
半加算器とは1bitの値A,Bを入力として,Sum(1bitの演算結果),CarryOut(桁溢れ)を出力する回路です.
実際には
- $0+0=0$
- $0+1=1$
- $1+0=1$
- $1+1=0$(桁溢れ)
のようになります.
真理値表の作成
これを真理値表にすると
A | B | Cout | S |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
のようになります.それでは順番に見ていきましょう.
まず,A=0,B=0の場合は0+0ということでCout,Sumともに0になります.
なのでCoutもSoutも0となります.ここは特別な説明は不要だと思います.
次に,A=0,B=1およびA=1,B=0の場合は0+1ということでSumは1となります.
この時点では桁溢れを起こしていないためCoutは0+0同様に0のままです.
CoutとSの論理回路について
先ほど作成した真理値表の動きを実現する論理回路を作成していきます.
CoutについてはA,Bともに1の場合に1を出力,つまりANDゲートを用いて実現できます.
SについてはAとBのどちらかが1の場合に1を出力,つまりXORゲートを用いて実現できます.
よって
- Cout = A・B
- S = A⊕B
となります.
全加算器の作成
全加算器は半加算器を拡張したものであり,入力がA,Bの他に下の桁からの繰り上がりCinを持ちます.
A | B | Cin | Cout | S |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
この真理値表からA,B,Cinの2つ以上が1のときにCoutは1となることがわかります.
また,A,B,Cinのどれか1が1,もしくはA,B,Cinの全てが1のときにSは1となることがわかります.
これを半加算器同様に論理式で表すと
- Cout=(A・B)+(B・Cin)+(Cin・A)
- S=A⊕B⊕Cin
となります.
ではここで全加算器をAHDL言語で書いてみましょう.
SUBDESIGN fa_d
(
a,b,c_in : INPUT;
s,c_out : OUTPUT;
)
BEGIN
c_out = (a & b) # (b & c_in) # (c_in & a);
s = a $ b $ c_in;
END;
上記のコードに関して1つずつ見ていきましょう.
まずSUBDESIGN()で囲まれた部分はサブデザイン部分と呼ばれサブデザイン名(のちに参照される際の名称)と信号で構成されます.今回は入力信号としてa,b,c_inを,出力信号としてc_out,sを持つのでこのように記述します.
また,BEGINとEND;で囲まれた部分は論理部分であり,回路の動作を記述します.
今回設計する全加算器のc_outとsは先ほど述べた論理式で導出されます.AHDL言語では論理積は&,論理和は#,排他的論理和は$を用いることに気をつけてください.
これで全加算器の設計は終了です.