컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (17)

나빌레라의 이미지

#17. 완전 자동화를 꿈꾸다.

인간이 일상 생활에서 가장 하기 싫어하는 것은 무엇일까? 물론 정답은 없다. 사람마다 모두 다른 답을 말할 것이다. 나는 "귀찮은 모든것"이라고 대답하고 싶다. 문명의 발달은 다른 시각에서 보면 끊임없이 귀찮은 것들을 없애가는 과정이라고 할수 있지 않을까. 나도 이야기를 계속하면서 계산의 귀찮음을 대신하기 위해 가산기를 만들었고, 기억의 귀찮음을 대신하기 위해 레지스터를 붙였고, 연속되는 입력이 귀찮아 SRAM을 붙였고, 계산 결과를 기억하기 귀찮아 레지스터와 SRAM을 연결했고, 입력 자체도 한 번에 해 버리기 위해 보조 기억 장치까지 만들었다. 여기까지 오면서 아직도 자동화하지 않은 것이 있다. 바로 각 소자의 CLK 입력이나 R/W, SEL, SUB/ADD 따위의 제어 신호들이다.

회로상에 여기저기 있는 제어 신호를 한 곳으로 몰았다. 신호선을 모은 곳을 컨트롤 유닛(Control Unit)이라고 부르겠다. 그냥 제어기라고 부를까. 아니다 컨트롤 유닛이라고 부르겠다. 컨트롤 유닛의 내부는 아래 그림과 같이 그냥 스위치만 있다.

어떤 동작을 하고 싶을 때에는 그 동작에 맞는 제어 스위치를 열고 닫아주면 된다. 예를 들면 현재 PC가 가리키고 있는 SRAM에서 연속된 두 값을 꺼내 레지스터 A와 레지스터 B에 넣고, 곱한 결과를 다시 SRAM에 넣는 작업을 하고 싶다면 컨트롤 유닛의 스위치를 아래 순서로 조작하면 된다.

1. 현재 PC가 가리키고 있는 SRAM의 값을 레지스터 A에 넣는다.
SRAM MUX SEL : off off
SRAM DEMUX SEL : off off
Reg A MUX SEL : on
SRAM R/W : on
MUL/DIV : off
SUB/ADD : off

(PC 자동 증가)
2. 현재 PC가 가리키고 있는 SRAM의 값을 레지스터 B에 넣는다.
SRAM MUX SEL : off off
SRAM DEMUX SEL : off on
Reg A MUX SEL : off
SRAM R/W : on
MUL/DIV : off
SUB/ADD : off

3. 레지스터 A와 B를 곱함
SRAM MUX SEL : off off
SRAM DEMUX SEL : off off
Reg A MUX SEL : off
SRAM R/W : off
MUL/DIV : on
SUB/ADD : off

4. 곱한 결과를 다시 SRAM에 저장
SRAM MUX SEL : off on
SRAM DEMUX SEL : off off
Reg A MUX SEL : off
SRAM R/W : off
MUL/DIV : off
SUB/ADD : off

위 내용처럼 각각의 스위치를 제어해서 회로에 원하는 동작을 시킬 수 있다. 공교롭게도 현재 스위치가 딱 여덟 개다. 1바이트로 표현 가능하다. 위 네 개의 절차를 이진수로 다시 표현할 수 있다.

1.레지스터 A에 값을 가져옴 : 00001100
2.레지스터 B에 값을 가져옴 : 00010100
3.두 값을 곱함 : 00000010
4.곱한 결과를 다시 SRAM에 저장 : 01000000

이진수를 이용해 기계에 명령을 내릴 수 있다. 이렇게 기계에 명령을 내리는 이진수를 기계어라고 한다. 우리가 “프로그래밍 언어로 프로그램을 작성하면 컴파일러를 통해 최종적으로 기계어가 된다.”라고 많이 외우고 있는 이론에 나오는 기계어가 바로 내가 위에서 이야기한 기계어다. 우리가 많이 사용하는 인텔 CPU나 ARM 칩은 이 기계어가 내가 이야기한 것보다 더 길고 복잡할 뿐 기계어가 하는 본질적인 역할은 같다. 결국 CPU 내부 소자들을 제어하는 것이 기계어의 역할이다.

