4桁の減算器

減算器は加算器を使って作ります。 a - b を a + (-b) と考えます。 正数と負数の足し算が減算器になります。 2進数の4桁の負数を考えると

4桁の2進数正の10進数負の10進数
111115-1
111014-2
110113-3
110012-4
101111-5
101010-6
1001 9-7
1000 8-8
0111 7-9
0110 6-10
0101 5-11
0100 4-12
0011 3-13
0010 2-14
0001 1-15
00000

上表のようになります。 15 - 15 = 15 + (-15) = 1 1 1 1 + 0 0 0 1 は 0 で 4 桁から 5 桁に桁上がりがあります。 a - b で a が b よりも小さいと 結果が負数になり ます。 4桁で負数を扱うときは最上位の桁を正負を決める桁 にします。 すると残りは3桁なので -7 〜 7 までの 数値を扱うことになります。

4桁の2進数正の10進数正負の10進数
111115-1
111014-2
110113-3
110012-4
101111-5
101010-6
1001 9-7
1000 8-0
0111 7 7
0110 6 6
0101 5 5
0100 4 4
0011 3 3
0010 2 2
0001 1 1
00000

このままでは扱える数が小さいですが、桁数を増やし ても同じ方法が通用します。 a - b で 必ず a が b より大きければ 結果に符号 の桁はいりません、 a も b も 0 〜 15 まで使えま す。 a - b = a + (-b) を加算器で作るときに b を -b に します、正数を負数にする方法を考えると b + (-b) = 0 なのですから 2進数の4桁値なら 1 + 15 = 16 = 0 なので 0001 に対して 1111 が -1 と言うことになり ます。 ある正数の負数は、その正数に加算すると全桁が1に なるような値を探します。 そのような数値は、ある正数の2進数の桁で0を1に1を 0に反転したものです。 ある正数に加算して全桁が1になるような数値が分か ったら、それに1を足すと結果は0になります。 ある正数 b の負数 -b は !b + 1 です。 よって a - b = a + (-b) = a + (!b + 1) になります。

logicname sample

{ -------------------------------------- }
{    手続き譜                            }
{ -------------------------------------- }
procedure add
input  a,b;
input  ci;
output pq[2];
bitn   q;
bitn   co;

   switch(a,b,ci)
      case 0,0,0: q=0; co=0; 
      case 0,1,0: q=1; co=0; 
      case 1,0,0: q=1; co=0; 
      case 1,1,0: q=0; co=1; 
      case 0,0,1: q=1; co=0; 
      case 0,1,1: q=0; co=1; 
      case 1,0,1: q=0; co=1; 
      case 1,1,1: q=1; co=1; 
   endswitch

   pq.0=q;
   pq.1=co;
endp

{ -------------------------------------- }
{    実効譜                              }
{ -------------------------------------- }
entity sub4
input  a[4],b[4];
output q[4];
output co;
bitn   n0q[2];
bitn   n1q[2];
bitn   n2q[2];
bitn   n3q[2];
bitn   nb[4];

   nb=!b+1;   <← b を -b にします。}

   n0q=add(a.0,nb.0,0);
   n1q=add(a.1,nb.1,n0q.1);
   n2q=add(a.2,nb.2,n1q.1);
   n3q=add(a.3,nb.3,n2q.1);

   q.0=n0q.0;
   q.1=n1q.0;
   q.2=n2q.0;
   q.3=n3q.0;

   co=n3q.1;
ende

{ -------------------------------------- }
{    機能実行譜                          }
{ -------------------------------------- }
entity sim
output a[4],b[4];
output q[4];
output co;
bitr   tc[8];

   part sub4(a,b,q,co)

   tc=tc+1;

   a=tc.0:3;
   b=tc.4:7;

ende

endlogic

機能実行は PDF を見てください。 4桁の減算器の作り方は8桁やそれ以上の桁数の減算器 を作るときにも使えます。