Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 반도체물성
- pn junction
- SoC설계
- 베르의게임개발유튜브
- 개인스터디
- 반도체교육
- 자습목적포스팅
- SK하이닉스
- 언리얼엔진4
- 전자공학부
- ASIC설계
- 하이포2기
- 자습
- 반도체소자교육
- UE4
- 회로개발
- 전자회로
- 반도체기초교육
- Rectifier
- 전자공학
- 디지털회로설계
- 참고
- 물리전자
- 반도체공정교육
- 다이오드
- UnrealEngine4
- 게임개발
- diode
- 베르
- 자습포스팅
Archives
- Today
- Total
호경
[개인스터디] CLA와 16-bit GCLA 본문
※시작에 앞서, 해당 내용은 서적 "VHDL과 반도체 회로설계"의 내용을 토대로 작성됐다.
※나는 Verilog HDL 코드로 작성해서 스터디를 진행했다.
1. 4-Bit CLA
A. CLA
이전 포스팅에서는 Parallel Adder 즉, RCA ripple carry adder에 대해서 공부했었다. Ripple carry adder는 아래 bit부터 하나씩 carry를 통해 마지막 carry out을 구할 때까지의 계산 과정을 기다려야한다.
반대로 CLA 회로 같은 경우는 이 계산 과정의 delay를 줄여주기 위해 만든 알고리즘으로 과거부터 현재까지 매우 많이 사용되고 있다.
예를 들면 n-bit RCA와 n-bit CLA의 계산 시간을 구해보면 n-bit RCA > n-bit CLA * 2, 즉 2배이상 차이가 난다.
"코딩 기록" 블로그에서 발췌한 내용인데, 실제 32-bits RCA와 n-bits CLA의 계산 속도를 비교했을 때,
CLA는 149.21MHz, RCA는 83.92MHz로 CLA가 훨씬 좋은 성능 보여줌을 알 수 있다. 하지만, 반대로 단점이 있는데, Carry Out을 위한 논리 게이트가 많아짐으로써 회로의 크기가 배로 늘어나는 큰 단점이 있다.
다음과 같은 식을 활용하여 4-bit CLA 회로를 만들 수 있다.
B. Verilog HDL
module CLA(A, B, S, Cin, Cout);
input[3:0] A, B;
input Cin;
output Cout;
output[3:0] S;
//PG Array
wire P0 = A[0] ^ B[0];
wire P1 = A[1] ^ B[1];
wire P2 = A[2] ^ B[2];
wire P3 = A[3] ^ B[3];
wire G0 = A[0] & B[0];
wire G1 = A[1] & B[1];
wire G2 = A[2] & B[2];
wire G3 = A[3] & B[3];
//Carry Array
wire C0 = Cin;
wire C1 = (G0 | (P0 & Cin));
wire C2 = (G1 | (G0 & P1) | (P0 & P1 & Cin));
wire C3 = (G2 | (G1 & P2) | (G0 & P1 & P2) | (P1 & P2 & P3 & Cin));
assign S[3:0] = {(C3 ^ P3), (C2 ^ P2), (C1 ^ P1), (C0 ^ P0)};
assign Cout = (G3 | (G2 & P3) | (G1 & P2 & P3) | (G0 & P1 & P2 & P3) | (P0 & P1 & P2 & P3 & Cin));
endmodule
C. RTL viewer
2. 16-Bit GCLA
말 그대로 16비트를 계산해주는 CLA로 4-bit CLA를 4개를 연결하여 결괄르 구하는 회로이다.
다음과 같은 회로를 가진다.
B. Verilog HDL
//Topmodule
module Bit16_CLA(A, B, Cin, Cout, S);
input[15:0] A, B;
input Cin;
output Cout;
output[15:0] S;
wire c0, c1, c2;
CLA CLA1(.A(A[3:0]), .B(B[3:0]), .S(S[3:0]), .Cin(Cin), .Cout(c1));
CLA CLA2(.A(A[7:4]), .B(B[7:4]), .S(S[7:4]), .Cin(C1), .Cout(c2));
CLA CLA3(.A(A[11:8]), .B(B[11:8]), .S(S[11:8]), .Cin(C2), .Cout(c3));
CLA CLA4(.A(A[15:12]), .B(B[15:12]), .S(S[15:12]), .Cin(c3), .Cout(Cout));
endmodule
//CLA
module CLA(A, B, S, Cin, Cout);
input[3:0] A, B;
input Cin;
output Cout;
output[3:0] S;
//PG Array
wire P0 = A[0] ^ B[0];
wire P1 = A[1] ^ B[1];
wire P2 = A[2] ^ B[2];
wire P3 = A[3] ^ B[3];
wire G0 = A[0] & B[0];
wire G1 = A[1] & B[1];
wire G2 = A[2] & B[2];
wire G3 = A[3] & B[3];
//Carry Array
wire C0 = Cin;
wire C1 = (G0 | (P0 & Cin));
wire C2 = (G1 | (G0 & P1) | (P0 & P1 & Cin));
wire C3 = (G2 | (G1 & P2) | (G0 & P1 & P2) | (P1 & P2 & P3 & Cin));
assign S[3:0] = {(C3 ^ P3), (C2 ^ P2), (C1 ^ P1), (C0 ^ P0)};
assign Cout = (G3 | (G2 & P3) | (G1 & P2 & P3) | (G0 & P1 & P2 & P3) | (P0 & P1 & P2 & P3 & Cin));
endmodule
C. RTl Viewer
'디지털회로설계 > SoC,ASIC 설계' 카테고리의 다른 글
[개인스터디/개인프로젝트] 8-bit 복합 ALU 설계하기 (0) | 2023.01.11 |
---|---|
[개인스터디] Loadable Counter and Test Bench (0) | 2023.01.08 |
[개인스터디] 4-bit parallel Adder (0) | 2023.01.02 |
[개인스터디] Mux using NAND (0) | 2023.01.02 |
[연구심화실습] Altera Cyclone II를 이용한 연습 프로젝트 (0) | 2023.01.01 |
Comments