앞서 이야기를 돌이켜 보면 이진수로 표현 가능한 것들은 전부 자동화했다. 기계어 입력도 자동화해 보자. 방법은 간단하다. 램을 달면 된다. 컨트롤 유닛 안에 있는 스위치는 현재 여덟 개다. PC는 자동 증가하기 때문에 PC쪽에 있는 CLK는 제어할 필요가 없다. ALU의 입출력을 자동화했을 때와 마찬가지로 컨트롤 유닛의 입력에 램을 연결하면 자동화할 수 있다.

그림이 번잡스러워서 앞서 그렸던 그림의 파란 연결선을 지웠다. 대신 화살표가 달린 직선을 그렸다. 여러분들은 화살표가 각각 아까 파란선이 연결된 핀으로 연결되어 있다고 해석해 주시기 바란다.

컨트롤 유닛 위에 별도의 SRAM을 달았다. 그리고 ALU로 연결되는 경로에 SRAM이 하나 더 있다. 이처럼 제어를 담당하는 램과 데이터를 담당하는 램이 따로 있는 구조를 흔히 '하버드 아키텍처'라고 부른다. 그리고 컨트롤 유닛 위에 달린 램을 코드 램, ALU 위에 달린 램을 데이터 램이라고 부른다. 나도 그렇게 표현하겠다.

데이터 램과 마찬가지로 코드 램에도 PC가 있어야 한다. 코드램의 출력도 8비트므로 코드 램 PC의 가산기 연결은 데이터 램 PC의 가산기 연결과 동일하다. 그리고 데이터 램의 입력을 보조 기억 장치로 자동화 했듯이 코드 램의 입력도 보조 기억 장치로부터 받도록 회로를 수정하자.

전체 회로는 너무 커서 필요한 부분만 그렸다. 보조 기억 장치에서 코드 램으로 데이터 선을 연결할 때 MUX를 쓰지 않았다. 보조 기억 장치에서 코드 램으로 데이터를 입력할 때는 데이터 램의 CLK에 입력을 주지 않으면 된다. 마찬가지로 보조 기억 장치에서 데이터 램으로 입력할 때도 코드 램의 CLK에 입력을 주지 않으면 코드 램으로 불필요한 데이터가 입력되지 않는다.

현재 까지 컨트롤 유닛의 입력 값으로 제어할 수 있는 동작들과 해당 기계어는 다음과 같다.

더하기 : 0x00
빼기 : 0x01
곱하기 : 0x02
나누기 : 0x03
레지스터 A로 읽어오기 : 0x0C
레지스터 B로 읽어오기 : 0x14
레지스터 A의 값을 램에 저장 : 0x40
레지스터 B의 값을 램에 저장 : 0x80

무려 여덟 가지의 동작이 가능하다. 앞에서도 잠깐 나왔지만 이제 프로그래밍이라는 것이 가능할 정도의 수준으로 진화했다. 사칙 연산과 램에서 데이터 읽기/저장하기가 가능하니 간단한 가계부 프로그램 정도는 충분히 작성할 수 있지 않을까?

아무것도 없는 상태에서 시작한 내 이야기가 어느덧 프로그래밍이 가능한 기계를 만드는데에 이르렀다. 이렇게 하나씩 차근차근 단계를 발전시켜 나가며 이야기해 보면 컴퓨터라는 녀석도 사실 별거 아니다. 이 글을 읽는 사람들은 아마 컴퓨터를 아무것도 모르는 사람은 아닐 것이다. 컴퓨터에 대해 어느 정도 지식이 있는 사람들일 것이다. 하지만 내가 이야기를 진행하는 방식으로 컴퓨터를 이해해 보려고 생각했던 사람은 아마 많지 않을 것이다. 대학교에서 컴퓨터 구조론을 가르치기는 하지만 너무 원리적 설명과 많은 이론을 다양하게 가르치려다 보니 배우면서도 이해를 못하는 경우가 많다. 나도 그랬다. 이 이야기를 쓰면서 오히려 더 많은 것을 스스로 깨우치기도 했다. 여러분들도 이 이야기를 통해서 몰랐던 사실을 하나라도 얻어가기 바란다.

이제 하드웨어 구성에 대한 설명은 거의 끝나 간다. 조금씩 소프트웨어에 대한 이야기들이 나올 것이다. 기대해 주기 바란다.

File attachments: 

댓글

qwerty4604의 이미지

글 잘 읽고 있습니다.
오랜만에 처음부터 쭉 읽었는데
뭐랄까...섬뜩하네요.
컴퓨터의 전체적인 구조가 한 눈에 들어옵니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.