목차]
I. Digital Computers
II. Logic Gates
III. Boolean Algebra
IV. Map Simplification
V. Combinational Circuits
VI. Flip-Flops
VII. Sequential Circuits
I. Digital Computers (p.3~6)
p.3 — Digital의 의미 디지털이란 이산적(discrete)인 값을 갖는 것을 말합니다. 진법별로 사용하는 숫자가 다릅니다.
- 10진수: 0~9 / 16진수: 0~F / 8진수: 0~7 / 2진수: 0, 1
- 비트(Bit): 이진 숫자 하나. 예: 1011010
- 프로그램: 명령어의 연속적인 나열
- 컴퓨터 = 하드웨어 + 소프트웨어
p.4 — 소프트웨어 계층 구조 컴퓨터 소프트웨어는 아래처럼 계층화되어 있습니다.
Application S/W (DB, 워드, 게임 등)
↕
API
Operating System(운영체제)
↕
ROM BIOS
↕
Computer H/W
- 소프트웨어 = 프로그램 + 데이터
- 응용 S/W: 사용자가 직접 사용하는 프로그램
- 시스템 S/W: OS, 컴파일러, 디바이스 드라이버 등
ROM BIOS는 HW초기화/ 부팅 프로세스 관리 / 기본 입출력 서비스 / CMOS 셋업 등등을 기능함. 메인보드 ROM칩에 저장된 펌웨어로서 하드웨어와 OS 사이에서 저수준 인터프리터 역할을 한다.
+펌웨어: HW, SW의 중간 성격을 가짐. 기기 내부의 ROM / 플래시 메모리에 내장되어 해당 장치를 제어하는 하위 수준의 프로그램이다. 기기 전원을 키면 가장 먼저 동작하여 HW 기능 최적화하는 제어 안내서 역할을 한다.

