Resistor와 Register는 전혀 다른 것이다.
Flip Flop(FF)이란 1bit, 즉 0 또는 0인지를 기억할 수 있는 소자를 말한다(Latch란 이런 소자를 통칭하는 말이다). Register는 Flip Flop의 집합이며 결국 n-bit register 라는 것은 n개의 정보를 저장할 수 있는 n 개의 Flip Flop Group을 말한다.
CPU 내부에는 메모리 대신에 메모리보다 매우 더 빠른 register가 쓰인다. 물론 CPU 외부에도 register가 있을 수 있다. CPU만 register를 사용할 수 있다는 편견을 버리길.
고속이면서 비싸니까 CPU 내부에 몇 개 밖에 안 들어 있는 것이고 그러다보니 CPU가 정말 필요로 하는 정보를 그때그때 저장하고 버리다보니 결국 '일시적인 기억장치'처럼 정의 내려진 것이다.
Register output에는 간단한 data-processing operation (데이터 처리 명령)을 할 수 있는 gate combination을 덧붙일 수 있다. 이 의미는 어떤 특정한 register가 특정한 task를 수행하기 위해서 존재할 수도 있으며 이 특정한 register에 약속된 특정 값을 write 함으로써 trigger시킬 수 있다는 의미이다. 이런 특징 덕택에 Register를 이용한 memory mapped I/O 구현이 가능해진다. (뒤에서 다룸)
가장 간단한 형태의 FF는 NOR gate 두 개의 output을 다시 서로의 input으로 feed back하는 형태로 생겼다. R-S(Reset Set) F/F라고 부르기도 한다.
Data in은 data input, Writer는 Write Enable이며 true가 되어야 data in을 위쪽 AND gate나 아래쪽 AND gate로 넣을 수 있다.
Write 신호가 항상 true라는 가정 하에
R은 Reset(초기화하는 놈)이고, S는 Set(설정하는 놈)이라는 이름을 붙여서 살펴 본다면,
R = 1, S=0 이면 R쪽 NOR gate의 output은 무조건 0이 된다. (NOR gate에서 하나가 1이면 output은 모로가도 0이기 때문)
R = 0, S=1 이며 R쪽의 NOR gate의 output은 무조건 1이 된다. (S쪽 NOR gate output이 항상 0이므로 이것이 다시 R쪽 NOR gate input이 들어가서 0 XOR 0이 되므로 output은 항상 1)
결국 R은 data out에 대한 Reset. S는 data out에 대한 set이며 둘은 같은 값을 가지면 안 된다. 이런 FF회로를 RS Flip Flop이라 부르고 다음 input이 들어올 때까지 data out을 유지하며 결국 Memory 기능을 가지고 있다는 뜻이다.
DI (Data In), DO (Data out), W (Write Enable 신호)을 의미한다. W가 high를 유지할 때 Write가 가능하고 DI를 기억하며, 그 외에는 기존 DI값을 기억만한다. DO에 뭔가 데이터처리 회로를 달아서 DO가 true가 되는 순간 뭔가를 처리할 수 있게 하는데 이런 것을 일컬어 Level Trigger latch라고 부른다.
Edge Trigger는 RS F/F 두 개를 묶어서 만드는데 clk이 올라가는 순간이나 내려가는 순간에만 write가 가능하고 그 외의 순간에는 그 전에 write된 값을 기억한다. 작은 삼각형은 Edge Trigger 방식이라는 뜻이다. clk이 0->1로 변할 때 write하는 경우를 rising edge trigger, 그 반대를 falling edge trigger라고 한다.
Rising edge trigger는 clock이 0에서 1로 올라갈 때 아래 열의 default signal을 input으로 받아들여서 data를 저장(capture)한다.
I0~I3 (input), A0~3(output data), write 신호가 edge일 경우에만 input data로 ouput들이 업데이트되며 그 내용을 유지한다. 아래는 write 신호에 대해 edge triggering 되는 4bit latch 또는 4bit register라고 한다.
이런 의미에서 register는 2가지 종류로 나눌 수 있다.
1. General Purpose Register
- 주소 레지스터 : 외부 메모리에 쓰거나 읽을 떄, data가 들어 있는 주소를 가리키는 값을 넣어둠
- 데이터 레지스터 : 외부 메모리에서 읽어온 값을 임시 저장하는 register이며 data input register와 data output register로 나눔
- instruction pipeline register : 외부 메모리에서 읽어온 opcode(명령어)를 저장.
2. Special Purpose Register
- Program counter : 현재 실행되고 있는 주소를 가리키는 register
- Stack pointer : 현재 사용하고 있는 stack 영역에서 마지막에 데이터가 push된 곳의 주소를 가리키는 register
- Linked Register : 수행하다 점프했을 경우 돌아갈 곳의 주소를 가리키는 register.
- Status Register : MCU의 현재 상태를 나타내는 register. (현재의 mode, 계산 결과 값의 상태 등)
그리고 I/O Register라는 것이 있다. 기억장소처럼 보이지만 실제로 D F/F로 구성되어 방금 저장된 값을 기억하기도 하고, 주변 장치를 향해 그 값을 밀어내는 역할도 한다. readonly, writeonly, read-write 중 하나의 property를 가지고 있다.