개발/개발 공부

[밑바닥부터] 7일차 - 2장 불 연산: 가산기와 증분기 구현

codesparkling 2025. 4. 13. 23:31

가산기와 증분기 구현

가산기

  1. 구현

    • 코드를 작성해보기 전에 가산기의 동작을 생각해보자.
      LSB는 반가산기를 통해서 더해주고, 나머지는 carry 비트가 추가적으로 필요하니 전가산기를 써주면 될 것 같다.
  2. HDL

     CHIP Add16 {
         IN a[16], b[16];
         OUT out[16];
    
         PARTS:
         HalfAdder(a= a[0], b= b[0], sum= out[0], carry= carry0);
         FullAdder(a= a[1], b= b[1], c= carry0, sum= out[1], carry= carry1);
         FullAdder(a= a[2], b= b[2], c= carry1, sum= out[2], carry= carry2);
         FullAdder(a= a[3], b= b[3], c= carry2, sum= out[3], carry= carry3);
         FullAdder(a= a[4], b= b[4], c= carry3, sum= out[4], carry= carry4);
         FullAdder(a= a[5], b= b[5], c= carry4, sum= out[5], carry= carry5);
         FullAdder(a= a[6], b= b[6], c= carry5, sum= out[6], carry= carry6);
         FullAdder(a= a[7], b= b[7], c= carry6, sum= out[7], carry= carry7);
         FullAdder(a= a[8], b= b[8], c= carry7, sum= out[8], carry= carry8);
         FullAdder(a= a[9], b= b[9], c= carry8, sum= out[9], carry= carry9);
         FullAdder(a= a[10], b= b[10], c= carry9, sum= out[10], carry= carry10);
         FullAdder(a= a[11], b= b[11], c= carry10, sum= out[11], carry= carry11);
         FullAdder(a= a[12], b= b[12], c= carry11, sum= out[12], carry= carry12);
         FullAdder(a= a[13], b= b[13], c= carry12, sum= out[13], carry= carry13);
         FullAdder(a= a[14], b= b[14], c= carry13, sum= out[14], carry= carry14);
         FullAdder(a= a[15], b= b[15], c= carry14, sum= out[15], carry= carry15);
     }

증분기

  1. 구현

    • 이전에 증분기의 동작을 생각해보자.
      증분기는 입력으로 들어온 값에 1을 더해주는 칩이다.
      그러면 b가 0000…01(16비트)인 b값을 가지는 가산기로 생각할 수 있다.
      그러니 반가산기만 사용해서 더해주면 된다.
  2. HDL

     CHIP Inc16 {
         IN in[16];
         OUT out[16];
    
         PARTS:
         HalfAdder(a= in[0], b= true, sum= out[0], carry= carry0);
         HalfAdder(a= in[1], b= carry0, sum= out[1], carry= carry1);
         HalfAdder(a= in[2], b= carry1, sum= out[2], carry= carry2);
         HalfAdder(a= in[3], b= carry2, sum= out[3], carry= carry3);
         HalfAdder(a= in[4], b= carry3, sum= out[4], carry= carry4);
         HalfAdder(a= in[5], b= carry4, sum= out[5], carry= carry5);
         HalfAdder(a= in[6], b= carry5, sum= out[6], carry= carry6);
         HalfAdder(a= in[7], b= carry6, sum= out[7], carry= carry7);
         HalfAdder(a= in[8], b= carry7, sum= out[8], carry= carry8);
         HalfAdder(a= in[9], b= carry8, sum= out[9], carry= carry9);
         HalfAdder(a= in[10], b= carry9, sum= out[10], carry= carry10);
         HalfAdder(a= in[11], b= carry10, sum= out[11], carry= carry11);
         HalfAdder(a= in[12], b= carry11, sum= out[12], carry= carry12);
         HalfAdder(a= in[13], b= carry12, sum= out[13], carry= carry13);
         HalfAdder(a= in[14], b= carry13, sum= out[14], carry= carry14);
         HalfAdder(a= in[15], b= carry14, sum= out[15], carry= carry15);
     }