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

나빌레라의 이미지

#14. 더 많은걸 기억하고 싶다!

메멘토라는 영화가 있다. 본 사람도 많을 것이다. 이 영화의 주인공은 기억력이 10분이다. 10분 정도 지나면 10분 전의 기억을 잊는다. 그래서 이 사람은 참 사는데 애로 사항이 많았고 그로 인해 영화의 마지막에서는 결국 사람도 죽였다. 메멘토의 주인공처럼 10분이라는 시간 제한이 아니라 기억의 용량 제한이 있는 사람이 있다고 가정해 보자. 이 사람은 기억할 수 있는 사람의 수가 여덟 명이다. 그래서 아홉 번째 사람을 만나서 이 사람을 기억하면 기억 속에서 한 사람을 잊는다. 잊었던 사람을 다시 만나게 되면 분명 인사를 하고 전화 번호까지 주고 받았음에도 ‘안녕하세요. 처음 뵙겠습니다.’라는 인사를 한다. 참 살기 힘들것이다.

지금껏 우리가 만들어 놓은 컴퓨터도 아직 이정도 수준이다. 직전에 계산한 결과는 기억하지만 그 전에 계산한 숫자는 기억하지 못할 뿐 더러, 아직도 사람의 기억에 의존하고 있다. 계산 결과를 사람에게 의존하는 것은 벗어났으나, 입력 값을 입력하는 것에 대해서는 아직도 사람이 한 번 계산할 때 마다 일일이 입력하고 CLK를 넣어줘야 계산이 된다. 그렇다면 입력도 스스로 기억하게 만들어 보자.

지난 번에 그렸던 그림보다 약간 더 복잡해 졌다. 레지스터 A와 레지스터 B 위로 두 개의 큰 모듈이 붙었다. 하나는 64KB 용량의 SRAM이고 나머지 하나는 PC라는 이름이 붙은 16bit D 플립플롭이다. 지난 번에 가산기 위에 두 입력을 저장하고 있던 D 플립플롭은 이름 자체를 아예 레지스터 A와 레지스터 B로 바꿨다. 앞으로 계속 그렇게 부를 것이다.

새로 붙은 모듈에 대한 설명을 먼저 하겠다. 64KB SRAM 밑에 DEMUX라는 녀석이 있다. 이것은 전에 이야기했던 먹스와 정확히 반대로 동작한다. demultiplexer가 정식 이름이고 demux라고 줄여서 쓰기도 하며 디먹스라고 읽는다. 나는 디먹스라고 쓰겠다. 디먹스의 실제 소자 구성은 어떤지 몰라도 먹스를 그대로 뒤집어 반대로 연결해 사용해도 디먹스와 같은 동작을 한다. 먹스는 여러 개의 입력 핀 중 한 입력 핀의 입력을 하나의 출력으로 보내주는 녀석이고, 디 먹스는 하나의 입력을 여러 개의 출력 중 하나와 연결해서 보내주는 녀석이다. 위 그림에서는 SRAM의 출력으로 나오는 8비트 신호를 레지스터 A 혹은 레지스터 B 쪽으로 보내기 위해서 디먹스를 사용했다. 디먹스의 원리적 구성은 먹스와 완전 동일하기 때문에 별도의 그림은 그리지 않겠다.

64KB SRAM은 64KByte 용량을 가진 1Byte 입력 1Byte 출력 램이다. 용량이 64KByte기 때문에 주소 영역은 0x0000부터 0xFFFF까지다. 그래서 주소 입력 핀은 16비트가 필요하다. 이 SRAM은 지난 번에 이야기했던 SRAM의 규모를 늘렸을 뿐 동작 원리나 구성은 이미 모두 이야기했다.

