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

나빌레라의 이미지

#18. 하나만 있어도 돼~

지난 이야기에서 우리의 CPU 회로의 제어를 자동화하기 위해 제어 신호들을 모두 한 곳에 묶어 컨트롤 유닛에 몰아 넣고 코드 램이라는 것을 컨트롤 유닛의 입력에 달았다. 그리고 천공 카드에 기계어를 프로그래밍해서 기계를 동작시켰다. 이와 같은 구조를 하버드 아키텍처라고 했다. 램이 두 개라는 것은 비용도 많이 들어갈 것 같고, 회로도 좀더 복잡할 것 같다. 코드 램과 데이터 램을 하나의 램으로 사용하고 싶다.

그렇다고 무턱대고 램의 신호선을 그대로 컨트롤 유닛으로 분기한다든가, 램 아래의 DEMUX에서 출력선을 뽑아서 컨트롤 유닛에 연결해 주는 식으로 연결해서는 제대로 동작하지 않는다. 램의 신호선을 그대로 컨트롤 유닛에 분기한다면 기계어 데이터가 아닌 계산용 데이터도 컨트롤 유닛에 반영되어 기계가 오동작할 것이다. 램 아래의 DEMUX에서 출력선을 컨트롤 유닛에 연결해 준다면 DEMUX의 SEL 핀을 제어해서 계산용 데이터가 컨트롤 유닛에 입력되는 경우는 막을 수 있을 지 몰라도 SEL 핀을 제어하는 신호 자체가 컨트롤 유닛에서 나와야 하기 때문에, 계산용 데이터를 램에서 읽어온 이후 기계어를 읽기 위해 DEMUX의 SEL을 제어할 수 없게된다.

해결 방법은 수도없이 많겠지만 지금까지 계속 그래왔듯 나는 가장 간단한 방법을 택하려 한다. 그냥 간단하게 SRAM에서 나가는 출력선을 16개로 늘려서 MSB 쪽 8비트는 컨트롤 유닛으로 연결하고 LSB쪽 8비트는 ALU로 연결하는 방식이다. 쉽게 생각해서 하버드 아키텍처에서는 명령어만 들어있는 램과 데이터만 들어있는 램이 따로 있어서 각각 8비트씩 출력하며 컨트롤 유닛과 ALU에 데이터를 주었지만, 이제는 그냥 램 한 개에서 16비트를 출력해서 각각 8비트씩 나눠 컨트롤 유닛과 ALU에 데이터를 주는 것이다. 사용하는 램은 하나로 줄었지만 동작 방식은 하버드 아키텍처일 때와 똑같다.

물론 램 주변 회로와 컨트롤 유닛 주변 회로를 조금 복잡하게 구성해서, 기계여 영역과 데이터 영역을 나 처럼 8비트씩 고정하는 것이 아니라 가변적으로 사용할 수 있도록 구성할 수 있다. 또 목적에 따라서는 16비트 전체를 데이터로만 사용하게 할 수도 있다. 하지만 그렇게 동작하게 만드는 회로는 설명하기에도 너무 벅차다. 지금 이야기하고 있는 것 처럼 상위, 하위 8비트씩 나눠서 기계어, 데이터 영역으로 사용하는 것으로도 충분히 동작원리는 설명이 되므로 더 복잡한 구조는 생략하도록 하겠다.

위 그림처럼 기계어와 데이터를 하나의 램에서 가져오는 구조를 폰 노이만 아키텍처라고 부른다. 요즘 사용으로 많이 쓰이는 대부분의 CPU들은 폰 노이만 아키텍처와 하버드 아키텍처를 혼합해서 사용하고 있다. CPU 내부에 캐시를 두는데 데이터용 캐시와 명령어용 캐시를 두어 따로 처리한다. 그리고 캐시에 데이터를 읽어올 때는 하나의 램에서 읽어온다. CPU 내부에서는 ALU와 캐시 사이에 하버드 아키텍처를 사용하고, CPU 외부에서는 캐시와 외부 램 사이에서 폰 노이만 아키텍처를 사용한다.

SRAM의 출력선이 16비트가 되었다는 것은 SRAM에서 한 번에 2바이트씩 주소가 증가해야 한다는 의미다. 그러므로 SRAM의 주소 입력 선에 연결된 PC 레지스터도 2바이트씩 증가해야 한다. 현재는 1바이트씩 증가하게 되어 있다. 간단히 PC 전용 가산기의 입력에 연결된 CLK 선을 한 비트 앞으로 밀어 주면 된다. 이진수에서 0001은 1이고, 0010은 2다.

간단하게 PC가 2씩 증가하도록 수정했다. 그리고 이왕 수정하는 김에 보조 기억 장치에서 SRAM으로 연결되는 입력도 16비트로 바꾸고, ALU도 16비트 계산이 가능하도록 바꾸고, 레지스터 A/B도 16비트가 저장 가능하도록 바꿔 보자.

비록 레지스터 A, B로 입력되는 값은 8비트 값이지만, 곱셈 계산 같은 경우 결과가 16비트로 나올 가능성이 매우 크기 때문에 이미 진작에 레지스터의 크기는 16비트로 올려놨어야 했다. 이제서야 16비트로 올린것은 오히려 늦은감이 있다.

위 그림을 보면 전체적인 데이터 선이 모두 16비트로 바뀌었고, ALU가 처리하는 데이터의 크기도 16비트로 바뀌었다. 이전까지 우리는 8비트 머신을 만들었고, 방금 우리의 8비트 머신은 순식간에 16비트 머신으로 업그레이드 되었다!

그림에서 내가 굵은 화살표로 표시하고 있는 데이터 선의 묶음을 데이터 버스라고 말한다. 흔히 8비트 머신, 16비트 머신, 32비트 머신, 64비트 머신을 구분하는 기준이 바로 이 데이터 버스의 폭(크기)다. 버스 폭이 클 수록 시스템에서 한 번에 계산할 수 있는 숫자의 크기도 커진다. 그래서 속도도 빨라진다. 32비트로 표현할 수 있는 숫자보다 큰 숫자를 연산해야 하는 경우 32비트 머신에서는 여러 클럭으로 나눠서 계산해야 하지만, 64비트 머신에서는 한 번에 처리할 수 있기 때문이다. 이런 관계는 16비트 머신과 32비트 머신, 8비트 머신과 16비트 머신에서도 동일하게 적용된다. 그렇다고 버스 폭이 크다고 무조건 좋은 것은 아니다. 버스 폭이 클 수록 회로가 커지고 복잡해지기 때문에 비용이 커지고 실용성이 떨어진다.

물 흐르듯 생각가는 대로 이야기를 하다보니 어느덧 우리가 만들어가고 있는 컴퓨터는 16비트 머신으로까지 진화했다. 스위치 한 개와 전구로 시작했던 회로는 이제 한 눈에 봐도 꽤나 복잡해 보인다. 만약 저 회로를 트랜지스터 혹은 전자석과 스위치로 된 릴레이 스위치로 그린다면 수 천배는 더 복잡해 질 것이다. 세상은 계속 복잡해 지고 있고 기술은 계속 발전하고 있다. 그리고 우리는 점점 알아야 할것들이 많아진다. 그렇다고 슬퍼하거나 좌절하지 말자. 결국엔 다 인간이 만들어낸 것들이니 인간인 우리가 이해 못할 이유는 없지 않은가! 그걸 돕기위해 내가 이 이야기를 이렇게 열심히 두드리고 있는 것이기도 하다.

File attachments: 

댓글 달기

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