Home
📓

밑바닥부터 만드는 컴퓨터 시스템

Tags
OS
Date
2025/02/03
Status
In progress
온라인 IDE

0장) 실습에 필요한 내용 정리

헷갈리는 용어 정리

칩 = 게이트

HDL이란

디지털 회로를 설계하고 표현하는 프로그래밍 언어
논리 게이트, 플립플롭, CPU 같은 하드웨어의 동작을 모델링하는 데 사용

문제 푸는 방법

1. SOP(SUM OF PRODUCTS) 방식

1.
진리표를 작성한다.
2.
최종 출력이 1인 경우의 조건을 AND로 묶는다
3.
최종적으로 OR로 연결한다.

2. 카르노 맵(K-Map)

1.
진리표를 시각적으로 다시 표현한다.
각 cell은 진리표의 한 행을 나타내고, 해당 입력 조합의 0/1을 기록한다.
인접한 셀을 묶어서 논리식을 간소화한다.
1이 인접해 있으면 묶을 수 있다.

1장) 불 논리

Nand

/** * Nand gate: * if (a and b) out = 0, else out = 1 */ CHIP Nand { IN a, b; OUT out; PARTS: BUILTIN Nand; }
VHDL
복사
기본으로 주어진다
Not And 연산
a
b
output
1
1
0
1
0
1
0
1
1
0
0
1

Not

