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

나빌레라의 이미지

#6. 기억

오실레이터에 대해 이야기하면서 피드백 회로에 대해 말했다. 그리고 트랜지스터 연결을 통해 논리 게이트를 구성했다. 그렇다면 논리 게이트를 조합해서 피드백 회로를 만든다면 어떤 현상이 벌어질까? 논리 게이트를 피드백 연결함으로써 기술의 발전은 또 한 번 도약하게 된다.

누군가를 사랑한다는 것은 그 사람을 기억한다는 것이다. 기억하지 못한다면 사랑하지도 못한다. 우리는 기억하며 산다. 기억을 하지 못한다면 나도 없는 것이고 친구도 연인도 가족도 없다. 내가 나를 기억하지 못하는데 어찌 내가 있을 수 있겠는가? 나는 기억한다. 고로 존재한다.

다소 헛소리같은 말들을 위에 늘어놨다. 기억하는 것이 얼마나 중요한 것인지 말하고 싶어서 그랬다. 컴퓨터도 기억을 해야 존재한다. 기억하지 못하는 컴퓨터는 의미가 없다. 컴퓨터는 계산하는 기계인데 계산 결과나 입력 값을 기억하지 못한다면 그것이 무슨 의미가 있겠는가? 오늘은 컴퓨터가 기억이라는 것을 어떻게 하는지 그 가장 기본적인 원리에 대해 이야기 하려한다. 다소 어려울 수도 있는 내용이다. 읽다가 어렵다고 느낀다면 굳이 이해하려고 애쓸 필요없다. 그냥 이런 것이 있구나하고 가볍게 읽으면 된다. 중요한 내용이긴 하지만 완벽하게 이해할 필요는 없다. 부담갖지 말자.

자, 그럼 시작해 보자.

지금까지 내가 이야기했던 내용들로만 만들어진 회로다. 이렇게 생긴 회로를 R-S Latch라고 부른다. 앞으로 RS 랫치라고 쓰겠다. NOR 논리 게이트가 두개 있고, 두 게이트가 서로 피드백 연결되어 있다. 모두 알고 있는 내용들로 구성된 회로긴 하지만 그 동작이 한 눈에 이해되진 않는다. 만약 위 회로도의 동작을 처음 본 순간 한 번에 이해했다면 당신은 천재다.

입력은 R과 S다. 그림에 친절하게 R은 Reset, S는 Set이라고 써 놨다. 왜 저 두 입력의 이름이 Reset, Set인지는 R과 S에 각각 0과 1의 값을 입력해 보면 알 수 있다. 한 번 입력해 보자.

RS 랫치를 처음 구성했을 때 회로의 출력을 표시했다. 빨간 출력이 1이고 검은 출력이 0이다. NOR 게이트의 두 입력의 초기 값은 아무것도 없는 0이므로 두 NOR 게이트는 1을 출력한다. 두 출력 1은 피드백으로 돌아와 다시 NOR 게이트에 1 입력으로 들어간다. NOR 게이트의 진리표를 보면 둘 중 한 입력이 1일 경우 출력은 무조건 0이다. 그럼 출력이 0이 되므로 중간에 피드백 되는 두 선은 다시 0이 된다. 피드백 신호가 0이 되므로 NOR 게이트의 출력은 또 1이 되고 위 과정은 계속 반복 된다. 결과적으로 Q와 /Q(Q위에 줄이 그어진것을 ‘큐 바’라고 읽고 이렇게 앞에 슬레시를 붙여서 표기하겠다.)의 값은 동일하게 0과 1을 반복한다. 오실레이터와 같은 출력 패턴을 보이지만 이 회로의 목적은 오실레이터 출력이 아니다. 즉 RS 랫치의 초기 상태는 불안정한 상태라고 판단한다.

이 불안정한 상태에서 S에 1을 준다.

