공부하는 스누피
[컴퓨터구조] 논리회로 본문
+ 이 글은 컴퓨터구조를 이해하기 위해 작성된 논리회로 요약 정리이다.
디지털 전자 신호는 강한 전류와 약한 전류의 두 가지 방법으로만 작동한다. 컴퓨터는 이 신호를 논리적으로 참(True, 1, asserted)과 거짓(False, 0, deasserted)라고 인식한다. 논리 블록들은 메모리를 가지고 있는지에 따라 구분한다. 메모리가 없는 블록은 combinational logic block(CLB)이라고 하고, 출력값이 입력값에 대해서만 의존할 수 있다. 메모리를 가지는 블록은 출력값이 이 입력값과 블록의 메모리에 대해 의존할 수 있다. 이렇게 블록에 저장되는 메모리를 논리 블록의 상태(state)라고 한다.
진리표 (Truth Tables)
CLB는 메모리를 가지고 있지 않아서 입력값에 대한 출력 가능한 값들을 알아낼 수 있다. 진리표는 입력 가능한 값들에 대한 출력값의 조합을 나타낸 표로, n개의 입력을 가진 논리 블록에 대해 2^n개의 엔트리(조합)를 가지고 있다.
ex. input이 A, B이고 각 input에 대한 output이 D, E일 경우 엔트리가 2^2 = 4인 진리표를 만들 수 있다.
Input | Output | ||
A | B | C | D |
0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
진리표는 input과 output 개수에 비례해 지수적으로 커진다.
불 대수(Boolean Algebra)
불 대수에서는 모든 변수들이 0 아니면 1의 값만 가지고 있다. 불 대수에서 쓰이는 연산자는 3개로, 다음과 같다.
- OR : +로 표기한다. 둘 중 하나라도 참이면 참이다.
- AND : ·(가운뎃점)이나 ,(쉼표)로 표기한다. 둘 다 참이어야 참이다.
- NOT : -(대시)나 ~를 해당 값 위에 올려서 표기한다. 거짓이어야 참이다. 편집기에서 표현이 불가능해 여기서는 ~를 문자 앞에 표시하도록 한다.
<법칙 모음>
- Identity law
A + 0 = A and A · 1 = A
- Zero and One laws
A + 1 = 1 and A · 0 = 0
- Inverse laws
A + ~A = 1 and A · ~A = 0
- Commutative laws
A + B = B + A and A · B = B · A
- Associative laws
A + (B + C) = (A+B)+C (곱셈도 마찬가지)
- Distributive laws
A · (B + C) = (A · B)+(A · C)
- 드모르간의법칙 (DeMorgan's laws)
~(A · B) = ~A + ~B
~(A + B) = ~A · ~B
게이트 (Gates)
논리 블록은 논리 함수를 구현한 게이트로 구성된다. 예를 들어, AND 게이트는 AND 함수를 구현하고, OR 게이트는 OR 함수를 구현한다. OR나 AND 게이트는 교환법칙과 결합법칙에 의해 여러 개의 input을 가질 수 있지만, NOT 게이트는 한 개의 input만 받을 수 있다. 각각의 게이트들의 표준 표기법은 다음 이미지와 같다.
모든 논리 함수는 AND 게이트와 OR게이트, NOT 게이트로 만들 수 있다. 그래서 자수 쓰이는 NOR과 NAND 또한 OR와 AND 게이트로 만들 수 있다. 위 그림의 NOT 게이트의 출력부에 작은 동그라미가 있는 것을 볼 수 있는데, 동그라미는 반전된(inversed) 값을 의미한다. 만약 ~A + B를 표현하고 싶다면, OR 게이트 입력부 중 하나에 NOT 게이트를 추가하면 된다. ~(~A+B)을 표현하고 싶다면 ~A+B를 표현한 OR 게이트의 출력부에 NOT 게이트를 추가하면 된다. 이렇게 입력부나 출력부에 게이트를 추가하는 것을 bubble이라 하고, NOT으로 bubbled된 입력부나 출력부는 NOT(삼각형)을 생락하고 작은 동그라미만 해당 부분에 붙이면 된다.
복합 논리회로
디코더 (decoder)
큰 컴포넌트로서 사용하는 논리 블록을 디코더라고 한다. 가장 흔한 타입의 디코더는 n-bit input과 2^n output을 가진 디코더이다. 이 디코더는 각 input 조합에 대해 하나의 출력값만 내보내는데, 이는 n-bit input을 하나의 이진 신호로 번역하는 것으로 생각할 수 있다. 3-bit 디코더는 2^3=8개 조합의 input에 대한 output을 내보낸다.
멀티플렉서 (multiplexor)
멀티플렉서는 selector라고 불리는데, 입력값 중 컨트롤(제어부)에 의해 선택된 값이 출력값으로 된다. 2개의 입력값을 받는 멀티플렉서는 2개의 입력값과 1개의 selector(control) value를 받아 총 3개의 입력값을 가지게 된다. Selector 값은 어떤 입력값이 출력값으로 나와야 하는지 결정한다.
위 그림에서 각 input을 A, B라고 하고, Selector value는 S 그리고 output을 C라고 한다면 다음 식으로 표현할 수 있다.
C = (A , S) + (B , S)
입력값이 2개일 경우에는 멀티플렉서가 하나의 셀렉터 값으로도 출력값을 결정할 수 있지만, n개의 입력값에 대해서는 |logN|의 셀렉터 값이 필요하다. 이 경우, 멀티플렉서는 세 가지 부분으로 구성된다.
1) 디코더: 서로 다른 입력값에 대응되는 n개의 신호를 만든다.
2) AND 게이트 n개: 디코더의 각 신호를 입력값으로 하여 결합시킨다.
3) OR 게이트 1개: AND 게이트의 출력값을 한데 모은다(통합시킨다).
Two-Level Logic and PLAs
AND와 OR 두 레벨의 게이트로 만들어진 논리 함수는 sum of products(SOP, 곱의 합)라 불린다. Sum-of-products 표현은 OR(논리합)을 곱한(AND) 것이다. Product of sums(POS, 합의 곱)는 반대로 논리곱(AND)를 합한(OR) 것이다.
E1 = ((A , B) + (A , C) + (B , C)) , ~(A , B , C)
E2 = (A , B , ~C) + (A , C , ~B) + (B , C , ~A) => sum of products form
E2식은은 2단계의 논리를 가지고 있으며 개별 변수에 대해서만 NOT 연산을 취하고 있다.
E1식은 3단계의 논리를 가지고 있다.
SOP로 표현된 논리 함수는 진리표로 함수를 표현할 때 유용하다. 모든 입력값의 논리곱으로 이루어져 있는 각 진리표 엔트리는 곱(AND)와 대응되기 때문이다. 진리표와 two-level 표현의 관계는 논리 함수의 집합에 있어 게이트 레벨의 구현을 만들게 하기 위함이다.
SOP는 자주 사용되는 논리 구현인 programmable logic array (PLA)에 대응된다. PLA는 입력값의 집합이며, 2계층 논리 구조를 가지고 있다. PLA의 첫번째 단계 AND 게이트(곱)들의 집합이다. 각 곱은 각 입력값과 그의 보수로 구성되어 있다. 두번째 단계는 OR 게이트의 배열이다. 각 게이트는 곱들의 논리합으로 구성된다. OR 게이트의 개수는 출력값이 참인 진리표 엔트리 수와 같다. PLA의 총 크기는 AND 게이트와 OR 게이트 개수의 합과 같다.
PLA의 특징
1. 적어도 하나의 참을 반환하는 진리표 엔트리만이 PLA와 연관된 논리 게이트를 가질 수 있다.
2. 서로 다른 논리곱은 출력값이 여러개라도 각각 PLA의 엔트리를 하나만 가지게 된다.
ROMs
논리 함수를 구현하기 위해 사용되는 구조화된 논리 중 하나가 read-only memory(ROM)이다. ROM은 메모리지만 저장되는 장소가 제조되는 시점부터 고정되어 있다. PROMs(programmable ROMs)는 설계자가 프로그램할 수 있으며, 지울때는 특별한 레이저로 지울 수 있다. 그래서 이 메모리는 제조될 때를 제외하고 읽기 전용으로만 쓰인다.
ROM은 입력값 주소의 집합과 출력값의 집합을 가지고 있다. 주소 접근이 가능한 엔트리는 m이 입력값이라 할 때 2^m개이다. m은 높이라 불리고 각 엔트리의 비트 개수는 너비라 불린다. ROM과 PLA가 밀접하게 관련되어 있어 ROM은 진리표에서 바로 논리 함수들을 인코딩할 수 있다. ROM은 모든 경우의 출력값을 디코딩하지만, PLA는 부분적으로만 디코딩된다.
Bus
버스는 같은 논리 신호로 취급되는 데이터 라인들의 모음이다. 입력값과 출력값이 버스일 경우 이것은 해당 요소가 입력값을 길이에 해당될 때까지 복제되었다는 것을 의미한다. 멀티플렉서를 연결해서 버스를 만들 수 있다.
하드웨어 기술 언어 (Hardware Description Language)
프로세서와 하드웨어 시스템은 하드웨어 기술 언어로 만들어진다. 이 언어는 두 가지 목적을 가진다.
1. 하드웨어를 시뮬레이션하고 디버그할 수 있게 추상적인 설명을 제공한다.
2. 논리적 언어와 하드웨어 컴파일 툴을 사용해서 이 설명이 하드웨어에 구현으로서 컴파일될 수 있게 한다.
Verilog
- C 기반인 산업에서 주로 쓰인다.
- 디지털 시스템의 행위적, 구조적 정의를 명세한다.
- 행위적 정의: 어떻게 기능적으로 동작하는지 정의한다.
- 구조적 정의: 계층적 표현과 같이 조직을 묘사한다.
- 진리표와 데이터패스를 표현할 때 사용할 수 있다.
VHDL
- Ada 기반인 산업에서 주로 쓰인다.
ALU (Arithmetic Logic Unit)
ALU는 컴퓨터의 근육이며(직역함), ALU는 수학적/논리적 작업을 수행하는 장치이다.
ARM에서는 64비트의 ALU를 사용하지만, 이해를 돕기 위해 1 bit의 ALU부터 살펴보자.
1-bit의 논리적 연산을 하는 논리 소자는 AND 게이트 하나, OR 게이트 하나, 멀티플렉서 하나로 구성되어 있다.
위 논리 소자의 멀티플렉서는 각 게이트의 control 값(그림에는 operation)에 따라 AND나 OR 연산의 결과값 중 하나를 선택한다.
1-bit의 덧셈 연산을 하는 논리 소자는 2개의 입력값을 가지고 1-bit의 출력값을 가진다. 반드시 두번째 출력값을 가지고 잇어야 하는데, carry로 값을 보내서 이 값을 CarryOut이라고 한다. 이렇게 보내진 CarryOut은 이웃 덧셈 소자의 input 값으로 포함되어야 하며, 이는 세번째 입력값으로 여겨진다. 이 세번째 입력값을 CarryIn이라고 한다.
CarryOut = (b , CarryIn) + (a , CarryIn) + (a , b) + (a , b , CarryIn)
논리 연산과 덧셈 연산을 수행하는 ALU는 아래 그림과 같이 표현할 수 있다. 기존 논리 연산 소자에 멀티플렉서에 옵션을 하나 더 추가하고, 덧셈 연산하는 논리 소자를 입력부에 연결하면 된다. CarryIn과 CarryOut도 연결해주자.
64bit ALU는 이러한 1-bit 소자들을 연결시켜서 만들 수 있다. 위 예제에서 0값과 오버플로우를 출력값으로 보내게 하려면 관련 논리 소자를 추가해야 한다. 0값의 경우 각 입력값이 게이트로 가기 전 멀티플렉서로 0값으로 바꾸고 싶은 값만 바꿔준다. 오버플로우는 게이트에 입력값이 들어가기 이전, 이후의 값을 받게 해서 오버플로우를 감지하게 한다.
두 기능을 추가한 ALU를 단순화하면 아래 그림처럼 표현할 수 있다.
클럭(Clock)
클럭은 어떤 요소가 업데이트되어야 하는지 결정하는 순차적 논리 작업을 요구한다. 간단히 말하자면 정해진 사이클 시간동안 돌아가는 신호인데, 클럭 빈도는 사이클 시간에 역수를 취한 것이다. 클럭 사이클 시간과 클럭 기간은 클럭이 높을 때와 클럭이 낮을 때로 구분된다. Edge-triggered clocking은 클러킹 스키마로, 모든 상태변화가 클럭 말단에서 이루어진다. 설명이 간단하기 때문에 이 스키마를 중점으로 클럭을 설명한다.
Edge-triggered 방법론에서는 클럭이 높게 올라가는 지점과 낮게 떨어지는 지점 사이를 active하다고 하고, 각 지점에서 상태변화가 일어난다. 신호가 유효하다는 것은 바뀌지 않았다는 것을 의미하고, 입력값이 바뀔때까지 바뀌지 않는 것을 의미한다. 그래서 복합 논리 소자가 바뀌지 않았으면 출력값은 유효하다. 그래서 동기화 시스템이 이 방법론에서 중요하게 여겨진다. 이 방법론의 장점은 상태 요소를 복합 논리 블록의 입력부와 출력부 두 군데에서 볼 수 있다는 것이다.
메모리 요소
Flip-flops and Latches
Flip-flops와 latches는 아주 간단한 메모리 요소다. 둘다 출력값이 요소 안에 저장된 값과 동일하다.
flip-flop과 latch의 차이는 클럭이 상태를 변화시키는 데 있다. Clocked latch에는 입력값이 변하거나 assert될 때 상태가 변한다. Flip-flop에서는 상태가 클럭 말단에서만 바뀐다. 앞에서 이야기한 Edge-triggered 방법론에서는 Flip-flop을 사용한다.
레지스터 파일
CPU의 데이터패스의 구조 중 하나가 레지스터 파일이다. 레지스터파일은 레지스터들의 집합으로 구성되어 있으며 접근할 레지스터 번호를 제공함으로써 데이터를 읽거나 쓰게 해준다. 레지스터 파일은 디코더로 구현이 가능한데, 각각 읽기와 쓰기 포트가 있고, 레지스터 배열이 D flip-flops(flip-flops의 컴퓨터 버전)으로 구성되어 있다. 레지스터를 읽기만 하는 것은 데이터 변경이 이루어지지 않아 입력값으로 레지스터 번호만 필요하다. 반면 레지스터에 쓰기 작업을 수행할 경우 입력값이 3개가 필요하다. 레지스터 번호, 작성할 데이터, 그리고 해당 레지스터를 제어하는 클럭이다.
SRAM
SRAM은 메모리 배열과 단일 액세스 포인트로 이루어진 통합된 회로이고, 액세스 포인트는 읽기와 쓰기를 제공한다.
SRAM은 액세스 시간을 고정시켜 놓았으며, 주소 접근 가능한 장소의 개수를 정해놓았다. 그래서 Static RAM이라고 하기도 한다.
DRAM
SRAM은 값이 게이트에 한 요소로 저장된다. DRAM에서는 데이터가 capacitor안에 하나의 충전재로서 보관된다 (직역).
단일 트랜지스터가 보관된 곳에 접근하기 위해 쓰이고, 읽거나 충전재를 덧씌우는 방식을 사용한다. DRAM이 저장소 bit 하나당 하나의 트랜지스터를 사용하기 때문에 밀집도가 더 높고 bit당 값이 싸다. SRAM은 bit 하나당 여러 개의 트랜지스터가 필요하기 때문이다 (게이트에 저장되기 때문).
(참고)
David A. Patterson, John L. Hennessy (2018). Computer Organization and Design (ARM Edition) Appendix A
+ 번역본에는 부록이 누락되어 있어 출판사 자료실에서 영어 자료를 다운받아야 함.
www.hanteemedia.co.kr/bbs/board.php?bo_table=data&wr_id=17&page=2
+ Appendix A가 논리회로 기초 설명을 다루지만 논리 회로 수업을 대체하진 않는다고 함.
'CS > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 캐시 (cache) (2) | 2020.11.15 |
---|---|
[컴퓨터구조] 파이프라이닝 (0) | 2020.11.12 |
[컴퓨터구조] 부동소수점 (0) | 2020.11.10 |
[컴퓨터구조] 프로그램 번역과 실행 과정 (0) | 2020.11.08 |
[컴퓨터구조] 2의 보수 표현법 (two's complement) (0) | 2020.11.07 |