본 시리즈은 비전공자가 공부한 computer science, 그중에서도 컴퓨터구조를 정리한 글입니다. 틀린내용이 있다면 댓글로 알려주시면 정말정말 감사하겠습니다. 참고한 책은 Computer Organization and Design MIPS Edition입니다
이번 포스팅은 3주차 마지막 주제인 Processor에 관한 내용입니다. 여기서 말하는 processor은 물리적인 CPU를 의미합니다. 우리가 지금까지는 0과1을 이용해서 컴퓨터에게 명령을하는 방법에 대해서 배웠는데 오늘부터는 실제 이 binary 명령이 CPU에서 어떻게 동작하는지를 배우게됩니다
정말 컴퓨터의 물리적인 구조를 배우는군요... 암튼 시작해보겠습니다
방금 제가 이런이야기를 했죠?
여기 나오는 Processor은 물리적인 CPU를 의미합니다
그렇기 때문에 우리가 CPU에 대해서 안다는것은 1차원적으로 회로
에 대한 공부를 하게된다는것을 의미합니다. 그렇다면 회로의 종류에는 어떤게 있을까요?
위의 그림과 같이 조합회로와 순차회로가 존재합니다
우리는 순서대로 조합회로먼저 알아보려하는데 그전에 약간 알아야할 개념이 몇가지 있습니다.
첫번째는 진리표라는건데 제가 처음에 이거를 읽고 해석하는데 애를좀 먹어서 이참에 조금 설명을 붙이고 가려고합니다.
CPU는 0과 1의 명령을 받기때문에 각각의 input은 0이거나 1일수있습니다. 그렇다면 0을 1의 not연산이라고 생각할 수 있을거고 input이 두개(A,B)라면 가능한 연산의 경우의 수는
A'B'
, AB'
, A'B
, AB
input은 이렇게 총 네가지가 될겁니다. 그러면 input에 대한 out은 어떻게 될까요? 만약에 out이 sum of product로 표현을한다고 하면 말그대로 각각의 input을 더하면되는데요 여기서 약간의 문제가 발생합니다 output을 하나로 하자니 1+1의 연산결과와 1+0혹은 0+1의 연산결과가 동일해지는거죠. 그래서 output의 field를 두개로 둬서 이 두가지 output을 분리해낼수 있습니다
output에는 sum과 carry의 두가지 field를 가지고 있게되고 이렇게 모든 연산의 경우에 수에 output을 표현할 수 있게됩니다.
이를 진리표라고 합니다
각각의 output을 수식으로 표현할수있는데 Sum = A'B + AB'
, Carry = AB
이런식으로 각각의 결과가 1인 경우의 수 연산들의 합으로 각각의 output을 정의할 수 있습니다
예시를 한가지 더 들어보고 다음 주제로 넘어가보겠습니다
만약에 input에 AB말고 C가 하나더 있다고 가정해보겠습니다. 그렇다면 당연히 연산가능한 경우의 수는 총 8가지가 나오겠죠 그리고 각각의 output을 Sum과 Carry로 나눠보면 아래와같은 진리표를 얻을 수 있습니다
그리고 각각의 Sum과 Carry는 아래와 같은 수식으로 표현할 수 있습니다.
C = A'BC + AB'C + ABC' + ABC
S = A'B'C + A'BC + AB'C + ABC
이걸 논리게이트 실제 register라고 생각하고 그림을 그려보면 아래와같은 논리게이트로 표현이 가능합니다.
또한 추가로 이렇게 각각의 input이 1비트이고 carry in이 있는걸 1bit full adder
라고 합니다. carry in이 없는 경우에 1bit half adder
라고 합니다.
근데 우리가 지금까지 배웠던걸 생각해보면 늘 32bit를 연산해왔었잖아요? 그러면 매번 모든 연산에 1bit full adder를 32개를 그려가면서 연산을 할수가없기때문에 이런식으로 1bit씩이 아니라 4bit씩 연산할 수있는 adder가 있습니다.
위의 그림처럼 4bit adder의 경우엔 실제로 1bit full adder가 4개가 연결된 회로이고 왼쪽그림처럼 표현할 수 있습니다.
자 이제 지금부터 본격적으로 조합회로
에 대해 알아보겠습니다 우선 조합회로의 종류에 대해서 알아보겠습니다
이렇게 총 네가지의 조합회로가 있는데요 각각의 input을 AND연산하는 AND게이트 그리고 좀전에 배웠던 Adder 그리고 남은 두개에 대해서 간단하게 설명하고 넘어가겠습니다
우선 multiplexer는 둘중 하나의 input이 S라는 control input에 따라 하나의 output이 되는 조합회로입니다. 예를들면 그림에서 s가 1이라면 I0가 그대로 output이 되는 그런 방식입니다.
ALU의 경우엔 A라는 input과 B라는 input을 받아서 F라는 control input에 따라 연산이 바뀌는 조합회로이고 A와 B는 32bit입니다.
순차회로에 대해서 알아보겠습니다.
순차회로는 연산된 데이터를 저장해두었다가 나중에 읽어내기 위해 사용된다
라고 합니다. 이 말의 뜻은 우리가 흔히 메모리
라고 부르는 역할을 하는 회로인거죠. 자 그러면 가장중요한 어떻게?
에 대해서 알아보도록 하겠습니다
우리가 지금까지 배웠던것중에 데이터를 저장하는건 register가 있었습니다. register에 값을 넣었고 값을 읽어왔었죠. register가 대표적인 state elemtent입니다.
데이터를 저장할때는 어떤방식인지를 위의 그림을 보면서 설명을해보겟습니다.
우선 register에 input이 들어오겠죠? 그러면 빨간색네모처럼 값자체가 input이 들어왔다는걸알려줍니다.
근데 output이 여기서는 실제로 데이터가 저장되는건데 실제로 데이터가 저장이 되지는 않는걸 볼수있습니다. 이는 맨위에있는 clk이 0에서 1로 rising될때 input이 output으로 데이터가 저장되기 때문입니다.
그래서 실제로 초록색네모를 보면 clk가 1이되는 순간 약간의 딜레이 후에 input이 반영되는걸 볼 수 있습니다.
하지만 실제 register에는 write control이라는게 존재하는데요 아무리 clk가 rising되더라도 write control이 1이 아니면 데이터가 저장되지 않습니다.
빨간색네모처럼 input이 들어오고 rising이 되었지만 write control이 0이어서 output이 반응하지않고 초록색네모처럼 rising이 되는순간 write control이 1인상황이라 output이 반응하는 모습을 볼 수 있습니다.
전체적인 그림을 보면 특정상태가 Combinational logic에 의해서 다른 특정상태가 되는게 닫힌 회로로 볼수가 있습니다
그리고 중요한 것중에 하나가 로직연산의 시간적 길이가 clock의 한 cycle보다는 반드시 작도록 설계를 해야합니다. 그래야 데이터의 input당 하나의 output을 보장할수 있게됩니다.
그러면 실제로 register에서 어떤일이 일어나는지 알아보겠습니다
위의 그림은 메모리에 값을 저장하는(write)의 경우입니다
우선 input으로 address가 들어오고 보니까 MemWrite가 1이고 MemRead가 0이죠? 그러면 ReadData에는 아무런 값이 나가지 않고 WriteData에서 받은20080064라는 값이 address에 write되게 됩니다
위의 그림을 보면 MemRead가 1이기 때문에 input address의 기존값을 output으로 전달하게 됩니다.
이렇게 두가지를 모두할 수 있는 Register의 전체적인 그림입니다
read의 경우엔 register번호가 input으로 들어와서 각각의 register에 들어있는 data가 각각의 output으로 나가고 write의 경우엔 write할 register번호와 data를 input으로 받아서 write하는 방식으로 연산이 이루어집니다
(위 그림에서 화살표방향대로 수행)
하나의 instruction을 어떻게 수행하는지 알아봤습니다
하지만 사실 spim에서 봤던것처럼 pc주소가 계속 증가하면서 그때마다의 binary값들을 가지고 instruction을 수행하는데 그 진행방식은 어떻게 회로로 구현되어있을까를 알아보는 시간입니다
우선 그전에 컴구를 처음배울때 봤던 그림을 한번 다시 보고 넘어가보죠
우리가 binary로된 instruction을 memory에서 받아와서 dataPath라는 곳을 통해 넘겨주면 control이 명령을해석해서 명령을 수행해주는 흐름이었습니다
여기서 dataPath의 역할은 한번에 하나의 function을 수행할수 있게 해주는 역할을 합니다
그렇다는 말은 한번의 function이 한번의 clock cycle에 실행되어야하며 우리가 한번에 하나의 기능(function)을 수행할수 있기때문에 instruction을 읽고 데이터를 읽는 기능은 각각의 기능이기때문에 instruction을 읽고 데이터를 읽는걸 나눠서 수행을하게됩니다.
요약을 해보면 우선 아래의 두가지가 계속 반복되게됩니다
1. fetch instruction을 해서 pc의 주소에서 instruction을 읽어옵니다
2. 그 명령어를 수행합니다
물론 pc의주소가 매번 4byte씩 늘어나야하기때문에 1번과정에서 자동으로 메모리 address에 4의 값을 더해줘야합니다.
우선 1번째인 instruction 명령어를 읽어오는 논리회로입니다
이는 data path의 첫번째 part
이고 instruction fetch
라고합니다
pc에서 address를 instruction memory에 input에 넣어주면 해당 address의 instruction을 output으로 보내주고 현재 pc주소에서 4만큼더해서 다시 pc의 input으로 넣어줍니다. 그러면 다음 clock cycle에서는 다음 pc주소의 instruction을 output으로 보내줄 수 있게됩니다.
그렇게해서 output으로 나온 instruction을 수행하게되는데 이를 data path의 두번째 part
이고 execution of Artihmetic/Logic instructions
라고합니다.
두개의 회로를 거치는데 데이터를 읽고쓰는 register의 out이 ALU회로의 input으로 들어가게됩니다.
instruction fetch
를 통해 instruction을 input으로 register가 받게 되고 우리는 이 이진명령에서 format을 통해 몇번 register의 값을 읽고써야할지 알수있게됩니다. 그리고 각각의 data의 연산이 필요하다면 각각의 read data를 ALU의 input으로 넣어주면됩니다
그리고 그 결과를 다시 register의 write data에다가 넣어주면 input에 있던 write register와 함께 처리가 되어서 데이터가 저장되는 과정을 거칠수있게됩니다
execution of Artihmetic/Logic instructions
의 과정을 좀 자세하게 보면 좋을거같아요
우선 instruction fetch
를 통해 이진화된 instruction이 input으로 들어왔고 rs rt rd가 주어지고 op code와 funct code를 통해 연산은 add를 해야한다는걸 알게됩니다 (ALU에서 add는 0010이니까 op와 funct를 통해 0010이라는 값이 ALU operation으로 설정됩니다)
우선 rs rt의 값은 읽어야하니 8번 register의값과 9번 register의 값이 output으로 나가고 그 두개의 값이 ALU를 통해 더해지고 그 결과를 다시 register의 write data와 연결을 시켜줍니다
이떄 이미 rd의 값은 register의 input으로 들어왔기때문에 2번 register에 ALU의 output을 저장해줍니다
이 때 중요한건 clock이 0에서 1로 rising할때 값이 써지게됩니다
3주차 컴퓨터구조의 마지막주제로 CPU에서 instruction을 수행하는 회로에대해 기본적인 개념을 공부해봤습니다
이전에 공부했던 내용들을 실제로 회로에서 어떻게 동작하는지를 배웠다고생각하면 좋을거같아요
3주차 내용이 정말 방대해서 내용을 정리하는데 5~6시간이 걸린거같아요...(사람살려...)
전공책을 기반으로 정리하는 글이기때문에 나름대로 최대한 이유가있는 설명을 한다고는하지만 분명히 틀리거나 추가로 들어가야할 내용이 있을수있기때문에 언제든지 댓글로 알려주세요!
그럼 20000!!!!