NOR 게이트에서 두 입력 중 하나가 1이면 출력은 무조건 0이므로 S 쪽에 있는 NOR 게이트의 출력은 0으로 고정된다. 그러면 R쪽으로 가는 피드백 신호 역시 0으로 고정된다. R에는 아무런 신호를 주지 않았으므로 R쪽 NOR 게이트의 출력은 1이 된다. 이 피드백 신호가 S쪽 NOR 게이트에 전달되긴 하지만 출력 값에 영향을 주진 않는다. Q는 1이 출력되고 /Q는 0이 출력된다. 초기 상태와는 달리 값이 변경되지 않고 고정되어 있다.

그럼 이 상태에서 S에 넣던 신호를 다시 끊어 보자. R과 S에는 아무 신호도 들어가지 않는다.

R 쪽 NOR 게이트에는 계속해서 두 입력이 0이었으므로 출력은 1로 유지된다. 이 출력은 피드백 되어 S쪽 입력으로 들어가고 S 입력이 0으로 꺼졌다 해도 피드백으로 들어온 1이 있기 때문에 S 쪽 NOR 게이트의 출력 역시 0으로 고정된다. 초기 상태와 같은 R, S 입력에 0을 주었지만 놀랍게도 이번에는 값이 변하지 않는다. 더 놀라운 사실은 직전에 S에 값을 주었을 때와 같은 출력을 Q와 /Q에서 유지하고 있다는 것이다.

계속 아무 신호 주지 않고 있던 R에 1을 주자.

NOR 게이트의 진리표에 따라 두 입력 중 하나가 1이면 출력은 무조건 0이다. 그러므로 R 쪽 NOR 게이트의 출력은 0으로 바뀐다. S 쪽 NOR 게이트로 가는 피드백 신호도 0으로 바뀌게 되고 S에는 아무 신호도 주지 않기 때문에 S 쪽 NOR 게이트의 출력은 1로 바뀌게 된다. R 쪽으로 가는 피드백 신호도 1로 바뀌지만 출력은 여전히 0이다. 그러면 Q와 /Q의 출력이 반대로 바뀌게 된다. Q는 다시 0이 되고 /Q는 1이 된다.

여기서 다시 R과 S에 신호를 끊어 보자. R과 S에는 0이 입력된다.

S 입력은 변화 없이 계속 0이므로 S 쪽 NOR 게이트의 출력도 변화 없이 1을 유지한다. R 입력은 1에서 0으로 변했지만 피드백으로 들어오는 신호가 1이므로 출력은 계속 0이다. Q는 0이고 /Q는 1이다. 놀랍다! 아까와 똑같이 R과 S에 0을 입력했지만 결과는 정반대다. 공통점이라면 직전의 Q와 /Q 값을 계속 유지하고 있다는 점이다.

R과 S 입력 조합에서 마지막 남은 것은 두 입력을 모두 1로 주는 것이다.

두 입력을 모두 1로 주면 출력은 Q, /Q 모두 0이 나온다.

이상 RS 랫치 회로의 입력과 출력을 진리표로 그리면 아래와 같다.

R과 S의 입력이 둘 다 0일 때는 직전 출력 값을 유지한다. 그래서 Hold Output이라고 진리표에 표시했다. 그리고 R과 S 값이 다를 때 Q와 /Q의 값을 보면 항상 반대인 것을 볼 수 있다. 그래서 출력 심볼을 Q와 /Q라고 한것이다. 전자 회로에서 글자 위에 줄을 하나 그으면 값이 반대인것을 의미한다. 이렇게 되면 R과 S 두 입력이 1일 때 출력이 좀 어울리지 않는다. Q와 /Q의 출력이 같다. 이 회로의 목적은 Q과 /Q의 출력이 서로 반대인 것이다. 그래서 진리표를 아래 처럼 고친다.

간단하게 R과 S 입력이 둘 다 1일 때는 Invalid Input. 즉, 잘못된 입력으로 간주해 버린다.

