참고 : http://recipes.egloos.com/4972694
레지스터란 무엇인가?
사전에서 레지스터의 정의를 찾으면 굉장히 복잡하게 이를 설명하는데, 그렇게 복잡하게 생각할 필요가 없다. 마이컴프로그래밍이나 컴파일러를 구현하는 우리에게 레지스터란 그저 CPU만이 쓸 수 있는 변수일 뿐이다.
과연 그럴까? 밑에 이야기를 들어보자.
- Resistor와 Register는 전혀 다른 단어이기 때문에 헷갈리면 안된다. 저항과 기억소자, 정말 다르다.
기록하다!
사실은 CPU가 적은양의 데이터나 처리하는 동안의 중간 결과를 일시적으로 저장히기 위해 사용하는 고속의 기억회로 라는 점인데, 어느정도는 확장, 수정할 필요가 있겠다.
나는 이렇게 고치고 싶다. Register는 Flip Flop의 집합이며, 이 Flip Flop이라는 것은 각각 1bit의 정보를 저장할 수 있는 것들을 의미한다. 결국 n-bit Register라는 것은 n bit의 정보를 저장할 수 있는 - 결국 n개의 Flip Flop으로 이루어진 - Flip Flop의 Group을 말하는 것이다. 이런 의미에서 Register라는 것은 최소 1 bit 단위로 정보를 저장 또는 수정할 수 있다.
즉 7 bit Latch나, 7 bit Register나 7개짜리 Flip Flop 한 묶음이나 같은 이야기이다.
그리고 Register는 굳이 CPU만 연산 중간이나 결과에 사용한다고 볼 수는 없고, CPU 내부에는 메모리 대신에 메모리 보다 훨씬 더 빠른 Register가 쓰이고 있다 정도로 이해를 하면 되겠다.
그러는 이유는 그렇게 이해하고 있다면 CPU 외부에는 Register가 없다고 생각을 가둘수도 있기 때문에 조금 위험한 생각 방향이다. CPU 내부 뿐만 아니라 외부에도 Register는 있을 수가 있다. 때에 따라서는 Memory도 이런 Register의 모음으로 구성될 수 있다. 용도에 따라 다르기 때문에 CPU만 Register를 사용할 수 있다는 편견을 버려야 한다.
결국에는 고속이며 비싸니까 CPU 내부에 몇개 안들어 있고, 그러다 보니 CPU가 정말 필요로 하는 정보를 그때 그때 저장하고 버리다보니 결과적으로 일시적인 기억장치처럼 정의가 내려진 것이다.
한가지 덧붙이자면 n-bit Register는 n 개의 Latch로 이루어 지며, 이런 Register들의 output에는 간단한 data-processing operation을 할 수 있는 gate combination이 덧붙여 질 수도 있다. 이 의미는 어떤 특정한 Register는 특정한 task를 수행하기 위해 존재할 수도 있으며, 이 특정한 Register에 약속된 특정 값을 write 함 으로서 특정한 일을 시킬 수도 있음을 의미한다. 이런 특징 때문에 Register를 이용한 Memory mapped I/O 구현이 가능해진다.
Register의 동작을 설명하기 위해서는 Flip Flop이라는 논리 회로를 이해 해야 한다. 사전적 의미로...
Flip - 프라이팬을 홱 뒤집다.
Flop - 벌렁 드러눞다.
라는 뜻을 가지고 있으며 드러누웠다가 홱 뒤집혔다가 다시 드러누웠다가 하는 회로 이다. 가장 간단한 형태의 Flip Flop이라는 것은 실은 NOR gate 두개의 output을 서로의 input으로 다시 feed back 하는 형태로 구성된다. R-S(Reset Set) F/F라고 부르기도 한다. 자세히 보면 Data In은 data input이고, write는 Write Enable이라고 해서 Write TRUE가 되어야 Data In을 위쪽 AND gate나 아래쪽 AND gate로 넣을 수가 있다.
Write 신호가 항상 TRUE라는 가정아래.
R은 Reset이고, S는 Set이라는 이름을 붙여서 살펴 본다면,
R = 1이고, S = 0 이면 R쪽의 NOR gate의 output은 무조건 0이 되며,
R = 0이고, S = 1 이면 R쪽의 NOR gate의 output은 무조건 1이 된다.
R = 1인 case에는 같은 NOR gate의 다른 input과 상관 없이 OR해서 1이 output되며, 이 것이 inverting이 되니 0이 된다. 복잡하게 생각하지 말고, 이렇게 간단하게 생각해보자.
결국 R은 Data out에 대한 Reset, S는 Data out에 대한 set이라고 보면 되며, R과 S는 같은 값을 가져서는 안된다. 이런 식이라면 R과 S를 잘 control하면 Data out에 뭔가를 넣을 수 있겠다.
그렇다면 Data In은 S와 R에 들어갈 Data 이므로 S 쪽에는 Data 원래 형태 그대로, R쪽에서는 Data를 Invert하여 넣으면 되고, 중요한 것은 이런 Flip-Flop 회로는 다음 input이 들어올 때 까지 Data Out을 유지하고 있다는 점이다. 결국 Memory 기능을 가지고 있다는 뜻이다. 이런 Flip Flop을 RS Flip Flop이라고 부른다.
지금 보는 Input은 Write 신호가 TRUE가 된 경우에만 Data In이 입력이 되고 DO에 기억 - 유지하고 있다. 그래서 이런 1bit을 저장할 수 있는 Flip-Flop 회로를 보고 있는 한개의 기호로 나타내기 시작했다.
DI는 Data In, DO는 Data Out, W는 Write Enable 신호이다. 이런 Latch를 이용하여 무엇인가를 잠시 저장하는 Latch들을 이용한다. DO에 어떤 Data processing 회로를 달아서 DO가 True가 되는 순간 어떤 일을 할 수 있게도 한다.
이러한 것을 Level Trigger latch라고 부른다. W가 High를 유지할 때, Write가 가능하고 그 외에는 값을 기억하고 있다는 의미이다. 왜 굳이 Level Trigger라고 부르는가? 하면 Edge Trigger D type latch라는 것도 있기 때문이다. 결론은 Level Trigger Latch는 Write 신호가 High로 올라가 있는 동안 입력된 Data(DI)를 기억 한다는 것이다.
Edge Trigger는 R/S F/F 두개를 묶어서 만드는데 CLK이 올라가는 순간이나, 내려가는 순간에만 Write가 가능하고 그것이 아닌 순간에는 그 전에 write된 값을 기억한다.
Edge Trigger는 아래와 같이 표현된다.
흔히 Level Trigger Flip Flop을 Latch, Edge Trigger Flip Flop을 그냥 Flip Flop이라고 부른는 경향이 있는데 매한 가지 이다. 또 어떤 때는 Latch는 Clock에 따른 동기화가 없는 것, Flip Flop은 Clock을 넣어서 동기화 것 으로도 나누기도 한다.
CLK부분의 작은 삼각형은 Edge Trigger 방식이라는 뜻이다. CLK이 0에서 1로 변할 때 값을 write 하는 경우에는 rising edge trigger라고 부르고, CLK이 1에서 0으로 변할 때 값을 write하는 경우에는 falling edge trigger라고 부른다. Rising Edge Trigger는 아래 그림처럼 Clock이 0에서 1로 올라갈 때의 아래 열의 default signal을 input으로 받아 들여 Data를 저장(Capture 라고도 함) 한다.
이러한 1bit Latch를 엮어 n-bit Latch(n bit Register)를 만들기도 하는데, 그런건 아래 그림과 같이 여러개의 1bit Latch를 엮어서 만들어 낸다. I0, I1, I2, I3은 모두 Input data이며, A0, A1, A2, A3는 Output data이고, Write 신호가 Edge일 경우에만 Input Data로 Output들이 Update 되며 그 내용을 유지하고 있다.
Register란 이런 Latch 여러개 또는 Flip Flop 여러개를 엮어서 n bit로 만든 것을 말한다. 아래는 Write 신호에 대하여 Edge triggering 되는 4bit Latch 또는 4bit Register라고 보면 된다.
이러한 Latch를 아래 그림처럼 하나로 타내기도 한다. 이 또한 W에 삼각형 표시가 있으니 Edge Trigger 방식이라고 봐야하겠다.
이런 Register의 저장 특성을 이용하여, MCP/CPU 내부에서 여러가지 용도로 사용한다. I/O로 이용하기도 하고, CPU Core 내의 임시 저장 공간으로 사용하기도 하며, CPU의 Register file로 이용하기도 한다.
이런 의미에서 Register는 크게 2가지 종류로 나눌 수 있다.(General Purpose Register, Special Purpose Register)
General Purpose Register
- Address Register : 외부메모리에 쓰거나 읽을 때, data가 들어 있는 주소를 가르키는 값을 넣어두는 Register
- Data Register : 외부메모리에서 읽어온 값을 임시 서장하는 Register이며, 자세히는 Data input register, Data output register로 구성.
- Instruction Pipeline Register : 외부 메모리에서 읽어온 Op-code(명령어)를 저장하는 Register
Special Purpose Register
- Program Counter : 현재 실행되고 있는 Process의 주소를 가리키는 register
- Stack pointer : 현재 사용하고 있는 Process의 stack 영역에서 마지막에 Data가 Push된 곳의 주소를 가리키는 register
- Linked Register : 방금 전까지 수행하다가 jump명을 수행했을 경우, 돌아갈 곳의 주소를 가리키는 register
- Status Register : MCU의 현재 상태를 나타내는 Register(ex: 계산의 결과값의 상태 등을 저장)
I/O Register
I/O Control을 위하여 Register를 setting 한다는 것은 정확히 표현하자면, Latch에 값음 담는다고 보면 된다. I/O Register는 기억장소처럼 보이지만, 실제로 D Flip Flop으로 구성되어 방금 저장된 값을 기억하기도 하고, 밀어내는 역할을 하기도 한다. 위에서 언급한 Register들은 보통 MPU의 WORD값과 같은 크기를 갖지만, I/O Register들은 필요한 크기 만큼만 갖는다. 3bit Register도 있을 수 있고, 7bit Register도 있을 수 있다.(n bit의 Latch라고 말하는 게 정확함.)
이런 I/O 제어 Register들은 Readonly, Writeonly, Read-Write 중의 하나의 Property를 가지고 있으며 이런 특성에 맞게 Access가 이루어져야 한다. Write 속성은 이제까지 보아왔듯이 저장 속성이며, Read 속성은 Latch의 output 부분에 따로 read 할 수 있는 line이 연결되어 있다.
Writeonly의 경우 I/O Register를 읽게 되면 실제 값과 다른 값이 읽히기도 한다. 또한 Readonly, Read-Write의 경우에도 실제 할당은 8bit 이지만, 그것보다 더 작은 bit만 구현되어 있기 때문에 읽어보면 실제 값과 다르게 보일 수도 있으니, 필요한 bit를 잘 masking해서 읽어야 한다.
저장공간으로서의 Register는 Latch로 이루어져 있으며, 고속이며, 비싼 경향이 있다. 그러다보니 많이 만들지 않고, MCU 내부에만 두고, MCU의 외부일 수록 점점 더 속도보다는 대용량이면서 저렴한 저장 매체를 사용하게 된다.
'Software > MICOM' 카테고리의 다른 글
Hi-Impedance(하이 임피던스) (0) | 2019.05.29 |
---|---|
I2S(Intergrated Interchip Sound) 통신 (12) | 2017.08.23 |
Renesas 개발일지(2) (0) | 2017.01.09 |
Renesas 개발일지(1) (0) | 2017.01.04 |
GPIO(General Purpose Input Output) 란? (0) | 2016.12.26 |