Skip to main content

마인크래프트 레드스톤으로 논리회로 게이트를 살펴보기

· 6 min read
Kevin
취준 안하는 대학생

thumbnail

아마 요즘 대학생들이라면 알만한 게임인 마인크래프트라는 게임이 있습니다. 여기 게임에는 레드스톤이라는 광석 물질이 있는데요.

레드스톤

이 물질은 간단히 말하자면 신호를 주면 켜지고, 신호가 없으면 꺼지는 특성을 가지고 있습니다. 그래서 이 물질을 활용하여 갖가지 기계를 만드는 모습을 유튜브를 통해 쉽게 볼 수 있는데요.

이번에는 한번 이 레드스톤으로 우리의 컴퓨터 밑바닥인 논리회로를 어떻게 구현하는지 한번 알아봅시다.

info

이번 글에서는 레드스톤으로 구현하는 논리회로와 현실 회로가 다름을 알 수 있어요!





레드스톤으로 논리회로 만들기

이미 레드스톤으로 간단한 논리회로 만드는 영상, 글들은 많이 있어서 이 회로가 왜 가능한 것인지를 중심으로 보겠습니다.

시각화를 위해 아래 사진처럼 블록 설명을 해놓았으니 혹시 회로를 보다가 모르겠다면 아래 사진들을 참고하면 됩니다.

설명



not, or 게이트(nor 게이트)

먼저 가장 간단하게 만들 수 있는 게이트입니다.

not 게이트를 살펴보면 횃불의 역할을 알 수 있습니다.

not

횃불을 통해 들어온 값의 정 반대 값을 보냄을 알 수 있죠.



다음으로 or 게이트입니다.

or

or 게이트를 통해 두 입력을 선으로 연결해서 합치면 최소 한 곳에서 신호가 올 경우 출력에도 신호가 오게 됩니다.

그리고 이를 응용하여 or 게이트에서 마지막에 not 게이트를 연결하면 nor게이트를 만들 수 있게 됩니다.

그러면 다음으로 and 게이트는 어떻게 구현되는지 알아봅시다.



and 게이트(+ nand 게이트)

and 게이트는 다음과 같습니다.

and

이렇게 보면 무슨 소리인가 싶지만, 이 사진을 토대로 구조를 나누어 보면 다음과 같습니다.

ii아래=¬((¬i)(¬i아래))i_{\text{위}} \land i_{\text{아래}} = \lnot \left( (\lnot i_{\text{위}}) \lor (\lnot i_{\text{아래}}) \right)

여기서 위 i를 x라 하고, 아래 i를 y라 하면 다음과 같은 식을 볼 수 있습니다.

xy=¬((¬x)(¬y))x \land y = \lnot \left( (\lnot x) \lor (\lnot y) \right)

이 식을 보면 아마 다들 들어는 봤을 드모르간 법칙이 떠오르실텐데요.

레드스톤을 활용한 회로에서는 and게이트가 직접적으로 없고 오직 not과 or만 사용 가능하기에 드모르간 법칙을 이용하여 회로를 작성한 것이라 보면 됩니다.


그리고 여기서 연계하여 맨 뒤 not 게이트를 제거하면 nand게이트는 다음과 같이 만들 수 있음을 알게 됩니다.

nand



xor 게이트

이제 어쩌면 레드스톤으로 구현 가능한 기본적인 논리 게이트 중에 가장 복잡해 보이는 xor 게이트를 보겠습니다. 일단 xor 게이트를 간략히 이야기하자면 다음과 같습니다.

두 입력의 값이 다르다면 1, 같다면 0을 출력하는 게이트

그래서 이 xor 게이트는 다음과 같이 만들어짐을 알 수 있습니다.

(참고로 tt와 ts둘다 있지만, 한 블럭에 두 횃불이 있는 것이므로 결론적으로 not의 not이 아니고 not하나만 있는 거라 보면 됩니다.)

xor

이 회로를 표현 식으로 나타내보면 위 i=x, 아래 i=y라 하면,

xy=(¬((¬x)¬(¬x¬y)))(¬((¬y)¬(¬x¬y)))x \oplus y = \left( \lnot \left( (\lnot x) \lor \lnot(\lnot x \lor \lnot y) \right) \right) \lor \left( \lnot \left( (\lnot y) \lor \lnot(\lnot x \lor \lnot y) \right) \right)

이렇게 보면 겉보기에는 복잡해보이는데,

¬(¬x¬y)=xy\lnot(\lnot x \lor \lnot y) = x \land y

와 같음을 이전에 확인했으므로 다음과 같이 줄일 수 있습니다.

(¬((¬x)¬(¬x¬y)))(¬((¬y)¬(¬x¬y)))=  (¬((¬x)(xy)))(¬((¬y)(xy)))\begin{aligned} &\left( \lnot \left( (\lnot x) \lor \lnot(\lnot x \lor \lnot y) \right) \right) \lor \left( \lnot \left( (\lnot y) \lor \lnot(\lnot x \lor \lnot y) \right) \right) \\ =\;& \left( \lnot \left( (\lnot x) \lor (x \land y) \right) \right) \lor \left( \lnot \left( (\lnot y) \lor (x \land y) \right) \right) \end{aligned}