위에서 말했듯이 PC도 레지스터다. CPU 구성에서 PC는 프로그램 카운터(Program Counter)의 약자다. PC는 CPU가 다음 번에 수행할 명령의 위치를 가리키는 포인터다라고 많이 외우고 있을 것이다. 하지만 우리가 만들고 있는 CPU는 아직 명령이란 것이 없다. 그래서 오늘 이야기의 PC는 다음 번에 가산기로 들어가야 하는 값이 저장되어 있는 메모리 주소를 가리키고 있게하겠다. 그리고 PC는 계속 하나씩 증가해야 한다. PC가 증가하지 않으면 메모리에 저장된 값을 전부 읽어올 수 없이 매번 같은 값만 읽게 될 것이다. 그래서 PC 주변에 PC 전용으로 16비트 가산기를 하나 더 달았다. 눈 여겨 볼 부분은 PC에 따로 붙은 가산기는 두 입력 중 하나로 CLK 신호를 같이 받는다. 그러면 CLK가 하나씩 인가 될 때 마다 현재 PC 값 + 1의 동작을 반복하게 된다. 그래서 PC는 계속 1씩 증가한다. 또 가산기로 가는 16비트 신호는 같은 값이 RAM의 주소 입력 핀으로도 들어가게 되므로 가산기로 들어가는 값은 RAM에 입력되고 1이 증가된 그 다음 값도 역시 RAM에 자연스럽게 입력되게 된다. 16비트 가산기와 PC는 동일 CLK를 입력받으므로 동시에 동작한다.

그럼 오늘은 1+9+10+12+21+40+37을 계산해 보겠다. 이 숫자는 지난주(358회) 로또 당첨 번호다. 로또 일 등 당첨되면 지금 쓰고 있는 이 글이 완성되는 날 자비로 천 권을 인쇄해서 선착순 천 명에게 무료로 배포하겠다. 지난 번까지는 일일이 하나씩 계산할 때마다 사람이 숫자를 레지스터에 직접 입력해 줘야 했다. 오늘은 그렇게 하지 않고 한 번에 RAM에 다 입력해 놓고 클럭만 일곱 번 넣어서 아주 빠르게 계산해 보겠다.

먼저, 숫자 일곱 개를 RAM에 입력한다. 입력이기 때문에 SRAM의 R/W 핀은 그대로 0을 입력한 상태로 둔다. 64KB SRAM의 Data In 핀에는 8개의 스위치가 연결되어 있다. 이 스위치를 조작해서 1, 9, 10, 12, 21, 40, 37을 이진수로 하나씩 입력하고 입력할 때 마다 SRAM의 CLK와 PC의 CLK에 펄스를 한 번씩 준다. 그러면 0x0000 번지부터 0x0006 번지까지 일곱 개의 숫자가 SRAM에 저장된다.

입력이 모두 완료된 후에 SRAM의 내용은 아래와 같다.

최초 PC는 0x0000부터 시작한다. 그러므로 위 그림처럼 PC가 0x0000을 가리키고 있다고 표현해도 될것이다. PC는 1씩 증가하는 가산기 회로와 붙어 있으므로 PC의 CLK가 한 번씩 뛸 때마다 위 그림의 PC가 가리키는 화살표는 한 칸씩 아래로 내려간다.

SRAM에 있는 값을 계산하는 방법도 원칙적으로는 레지스터에 스위치로 직접 값을 넣었던 지난 번 방법과 같다. 다만 값이 스위치에서 오는 것이 아니라 SRAM에서 오기 때문에 매우 빨리 수행된다는 점이 다르다. 하지만 매우 빨리 수행된다는 이 다른 점이 컴퓨터를 진정 가치있게 만드는 특징이다.

처음 두 수는 각각 레지스터 A와 레지스터 B에 입력되어야 한다. 즉 0x0000 번지의 값은 레지스터 A로 0x0001 번지의 값은 레지스터 B로 입력되어야 한다는 말이다.

우선 SRAM의 0x0000 번지부터 다시 값을 읽어야 하기 때문에 PC의 CLR 핀에 펄스를 한 번 주어 PC를 0으로 만들어 준다. 그런 다음 레지스터 A에 값을 입력하기 위해 SRAM의 R/W 핀에 1을 주어 읽기 상태로 하고, SRAM 아래에 있는 디먹스 SEL에 0을 주어 출력 방향을 레지스터 A 쪽으로 한다. 그리고 레지스터 A 위에 있는 먹스의 SEL은 1을 주어 오른쪽에서 오는 입력을 받아들인다.

왼쪽 그림은 레지스터 A에 값을 넣을때, 오른쪽 그림은 레지스터 B에 값을 넣을 때의 데이터 흐름을 그린 그림이다.