- CPU: 연산·제어 담당
- 메모리: ROM(프로그램 저장)-비휘발성!, RAM(데이터 저장) - 휘발성, 메인메모리라고도 함
- I/O 장치: 키보드·마우스(입력), 프린터·모니터(출력), HDD(저장)
- Input-Output Processor(IOP): 주변 장치와 메모리 사이의 데이터 전송을 전담하는 독립적인 처리 장치
p.6 — 컴퓨터 구조란? Hennessy & Patterson의 정의에 따르면 컴퓨터 구조는 두 가지로 나뉩니다.
- ISA (Instruction Set Architecture): 명령어, 주소 지정 방식, 명령어/데이터 형식, 레지스터
- Machine Organization: CPU(제어장치 + 데이터패스), 메모리, 입출력
쉽게 말해 ISA는 "무엇을 할 수 있는가", Machine Organization은 "어떻게 구현되었는가"입니다.
II. Logic Gates (p.7~10)
p.7 — 논리 게이트 개념
- 컴퓨터 내부에서 2진 정보는 신호(signal) 형태로 표현됩니다.
- 게이트(Gate): 0 또는 1의 신호를 만들어내는 하드웨어 블록
- 핵심 사실: 모든 게이트는 NAND 게이트나 NOR 게이트의 조합으로 대체 가능합니다. (Complete Set)
- 퀴즈: NAND/NOR로 AND, OR 회로 구현하기
p.8~9 — 논리 게이트 종류 (회로 그림) 이 페이지들은 주로 그림으로 구성되어 있으며, 아래 게이트들의 기호와 진리표가 나옵니다.
| AND | A·B | 둘 다 1일 때만 1 |
| OR | A+B | 하나라도 1이면 1 |
| NOT | A' | 입력 반전 |
| NAND | (AB)' | AND의 반전 |
| NOR | (A+B)' | OR의 반전 |
| XOR | A⊕B | 다를 때만 1 |
| XNOR | (A⊕B)' | 같을 때만 1 |
III. Boolean Algebra (p.11~15)
p.11 — 부울 대수 기본 개념
- 부울 변수: 0 또는 1의 값만 갖는 변수 (A, B, x, y)
- 부울 함수: 변수 + 논리 연산. 예: F(x,y,z) = x + y'z
- 진리표(Truth Table): n개 변수 → 2ⁿ가지 조합. 변수 3개면 8행
- 논리 회로도: 게이트로 함수를 표현한 그림
p.12 — 부울 대수 기본 정리 17가지
| 항등원 | x+0=x, x·1=x |
| 영원 | x·0=0, x+1=1 |
| 멱등 | x+x=x, x·x=x |
| 보원 | x+x'=1, x·x'=0 |
| 교환 | x+y=y+x |
| 결합 | x+(y+z)=(x+y)+z |
| 분배 | x(y+z)=xy+xz |
| 드모르간 | (x+y)'=x'y', (xy)'=x'+y' |
| 이중 부정 | (x')'=x |
드모르간의 법칙이 특히 중요합니다. NAND/NOR 게이트 구현에 핵심적으로 사용됩니다.
p.13 — 부울식 간소화가 필요한 이유
- 게이트 수를 줄여 전파 지연(propagation delay) 감소
- 비용 절감
- 방법: 기본 정리 이용 / 카르노맵 이용
p.14 — 간소화 예제
= (AB' + C'D) + (AB' + C'D) ← x+x = x
= AB' + C'D
F = ABC + ABC' + A'C
= AB(C+C') + A'C ← 분배 + 보원
= AB + A'C (인버터 1개, AND 게이트 1개 절약!)
p.15 — 퀴즈
- F = AB'C + AC
= AC(B' + 1) = AC
- F = (A+B)'(A'+B')'
= A'B' AB = 0
IV. Map Simplification (p.16~26)
p.16 — 카르노맵 기초: 민텀/맥스텀
- 민텀(Minterm): n개 변수의 곱(AND). 변수가 1이면 그대로, 0이면 보수 (x=1, x'=0)
- 맥스텀(Maxterm): n개 변수의 합(OR). 변수가 0이면 그대로, 1이면 보수 (x=0, x'=1)
1. Maxterm의 설계 목적: "오직 이때만 0이 되는 함정(Trap) 만들기"
Maxterm은 변수들이 **OR 게이트(+)**로 묶여 있는 덩어리입니다. OR 게이트의 치명적인 특징은 **"입력이 모두 0일 때만 딱 한 번 0이 나온다"**는 것입니다.
- 상황: 진리표를 보니 입력이 x=1, y=0일 때 결과가 0이 나와야 하는 오답 케이스라고 가정해 봅시다.
- 함정 설계: 이 1, 0이 들어올 때만 전체를 0으로 만드는 OR 게이트를 조립해야 합니다.
- y는 이미 0이니까 그냥 y를 그대로 씁니다.
- $x$는 1이 들어오므로, OR 게이트 안에서 0으로 만들어주기 위해 반전시켜서 $x'$를 씁니다.
- 두 개를 더하면 (x' + y) 라는 식이 완성됩니다. MAXTERM으로 2 의미. M₂
- 결과: 이 식은 오직 x=1, y=0이 들어올 때만 (1' + 0) = 0 + 0 = 0$이 되고, 나머지 3가지 경우의 수에서는 무조건 1이 나옵니다.
- 결론: Maxterm에서 반대로 기호를 붙이는 이유는 **"내가 지목한 딱 그 오답 케이스에서만 0을 뿜어내는 맞춤형 스위치"**를 억지로 만들어내기 위해서입니다.
2. AND 곱하기(Pi)의 역할: "함정에 걸리면 즉시 전원 차단하기"
이제 진리표에서 결과가 0인 오답 케이스들을 찾아 각각의 맞춤형 함정(Maxterm)들을 만들었습니다. 이것들을 모조리 **AND 게이트($\cdot$)**로 곱해버립니다 (Product).
AND 게이트의 특징은 **"수백 개가 1이어도 단 하나만 0이면 전체 결과는 0이다"**라는 절대적인 거부권(Veto)을 가진다는 것입니다.
- 정답인 케이스가 들어올 때: 어떤 함정(Maxterm)도 발동하지 않아 모두가 1을 내보냅니다. 따라서 1 dot 1 dot 1 = 1이 되어 무사히 통과합니다.
- 오답인 케이스가 들어올 때: 대기하고 있던 수많은 함정 중 하나가 자기가 맡은 오답을 인식하고 0을 뿜어냅니다. 그러면 나머지 Maxterm들이 1이든 말든 상관없이, AND 곱하기에 의해 **전체 회로의 결괏값은 즉시 0으로 배제(Exclusion)**되어 버립니다.
💡 핵심 요약
결국 POS 회로는 **"오답을 만나면 0이 되는 스위치(Maxterm)들을 싹 다 직렬(AND)로 연결해 두고, 오답이 하나라도 들어오면 전체 회로의 불을 꺼버리는(0으로 만드는) 설계 방식"**입니다. Minterm의 규칙을 거꾸로 뒤집어서 완벽한 필터링 시스템을 만들어낸 것이죠!
2변수 예시:
| 0 | 0 | m₀ = x'y' | M₀ = x+y |
| 0 | 1 | m₁ = x'y | M₁ = x+y' |
| 1 | 0 | m₂ = xy' | M₂ = x'+y |
| 1 | 1 | m₃ = xy | M₃ = x'+y' |

p.17 — 2변수 카르노맵 예시 F = x'y + xy의 카르노맵에서 m₁, m₃을 묶으면 → F = y (간소화 완료)
F는 SOP로 표현 (정답 즉 1인 것들, minterm들) 또는 POS로 표현 (오답, 즉 0인 것들, MAXTERM들)
오답인 (0,2)를 SOP로 표현하면 F'를 표현한게 된다!
p.18 — 카르노맵 구조 (2/3/4/5변수)
- 2변수: 2×2 맵 (0, 1 / 0 , 1)
- 3변수: 2×4 맵 (그레이 코드 순서: 00, 01, 11, 10)
- 4변수: 4×4 맵
4변수부터 카르노맵의 숫자 위치를 어떻게 익히지...? 에 대한 답>>
결론부터 말씀드리면, 안쪽의 십진수 숫자들(0~15)은 절대 외우는 것이 아닙니다. 카르노 맵의 가로축과 세로축에 적히는 그레이 코드(Gray Code)의 생성 원리만 딱 하나 이해하면, 아무리 큰 카르노 맵이라도 그 자리에서 바로 그려낼 수 있습니다.
그레이 코드가 어떻게 1비트만 다르게 배치되도록 만들어지는지, 그 마법 같은 **'거울 반사의 원리(Reflection)'**를 알려드릴게요.
1. 그레이 코드는 어떻게 만들어질까? (거울 반사 원리)
그레이 코드는 앞 단계의 코드를 '거울에 비추듯' 반사한 뒤, 절반을 나누어 0과 1을 붙이는 아주 단순한 규칙으로 만들어집니다. (그래서 정식 명칭도 Reflected Gray Code입니다.)
[1단계] 1비트 그레이 코드
가장 기본이 되는 상태입니다.
- 0
- 1
[2단계] 2비트 그레이 코드 (카르노 맵 축에 사용됨)
1비트 코드를 거울에 비춰서 데칼코마니처럼 접었다 편다고 상상해 보세요.
- 반사: 0, 1 |거울| 1, 0
- 앞에 숫자 붙이기: 거울을 기준으로 위쪽(원래 것)에는 앞에 0을 붙이고, 아래쪽(반사된 것)에는 앞에 1을 붙입니다.
- 00
- 01
- 11
- 10
- 결과: 우리가 카르노 맵에서 달달 외우던 **00, 01, 11, 10**이 바로 이렇게 탄생합니다! (위아래를 비교해 보시면 정말로 딱 1비트씩만 다릅니다.)
2. 4변수 카르노 맵에 적용하기 (암기 해방)
이제 4변수(A, B, C, D) 카르노 맵의 4x4 표를 머릿속으로 그려보세요.
- 가로축 (C, D): 00, 01, 11, 10
- 세로축 (A, B): 00, 01, 11, 10
표 안쪽의 숫자들은 그냥 세로축의 이진수와 가로축의 이진수를 합친 것일 뿐입니다. 가장 헷갈리는 3번째 줄(행)을 직접 조합해 볼까요?
- 세로축 A, B가 **11**인 3번째 줄:
- 가로축 00과 만남 -> 1100 (십진수 12)
- 가로축 01과 만남 -> 1101 (십진수 13)
- 가로축 11과 만남 -> 1111 (십진수 15)
- 가로축 10과 만남 -> 1110 (십진수 14)
이렇게 세로축의 3번째 인덱스가 10이 아니라 그레이 코드에 의해 11이 되기 때문에, 3번째 줄의 십진수 값들이 8, 9... 가 아니라 12, 13, 15, 14로 껑충 뛰는 것입니다.
이제 표의 헤더에 00, 01, 11, 10만 적어두면, 굳이 안쪽 숫자를 외우지 않아도 교차하는 이진수를 읽어서 바로 십진수로 변환할 수 있습니다!
- 5변수: 4×8 맵
인접 셀은 1비트만 다르게 배치합니다(그레이 코드). 이것이 K-맵의 핵심입니다.
p.19~21 — 4변수 카르노맵 예제 F(a,b,c,d) = Σm(0,1,2,5,8,9,10) 간소화
- F' = AB + CD + BD
- F = (A'+B')(C'+D')(B'+D') (곱의 합 → POS 형태)

p.22 — 인접 사각형 규칙
- 묶음의 크기는 반드시 2ⁿ개 (2, 4, 8, ...)
- 같은 행의 양 끝, 같은 열의 위·아래 끝도 인접으로 간주 (환형 구조)
- 네 모서리도 서로 인접 (위아래로 말아서 b' 좌우로 말아서 d' -> b'd')
- 묶음은 겹쳐도 됨
카르노맵에서 보이듯 A, B, C, D가 1인 영역을 표시해두면 묶은 결과 알아내기 쉽다!

p.24 — NAND/NOR 구현 및 Don't Care

SOP에서 결국 마지막은 합으로 표현되는데, 원래 회로에 이중부정을 걸면 결과는 동일하다!
이 때 드모르간 법칙을 그대로 적용하면 (부정의 합 = 곱의 부정) invert 해서 부정의 합으로 연산하는 부분을 곱의 부정 NAND 게이트로 바꿔 표현할 수 있다!
- 곱의 합(SOP) → NAND 게이트로 구현 (합으로 표현된 걸 곱으로 표현) - 이중부정+드모르간으로 게이트 부품 통일!
- 합의 곱(POS) → NOR 게이트로 구현 (곱으로 표현된 걸 합으로 표현) - 이중부정+드모르간으로 게이트 부품 통일!
- Don't Care 조건: 입력이 발생하지 않거나 출력이 무관한 경우 → X로 표시, 간소화에 활용
p.25 — Don't Care 상세 X로 표시된 셀은 0 또는 1 어느 쪽으로도 사용 가능 → 더 큰 묶음 형성에 활용하여 추가 간소화
돈케어 1로 보고 묶으면 묶은 돈케어는 SOP에서 1을 나타내게 되고, 돈케어 0으로 보고 묶은 돈케어는 POS에서 0을 나타내게 된다.
p.26 — 퀴즈
- F(x,y,z) = Σ(0,1,5,7)
나는 F=xz+x'y'+y'z 라고 생각했는데 1인 부분 다 묶었으면(덮었으면) 불필요하게 더 안묶어도된다.
안묶인 1이 있으면 묶은 부분도 또 묶을 수 있는 것!
그런데 왜 최종 정답(간소화된 식)에는 y'z가 빠져야 할까요? 여기서 카르노 맵의 또 다른 숨겨진 핵심 규칙인 '중복항(Redundant Term) 제거' 개념이 등장합니다. 아주 중요한 부분을 찌르셨습니다!
💡 왜 y'z는 정답에서 빠질까? (필수 그룹 vs 잉여 그룹)
카르노 맵의 진짜 목적은 "모든 1을 다 덮되, 최소한의 그룹 개수로 덮는 것"입니다. 그룹을 하나라도 덜 써야 논리 게이트 부품을 아낄 수 있기 때문입니다.
우리가 덮어야 할 1은 0, 1, 5, 7입니다.
- 첫 번째 필수 그룹 (x'y'): m_0과 m_1을 묶습니다.
- (이제 0번과 1번은 안전하게 구출되었습니다.)
- 두 번째 필수 그룹 (xz): m_5와 m_7을 묶습니다.
- (이제 5번과 7번도 안전하게 구출되었습니다.)
자, 여기서 잠시 멈추고 표를 보세요. 우리가 구해야 할 1(0, 1, 5, 7번)이 모두 동그라미 안에 들어왔나요? 네, 모두 다 구출되었습니다!
- 세 번째 그룹 (y'z)의 운명: 질문자님이 만드신 m_1과 m_5의 묶음입니다.
- 분명히 묶을 수 있는 짝꿍이 맞습니다.
- 하지만 m_1은 이미 첫 번째 그룹이 구출했고, m_5는 이미 두 번째 그룹이 구출했습니다.
- 즉, 이 y'z라는 묶음은 **"이미 다른 그룹에 의해 완벽하게 커버된 애들끼리만 묶어놓은 쓸데없는(Redundant) 묶음"**이 되어버립니다.
🎯 핵심 요약
지난번 m_1, m_5 질문에서 "이미 묶인 것도 또 묶을 수 있다"라고 했던 것은, 아직 구출되지 않은 1을 구출하기 위해 빌려올 때의 이야기입니다.
하지만 이번 상황처럼 **"묶음에 들어있는 1들이 모두 이미 다른 곳에서 안전하게 구출된 상태"**라면, 굳이 돈을 들여서 묶음(게이트)을 하나 더 만들 필요가 없습니다. 카르노 맵에서는 이런 군더더기 묶음을 지워버리는 것이 간소화의 완성입니다.
따라서 계산하신 y'z는 논리적으로 틀린 값은 아니지만, '최적화(간소화)' 규칙에 의해 생략되어야 하는 잉여 묶음이기 때문에 최종 식 F = x'y' + xz 에서 빠지는 것입니다!
- F(A,B,C,D) = Σ(0,2,8,9,10,11,14,15)
V. Combinational Circuits (p.27~31)
p.27 — 조합회로 개념
- 논리 게이트들이 연결된 회로
- 출력이 현재 입력에만 의존 (기억 없음) - 플립플롭 같은 소자 없음! 순수 입력 -> 출력
- n개 입력 → m개 출력
p.28 — 조합회로 설계 절차
- 문제 정의
- 입출력 변수 결정
- 진리표 작성
- 부울 함수 간소화 (K-맵 또는 부울 대수)
- 논리 회로도 작성
p.29~31 — 조합회로 예제 (그림 위주) 반가산기(Half Adder), 전가산기(Full Adder), 비교기(Comparator) 등의 회로 그림이 포함됩니다.

- 반가산기: 1비트 + 1비트 → 합(S), 올림수(C)
- S = A⊕B, C = AB (S 계산은 XOR 연산, C는 AND 연산 결과와 같음)
- XOR 게이트 1개, AND 게이트 1개로 구성

- 전가산기: 올림수 입력까지 포함한 1비트 덧셈기
전가산기 3변수일 때는 C값이 변수들 중 1인게 '2개 이상일 때', S값은 변수들 중 '값 1인 개수가 홀수개일 때' 1이 나온다.
이 때 카르노맵은 왜 최대로 묶는 모습이 아니지???
C를 예로 들면 m3,m7 묶고 m5,m7 묶고, m7,m6 묶어야하지않나?
질문자님의 카르노 맵 직관이 100% 정확하게 맞습니다! 카르노 맵의 절대 규칙인 "최대한 크게 묶어라"를 적용하면, m5와 m7은 당연히 묶어야 하고, 심지어 m3와 m7도 묶어야 합니다. (이때 m7은 무려 3번이나 중복 사용됩니다!)
그렇다면 왜 교재나 어떤 풀이에서는 m3와 m5를 예쁘게 묶지 않고 굳이 따로 빼서 이상하게 식을 만들었을까요?
그 이유는 카르노 맵의 규칙이 틀려서가 아니라, 컴퓨터 공학자들이 **'부품 재사용'이라는 엄청난 꼼수(하드웨어 최적화)**를 쓰기 위해 수학 규칙을 일부러 살짝 비틀었기 때문입니다.
이 두 가지 관점의 차이를 명확하게 비교해 드릴게요. (변수는 $A, B, C_{in}$으로 설명하겠습니다)
1. 수학자의 방식: 정석 카르노 맵 묶기 (질문자님의 생각)
전가산기 Carry Out의 1 위치는 m3, m5, m6, m7입니다.
이것을 카르노 맵 원칙대로 가장 크게 묶으면 m7을 중심으로 3개의 그룹이 나옵니다.
- m6, m7 묶음: $AB$
- m5, m7 묶음: $A C_{in}$
- m3, m7 묶음: $B C_{in}$
- 최종 수학적 정답: $C_{out} = AB + AC_{in} + BC_{in}$ (아주 완벽한 정답입니다!)
2. 엔지니어의 방식: 실제 하드웨어 설계 (교안의 이상한 묶음)
수학적으로는 위의 식이 완벽하지만, 실제로 공장에 가서 게이트(부품)를 조립하려고 보니 억울한 일이 생겼습니다.
우리는 이미 **합(Sum)**을 계산하기 위해 $A \oplus B$ (XOR 게이트) 부품을 만들어 두었습니다. 엔지니어들은 "어? 저 부품 이미 만들어놨는데, C를 구할 때도 어떻게든 재활용할 수 없을까?"를 고민합니다.
그래서 카르노 맵의 완벽한 묶음을 포기하고 식을 억지로 조작합니다.
- m6, m7은 그대로 묶습니다: $AB$
- m3(011)과 m5(101)를 굳이 묶지 않고 따로 봅니다:
- $A'BC_{in} + AB'C_{in}$
- 여기서 $C_{in}$을 밖으로 묶어내면? $\rightarrow$ **$(A'B + AB')C_{in}$**
- 괄호 안의 식은 완벽하게 XOR 형태가 됩니다! $\rightarrow$ $(A \oplus B) \cdot C_{in}$
- 최종 엔지니어의 정답: $C_{out} = AB + (A \oplus B)C_{in}$
💡 결론
질문자님이 "m5, m7 묶을 수 있는 거 아니야?"라고 생각하신 것은 카르노 맵 이론상 완벽한 정답입니다.
하지만 교안에서 굳이 그것을 따로 빼서 묶은 이유는, 순수하게 카르노 맵을 간소화하려는 목적이 아니라 Sum 연산에서 이미 만들어둔 XOR 게이트($A \oplus B$)를 Carry 연산에도 재활용해서 칩의 단가를 낮추려는 엔지니어들의 설계 기법을 보여주기 위함입니다!
---------------------------------------------------------------------------------------------------------------------------------
1. 자리올림 C (Carry): "다수결의 원칙 (Majority Function)"
질문자님께서 **"1이 짝수(2개)일 때 1이고, 모두 1(3개)일 때도 1이다"**라고 관찰하신 내용을 합치면 수학적으로 아주 깔끔한 한 문장이 됩니다.
- 원리: 3개의 입력(X, Y, Z) 중 '1'이 과반수(2개 이상)이면 C는 무조건 1이 됩니다.
- 컴퓨터 과학에서는 이를 **다수결 함수(Majority Function)**라고 부릅니다. 3명이 투표를 해서 2명 이상이 찬성(1)하면 다음 자리로 숫자를 넘겨버리는(C=1) 직관적인 원리입니다.
2. 내친김에 보는 합 S (Sum)의 패턴: "홀수 판독기 (Odd Parity)"
C의 패턴을 찾으셨으니, 합계인 S의 세로줄도 한번 훑어보세요! 아주 기가 막힌 대칭적인 패턴이 숨어 있습니다.
- 원리: 3개의 입력 중 '1'의 개수가 정확히 홀수 개(1개 또는 3개)일 때만 S는 무조건 1이 됩니다. (1이 0개나 2개인 짝수 상황에서는 0이 됩니다.)
- 그래서 S를 계산하는 회로를 만들 때, 들어온 1의 개수가 홀수인지 짝수인지 기가 막히게 판별해 내는 전용 게이트인 **XOR 게이트를 통째로 가져다 쓰는 것입니다.
💡 핵심 요약
질문자님의 날카로운 관찰을 정리하면 전가산기는 결국 이렇게 움직이는 기계입니다.
- S (Sum): "입력된 1의 개수가 홀수인가?" (XOR 역할)
- C (Carry): "입력된 1의 개수가 **2개 이상(다수)**인가?" (Majority 역할)
이렇게 원리를 스스로 깨우치시면, 나중에 입력이 4개, 5개로 늘어나는 복잡한 가산기를 배우더라도 진리표를 보지 않고 머릿속으로 결과를 바로 예측하실 수 있을 겁니다. 완벽한 분석이었습니다!
VI. Flip-Flops (p.32~39)
p.32 — 플립플롭 개념
- 1비트 정보를 저장할 수 있는 이진 소자
- 동기식 저장 소자: 클록 펄스가 발생하는 순간에만 상태 변화
- 클록 펄스 생성기(Clock Pulse Generator)로 동기화
p.33~36 — 각종 플립플롭 (그림 위주)

| SR F/F | Set/Reset. S=R=1 금지 상태 존재 |
| JK F/F | SR의 개선판. J=K=1이면 토글(반전) |
| D F/F | 입력 D를 그대로 저장. 가장 단순 |
| T F/F | T=1이면 토글, T=0이면 유지 |

1. SR F/F: 모든 기억 소자의 조상
NAND 게이트 2개를 꼬아서 연결하면 1비트를 기억할 수 있는 기본 '래치(Latch)'가 된다. 여기에 클럭(CP) 신호를 받을 수 있도록 앞에 NAND 게이트 2개를 더 붙이면 완벽한 SR 플립플롭이 완성됩니다.
한계점: S=1 R=1 이 동시에 들어오면 회로가 붕괴되는 '금지된 상태'가 존재한다는 약점이 있습니다.
[금지된 상태에 대한 자세한 설명]
1단계: NOR 게이트의 절대 규칙
회로를 이해하기 위해 딱 하나만 기억하면 됩니다.
- NOR 게이트의 성질: 여러 입력 선 중 단 하나라도 '1'이 들어오면, 나머지 입력이 뭐든 상관없이 무조건 '0'을 뿜어냅니다.
2단계: 모순의 시작 (S=1, R=1을 동시에 누를 때)
평소에는 S나 R 중 하나만 1이 들어와서 Q와 Q'가 서로 1과 0을 사이좋게 나눠 가집니다. 그런데 S와 R에 동시에 1을 주면 끔찍한 일이 벌어집니다.
- R 선에 1이 들어오니, 위쪽 NOR 게이트는 무조건 Q를 0으로 만들어 버립니다.
- S 선에 1이 들어오니, 아래쪽 NOR 게이트도 무조건 Q'를 0으로 만들어 버립니다.
- 논리적 붕괴: Q와 Q'는 이름부터 서로 정반대(NOT)여야 하는 쌍둥이인데, 둘 다 0이 되어버리는 모순이 발생합니다. 이것이 첫 번째 고장입니다.
3단계: 진짜 대참사 발발 (버튼에서 손을 뗄 때 = Race Condition)
사실 둘 다 0이 된 것 자체보다, S=1, R=1 상태에서 다시 상태 유지(S=0, R=0)로 돌아가기 위해 손을 떼는 찰나의 순간에 진짜 충돌이 일어납니다.
- 방금 전까지 Q=0, Q'=0 이었습니다.
- 스위치에서 손을 떼면 S=0, R=0이 됩니다.
- 위쪽 게이트의 입력은 (R=0, Q'=0)이 되고, 아래쪽 게이트의 입력은 (S=0, Q=0)이 됩니다.
- NOR 게이트는 입력이 둘 다 0일 때만 출력을 '1'로 올립니다. 따라서 위쪽 게이트와 아래쪽 게이트가 동시에 출력을 1로 올리려고 시도합니다.
- 충돌 (Race Condition): 두 게이트가 1을 향해 경주(Race)를 시작합니다. 그런데 어느 한쪽 게이트가 간발의 차이로 아주 조금 더 빨리 1이 되면, 그 1이 교차된 선을 타고 반대쪽 게이트로 쳐들어가서 상대방을 다시 0으로 짓눌러버립니다.
- 예측 불가: 위쪽이 이겨서 Q=1이 될지, 아래쪽이 이겨서 Q'=1이 될지는 오로지 전선의 미세한 길이 차이, 온도의 차이 같은 물리적인 '우연'에 의해 결정됩니다. 컴퓨터 세계에서 "다음 결과를 수학적으로 100% 확신할 수 없다"는 것은 시스템 다운을 의미하는 최악의 오류입니다.
근데 NOR 또는 NAND로 구성된 SR (래치) 회로에서 S,R은 사용자가 가정하고 시작한다쳐도 Q와 Q' 값이 주어지지 않았을 때 회로작동이 어떻게 되는지 알 수 있나?? (초기화 딜레마 - 닭이 먼저냐, 알이 먼저냐..)
결론부터 말씀드리면, "Q와 Q'의 초기값을 모르는 상태에서 S=0, R=0(유지)을 주면, 회로가 어떻게 작동할지 이론적으로 절대 알 수 없습니다." 이 딜레마가 이론과 현실에서 어떻게 다르게 나타나고, 엔지니어들은 이를 어떻게 해결하는지 3가지 관점으로 명쾌하게 풀어드릴게요.
1. 이론적 관점 (시뮬레이터의 세계): "영원한 미지수(Unknown)"
우리가 로직웍스 같은 시뮬레이터에서 처음 SR 래치(NOR 기준)를 그리고 스위치를 S=0, R=0으로 두면, 전선의 색깔이 빨간색(1)도 파란색(0)도 아닌 보라색이나 'X', 'U'(Unknown) 상태로 뜹니다.
이유: 위쪽 게이트는 "아래쪽 Q'가 뭔지 알아야 내 값(Q)을 정하지!"라고 버티고, 아래쪽 게이트는 "위쪽 Q가 뭔지 알아야 내 값(Q')을 정하지!"라고 서로 무한 대기를 타기 때문입니다.
2. 현실 세계의 물리 법칙: "랜덤 뽑기 (Random Power-up State)"
하지만 현실에서 실제 빵판(Breadboard)에 칩을 꽂고 전원을 넣으면 보라색(X) 같은 상태는 존재하지 않습니다. 전기가 들어오는 찰나의 순간, 회로는 무조건 0이나 1 중 하나로 무작위로 결정됩니다.
이유: 현실의 부품은 완벽하게 대칭이지 않습니다. 아주 미세한 전선의 길이 차이, 온도의 차이, 공기 중의 노이즈 때문에 어느 한쪽 NOR 게이트가 0.000000001초라도 먼저 작동하게 됩니다.
컴퓨터를 켤 때마다 플립플롭이 1이 될지 0이 될지 랜덤으로 결정된다면, 컴퓨터는 부팅할 때마다 미쳐버릴 것입니다.
3. 엔지니어의 완벽한 해결책: "강제 초기화 (Global Reset)"
그래서 실제 하드웨어 설계자들은 회로를 만들 때 "현재 상태가 뭐든 간에 무조건 알 수 있도록 강제로 멱살을 잡고 끌고 오는 과정"을 무조건 넣습니다.
컴퓨터나 스마트폰의 전원 버튼을 누르는 순간, CPU 내부에서는 약 0.1초 동안 모든 플립플롭의 R(Reset) 핀에 강제로 1을 쫙 쏴버립니다.
R=1이 들어가는 순간, Q가 이전 상태가 무엇이든, 심지어 모르는 상태(Unknown)였든 상관없이 무조건 Q=0으로 확정 지어 버립니다. (NOR 게이트는 하나만 1이어도 무조건 0이 되니까요!)이렇게 한 번 Q=0, Q'=1로 **초기화(Initialization)**를 하고 난 뒤에야 비로소 $S=0, R=0$을 주면서 정상적인 작동을 시작합니다.
2. D F/F: "금지된 상태를 원천 차단"
SR의 S에 D를, R에 D'를 넣어서 1과 0만 들어가게 만듭니다.
S와 R에 절대 같은 값이 들어가지 못하게 NOT 게이트(인버터)를 하나 답니다. 그 결과 SR F/F 에서 (1,0) (0,1)일 때의 상태만 저장하게됩니다. 입력된 D값이 클럭이 뛸 때마다 그대로 Q로 전달되는 데이터 저장소 (Data/Delay F/F)가 탄생했습니다.
3. JK F/F: "금지된 상태를 유용하게 써먹자" (피드백의 마법)
Q'를 J쪽에 Q를 K쪽에 AND 게이트로 연결하여 '피드백'을 이용합니다.
SR이 1,1 일 때 고장 나는 이유는 "자신이 지금 무슨 상태인지 모르고 무작정 바꾸려다 충돌하는 것"
그래서 JK는 자신의 현재 출력(Q, Q')을 다시 입력 쪽으로 끌고 와서(피드백) 확인합니다. 덕분에 J=1, K=1이 들어오면 고장 나는 대신 현재 상태를 정반대로 뒤집어버리는 토글(Toggle) 기능으로 진화했습니다.
4. T F/F: "토글 기능만 극대화하자"
- 내용: JK F/F의 J와 K를 하나로 묶어서 T로 만들고 E(또는 CP)로 작동하게 한다.
- 추가 포인트: 이것도 100% 정답입니다. J와 K를 하나의 선으로 묶어버리면, 들어올 수 있는 입력은 (0, 0) 아니면 (1, 1) 두 가지뿐입니다.
- T=0이면 (0, 0)이 들어가서 현재 상태 유지(No Change).
- T=1이면 (1, 1)이 들어가서 무조건 반전(Toggle).
- 0 1 0 1 로 깜빡거려야 하는 '카운터(Counter)' 회로를 만들 때 이 T 플립플롭이 핵심 부품으로 쓰입니다.

0->1 : positive transition / 1->0 : negative transition
p.37 — Race 현상
- 발생 조건: Setup Time > Propagation Delay
- 증상: 0과 1을 반복하다 불안정 상태
- 해결책: Edge Triggered F/F 또는 Master/Slave F/F 사용
1. 진짜 레이스 현상의 조건 2가지
보통 학부 수준에서 레이스 현상이라고 하면 다음 두 가지 중 하나를 의미합니다.
조건 A: 펄스 폭(Pulse Width, t_p) > 전파 지연(t_{pd})
- 현상: 가장 유명한 **'레이스 어라운드(Race-around) 현상'**입니다. 클럭이 '1'로 유지되는 시간(펄스 폭)이 너무 길어서, 신호가 플립플롭을 빠져나간 뒤 피드백 선을 타고 다시 돌아와 자기 자신을 또 뒤집어버리는(무한 토글) 현상입니다.
- 예상: 교수님이 펄스 폭(Pulse Width)을 적으려다가 셋업 타임(Setup Time)으로 잘못 적으셨을 가능성이 가장 큽니다.
조건 B: 홀드 타임(t_{hold}) > 전파 지연(t_{pd})
- 현상: 방금 전 우리가 시뮬레이터로 보았던 상황입니다. 앞 플립플롭을 통과하는 속도(t_{pd})가 너무 빨라서, 뒤 플립플롭이 문을 채 닫기도 전(t_{hold})에 새로운 값이 난입해버리는 현상입니다.
2. 왜 Setup time > Propagation delay는 어색할까?
셋업 타임은 클럭(셔터)이 터지기 **'전'**에 데이터가 미리 와서 대기해야 하는 시간입니다.
만약 전파 지연 시간보다 셋업 타임이 더 길다면, 그냥 회로가 다음 클럭 주기에 맞춰 데이터를 안정적으로 밀어 넣기 매우 빡빡해진다는 뜻(Setup Time Violation)입니다. 신호가 통제를 벗어나서 회로를 마구 뚫고 지나가거나 빙글빙글 도는 '경주(Race)' 자체와는 물리적인 연관성이 없습니다.
p.38 — 여기표 (Excitation Table)
- 현재 상태 → 다음 상태로 바꾸기 위해 F/F 입력에 무엇을 넣어야 하는지 정리한 표
- 순서회로 설계의 핵심 도구
p.39 — 퀴즈 SR, JK, D, T F/F 각각을 NOR 게이트로 구성한 회로도를 작성하세요.
VII. Sequential Circuits (p.40~48)
p.40 — 순서회로 개념 (그림)
- 조합회로 + 플립플롭(기억 소자)
- 출력이 현재 입력 + 현재 상태에 의존
p.41 — 플립플롭 입력 방정식

- 입력 방정식: F/F 입력에 대한 부울식
- 예: D_A = Ax + Bx, D_B = A'x
- 출력 방정식: y = Ax' + Bx'

p.42~45 — 순서회로 분석/설계 예제 (그림 위주) 상태 다이어그램, 상태표(State Table), 여기표를 이용한 순서회로 설계 과정
p.46 — 이진 카운터

- 입력 변수 A, B, x를 갖는 이진 카운터
- 상태 전이표와 플립플롭 입력 방정식 유도

p.47 — JK F/F로 구현한 카운터 논리 회로도

p.48 — 최종 퀴즈
2개의 플립플롭과 1개의 입력 x를 갖는 2비트 다운 카운터 설계
- x=0: 카운터 변화 없음
- x=1: 11 → 10 → 01 → 00 → 11 반복
'CS' 카테고리의 다른 글
| 자료구조(Data Structure)- 점검편 1 (0) | 2026.03.30 |
|---|