CPU의 조합 회로들로 논리 함수를 모두 표현할 수 있지만, 모든 논리 함수를 조합 회로로 만들어서 사용하는 것은 비현실적이다.
하드웨어는 가장 기본적인 기능만 제공하고, 모든 연산 논리는 이 기본 기능을 이용하여 소프트웨어로 표현하는 것이 좋은 방법이다.
하드웨어는 변하지 않지만, 소프트웨어는 변할 수 있다.
컴퓨터는 하드웨어에 서로 다른 소프트웨어를 설치하여 서로 다른 기능을 가질 수 있다.(강력한 범용성)
하드웨어의 CPU는 연산 능력만 제공하며, 프로그래머가 피연산자를 제공하는데
CPU의 연산 능력의 표현 방식은 명령어 집합을 이용해 구현된다.
명령어 집합(instruction set) = 명령어(opcode) + 피연산자(operand)
기계 명령어
덧셈 연산 기계 명령어를 살펴 보면,
메모리에서 숫자를 읽는다. 읽을 주소는 ***이다.
두 숫자를 더한다.
두 숫자의 크기를 비교한다.
숫자를 메모리에 저장한다. 저장할 주소는 ***이다.
CPU에서는 모두 이런 느낌의 기계 명령어로 변환한 후 실행한다.
명령어의 처음 4비트가 CPU에 수행할 작업을 알려 주는 역할을 하여, 우리는 이 4비트의 가짓수에 해당하는 16개의 기계 명령어를 설계할 수 있다.
이 16개의 기계 명령어가 바로 명령어 집합이며, 명령어 집합은 CPU가 수행할 수 있는 일이다.
덧셈 연산 기계 명령어의 예시
고급 프로그래밍 언어를 컴파일러로 이런 간단한 기계 명령어들로 변환하게 된다.
산술 논리 장치와 레지스터
이 기계 명령어는 어떤 원리로 수행될 수 있을까?
연산 작업은 산술 논리 장치로, 정보 저장은 레지스터에서 각각 수행된다.
CPU에서는 트랜지스터로 회로를 조합하여 연산을 수행, 정보를 저장하고 기계 명령어를 실행한다.
🛜 트랜지스터란? 전송(Transfer) + 저항(Resistor)의 합성어로 트랜지스터(Transistor)라고 한다. 신호를 증폭하고, 스위칭 기능을 하는 반도체 소자이다. 단자 한쪽에 전류를 흘리면 나머지 단자 두 개에 전류를 흐르게 하거나 흐르지 않게 한다.
결국, 프로그래밍이 아무리 복잡하게 구성되어 있어도, 최종적으로 소프트웨어가 수행하는 기능은 트랜지스터의 개폐 작업이다.
CPU의 연산 능력 (=산술 논리 장치)
CPU는 트랜지스터로 만들 수 있는 세 가지 논리적 회로로 연산을 구현하며, 이 세 가지 논리는 논리적 완전성을 지닌다.
논리곱 게이트(logical conjunction gate, AND)
논리합 게이트(logical disjunction gate, OR)
논리부정 게이트(logical negation gate, NOT)
논리적 완전성(logical completeness) = 논리곱, 논리합, 논리부정 게이트로 모든 논리 함수를 표현할 수 있다.
∴ 모든 논리는 And, Or, Not으로 이루어져 있다. ∴ 컴퓨터가 이 세 가지의 간단한 논리 게이트 회로만으로 구성될 수 있다. (입력 → 출력)
조합회로란?
입력과 출력을 가진 논리 게이트들의 집합
출력 값은 입력 값 0과 1의 조합에 의해 결정된다.
기억능력이 없고, 게이트 자체가 기본이다.
반가산기, 전가산기, 디코더, 멀티플렉서, 디멀티플렉서가 있다.
<진리표>
INPUT
OUTPUT
A
B
논리곱 (AND)
논리합 (OR)
논리부정 (NOT)
배타적 논리합 (exclusive OR = XOR)
부정논리곱 (NAND)
부정논리합 (NOR)
0
0
0
0
¬A = 1
0
1
1
0
1
0
1
1
1
0
1
0
0
1
¬A = 0
1
1
0
1
1
1
1
0
0
0
CPU의 계산 담당 모듈 ALU(산술 논리 장치, Arithmetic Logic Unit)이 산술 연산을 설계한다.
e.g. 가산기(Adder) 배타적 논리합과 논리곱의 조합
CPU의 저장 능력 (= 레지스터)
"정보를 기억하는 회로"를 순서논리회로(Sequential Logic Circuit)라고 하는데, 이는 조합논리회로에 기억소자를 포함시킨 것이다. 즉, 회로가 정보를 기억하도록 만든 것이며, 이들은 대부분 전기신호를 기억하고 있다.
순서회로란?
조합회로와 달리 정보의 이전 상태를 기억할 수 있는 게이트들의 집합
입력 값과 회로의 현재 상태에 따라 출력값이 결정됨
플립플롭, 레지스터, 카운터가 있다.
순서논리회로에서는 '회로의 상태'가 출력값에 영향을 끼치게 되는데,
이 회로의 상태를 저장하기 위해서 사용하는 회로가 플립플롭(Flip-Flop) 이다.
플립플롭이란?
1비트의 정보를 저장
입력 신호가 변하기 전에는 현재의 상태를 그대로 유지
클럭 신호를 래치의 입력값으로 받은 것
메모리(기억 회로)로서 활용될 수 있다.
주로 활용되는 플립플롭
SR 플립플롭 (Set / Reset)
JK 플립플롭 (Set / Reset / Toggle)
D 플립플롭 (Data or Delay)
T 플립플롭 (Toggle)
생성된 데이터가 회로 내에 그대로 유지되려면 어떻게 해야 할까?
외부로부터의 입력이 사라지더라도 그 출력값을 그대로 유지하는 구조의 회로를 래치(latch)라고 한다.
OR 게이트 래치
출력값을 자신의 입력값으로 사용하는 순환구조 = 피드백
래치는 피드백으로 인해 특정한 출력값을 유지할 수 있다.
위와 같은 OR 게이트 래치로는 출력값을 set(1)하고 유지시킬 수는 있지만, set(1)하고 reset(0)할 수는 없다.
출력값을 자유자재로 변경하려면, 피드백 과정에 간섭할 수 있는 수단을 추가해야 한다.
위와 같은 방식으로 우리는 회로 내에 비트 단위로 데이터를 저장할 수 있다.
가장 보편적으로, 두 개의 부정 논리곱 게이트(non-conjunction gate)의 조합으로 "정보를 기억하는 회로"를 만들 수 있다.
이 방법을 S-R 래치(set-reset latch) 구조라고 한다.
첫 번째 부정 논리곱 게이트의 출력은 다른 부정 논리곱 게이트의 입력이 되는 방식으로, S, R의 입력값에 따라 정보를 유지, 1, 0의 출력을 가질 수 있다. 이런 기능적 원리로 회로에 정보를 저장하게 되는 것이다.
이를 더 발전시켜 하나의 입력값으로 저장하는 회로(D 래치)를 구현할 수 있다.
실제로 저장하는 데 필요한 입력은 비트 하나이며, D 단자에 따라 회로의 저장값이 달라진다. E(Enable)단자는 저장 여부를 선택하는 데 사용된다. D 단자가 0이면 전체 회로가 저장하는 것은 0이며, 그렇지 않으면 1이 된다.
D latch
바로 이 회로가 1비트를 저장할 수 있는 메모리가 된다.
이 회로를 4개 이어 붙이면 4비트를 저장할 수 있는 회로가 되는데, 이것이 바로 레지스터(register)이다.
더 많은 정보를 저장하고 주소를 지정하기 위해 더 복잡한 회로를 구축하고, 8비트를 1바이트로 규정하고 각각의 바이트에 번호를 부여한다. 이 부여된 번호를 이용하여 회로에 저장된 정보를 읽을 수 있는데, 이걸 메모리(memory)라고 한다.
메모리는 회로로만 이루어져 있기 때문에, 전원이 꺼지면 저장할 수 없다.
안정성 문제 (=클럭 신호)
이제 위와 같은 회로는 연산 능력과 저장 능력을 갖추고 있으며, 명령어로 회로에 무엇을 해야 하는지 주문할 수 있다.
하지만 한 가지 더 고려해야 할 점은 회로란 철저히 물리적인 특성의 거래를 하는 기계라는 것이다.
1.
데이터를 변경하려는 주문이 없음에도 set이나 reset에 1이라는 입력값이 들어온다면 어떻게 될까? 래치는 당연히 이를 받아들이고 출력값을 설정할 것이다.
이런 문제를 최소화하기 위해서 안전장치가 필요하다.
저장하려는 데이터에 대한 입력값, 회로에 데이터를 저장하라는 명령의 입력값을 동시에 취급하도록 하는 것이다.
2.
입력값들에 부합하는 연산 결과가 게이트들을 지나 출력값으로 나올 때까지는 시간이 걸리며, 이를 전파지연이라고 한다.
이 지연되는 시간만큼의 구간동안 다음 연산의 수행을 지연해야 전파지연 시간으로 인한 문제를 방지할 수 있다.
위 두 가지 문제를 방지하는 목적으로,
각 부분의 회로가 함께 작업할 수 있도록 조정하거나 동기화하는 역할을 맡고 있는 것이 클럭 신호(clock signal)이다.
클럭 신호(clock signal) : 시간의 경과를 알려주는 데이터 입력값. e.g.지휘자 역할, 지휘봉 클럭 주파수(clock rate) : 1초 동안 일어나는 클럭 신호 횟수
클럭 신호
이 클럭을 래치의 입력값으로 받아 적절하게 사용함으로써 위의 문제점들을 해결할 수 있다.
⌛ 위에 잠깐 이야기했던 플립플롭이 드디어 완성될 수 있다. clock이 변하는 순간의 신호를 에지(edge)라고 하며, 0에서 1로 변할 때는 양의 에지, 1에서 0으로 변할 때는 음의 에지라고 한다. 플립플롭이란, 에지에 의해 데이터 변화가 촉발되는 래치(dege-triggered latch)이다. 이 중 가장 흔하게 사용되는 D-플립플롭은 양의 에지에 의해 데이터 변화가 촉발되는 플립플롭을 의미한다.
이들을 한데 묶어 중앙 처리 장치, 즉 CPU 또는 프로세서(processor)라고 한다.
CPU(프로세서) = 산술 논리 장치 + 레지스터 + 클럭 신호
산술 논리 장치: 각종 연산 설계 레지스터: 정보를 저장 클럭 신호: 동시 작업을 위한 제어