다운/퍼 가실 때 댓글 부탁드려요. 그리고 받으신 자료 유료 레포트 사이트에 올리지 말아주세요.


1.

. 8비트 리플 캐리 가산기 감산기를 구현한다.

. 반가산기를 구현하고 반가산기를 합성하여 전가산기를 구현한 다음, 1개의 반가산기와 7개의 전가산기를 합성하여 8비트 리플 캐리 가산기를 구현한다.

. 감산기는 1의 보수를 취한 뒤 처음 전가산기에 캐리를 1로 입력받아서 2의 보수형태를 사용하는 방식으로 구현한다.


2.
알고리즘

. 8비트 리플 캐리 가산기

1) 1개의 반가산기와 7개의 전가산기를 이용하여 구현한다.

2) 8개의 전가산기로 구현한 경우 위의 그림에서 C0 0이 입력된다.

3) 리플 캐리 가산기의 계산 순서는, 두 입력 A, B의 최하위 각 한 비트가 더해져 캐리가 발생하면 상위 전가산기의 캐리인으로 입력된다. 상위 전가산기 역시 같은 방식으로 상위의 전가산기에 캐리를 넘겨주어 최종적으로 최상위 전가산기까지 캐리가 전해진다.

4) 예를 들어 A 11000111이고, B 00000001이라면 아래 표와 같이 된다.

전가산기

A

B

캐리인

캐리아웃

FA1

1

1

0

0

1

FA2

1

0

1

0

1

FA3

1

0

1

0

1

FA4

0

0

1

1

0

FA5

0

0

0

0

0

FA6

0

0

0

0

0

FA7

1

0

0

1

0

FA8

1

0

0

1

0

. 8비트 감산기

1) 8개의 전가산기를 이용하여 구현하고, 입력 B 대한 2 보수를 위해서 처음 캐리 값으로 1 넣어준다.

2진수 감산을 위해서 감산기를 이용하지 않고 가산기를 이용하는 방법은 입력 A에서 B 감산하는 로직을 구현할 B 2 보수로 바꾼 가산하면 감산에 해당하는 결과를 얻을 있다.

2) 감산기의 계산 순서는, 입력 A, B 대해서 B 감수(빼지는 ) B 입력을 1 보수형태로 바꾸고(not연산 또는 11111111 or해서 구함), 2의 보수형태로 바꾸기 위해서 최고 캐리에 1을 입력한다. 그 후 가산기와 마찬가기로 최상위 가산기까지 캐리를 넘기면서 가산하게 되면 입력 A, B 대한 감산 결과를 얻을 있다.

3) 예를 들어 A 00101101이고, B 00011001이라면 아래 표와 같이 된다.

전가산기

A

B

B(1의 보수)

캐리인

캐리아웃

FA1

1

1

0

1

0

1

FA2

0

0

1

1

0

1

FA3

1

0

1

1

1

1

FA4

1

1

0

1

0

1

FA5

0

1

0

1

1

0

FA6

1

0

1

0

0

1

FA7

0

0

1

1

0

1

FA8

0

0

1

1

0

1

A B 감산 결과는 00010100 된다.

 

3.

. 8비트 리플 캐리 가산기

module half_adder(a, b, co, s); // 반가산기 구성

input a, b;

output co, s;

 

assign co = a & b; // 캐리 출력 값

assign s = a ^ b; // XOR로 합을 구함

endmodule

 

module full_adder(a, b, ci, co, s); // 전가산기 구성

input a, b, ci;

output co, s;

wire s1, c1, c2;

 

half_adder h1(b,ci,c1,s1);

half_adder h2(a,s1,c2,s);

 

assign co = c1 | c2; // 캐리 생성

endmodule

 

module ripplecarryadder(a, b, o, cout);

input [7:0] a, b;

output [7:0] s;

output cout; // 최종 캐리 값

 

reg [7:0] s;

reg cout;

 

wire [6:0] c; // 내부 캐리

 

half_adder h1(a[0],b[0],c[0],s[0]); // 초기 캐리가 없으므로 반가산기이용

full_adder f1(a[1],b[1],c[0],c[1],s[1]); // 이후부터 전가산기 이용

full_adder f2(a[2],b[2],c[1],c[2],s[2]);

full_adder f3(a[3],b[3],c[2],c[3],s[3]);

full_adder f4(a[4],b[4],c[3],c[4],s[4]);

full_adder f5(a[5],b[5],c[4],c[5],s[5]);

full_adder f6(a[6],b[6],c[5],c[6],s[6]);

full_adder f7(a[7],b[7],c[6],cout,s[7]);

endmodule

. 8비트 감산기

module half_adder(a, b, co, s); // 반가산기 구성

input a, b;

output co, s;

 

assign co = a & b; // 캐리 출력값

assign s = a ^ b; // XOR로 합을 구함

endmodule

 

module full_adder(a, b, ci, co, s); // 전가산기 구성

input a, b, ci;

output co, s;

wire s1, c1, c2;

 

half_adder h1(b, ci, c1, s1);

half_adder h2(a, s1, c2, s);

 

assign co = c1 | c2; // 캐리 생성

endmodule

 

module subtract(a, b, s, cout); // 8bit 감산기 입출력 변수 선언

input [7:0] a, b;

output [7:0] s;

output cout;

 

reg [7:0] s;

reg cout;

 

wire [6:0] c; // 캐리 연결선

wire [7:0] b1; // 감수에 XOR해서 나오는 신호선

 

assign b1 = b ^ 8'b11111111; // 감수에 1의 보수 취함

 

full_adder f1(a[0],b1[0],1,c[0],s[0]); // 2의 보수를 위해 캐리에 1 넣음

full_adder f2(a[1],b1[1],c[0],c[1],s[1]);

full_adder f3(a[2],b1[2],c[1],c[2],s[2]);

full_adder f4(a[3],b1[3],c[2],c[3],s[3]);

full_adder f5(a[4],b1[4],c[3],c[4],s[4]);

full_adder f6(a[5],b1[5],c[4],c[5],s[5]);

full_adder f7(a[6],b1[6],c[5],c[6],s[6]);

full_adder f8(a[7],b1[7],c[6],cout,s[7]);

endmodule


4.
파형 분석

. 8비트 리플 캐리 가산기

1) a, b 입력값, s 입력의 , cout 최종 캐리값

2) 출력값은 계산을 쉽게 하기 위해서 unsigned 10진수 형으로 표시하였다.

3) 리플 캐리 가산기의 가산 결과는 정확하고, 한 개의 전가산기에서 발생한 지연시간이 MSB 위치한 전가산기까지 누적되므로 결과에서 시간 지연이 발생한다.

4) a, b 합이 255 넘어가면 s 8비트이기 때문에 255까지의 값밖에 표현하지 못하므로 cout 1 넘어가고, 나머지 값이 s 출력된다.

. 8비트 감산기

1) a, b 입력값, s 입력의 , cout 최종 캐리

2) 출력값은 계산을 쉽게 하기 위해서 unsigned 10진수 형으로 표시하였다.

3) 감산기의 감산 결과는 정확하고, 가산기와 마찬가지로 개의 전가산기에서 발생한 지연시간이 MSB 위치한 전가산기까지 누적되므로 결과에서 시간 지연이 발생한다.


참고 문헌

. 디지털 시스템(인터비젼 / Alan B. Marcovitz )

. 디지털 시스템 설계(양서각 / 이채봉, 정완영 공저)

. HDL Chip Design(Doone Publications / Douglas J Smith )


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License