목표: carry look ahead 방식의 이해를 통해서 4bit adder의 설계1. CLA 방식의 ADDERSource code 및 code 분석module carry_lookahead_4bit_adder(a,b,c0,s,c4); // carry_lookahead_4bit_adder라는 모듈 설정input [3:0] a,b; // a, b라는 4bit 입력값 설정input c0; // 초기 carry c0라는 입력값 설정output [3:0] s; // s라는 sum을 의미하는 4bit 입력값 설정output c4; // c4라는 출력값 설정wire [3:0] p,g; // p, g라는 4bit wire 설정wire p0c0,p1c1,p2c2,p3c3,c1,c2,c3; // p0c0,p1c1,p2c2,p3c3,c1,c2,c3라는 wire 설정xor go(p[0],a[0],b[0]); // a, b의 4bit 각 자리를 XOR 연산 후 p의 각 자리에 입력and g1(g[0],a[0],b[0]); // a, b의 4bit 각 자리를 AND 연산 후 p의 각 자리에 입력xor g2(p[1],a[1],b[1]);and g3(g[1],a[1],b[1]);xor g4(p[2],a[2],b[2]);and g5(g[2],a[2],b[2]);xor g6(p[3],a[3],b[3]);and g7(g[3],a[3],b[3]); // a, b 4bit의 각 자리수 연산을 끝냄and g8(p0c0,p[0],c0); // c0값과 위의 연산의 결과 p[0]값을 and 연산 후 p0c0라는 wire에 저장or g9(c1,g[0],p0c0); // p0c0의 값과 g[0]값의 or연산 후 c1에 에 저장and g10(p1c1,p[1],c1); // c1값과 위의 연산의 결과 p[1]값을 and 연산 후 p1c1라는 wire에 저장or g11(c2,g[1],p1c1); // p1c1의 값과 g[1]값의 or연산 후 c2에 에 저장and g12(p2c2,p[2],c2); // c2값과 위의 연산의 결과 p[2]값을 and 연산 후 p2c2라는 wire에 저장or g13(c3,g[2],p2c2); // p2c2의 값과 g[2]값의 or연산 후 c3에 에 저장and g14(p3c3,p[3],c3); // c3값과 위의 연산의 결과 p[3]값을 and 연산 후 p3c3라는 wire에 저장assign s[0]=p[0]^c0; // p[0]값과 c0값의 exclusive OR 연산 후 s[0]에 저장assign s[1]=p[1]^c1; // p[1]값과 c1값의 exclusive OR 연산 후 s[1]에 저장assign s[2]=p[2]^c2; // p[2]값과 c2값의 exclusive OR 연산 후 s[2]에 저장assign s[3]=p[3]^c3; // p[3]값과 c3값의 exclusive OR 연산 후 s[3]에 저장assign c4=g[3]+p3c3; // g[3]값과 p3c3값을 더한 후 c4에 저장endmodule // 모듈을 종료Max_Plus2를 이용하여 출력한 wave form형태2. Ripple 방식의 ADDERSource code 및 code 분석module fulladd(X, Y, Cin, S, Cout); // fulladd이라는 모듈 지정input X, Y, Cin; //입력 값 지정output S, Cout; //출력 값 지정assign S=X^Y^Cin; // S 값 정의assign Cout=(X&Y)|(X&Cin)|(Y&Cin); //C out 값 정의endmodule // fulladder를 밑에서 이용하기 때문에 우선 지정해준다.module addnsub(X, Y, c0 , S); // addnsub모듈 지정input c0; // c0라는 입력값 지정input [3:0] X ,Y; // 4비트 의 수 X, Y지정output [3:0] S; // 4비트의 수 S라는 출력값 지정wire [3:0] temp, Y; // 4비트의 temp, Y의 wire 지정fulladd F1(X[0], Y[0], c0, S[0], temp[0]); // F1이라는 fulladd 모듈 설정fulladd F2(X[1], Y[1], temp[0], S[1], temp[1]); // F2이라는 fulladd 모듈 설정fulladd F3(X[2], Y[2], temp[1], S[2], temp[2]); // F3이라는 fulladd 모듈 설정fulladd F4(X[3], Y[3], temp[2], S[3], temp[3]); // F4이라는 fulladd 모듈 설정endmodule // 모듈 종료Max_Plus2를 이용하여 출력한 wave form형태3. Time Analyzer를 이용하여 두 Adder의 지연시간 비교.Time Analyzer를 이용한 CLA 방식 adder의 출력값Time Analyzer를 이용한 Ripple방식 adder의 출력값4. 두 Adder의 차이점에 대한 분석Ripple 방식 adder: 가산이 행해지는 시간은 가산기의 모든 단을 통하여 캐리의 전파에 요구시간에 의해 제한된다. 즉 넘어오는 carry 비트를 입력값 이 게이트를 통과하는 시간이후에 결정이 가능해진다. 따라서 propagation delay에 영향을 많이 받게된다.CLA 방식 adder: 캐리의 전파 지연을 제거함으로써 이 과정의 속도를 증가시키는 한 방법으로 캐리 발생과 캐리 전파 기능에 기초를 두고 있다.캐리 발생(Carry Generate: CG): 출력 캐리가 전가산기에 의해 발생될 때,두 입력 비트가 1일 때만 만들어짐CG = PQ캐리 전파(Carry Propagation: CP): 입력 캐리는 입력 비트의 둘 중 어느 하나가 1일 때 전가산기에 의해 전파 됨CP = PQ그림1-1 캐리 발생과 전파 조건그림1-2. 4bit CLA Adder의 논리 선도CLA Adder가 빠른 이유: CG와 CP의 각 함수는 전가산기의 P, Q 입력에 항으로 표현 할 수 있기 때문에 모든 출력 캐리는 즉각 유용하며(게이트 지연시간 제외) 마지막 결과를 얻기 전에 모든 단을 통과하기 위한 캐리를 기다리지 않아도 되 므로 CLA 기술은 가산처리의 속도를 높여준다.앞 가산기의 캐리출력을 다음 가산기의 캐리입력으로 사용하는Ripple Adder는 가산기 횟수 만큼의 지연이 생깁니다.그 지연을 없애기 위해서 캐리를 독립적으로 따로 계산하는 방법을 사용하는데... 그것이 CLA 입니다.이 소스에서는..- Carry Generate 와 Carry Propagate 를 구현한 컴포넌트- Carry Lookahead 컴포넌트- Sum 을 계산하는 컴포넌트이렇게 3가지 컴포넌트를 써서 CLA를 구현합니다.-------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;entity cgcpu is--cgcpu (Carry Generate & Carry Propagate 회로) ; 공식에 입력 값으로 들어가는 G와 ㅖ를 구하는 회로port(a,b : in std_logic_vector(3 downto 0);g, p : out std_logic_vector(3 downto 0));end cgcpu;architecture dataflow of cgcpu isbeging