CHIP Not { IN in; OUT out; //// PUT YOUR CODE HERE PART: Nand(a=in, b=in, out=out); }
VHDL
복사
인버터(Inverter)
입력 값의 반대 값을 출력한다
명세
칩 이름
Not
입력
in
출력
out
기능
if (in == 0) then out = 1, else out = 0

And

CHIP And { IN a, b; OUT out; PARTS: //// Replace this comment with your code. Nand(a=a, b=b, out=temp); Not(in=temp, out=out); }
VHDL
복사
명세
칩 이름
And
입력
a, b
출력
out
기능
if ((a==0) and (b==0)) then out = 0, else out = 1
Nand의 결과를 뒤집는다고 생각하고 구현함

Or

CHIP Or { IN a, b; OUT out; PARTS: //// Replace this comment with your code. Not(in=a, out=outa); Not(in=b, out=outb); Nand(a=outa, b=outb, out=out); }
VHDL
복사
명세
칩 이름
Or
입력
a, b
출력
out
기능
if ((a==1) or (b==1)) then out = 1, else out = 0

Xor

CHIP Xor { IN a, b; OUT out; PARTS: //// Replace this comment with your code. Not(in=a, out=nota); Not(in=b, out=notb); And(a=a, b=notb, out= aAndNotB); And(a=nota, b=b, out=notAAndB); Or(a=aAndNotB, b=notAAndB, out=out); }
VHDL
복사
명세
칩 이름
Xor
입력
a, b
출력
out
기능
if (a!=b) then out=1, else out=0
배타적 논리합
A와 B가 값이 다를 때만 1을 출력한다
A가 1, B가 0인 경우
A가 0, B가 1인 경우,
⇒ (A and not B) or (not A and B)
⇒ 이걸 그대로 연산하면 결과값이 나온다
결과
a
b
output
1
1
0
1
0
1
0
1
1
0
0
0

멀티플렉서(Multiplexor, Mux)

CHIP Mux { IN a, b, sel; OUT out; PARTS: //// Replace this comment with your code. Not(in=sel, out=notSel); And(a=a, b=notSel, out=aAndNotSel); And(a=b, b=sel, out=bAndSel); Or(a=aAndNotSel, b=bAndSel, out=out); }
VHDL
복사
3-입력 게이트
data bit a, b
selection bit sel
sel 을 통해 a, b 중 어떤 값을 출력할 지 선택
명세
칩 이름
Mux
입력
a, b, sel
출력
out
기능
if (sel==0) then out=a, else out=b

디멀티플렉서(Deultiplexor, DMux)

CHIP DMux { IN in, sel; OUT a, b; PARTS: //// Replace this comment with your code. Not(in=sel, out=notSel); And(a=in, b=notSel, out=a); And(a=in, b=sel, out=b); }
VHDL
복사
멀티 플렉서와 정반대 기능
명세
칩 이름
DMux
입력
a, b, sel
출력
out
기능
if (sel==0) then {a,b} = {in, 0}, else {a,b} = {0, in}

멀티비트 Not(Not16)

CHIP Not16 { IN in[16]; OUT out[16]; PARTS: //// Replace this comment with your code. Not(in=in[0], out=out[0]); Not(in=in[1], out=out[1]); Not(in=in[2], out=out[2]); Not(in=in[3], out=out[3]); Not(in=in[4], out=out[4]); Not(in=in[5], out=out[5]); Not(in=in[6], out=out[6]); Not(in=in[7], out=out[7]); Not(in=in[8], out=out[8]); Not(in=in[9], out=out[9]); Not(in=in[10], out=out[10]); Not(in=in[11], out=out[11]); Not(in=in[12], out=out[12]); Not(in=in[13], out=out[13]); Not(in=in[14], out=out[14]); Not(in=in[15], out=out[15]); }
VHDL
복사
n비트 입력의 모든 비트마다 Not 불 연산 수행
명세
칩 이름
Not16
입력
in[16]
출력
out[16]
기능
for i = 0..15 out[i] = Not(in[i])

다입력 Or(Or8Way)

CHIP Or8Way { IN in[8]; OUT out; PARTS: //// Replace this comment with your code. Or(a=in[0], b=in[1], out=out1); Or(a=in[2], b=in[3], out=out2); Or(a=in[4], b=in[5], out=out3); Or(a=in[6], b=in[7], out=out4); // Or(a=out1, b=out2, out=out12); Or(a=out3, b=out4, out=out34); // Or(a=out12, b=out34, out=out); }
VHDL
복사
입력이 하나 또는 두 개인 논리 게이트 → 입력이 두 개 이상인 다입력(multi-way) 게이트로 일반화 가능

2장) 불 연산

1. 이론

2.1. 산술 연산

컴퓨터 시스템에 구현되어있어야 하는, 부호 있는 정수에 대한, 최소한의 산술 연산) 덧셈, 부호 변환, 뺄셈, 비교, 곡셈, 나눗셈
덧셈과 부호 변환을 수행하는 게이트 논리에서 시작해서 다른 산술 연산을 구현함

2.2. 2진수

컴퓨터 내부에서 모든 것은 2진 코드로 표현된다. 예를 들어 “소수의 예를 하나 입력하세요”라는 말에 따라 1 , 9 , Enter 라고 표시된 키를 누르면, 컴퓨터 메모리에 최종적으로 저장되는 것은 2진 코드인 10011 이다. 이 값을 화면에 표시하라고 컴퓨터에 명령하면, 다음과 같은 과정을 거치게 된다.
먼저 컴퓨터의 운영체제(OS)는 10011 이 나타내는 10진수를 계산하고, 이 값은 19가 된다.
OS는 이 정수 값을 두 개의 문자 1과 9로 변환하고 나ㅏ서, 현재 글꼴을 조회해서 화면에 렌더링하기 위한 두 개의 비트맵 이미지를 만든다.
다음으로 OS는 스크린 드라이버를 통해 픽셀을 끄거나 켜고(여기까지 몇 백분의 1초도 안걸림) 화면에 19라는 이미지가 나타난다.
고정 단어 크기
컴퓨터는 숫자를 표현하는 데 고정 단어 크기를 사용해야 하는 유한한 기계다.
단어 크기(word size)란 일반적인 하드웨어 용어로, 컴퓨터가 기본 정보 단위(이 경우에는 정수 값)을 표현하는 데 사용하는 비트 수를 가리킨다.
보통 정수를 표현하는 데 8-, 16-, 32-, 64-비트 레지스터가 사용된다. 고정 단어 크기는 이 레지스터가 표현 가능한 값의 개수에 한계가 있음을 의미한다.
예를 들어 8-비트 레지스터는 2^8개(256개)의 서로 다른 코드를 나타낼 수 있다.

2.3. 2진 덧셈

오른쪽에서 왼쪽 자릿수로 숫자들을 하나씩 더함
용어
LSB(Least Significant Bit) 최하위 비트
Carry Bit 자리올림 비트
MSB(Most Significant Bit) 최상위 비트
오버플로
최상위 비트를 더하고 나서도 자리올림수가 1이면 오버플로 발생
오버플로란? 계산 값이 컴퓨터에서 허용하는 범위를 넘을 때 발생하는 오류

2.4. 부호가 있는 2진수

2의 보수법(기수의 보수법)
단어 크기가 n비트인 2진법 체계에서,
2의 보수법에 따라 음수 x를 표현하는 2진 코드는
2^n - x를 나타내는 코드가 된다
-7 = 2^4 - 7 = 9 = 1001
성질
이 체계는 -(2^(n-1))부터 2^(n-1)-1개의 부호 있는 숫자를 표기할 수 있음
음수 아닌 수의 코드는 모두 0으로 시작
음수의 코드는 1로 시작
x의 코드에서 -x의 코드를 구하려면, x의 최하위 0비트들과 처음으로 나타나는 최하위 1비트는 그대로 두고, 나머지 비트는 모두 뒤집으면 됨.

2. 실습

1) 반가산기 - 2진수 덧셈의 첫번째 단계, 두 비트를 더하는 기능

CHIP HalfAdder { IN a, b; // 1-bit inputs OUT sum, // Right bit of a + b carry; // Left bit of a + b PARTS: Xor(a=a, b=b, out=sum); And(a=a, b=b, out=carry); }
VHDL
복사
명세
칩 이름
HalfAdder
입력
a, b
출력
sum, carry
기능
sum = a + b의 LSB carry = a + b의 MSB
입출력 예시
a
b
carry
sum
0
0
0
0
0
1
0
1
1
0
0
1
1
1
1
0
그림

2) 전가산기 - 세 개 입 력 비트의 덧셈

CHIP FullAdder { IN a, b, c; // 1-bit inputs OUT sum, // Right bit of a + b + c carry; // Left bit of a + b + c PARTS: HalfAdder(a=a, b=b, sum=absum, carry=abcarry); HalfAdder(a=absum, b=c, sum=sum, carry=abccarry); Xor(a=abcarry, b=abccarry, out=carry); }
VHDL
복사
명세
칩 이름
FullAdder
입력
a, b, c
출력
sum, carry
기능
sum = a + b + C의 LSB carry = a + b + C의 MSB

3) 가산기 - 컴퓨터 정수를 고정 단어 크기로 표현

CHIP Add16 { IN a[16], b[16]; OUT out[16]; PARTS: HalfAdder(a=a[0], b=b[0], sum=out[0], carry=c1); FullAdder(a=a[1], b=b[1], c=c1, sum=out[1], carry=c2); FullAdder(a=a[2], b=b[2], c=c2, sum=out[2], carry=c3); FullAdder(a=a[3], b=b[3], c=c3, sum=out[3], carry=c4); FullAdder(a=a[4], b=b[4], c=c4, sum=out[4], carry=c5); FullAdder(a=a[5], b=b[5], c=c5, sum=out[5], carry=c6); FullAdder(a=a[6], b=b[6], c=c6, sum=out[6], carry=c7); FullAdder(a=a[7], b=b[7], c=c7, sum=out[7], carry=c8); FullAdder(a=a[8], b=b[8], c=c8, sum=out[8], carry=c9); FullAdder(a=a[9], b=b[9], c=c9, sum=out[9], carry=c10); FullAdder(a=a[10], b=b[10], c=c10, sum=out[10], carry=c11); FullAdder(a=a[11], b=b[11], c=c11, sum=out[11], carry=c12); FullAdder(a=a[12], b=b[12], c=c12, sum=out[12], carry=c13); FullAdder(a=a[13], b=b[13], c=c13, sum=out[13], carry=c14); FullAdder(a=a[14], b=b[14], c=c14, sum=out[14], carry=c15); FullAdder(a=a[15], b=b[15], c=c15, sum=out[15], carry=x); }
VHDL
복사
명세
칩 이름
Add16
입력
a[16], b[16]
출력
out[16]
기능
두 개의 16비트 수를 더한다. 오버플로 비트는 무시.

4) 증분기 - 나중에 컴퓨터 아키텍처를 설계할 때, 주어진 숫자에 1을 더하는 칩이 있는 게 편리함, 현재 명령을 실행한 후에 다음 명령을 가져오는 데 쓰임.

CHIP Inc16 { IN in[16]; OUT out[16]; PARTS: Add16(a=in, b[0]=true, b[1..15]=false, out=out); }
VHDL
복사
명세
칩 이름
Inc16
입력
in[16]
출력
out[16]
기능
out = in + 1

5) ALU