온라인 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) 최상위 비트
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 |