컴퓨터 공학과 복수전공을 준비하며 타 학교 컴퓨터 공학과에서는 전공 필수 과목일 정도로 중요한 논리회로라는 강의를 수강하였다.
한 학기에 전부 공부하기엔 양이 많아 가볍게 보고 넘어간 부분들도 많다.
나중에 보면 내용이 떠오를 정도로 기억에 남는 핵심 내용들만 복습겸 정리해보겠다.
ADC(Analog to Digital Converter)는 아날로그 신호(연속적인 전압, 전류 등)를 디지털 신호(0과 1의 조합)로 변환하는 장치다.
센서, 마이크, 온도계, 조이스틱 등에서 나오는 아날로그 데이터를 컴퓨터나 마이크로컨트롤러가 처리할 수 있도록 해주는 필수 인터페이스다.
ADC는 아날로그 신호를 디지털로 바꾸기 위해 다음의 3단계 과정을 거친다.
샘플링(Sampling)
양자화(Quantization)
부호화(Encoding)
쉽게 얘기해서 왼쪽과 같은 아날로그 신호를 일정 간격으로 자르는게 샘플링이고, 자른 값을 정해놓은 방식대로 반올림 하는게 양자화 이걸 2진수로 바꾸는것이 부호화이다. 그리고 이 양자화 과정의 반올림에서 생기는 오차가 바로 양자화 잡음이다.
양자화 잡음은 신호 품질을 떨어뜨리는 주요 원인 중 하나다.
양자화 스텝이 작을수록 잡음은 줄지만, 필요한 비트 수가 늘어나서 저장 공간이나 전송 대역폭이 커진다.
양자화 잡음 줄이는 법
비선형 압신(Companding) 사용: 작은 신호에 더 촘촘한 스텝을 할당한다.
오버샘플링: 샘플링 주파수를 높여 잡음을 분산시킨다.
그레이 코드는 연속된 값끼리 1비트만 다르게 만드는 이진 코드다.
이 코드를 쓰면 값이 바뀔 때 여러 비트가 동시에 바뀌는 걸 막을 수 있어서, 하드웨어에서 신호 오류를 줄일 수 있다.
XOR을 활용해 2진수를 그레이코드로 변환할 수 있다.
XOR을 활용한 2진수 - 그레이코드 변환
https://computersource.tistory.com/60
특징
인접 값끼리 1비트만 다르다.
회로에서 에러 검출, 엔코더, 디지털-아날로그 변환 등에 많이 쓴다.
파이썬에서의 이진수 그레이 코드 변환
# 이진수 → 그레이 코드
gray = binary ^ (binary >> 1)
# 그레이 코드 → 이진수
b = gray
while gray > 0:
gray = gray >> 1
b = b ^ gray
예시 표
| 10진수 | 이진수 | 그레이 코드 |
|---|---|---|
| 0 | 000 | 000 |
| 1 | 001 | 001 |
| 2 | 010 | 011 |
| 3 | 011 | 010 |
| 4 | 100 | 110 |
| 5 | 101 | 111 |
| 6 | 110 | 101 |
| 7 | 111 | 100 |
디지털 신호에서 에러를 검출하기 위해 여러 가지 코드가 쓰인다.
| 코드 종류 | 구조 | 특징/원리 |
|---|---|---|
| 2-out-of-5 코드 | 5비트, 2개의 1 | 1의 개수가 2개 아니면 에러 |
| 이중 5 코드 | 7비트 | 항상 2개의 1을 가짐 |
| 링 카운터 코드 | 10비트, 1개의 1 | 1의 위치로 상태 구분 |
2-out-of-5 코드는 각 코드에 1이 2개만 들어가도록 해서, 1의 개수가 다르면 에러라고 판단한다.
디지털 회로의 기본 단위는 논리 게이트다.
각 게이트는 입력 신호를 받아 정해진 논리 연산을 수행한다.
논리게이트 논리식 및 회로기호
이미지 출처 : 위키백과
버퍼(Buffer) 게이트는 입력 신호를 그대로 출력해서 신호를 안정화시키는 역할을 한다.
불대수는 0과 1 두 값으로 논리 연산을 다루는 대수 체계다.
논리회로를 간소화할 때 꼭 필요한 도구다.
주요 법칙
교환법칙: A+B = B+A, A·B = B·A
결합법칙: (A+B)+C = A+(B+C)
분배법칙: A·(B+C) = A·B + A·C
드모르간 법칙: (A+B)' = A'·B', (A·B)' = A'+B'
흡수법칙: A + A·B = A
n개의 변수로 이루어진 논리식에서, 각 변수마다 한 번씩 등장하는 n개의 논리곱(AND) 항을 최소항이라고 한다.
각 최소항은 진리표의 한 행(입력 조합)에 정확히 하나씩 대응한다.
입력 조합이 1(참)이 되는 경우의 항만을 모아 OR(+) 연산으로 합친 것이 최소항식이다.
변수 x, y, z가 있을 때:
x=0, y=1, z=0에 해당하는 최소항:
→ x' y z'
x=1, y=0, z=1에 해당하는 최소항:
→ x y' z
진리표에서 함수 f가 1이 되는 행의 입력 조합에 해당하는 최소항만을 OR로 연결한다.
기호 표기:
m0, m1, m2, ...로 표기한다.
예: x'y'z = m1 (x=0, y=0, z=1)
함수 표현:
F(x, y, z) = Σ(1, 3, 6, 7)
→ m1, m3, m6, m7에 해당하는 최소항의 합
f = x'y'z + x'yz + xy'z' + xyz
이 식은 각 항이 세 변수(x, y, z)를 모두 한 번씩 포함하므로 최소항식이다.
변수 3개(x, y, z), f가 1인 경우:
(x, y, z) = (0, 1, 1) → x' y z
(x, y, z) = (1, 0, 0) → x y' z'
(x, y, z) = (1, 1, 0) → x y z'
최소항식: f = x'y z + x y' z' + x y z'
논리회로 설계의 표준:
논리함수를 AND, OR 게이트만으로 간단하게 구현할 수 있다.
카르노맵, 퀸-맥클러스키 등 논리식 간소화의 출발점이 된다.
모든 최소항을 조합하면 2ⁿ개가 만들어진다(n: 변수 개수)
최소항(Minterm)
함수가 1이 되는 입력 조합의 논리곱(AND)
최대항(Maxterm)
함수가 0이 되는 입력 조합의 논리합(OR)
보수 관계
최소항식의 보수는 최대항식, 최대항식의 보수는 최소항식이 된다.
카르노맵은 불 함수를 시각적으로 간소화하는 도구다.
입력 변수가 3~4개일 때 효과적으로 최소 논리식을 찾을 수 있다.
3변수 예시
| X\YZ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 | 0 |
1이 인접한 칸끼리 묶어서 최소항을 만든다.
묶음 예시
X=0, YZ=00/01 →
X=0, YZ=01/11 →
최종식
카르노맵 간소화 방법
https://homubee.tistory.com/42
변수 4개 이상의 논리식 간소화를 위한 체계적 알고리즘이다. 카르노맵보다 확장성이 높아 디지털 컴퓨터 구현에 적합하다.
최소항 그룹화:
최소항을 2진수로 변환 후 1의 개수로 그룹 분류
EX: 최소항 [0(000), 1(001), 2(010), 5(101), 6(110), 7(111)]
그룹 0: 000
그룹 1: 001, 010
그룹 2: 101, 110
그룹 3: 111
주항(PI) 추출:
인접 그룹끼리 1비트 차이 항 병합
000-001 → 00-
010-110 → -10
101-111 → 1-1
더 이상 병합 불가능한 항을 주항으로 선택
주항 차트로 최소 커버링:
필수 주항(Essential PI) 선정 후 나머지 항 커버링.
퀸 맥클러스키 간소화 방법
https://blog.naver.com/leeyunghuk1/220959424842
조합논리회로는 AND, OR, NOT 세가지 기본 논리회로의 조합으로 만들어지고 가산기에 대해 정리하겠다.
반가산기는 한 자리 2진수 2개를 입력해서 합과 캐리를 계산하는 회로이다.
입력: A, B
출력: 합(S), C
| A | B | S | C |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
반 가산기는 2진수 한 자리 덧셈을 하기때문에 아랫자리에서 발생한 올림은 고려하지 않아 2비트 이상의 2진수 덧셈은 할 수 없다.
그러하여 이전 자리올림을 입력으로 넣어 덧셈을 할 수 있도록 한 회로가 전가산기이다.
| A | B | Ci | S | Co |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
디코더는 n비트의 입력 → 2^n개의 정보로 출력시켜주는 회로이다.
주소 지정과 명령어 해석에 사용한다.
2x4 디코더의 경우에는 아래와 같은 진리표, 논리식, 회로도를 가진다.
아래와 같이 표와 논리식을 보기 좋게 정리할 수 있다.
| B | A | Y₃ | Y₂ | Y₁ | Y₀ |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 | 0 | 0 |
멀티플렉서는 2^n개의입력 중 1개 선택해서 출력하는 조합논리회로.
데이터 선택기로 CPU 내부에서 활용한다.
| S₁ | S₀ | F |
|---|---|---|
| 0 | 0 | D₀ |
| 0 | 1 | D₁ |
| 1 | 0 | D₂ |
| 1 | 1 | D₃ |
| A | B | C | D₀ | D₁ | D₂ | D₃ | F |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
| A | B | C | F |
|---|---|---|---|
| 0 | 0 | 0 | D₀ = 1 |
| 0 | 0 | 1 | D₀ = 1 |
| 0 | 1 | 0 | D₁ = 0 |
| 0 | 1 | 1 | D₁ = 0 |
| 1 | 0 | 0 | D₂ = C |
| 1 | 0 | 1 | D₂ = C |
| 1 | 1 | 0 | D₃ = C |
| 1 | 1 | 1 | D₃ = C |
이 내용은 처음에 접했을때 어려웠지만 반복해서 연습하다보니 쉽게 느껴졌다.
C를 0,1과 같은 패턴으로 두고 패턴을 찾아 입력으로 사용하여 설계하면 된다.
순서논리회로는 기억 능력이 있는 논리회로인데, 이때 기억 능력을 위해 기억 소자가 필요하고 이때 사용되는 핵심 부품이 래치와 플립플롭이다.
플립플롭은 1비트의 정보를 저장할 수 있는 메모리 소자로, 저장 기능이 있다.
| 특성 | 래치 (Latch) | 플립플롭 (Flip-Flop) |
|---|---|---|
| 동작 방식 | 비동기식 (Asynchronous) | 동기식 (Synchronous) |
| 트리거 방식 | 레벨 트리거 (Level-Triggered) | 엣지 트리거 (Edge-Triggered) |
| 설명 | 입력 신호가 유지되는 동안 계속 출력이 변할 수 있음 (Enable 신호가 High인 동안 투명하게 동작) | 클럭 신호가 변하는 순간(상승 엣지 또는 하강 엣지)에만 출력이 변함 |
| 안정성 | 낮음 (Race Condition 발생 가능성) | 높음 (예측 가능한 시점에만 상태 변경) |
가장 기본적인 플립플롭으로, SR 래치에 클럭 입력을 추가한 구조이다.
특성표 (Characteristic Table)
클럭이 인가되었을 때의 동작을 나타낸다.
| S | R | Q(t+1) | 동작 |
|---|---|---|---|
| 0 | 0 | Q(t) | 유지 (Hold) |
| 0 | 1 | 0 | 리셋 (Reset) |
| 1 | 0 | 1 | 셋 (Set) |
| 1 | 1 | 불확실 (Invalid) | 금지 (Forbidden) |
특성식 (Characteristic Equation)
(단, SR=0 조건)
특성(방정)식은 특성표를 바탕으로 만든 카르노맵을 통해 구할 수 있다.
여기표 (Excitation Table)
현재 상태 Q(t)에서 다음 상태 Q(t+1)로 변하기 위해 필요한 입력 S와 R을 나타낸다. (X는 Don't Care)
| Q(t) | Q(t+1) | S | R | 설명 |
|---|---|---|---|---|
| 0 | 0 | 0 | X | 상태를 0으로 유지(Hold)하거나 리셋(Reset) |
| 0 | 1 | 1 | 0 | 반드시 셋(Set) 해야 함 |
| 1 | 0 | 0 | 1 | 반드시 리셋(Reset) 해야 함 |
| 1 | 1 | X | 0 | 상태를 1로 유지(Hold)하거나 셋(Set) |
SR 플립플롭의 S=R=1 문제를 해결하기 위해 입력을 하나로 통합한 플립플롭이다.
구조
SR 플립플롭의 S 입력에 D를, R 입력에 D의 NOT 게이트를 연결합니다. 이로써 S와 R은 항상 반대 값을 갖게 되어 S=R=1 조건이 원천적으로 차단된다.
동작
클럭의 엣지에서 입력 D의 값이 그대로 출력 Q에 저장된다. 그래서 '데이터' 또는 '지연(Delay)' 플립플롭이라고도 한다.
특성표
| D | Q(t+1) | 동작 |
|---|---|---|
| 0 | 0 | 리셋 (Reset) |
| 1 | 1 | 셋 (Set) |
특성식
여기표
| Q(t) | Q(t+1) | D | 설명 |
|---|---|---|---|
| 0 | 0 | 0 | 다음 상태가 0이므로 D도 0이어야 함 |
| 0 | 1 | 1 | 다음 상태가 1이므로 D도 1이어야 함 |
| 1 | 0 | 0 | 다음 상태가 0이므로 D도 0이어야 함 |
| 1 | 1 | 1 | 다음 상태가 1이므로 D도 1이어야 함 |
SR 플립플롭의 S=R=1 문제를 해결하면서, 그 상태를 유용한 토글(Toggle) 기능으로 활용한 범용 플립플롭이다.
진화
S=J, R=K로 대응되며, J=K=1일 때 출력이 현재 상태의 반대(Q')가 된다.
특성표
| J | K | Q(t+1) | 동작 |
|---|---|---|---|
| 0 | 0 | Q(t) | 유지 (Hold) |
| 0 | 1 | 0 | 리셋 (Reset) |
| 1 | 0 | 1 | 셋 (Set) |
| 1 | 1 | Q'(t) | 토글 (Toggle) |
특성식
여기표
| Q(t) | Q(t+1) | J | K | 설명 |
|---|---|---|---|---|
| 0 | 0 | 0 | X | 0으로 유지(Hold)하거나 리셋(Reset) |
| 0 | 1 | 1 | X | 1로 셋(Set)하거나 토글(Toggle) |
| 1 | 0 | X | 1 | 0으로 리셋(Reset)하거나 토글(Toggle) |
| 1 | 1 | X | 0 | 1로 유지(Hold)하거나 셋(Set) |
JK 플립플롭의 J와 K 입력을 하나로 묶어 만든 특수 형태의 플립플롭이다.
구조
J=K=T로 연결한다.
동작
T=0이면 현재 상태를 유지하고, T=1이면 클럭 엣지마다 출력을 반전(토글)시킨다. 주파수를 1/2로 분주하는 효과가 있어 카운터 설계의 핵심 소자이다.
특성표
| T | Q(t+1) | 동작 |
|---|---|---|
| 0 | Q(t) | 유지 (Hold) |
| 1 | Q'(t) | 토글 (Toggle) |
특성식
여기표
| Q(t) | Q(t+1) | T | 설명 |
|---|---|---|---|
| 0 | 0 | 0 | 상태가 유지되었으므로 T=0 |
| 0 | 1 | 1 | 상태가 반전되었으므로 T=1 |
| 1 | 0 | 1 | 상태가 반전되었으므로 T=1 |
| 1 | 1 | 0 | 상태가 유지되었으므로 T=0 |
목표
000 → 001 → 010 → 011 → 100 → 101 → 110 → 111 → 000... 순서로 카운트하는 3비트 동기식 카운터 설계
3비트이므로 총 개의 상태(000 ~ 111)를 가진다.
각 상태는 클럭이 한 번 인가될 때마다 다음 숫자로 변경된다.
(예: 010에서 클럭 인가 시 011로)
마지막 상태인 111에서는 다음 클럭에 000으로 돌아간다.
(000) -> (001) -> (010) -> (011) -> (100) -> (101) -> (110) -> (111) -> (000)
| 현재 상태 (A B C) | 다음 상태 (A B C) |
|---|---|
| 0 0 0 | 0 0 1 |
| 0 0 1 | 0 1 0 |
| 0 1 0 | 0 1 1 |
| 0 1 1 | 1 0 0 |
| 1 0 0 | 1 0 1 |
| 1 0 1 | 1 1 0 |
| 1 1 0 | 1 1 1 |
| 1 1 1 | 0 0 0 |
2단계 상태표와 JK 플립플롭의 여기표를 결합
| 현재 상태 | 다음 상태 | JA | KA | JB | KB | JC | KC |
|---|---|---|---|---|---|---|---|
| A B C | A B C | ||||||
| --- | --- | --- | --- | --- | --- | --- | --- |
| 0 0 0 | 0 0 1 | 0 | × | 0 | × | 1 | × |
| 0 0 1 | 0 1 0 | 0 | × | 1 | 0 | × | 1 |
| 0 1 0 | 0 1 1 | 0 | × | × | 0 | × | 1 |
| 0 1 1 | 1 0 0 | 1 | × | 1 | 1 | × | 1 |
| 1 0 0 | 1 0 1 | × | 0 | 0 | 1 | × | 1 |
| 1 0 1 | 1 1 0 | × | 0 | 1 | 0 | × | 1 |
| 1 1 0 | 1 1 1 | × | 0 | × | 0 | × | 1 |
| 1 1 1 | 0 0 0 | × | 1 | × | 1 | × | × |
‘×’는 무관(상관없음) 조건을 의미한다.
3단계 표를 바탕으로 각 J, K 입력(J2, K2, J1, K1, J0, K0)에 대한 논리식을 카르노맵을 이용해 구한다.
JA = BC
KA = BC
JB = C
KB = C
JC = 1
KC = 1
4단계에서 구한 논리식을 바탕으로 회로를 구성한다.
