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

나빌레라의 이미지

#8. 기억 세 번째 이야기.

논리 게이트에 대한 이야기까지는 비교적 널널하게 진행하다가 RS 랫치의 등장 이후 갑자기 난이도가 올라간 듯한 느낌이 들 것이다. 당연하다. 플립플롭은 디지털 세상에서 기억을 어떻게 하느냐를 설명하기 위해서 꼭 필요한 내용이지만 처음 접하는 사람은 논리 게이트까지 이해를 쉽게 하더라도 플립플롭에 이르러서는 피드백이라는 개념 때문에 쉽게 직관적으로 받아들이기 힘들것이다. 내가 풀어 놓은 이야기들과 그림을 보면서 직접 손으로 회로를 그려 보고 피드백에 따른 값의 변화를 추적해 보면 보다 쉽게 이해 할 수 있을 것이다.

오늘은 어려웠던 플립플롭 이야기의 마지막 편이다. RS 랫치에서 RS 플립플롭을 거쳐 JK 플립플롭에 이르기까지 우리의 회로는 보다 안정적인 상태에서 값을 저장하기 위해 진화를 거듭했다. 그 진화의 과정에서 보다 단순해지고 조금 더 유용한 회로가 만들어졌으니 D 플립플롭이라고 한다.

RS 플립플롭의 입력에 인버터를 달고 S와 R에 서로 보수를 입력했다. CLK는 그대로 입력으로 간다. 이렇게 하면 실질적으로 의미를 가지는 입력은 D 입력 하나 뿐이다. D 입력에 인버터를 달아 S와 R에 입력하므로 1, 1이나 0, 0이 입력되는 경우는 생기지 않는다. S와 R에 서로 반대 값이 들어가는 경우만 생기는데 이 경우는 RS 플립플롭의 동작을 보다 단순화 시킨것이다.

D 플립플롭은 별다르게 하는 일 없이 D로 입력 받은 값을 CLK가 다시 활성화 될 때까지 보관하는 역할을 한다. 라이징 엣지 트리거 타입 D 플립플롭의 경우 D로 입력한 값을 다음번 라이징 엣지까지 보관한다. 쉽게 말해 1비트를 저장하는 것이다.

D 플립플롭 역시 간단하게 네모 모양으로 표기한다. 아래에 D 플립플롭의 간단한 표기와 진리표, 타이밍 다이어그램이 있다.

타이밍 다이어그램을 보면 알겠지만, CKL의 값이 라이징 엣지일 때만 Q의 출력이 변한다. 그리고 그 출력되는 값은 D의 값과 같다. 그래서 D 플립플롭은 CLK에 값이 변하면 D 입력이 플립플롭에 반영되는 1비트 짜리 저장소다. 그럼 이걸 8개 연달아 붙여 놓으면? 그렇다 1바이트짜리 저장소가 된다. 1바이트짜리 저장소를 1024개 붙여 놓으면? 1KB 저장소가 된다. 물론 전원을 제거하면 데이터는 사라진다. 무언가 연상되지 않는가?

D 플립플롭을 여러개 묶어 놓으면 RAM이 된다.

나는 이 이야기를 하고 싶어서 그렇게 길게 RS 랫치를 설명하고 RS 플립플롭을 거쳐 JK 플립플롭에서 D 플립플롭까지 온것이다. 나는 RAM을 만들고 싶었다.

위 그림은 D 플립플롭을 8개 붙여 만든 1바이트 램이다.아무것도 없이 그냥 D 플립플롭 8개 늘어 놓은것이 램이라고? 맞다 램이다. 알고보면 램 별거 아니다. 저렇게 1비트를 저장할 수 있는 소자를 매트릭스 형태로 집적해 놓은것이다. SRAM은 그 소자가 트랜지스터로 만든 랫치고 DRAM은 콘덴서일 뿐이다. 우리가 만든 램은 D 플립플롭이다.

각 D 플립플롭의 출력은 /Q가 없이 Q 하나 뿐이다. 어차피 /Q는 쓰지 않는다. 없어도 된다. 물론 우리가 흔히 알고 있는 SRAM이나 DRAM과는 다른 구조를 가지고 있다. DRAM은 아니지만 SRAM은 내부에 트랜지스터를 이용한 랫치 회로로 1비트를 저장하므로 D 플립플롭을 이용한 위 램 구성과 일면 비슷한 원리로 동작한다고 볼 수 있다. SRAM과 DRAM에 대해서는 다음에 이야기 할 생각이다.

그럼 D 플립플롭을 묶은 위 회로에 몇 개의 장치를 더 달아보자.

8개의 D 플립플롭의 D 입력에는 각각 하나씩 8개의 스위치가 연결되어 있고(INPUT), CLK는 공통으로 하나의 선을 공유하면서 한 개의 스위치에 연결되어 있다(WORD LINE). INPUT, WORD LINE이라고 붙인것은 나중에 나올 램 회로에서 쓰는 용어다. 그리고 Q 출력에는 램프를 달아서 어떤 값이 저장되어 있는지 2진수로 읽을 수 있도록 했다. 오늘 이야기에서는 별 의미가 없겠지만 미리 익숙해 지는 것이 좋으므로 이제부터 사용하도록 하겠다. 영어 타이핑하기 귀찮으니 인풋, 워드라인 이렇게 한글로 쓰도록 하겠다. 양해 부탁한다.

인풋의 8개 스위치는 개별적으로 값을 넣을 수 있다. 8비트 램이므로 입력 가능한 값은 0부터 255까지다. 이진수로는 00000000b부터 11111111b까지다. 램에 저장되어 있는 비트 값이 1이면 램프에 불이 들어오고 0이면 불이 꺼진다.

