-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: [Computer Architecture] 논리회로, 조합논리회로 (#33)
* ComputerSystem * chore : [os] Create Computer System 정리 * chore [OS] Computer System <1. 컴퓨터 구조 개론> * chore [OS] Computer System 파일 정리 * chore [OS] Computer System <2. 컴퓨터 내부의 데이터표현> * chore [OS] Computer System <3. 논리 회로 기초> * feat: [Computer architecture] 2장 정수표현 * docs: [Computer architecture] 파일 수정 * feat: Computer architecture md 내용 추가 * feat: Computer architechure 파일 구조 변경 * [Computer Architecture] 부동 소수점 내용 구체화 * feat: [Computer Architecture] 3. 논리 회로 기초 파일 생성 * feat: [Computer Architecture] 3. 논리 회로 기초 수정 * feat: [Computer Architecture] 4.1 조합 논리 회로 * feat: [Computer Architecture] 4.2 논리식의 간소화 * feat: [Computer Architecture] 2장 conflict 해결
- Loading branch information
1 parent
cf02a2c
commit 7105ea9
Showing
2 changed files
with
269 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
# 3.2 논리 회로 기초 | ||
|
||
- 컴파일 과정 | ||
|
||
고급 언어로 작성된 소스 프로그램 -> 기계어로 작성된 오브젝트 프로그램으로 변환하는 과정 | ||
소스 프로그램을 오브젝트 프로그램으로 컴파일하는 프로그램을 컴파일러 라고 한다 | ||
|
||
기계어(Machine Language) | ||
컴퓨터가 직접 이해하고 실행할 수 있는 가장 저수준의 프로그래밍 언어 | ||
이 언어는 0과 1로 이루어진 이진수의 집합으로 구성되어 있다 | ||
|
||
어셈블리어(Assembly Language) | ||
기계어와 1:1로 대응되는 저수준의 프로그래밍 언어 | ||
사람이 읽고 쓰기 더 쉽게 만든 언어이다 | ||
기계어는 사람이 바로 이해하기 어렵기 때문에, 어셈블리어는 이러한 기계어 명렁에 대해 | ||
사람이 읽을 수 있는 기호적인 표현을 제공한다 | ||
|
||
## 기본 게이트 | ||
|
||
- 게이트 | ||
컴퓨터에서 전기 신호에 따라 가장 기본적인 연산을 수행하는 소자이다 | ||
디지털 회로에서 입력 신호를 받아 틀정 규칙에 따라 출력 신호를 생성하는 기본적인 논리 소자 | ||
이진수의 참과 거짓 상태를 처리하는데 사용된다 | ||
|
||
- AND 게이트 | ||
두 입력이 모두 1일 때 출력 1 | ||
|
||
- OR 게이트 | ||
두입력 중 하나라고 1이면 출력이 1 | ||
|
||
- NOT 게이트 | ||
입력값을 반전을 출력 | ||
입력값이 1이면 0을 출력, 0을 입력하면 1을 출력 | ||
|
||
- XOR 게이트 | ||
베타적 논리합이라고 부르기도 한다 | ||
두 입력이 서로 다를 때 출력이 1이 된다 | ||
|
||
- NAND 게이트 | ||
AND 게이트의 출력을 반전시킨 논리 게이트 | ||
두 입력이 모두 1일 때 출력이 0, 그 외의 경우에는 출력이 1 | ||
|
||
- NOR 게이트 | ||
OR 게이트의 출력을 반전시킨 논리 게이트 | ||
두 입력 중 하나라도 1일 경우 출력이 0, 모든 입력이 0일 때만 출력이 1 | ||
|
||
|
||
# 3.3 논리회로의 표현방식 | ||
|
||
논리회로는 논리도, 논리식, 진리표를 통해 구할 수 있다. | ||
|
||
## 불 대수(Boolean Algebra) | ||
|
||
연산자 우선 순위: OR << AND << NOT | ||
|
||
- 불 대수 규칙 | ||
|
||
Commutative(교환 법칙) | ||
a + b = b + a | ||
a x b = b x a | ||
|
||
Associative(결합 법칙) | ||
(a + b) + c = a + (b + c) | ||
(a x b) x c = a x (b x c) | ||
|
||
Distributive(분배 법칙) | ||
a + (b x c) = (a + b) x (a + c) | ||
a x (b + c) = (a x b) + (a x c) | ||
|
||
Identity(항등 법칙) | ||
a + 0 = a | ||
a + 1 = 1 | ||
a x 0 = 0 | ||
a x 1 = a | ||
|
||
Complement(보수 법칙) | ||
a + a' = 1 | ||
a x a' = 0 | ||
|
||
Idempotent(멱등 법칙) | ||
a + a = a | ||
a x a = a | ||
|
||
Absorption(흡수 법칙) | ||
a + (a x b) = a | ||
a x (a + b) = a | ||
a'b + a = a + b | ||
|
||
De Morgan's law(드모르강의 법칙) | ||
(a x b)' = a' + b' | ||
(a + b)' = a' x b' | ||
|
||
Complement theorem(부정) | ||
(a')' = a | ||
1' = 0 | ||
0' = 1 | ||
|
||
## 논리 회로의 2가지 종류 | ||
|
||
- 조합 논리 회로(Combinational logic circuit) | ||
입력값만으로 출력값이 결정되는 회로 | ||
|
||
- 순서 논리 회로(Sequential logic circuit) | ||
입력값과 회로의 내부 상태가 출력값을 결정하는 회로, 메모리가 필요함 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
# 4.1 조합 논리 회로 | ||
|
||
## 가산기 | ||
|
||
- 반가산기(half adder) | ||
|
||
반가산기는 두 개의 입력을 받아 덧셈을 수행하며, 자리 올림수를 처리하지 않는다 | ||
반가산기는 '반쪽짜리 가산기'라는 의미를 지닌다 | ||
|
||
반가산기 진리표 작성: | ||
입력 A와 B의 모든 경우의 수를 나열한다 | ||
-> (00, 01, 10, 11) | ||
진리표의 출력은 합계(S)와 자리 올림수(C)로 나뉜다 | ||
각 입력 조합에 따른 출력을 정리한다 | ||
|
||
반가산기 회로 설계: | ||
합계 S는 XOR 게이트를 사용하여 계산된다 | ||
자리 올림수 C는 AND 게이트를 통해 계산된다 | ||
반가산기의 회로는 XOR와 AND 게이트로 구성된다 | ||
|
||
- 전가산기(full adder) | ||
|
||
전가산기는 세 개의 입력을 받아 덧셈을 수행하고, 자리 올림수를 처리할 수 있다 | ||
입력이 세 개인 이유는 덧셈 과정에서 발생하는 캐리를 포함하기 때문이다 | ||
전가산기는 두 개의 반가산기와 하나의 OR 게이트로 구성된다 | ||
|
||
전가산기 진리표 작성: | ||
세 개의 입력 X, Y, Z에 대한 모든 조합을 나열한다 | ||
-> (000, 100, 010, 110, 001, 101, 011, 111) | ||
각 조합에 따른 합계(S)와 자리 올림수(C)를 기록한다 | ||
진리표를 통해 캐리와 합계를 확인한다 | ||
|
||
전가산기의 회로 설계: | ||
합계 S는 X, Y, Z를 XOR 게이트를 통해 계산한다 | ||
S는 짝수 패리티라고도 부른다, 1의 개수가 홀수면 1을 출력하는 방식 | ||
자리 올림수 C는 두 가지 경로를 통해 계산된다 | ||
Cout는 A AND B + Cin (A XOR B) | ||
-> 입력 3개 중 2개 이상 1이 나오면 출력으로 1이 나온다는 뜻이다 | ||
캐리가 발생하려면 무조건 입력에 1이 두 개 이상이어야 한다 | ||
전가산기는 두 개의 반가산기와 하나의 OR 게이트로 구성된다 | ||
|
||
- 멀티 비트 가산기 | ||
|
||
하위비트의 Cout이 상위비트의 Cin으로 입력된다 | ||
4비트 전가산기의 경우에는 리플캐리 방식을 사용한다 | ||
|
||
## 감산기 | ||
|
||
- 감산기의 원리 | ||
|
||
A - B = A + (-B) = A + not(B) + 1 = A + (B XOR 1) + 1 | ||
|
||
A + not(B) + 1 | ||
-> 상위비트에서 빼기 힘들기 때문에 비트 반전을 주어 | ||
먼저 1비트를 빼주고 나중에 1비트를 더하는 방식으로 계산하는 것을 말한다 | ||
|
||
A + (B XOR 1) + 1 | ||
-> not(B) 라는 것이 비트 반전을 주는 것이기 때문에 이거 자체가 | ||
(B XOR 1) 즉 0 이거나 1이라는 뜻으로 선택적으로 뒤집는 것으로 같은 의미이다 | ||
|
||
- 반감산기 | ||
|
||
비트의 감산 과정 중 빌려오는 과정에서 상위 비트에서 1을 빌려오는 형식이다 | ||
입력이 두 개일 경우 반감산기이다 | ||
반감산기는 XOR 게이트와 NOT이 들어간 AND 게이트로 구성된다 | ||
|
||
- 전감산기 | ||
|
||
입력이 3개일 경우 전감산기이다 | ||
전감산기의 모든 경우의 수를 진리표에 표현한다 | ||
X, Y, Z의 조합에 따른 감산 결과를 분석한다 | ||
각 조합에 따른 차이(D)와 빌려온 수(B)의 변화를 설명한다 | ||
전감산기는 반감산기 두 개와 OR 게이트로 구성된다 | ||
|
||
- 감/가산기 | ||
|
||
Cin이 0이면 가산기이고 Cin이 1이면 감산기이다 | ||
뺄셈을 할 때는 Sub 신호에 1을 입력해서 뺄셈을 하는 것이다 | ||
이렇게 Cin을 조절해서 감산기와 가산기 모두 수행 가능하다 | ||
|
||
## 상태비트(status) 회로 | ||
|
||
- 상태 레지스터 | ||
|
||
cpu 내부의 상태를 저장하는 레지스터를 말한다 | ||
Negative(N), Zero(Z), Overflow(V), Carry(C) 가 있다 | ||
|
||
C: Cout을 말한다 | ||
V: 마지막 두 Cout을 XOR 해서 Overflow를 확인한다 | ||
N: S의 부호가 무엇인지 N을 확인한다 | ||
Z: 모든 S의 합이 0인지를 NOR을 통해 확인한다 | ||
|
||
## 오버플로우 판별 | ||
|
||
- 캐리와 오버플로우의 차이 | ||
|
||
캐리는 정상적인 자리 올림 수가 발생되는 과정에서 나오는 현상이다 | ||
오버플로우는 표현할 수 있는 수의 범위를 벗어나는 경우에 발생한다 | ||
캐리는 연산의 결과에 영향을 미치지 않는다 | ||
1 + 127을 계산할 때, 128이 아닌 -128이 출력되는 경우가 발생하는데, | ||
이는 오버플로우가 발생했음을 나타내며 이는 잘못된 결과를 초래한다 | ||
|
||
- 오버플로우 발생하는 경우 | ||
|
||
같은 부호의 숫자들을 더하는 경우 오버플로우가 발생한다 | ||
양수 + 양수 / 음수 + 음수 를 더하는 경우 | ||
다른 부호의 숫자들을 더한다면 절댓값이 작아지기 때문에 오버플로우가 발생하지 않는다 | ||
|
||
2개의 전가산기 Cout 출력 결과를 XOR해보면 오버플로우 여부를 확인할 수 있다 | ||
1이 나오면 오버플로우이고, 0이 나오면 정상적인 계산 결과이다 | ||
|
||
|
||
# 4.2 논리식의 간소화: Karnaugh map(K-map) | ||
|
||
## k-map | ||
|
||
카르노 맵은 논리식의 간소화를 위한 도구이다 | ||
변수의 수에 따라 맵의 형태가 달라진다 | ||
0인 부분은 해당 변수의 NOT을 나타낸다 | ||
1인 부분은 해당 변수를 그대로 나타낸다 | ||
카르노 맵은 2의 지수승개인 1, 2, 4, 8개 등으로 묶어서 이들을 공통적으로 묶어서 표시한다 | ||
1인 부분을 많이 중복해도 상관없으니 변수를 최대한 줄이는 방식으로 크게 묶는 것이 좋다 | ||
|
||
a\bc인 맵에서 a 는 0, 1로 표시하지만 | ||
bc는 00, 01, 11, 10 순서로 표시한다 | ||
인접한 셀들끼리 1비트씩만 다르게 표시해야 변수들을 묶을 때 | ||
변수들을 삭제해서 표시할 수 있기 때문이다 | ||
|
||
- 1비트 전가산기 | ||
|
||
k-map for Sum: | ||
Sum = A'B'C + ABC' + ABC + A'BC' | ||
= A(B XOR C) + A'(B XOR C) | ||
= A XOR B XOR Cin | ||
|
||
k-map for Cout: | ||
Cout = AB + CinA + CinB | ||
= AB + Cin(A + B) | ||
|
||
- Don't Care | ||
|
||
특정 입력값을 고려할 필요가 없는 경우 | ||
출력에 영향을 전혀 미치지 않는 입력의 경우에 | ||
필요하다면 그룹핑을 할 때 1로 생각할 수 있다 | ||
|
||
- Dual k-map | ||
|
||
곱의 합(SoP, Sum of Product): | ||
최소항(민텀)을 사용한다 | ||
f = y'z + xz' | ||
원래 하던대로 1을 묶어서 f를 구하는 방식이다 | ||
|
||
합의 곱(PoS, Product of Sum): | ||
최대항(맥스텀)을 사용한다 | ||
f' = x'y'z' + x'yz' + x'yz + xyz | ||
= x'z'(y' + y) + yz(x + x') | ||
= yz + x'z' | ||
f = (f')' = (yz + x'z')' = (y' + z')(x + z) | ||
f'인 0을 묶는 것이 더 구하기 쉬울 때 f'을 구하고 (f')'을 해서 f를 구하는 방식이다 | ||
|
||
### NAND 게이트 | ||
|
||
드모르강의 법칙을 이용하여 And-or 회로를 NAND 게이트로 바꾸는 것이다 | ||
(abc)' = a' + b' + c' | ||
(a + b + c)' = a'b'c' 이렇게 NAND 게이트로 바꿔도 동일한 기능을 수행한다 |