기억이라는 화두로 이야기를 시작해서 갑자기 난데 없이 RS 랫치에 대해서 길게 이야기 했다. 왜 기억이라는 말을 꺼내 놓고 RS 랫치를 말한 것인가. 위 내용을 다시 한 번 천천히 읽어보자. 처음 S나 R에 입력을 주어 값을 설정하고 R과 S에 아무 입력도 주지 않으면 직전 입력이 유지 된다고 했었다. 그렇다. 이 RS 랫치 회로는 직전 입력을 ‘기억’하고 있는 것이다. 단지 1 비트의 값을 기억할 수 있는 회로일 뿐이지만 어찌되었건 이 회로는 기억을 할 수 있는 회로인것이다. 게다가 R에 1을 입력하면 Q 출력 값이 다시 0으로 돌아간다. 그래서 R의 이름이 Reset인 것이고, S에 1을 입력했을 때는 Q 출력 값이 1이 된다. 그래서 S는 Set이다.

정리하면 S로 출력 값을 1로 만들고 가만히 있으면 출력 값은 1로 유지된다. 그러다가 R로 출력을 0으로 초기화하고 또 가만히 있으면 출력 값은 0으로 유지된다. 한 비트의 값을 1이나 0으로 세팅하고 기억할 수 있는 회로인것이다.

기억 가능한 회로는 RS 랫치 말고 몇 가지 더 있다. 다음엔 다른 회로들에 대해서 더 이야기하겠다. 다른 회로들은 RS 랫치에 비해서 좀 더 많이 복잡하다. 하지만 그 기본 원리는 RS 랫치만 이해한다면 다들 비슷하다. RS 랫치도 결국 논리 게이트의 입력과 출력. 그리고 피드백만 이해 한다면 언젠가는 이해 할 수 있다. 복잡한 모든것은 원리의 확장일 뿐이다.

나는 0과 1에서 부터 이 이야기를 시작했고 지금 꽤 복잡한 수준까지 이야기를 발전 시켰다. 앞으로 이야기는 조금 더 복잡해 질 것이다. 하지만 그 근본은 0과 1이다. 그러니 어려워할 것 없다. 결국엔 다 0과 1이다. 디지털 세상은 단순하다.

댓글

Okidoki의 이미지

게이트 그림을 보면서 제가 착각한 것 중 하나가, 게이트의 입력과 출력이 서로 전선 같은 것으로 연결되어있다고 생각한 것인데요... 이것 때문에 NOR 게이트의 입력으로 (0, 0)이 들어왔을 때 출력으로 어떻게 1이 나가는 것인지 잘 이해가 안 됐었습니다 ㅎ; 들어온 전압이 없는데 어떻게 無에서 有가 발생하는 것일까 이렇게 생각을 했더랬지요... 하지만 실제로 좀 더 디테일한 회로도를 보고 게이트의 입력과 출력은 전혀 별개라는 것을 알 수 있었습니다. 나빌레라님의 앞의 강좌에 나왔던 증폭기(릴레이)의 그림을 보면 쉽게 알 수 있을 것 같네요. 게이트의 입력은 단지 게이트 내부의 스위치를 조작하는 데까지만 영향을 미치고 게이트의 출력은 전혀 별개의 전원으로부터 에너지를 공급받고 있는 것이더군요. 어떻게 보면 '(x, y)가 들어왔을 때 z가 나간다'라는 식의 단순한 설명이 이런 오해를 더욱 부추기는 것 같기도 합니다.

정리하면 게이트의 입력은 게이트 내부의 스위치를 조작하기 위한 입력라인이고, 출력은 일반적으로 그 입력라인과는 전혀 별개의 회로(와 연결되어 있다)라고 할 수 있을 것 같습니다. 물론 R-S Latch같은 경우는 게이트의 출력이 다시 자기자신의 스위치를 컨트롤 하게 되어 있어서 조금 괴상한 경우죠; 뭐 여튼 저는 이렇게 이해했습니다. ㅋ

덧. 좀 늦은 감이 있지만 나빌레라님 강좌를 굉장히 재미있게 보고 있습니다. :) 좋은 강좌 감사합니다. ㅋ

댓글 달기

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