xor 게이트 식 최적화하기

이렇게 인터넷의 정보를 통해 xor 식이 이렇다는 것을 알았지만, 사실

(¬((¬x)(xy)))(¬((¬y)(xy)))\left( \lnot \left( (\lnot x) \lor (x \land y) \right) \right) \lor \left( \lnot \left( (\lnot y) \lor (x \land y) \right) \right)

이 식을 더 줄여볼 수 있습니다. 논리회로에서는 직렬로 이어져 있는 게이트 수를 줄이는 것이 성능 최적화하는 길이거든요.

그래서 조금 더 줄여보면 다음과 같습니다.

¬((¬x)(xy))(왼쪽 식)\lnot \left( (\lnot x) \lor (x \land y) \right) \quad \text{(왼쪽 식)}
자세히 보기
¬((¬x)(xy))=x¬(xy)not을 안쪽 항에 분배=x(¬x¬y)드모르간 법칙 적용=(x¬x)(x¬y)x를 분배=0(x¬y)x and not x = 0=x¬y0 or A = A\begin{aligned} \lnot \left( (\lnot x) \lor (x \land y) \right) &= x \land \lnot(x \land y) && \text{not을 안쪽 항에 분배} \\ &= x \land (\lnot x \lor \lnot y) && \text{드모르간 법칙 적용} \\ &= (x \land \lnot x) \lor (x \land \lnot y) && \text{x를 분배} \\ &= 0 \lor (x \land \lnot y) && \text{x and not x = 0} \\ &= x \land \lnot y && \text{0 or A = A} \end{aligned}
x¬yx \land \lnot y

그리고 오른쪽 식도 1번과 같은 전개를 통해 다음 식이 나오게 됩니다.

¬((¬y)(xy))(오른쪽 식)\lnot \left( (\lnot y) \lor (x \land y) \right) \quad \text{(오른쪽 식)}
자세히 보기
¬((¬y)(xy))=y¬(xy)not을 안쪽 항에 분배=y(¬x¬y)드모르간 법칙 적용=(y¬x)(y¬y)y를 분배=(¬xy)0y and not y = 0=¬xyA or 0 = A\begin{aligned} \lnot \left( (\lnot y) \lor (x \land y) \right) &= y \land \lnot(x \land y) && \text{not을 안쪽 항에 분배} \\ &= y \land (\lnot x \lor \lnot y) && \text{드모르간 법칙 적용} \\ &= (y \land \lnot x) \lor (y \land \lnot y) && \text{y를 분배} \\ &= (\lnot x \land y) \lor 0 && \text{y and not y = 0} \\ &= \lnot x \land y && \text{A or 0 = A} \end{aligned}
¬xy\lnot x \land y

여기서 1번과 2번을 or로 합치면

(x¬y)(¬xy)(x \land \lnot y) \lor (\lnot x \land y)

가 나오게 됩니다.

다만 별도로 마인크래프트의 회로짜는 특성 상 편의를 위해 and 대신 회로에 not과 or만 된다고 보면 다음과 같이 나타납니다.

¬(¬xy)¬(x¬y)\lnot(\lnot x \lor y) \lor \lnot(x \lor \lnot y)

그리하여 이를 기반으로 회로를 짜보면 다음과 같이 나옵니다.

xor-개선



너무 비효율적인가?

그래서 위의 사진을 보면 우리는 식을 최적화했지만, 실전에서는 비효율적임을 알 수 있게 됩니다.

사실 상 게이트(or, not)를 거친다고 레드스톤 신호의 속도가 느려지는 것은 아니라보기 때문에, 결국 비용을 판단하게 될텐데, 레드스톤의 갯수가 원래 xor 게이트는 13개, 바로 위 이론 상 최적화한 xor 게이트는 21개가 사용되거든요.


전공 수업에서 알게되는 논리회로와 마인크래프트의 레드스톤 회로의 관점이 달라서 결국 정답이 이론과 달라짐을 알게되었습니다.





마무리

어쩌면 지루할지도 모르는 논리회로를 마인크래프트 레드스톤 회로라는 관점으로 작성해봤습니다.

논리회로: 게이트 수 / 깊이 → 성능

레드스톤: 블록 수 → 비용

이런 식으로 볼 수 있겠네요

이를 토대로 컴퓨터 구조 속 들어가는 CPU와 RAM 등을 구현해보면 어떨까 싶었지만 그 부분은 너무 복잡해져버리기 때문에 이번엔 이렇게 해보았습니다.

여러분들의 게임에도 이런 0과 1의 신호를 보낼 수 있는 무언가가 있다면 한번 해보는 것은 어떨까요?