레지스터 B로 값을 입력하는 방법은 SRAM 아래 쪽의 디먹스의 SEL 값만 1로 바꿔서 간단히 처리할 수 있다. 물론 그전에 PC 값은 하나 증가시켜야 한다.

이렇게 레지스터 A와 레지스터 B에 값을 입력 완료하고 두 레지스터의 CLK에 펄스를 주어 값을 8비트 가산기까지 넣어준다. 그리고 8비트 가산기의 CLK에 펄스를 주면 덧셈을 완료하고 결과는 레지스터 A 쪽의 먹스로 간다. 이후 과정은 지난 번과 비슷하다. 스위치로 매번 값을 레지스터 B에 입력해 주는 대신 PC에 연결된 CLK를 한 번씩 튕겨줄 뿐이다.

위 그림처럼 SRAM 아래의 디먹스와 레지스터 A 위의 먹스에 입력되는 SEL 입력 값을 고정하고, PC와 SRAM, 두 레지스터, 가산기의 CLK만 계속 튕겨주면 SRAM 안의 값이 순서대로 출력되면서 계속 더해진다. 0x0007까지 PC가 이동하고 나면 레지스터 A에 최종 결과가 저장되어 있다. PC는 현재 계산되 다음 주소를 가리키고 있기 때문에 0x0006까지 다 계산한 후 라면 0x0007을 가리키고 있는다.

지난 번에 비해 조금 더 발전된 모습을 갖추었지만 아직도 많은 부분이 아쉽다. 그중 가장 마음에 안드는 부분을 꼽아 보라면 최종 결과가 레지스터에 머물러 있는 부분이다. 입력 값을 SRAM에서 읽어왔으니 최종 결과도 SRAM에 저장하고 싶다. 이 동작이 가능하도록 회로를 바꿔 보자.

바뀐 부분은 레지스터 A와 레지스터 B의 출력이 두 갈래로 갈라져 SRAM의 Data In 쪽으로 간다. SRAM의 Data In에는 3-입력-1-출력 먹스를 새로 달아 레지스터 A, 레지스터 B, 스위치. 이렇게 세 입력 중 하나를 선택할 수 있도록 했다. 새로 생긴 3-입력-1-출력 먹스는 입력이 세 개므로 SEL 핀도 두 개다.

레지스터 A에 있는 최종 결과를 SRAM에 저장하기 위해서는 PC가 0x0007의 값을 가지고 있는 시점에서 레지스터 A의 CLK에 펄스를 주고 SRAM 위에 있는 3입력 먹스의 SEL에 01을 주어 두 번째 입력을 선택한 다음, SRAM의 R/W에 0을 입력해 쓰기 상태로 만들고 SRAM의 CLK에 펄스를 주면 된다. 이제 이 글을 읽고 있는 여러분들은 위 설명을 쉽게 따라갈 수 있는 수준이 되어 있을 것이므로 별도로 그림을 그리진 않겠다. 그림 그리기 귀찮아서 그림을 그리지 않은 것이 아니다. 단지 같은 페이지에 덩치 큰 비슷한 두 그림이 연달아 나오는 것이 미학적으로 보기 않좋을 뿐이다. 정말이다.

기존 레지스터와 가산기로 이루어진 회로에 PC와 SRAM이 붙고 연결선을 몇 개 더 붙이니 일련의 계산을 한 번에 처리하는 보다 진보한 자동화 가산기 회로가 완성되었다. 그리고 이 모습은 전 보다 훨씬 더 CPU의 구성에 가까워진 모습이다. 조금씩 발전하는 모습을 볼 수 있을 것이다.

File attachments: 

댓글

나빌레라의 이미지

사는게 뭔지...-_-;;
KLDP에 이 글을 연재하고 있었단 사실을 까먹었을 만큼 바쁘네요...으헐헐..
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

snowall의 이미지

기다리고 있었습니다. ㅋㅋ

때맞침 올라와서 잘 읽었습니다. 감사합니다.

--------------------------
피할 수 있을때 즐겨라!
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

nuwool의 이미지

역시 이해하기 쉽게 잘 적어 주셔서 잘 배우고 있습니다.
감사합니다.
다음 강좌 기대 하겠습니다.

ubtaptt의 이미지

컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (13) : http://kldp.org/node/111192
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (15) : http://kldp.org/node/112152

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.