값을 입력할 때는 인풋에 있는 8개 스위치 중 원하는 스위치를 눌러 놓은 상태에서 워드라인의 스위치를 살짝 닫았다 열어준다. 라이징 엣지 트리거 타입 D 플립플롭을 소자로 사용한 램이기 때문에 스위치가 닫히는 순간 인풋의 값이 저장된다. 스위치가 다시 열려도 이제 그 값은 기억된다.

그럼 간단히 134를 입력해 보겠다. 134라는 숫자에 의미가 있는 건 아니다. 지금 방금 키보드의 숫자 패드를 손바닥으로 내리쳤는데 134가 찍혔을 뿐이다. 134는 이진수로 10000110b다.

위 그림을 설명하기 전에 LSB(Least Significant Bit)와 MSB(Most Significant Bit)를 살짝 언급하겠다. LSB는 이진수 표기에서 가장 낮은 자리 위치를 말하고 당연히 MSB는 가장 높은 자리 위치를 말한다. 그래서 LSB는 오른쪽 끝 숫자가 되고 MSB는 왼쪽 끝 숫자가 된다. 위 그림에서는 알아보기 편하게 MSB는 그림 상 가장 위쪽에 있는 D 플립플롭으로 정의했다. 당연히 LSB는 가장 아래있는 D 플립플롭이다.

MSB가 가장 위에 있는 D 플립플롭이므로 인풋 스위치의 입력은 가장 위의 스위치를 닫고 이어서 네 개의 스위치는 열고 두 개 스위치 닫고 마지막 스위치를 연다. 이러면 논리적으로 10000110을 표시한다.

이렇게 스위치를 고정해 놓은 상태에서 워드라인에 펄스를 한 번 준다. 워드라인에 펄스를 준다는 의미는 쉽게 말해 CLK에 클록을 한 번 입력해서 라이징 엣지를 만들어준다는 뜻이다. 라이징 엣지가 들어가면 8개의 D 플립플롭에는 10000110이 입력된 상태다. 인풋과 워드라인의 스위치를 모두 열어 놔도 출력쪽에 있는 8개의 램프에는 우리가 입력한 값 대로 램프에 불이 켜진채 유지된다.

1바이트 입력과 출력이 잘 동작하는 램을 만드는데 성공했다. 하지만 아직 부족한 점이 있다. 램의 용량이 커지면 커지는 대로 입력 스위치의 수를 늘려야 할까? 그렇다면 램이 1MB가 되면 입력 스위치와 출력 램프가 각각 백만 개씩 있어야 한다. 하지만 실제 램 칩은 그렇지 않다. 램의 값을 주소로 접근하기 때문이다. 그것에 대해서 다음번에 이야기할 것이다.

영과 일. 디지털. 코드로 부터 시작한 이야기가 점점 깊이를 더해가다가 어느덧 우리는 램을 만들게 되었다. 맨 처음 했던 이야기부터 오늘 이야기까지 읽어보면 알겠지만 복잡해 보이는 램도 갑자기 새로운 개념에서 생겨난 것이 아니라 가장 기본적인 스위치를 열고 닫고 하는 것에서 부터 출발한 것이다. 그리고 앞으로 내가 여러분에게 해 줄 더 많은 이야기도 이렇게 계속해서 발전되어 가는 방향을 보일 것이다.지금까지 이해 안되는 플립플롭 읽어주느라 고생이 많았다. 다음 이야기 부터는 약간 읽기 편해질 것이다. 아마 최소한 직관적으로 이해는 될 것이라고 생각한다.

한편 한편 이야기를 진행할 때마다 조금씩 발전하는 디지털 세상이 보인다. 여행하는 기분으로 즐겨주시기 바란다.

댓글

lain07의 이미지

쉽지는 않습니다만;
아직까지는 아는 거라서 힘을 내서 보겠습니다!

감사합니다. 정말..
___________________________
I like Small Linux.


___________________________
I like Small Linux.

나빌레라의 이미지

감사합니다.
아직 더 많은 이야기가 준비되어 있고, 꾸준히 올릴 것이니
계속 관심 가져주세요~ ^^;

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

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

sensui의 이미지

1학년때 배웠던 것들이라서 복습겸 즐겁게 보고 있습니다
감사합니다!

忘れるだったから 忘れるとよかった
잊어야 한다면 잊혀지면 좋겠어...

- 김광석 " 그날들 " 中

忘れるだったから 忘れるとよかった
잊어야 한다면 잊혀지면 좋겠어...

- 김광석 " 그날들 " 中

raymundo의 이미지

우왕 너무 잘 읽었습니다.

앞으로도 잘 부탁드려요 꾸벅!

좋은 하루 되세요!

sungeuns의 이미지

디지털 논리회로 시간에 이렇게 배웠으면 얼마나 재미있었을까 하는 생각이 드네요~
그때는 그냥 뭣도모르고 이론적으로만 배워서 정말 재미없었는데...
항상 잘보고있습니다~ ㅎㅎ

근데 다른그림은 잘나오는데 강좌 글에있는 그림만 안나오는 이유는 도대체뭘까요 ㅠㅠㅠㅠㅠ흑흑

arin06의 이미지

쓰세요 그럼 그림도 잘나옴
익스플로워가 후져서...

정규혁의 이미지

근데 클럭이 0이되면 플립플롭의 입력이 어떻게 되나요?
d플립플롭에서 클럭이 0이 될때는 불능 상태가 되는데 클럭이 0일때는 처리가 어떻게 될까요?

나빌레라의 이미지

본문에도 써 있듯 클럭이 0이면 데이터 보존입니다.

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

댓글 달기

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