프로그램 가능한 레드넷 제어기(PRC) Part.6

마인크래프트 1.6.2, 마인팩토리 리로디드 2.7.0B8 기준으로 작성되었습니다.

이번에는 래치와 플립플롭에 대해 알아보겠습니다. 디지털 회로에서 플립플롭과 래치는 값을 보관하기 위한 중요한 회로이지만 PRC에는 내부에 변수(VARS) 저장 공간이 있다보니 용도가 애매합니다. 그런 관계로 간단한 사용 방법만 적어둡니다. 래치와 플립플롭은 공통적으로 Q와 Q# 값을 출력으로 사용합니다. Q에는 현재 보관중인 값을, Q#에는 현재 보관중인 값과 반대되는 값을 내보냅니다.

SR-래치(SR-Latch) – S(Set)와 R(Reset)의 값에 따라 보관중인 값을 변경합니다. S로 신호가 들어올 경우 보관중인 값을 15로, R로 신호가 들어올 경우 보관중인 값을 0으로 바꿉니다. 양쪽 모두 신호가 들어오지 않을 경우 그대로 유지하고, 양쪽 모두 신호가 들어올 경우 원래 회로는 비정상적인 동작을 하게 되지만 PRC에서는 아무런 변화 없이 현재 상태를 유지합니다.

SR-래치(SR-Latch) Gated – 회로의 동작은 SR-래치와 동일합니다. 다만 E라는 입력을 추가로 받아서 E로 신호가 들어올 경우에만 동작하도록 변경된 회로가 SR-래치 Gated 회로입니다.

D-래치(D-Latch) Gated – E로 신호가 들어오는 동안 보관중인 값을 D에서 들어오는 값으로 바꿉니다.

T-플립플롭(T-Flipflop) – 입력에 따라 저장된 값을 반전시키는(토글, Toggle) 회로입니다. CLK의 값이 0에서 다른 숫자로 바뀌는 순간 T 입력을 확인해서 T로 신호가 들어왔다면 보관중인 값을 반대로 바꿉니다.

JK-플립플롭(JK-Flipflop) – SR-래치와 T-플립플롭을 합친 형태의 회로입니다. 입력은 J와 K를 받으며 J는  S의 역할을, K는 R의 역할을 합니다. 다만, J와 K 모두 신호가 들어올 경우 아무런 동작도 하지 않던 SR-래치와 달리 T-플립플롭처럼 보관중인 값을 반대로 바꿉니다. 그리고 CLK입력을 받아서 CLK값이 0에서 다른 숫자로 바뀌는 순간에만 회로가 동작합니다.

이상으로 현재 PRC에서 제공중인 래치와 플립플롭에 대해 알아보았습니다.

이제 나머지 PRC 회로들을 알아보겠습니다. 우선 통과(Passthrough) 회로입니다. PRC에서 제공하는 통과 회로는 총 3가지 형태가 있습니다.

첫번째로 일반 통과 회로의 경우 들어온 입력 값을 그대로 출력 값으로 내보냅니다. 상수(CNST)값을 출력하고 싶을때나, 들어온 값을 변수(VARS)에 넣고 싶을때 등에 쓸 수 있습니다.

두번째로 Gated 통과 회로입니다. 래치에서 잠시 언급한대로 E라는 신호를 받아서 신호가 들어올 때만 값을 전달합니다. E에 신호가 들어오지 않는다면 0을 내보냅니다.

세번째로 Ring 통과 회로입니다. Ring 통과 회로에는 많은 입력과 출력이 있습니다. 우선 CNT 입력값은 입력된 I 값을 몇개의 출력으로 보낼지를 결정합니다. CNT가 5일 경우 O0부터 O4까지 5개로만 I 값이 출력됩니다. 그리고 CLK 값이 0에서 다른 숫자로 바뀔때마다 출력되는 위치가 바뀝니다. 바뀌는 순서는 순차대로 0번부터 1씩 증가하며 마지막 출력이었다면 첫번째인 0번 출력으로 돌아갑니다. 현재 출력중인 위치를 제외한 나머지 출력에는 0을 내보냅니다.

다음으로 알아볼 회로는 지연(Delay) 회로입니다. 마인크래프트에 있는 레드스톤 중계기(Redstone Repeater)와 같이 입력된 값을 일정 시간이 지난 후에 출력하는 회로입니다. 다만, 레드스톤 중계기에 비해 지연 시간을 자유롭게 설정할 수 있다는 장점이 있습니다. D에 입력된 숫자만큼의 틱이 지난 후에 I의 값을 O로 보냅니다.

다음은 팬아웃(Fanout) 회로입니다. 팬아웃은 하나의 입력을 여러개의 출력으로 동시에 내보내는 역할을 합니다.

마지막으로 슈미트 트리거(Schmitt Trigger) 회로입니다. 슈미트 트리거 회로는 Pd에 설정된 틱 시간 이상동안 I로 입력이 있어야 출력으로 값을 전달합니다. 발판을 설치하면서 잠시 지나가는 경우에는 무시하고 싶을때 쓸 수 있는 회로입니다. 발판 위에서 일정 시간동안 대기해야 신호가 전달되기에 잠깐 밟는 정도로는 신호가 출력되지 않게 할 수 있습니다.

이상으로 현재 PRC에서 제공되는 모든 회로에 대한 이야기를 마칩니다. 자세히 풀어서 설명하는 능력이 없다 보니 각 회로별로 간략한 요점 정리글이 되어버렸지만요. 각 회로에 대해 궁금한 내용이 있으신 분은 댓글을 남겨주시면 답변을 드리도록 하겠습니다.

프로그램 가능한 레드넷 제어기(PRC) Part.5

마인크래프트 1.6.2, 마인팩토리 리로디드 2.7.0B8 기준으로 작성되었습니다.

이번에는 숫자 연산(아날로그 연산)과 관련된 회로들에 대해서 알아보겠습니다. 사실 회로라고 하긴 애매한 분야지만요.

가산(덧셈, Adder) – 두개의 입력을 받아서 더한 값을 출력합니다. 3편에서 나온 디지털 가산 회로의 경우 0 또는 0이 아닌 숫자로 0과 1의 입력을 처리하지만, 지금 설명하는 아날로그 가산 회로는 입력받은 숫자를 그대로 더해서 출력합니다.

감산(뺄셈, Subtractor) – 두개의 입력을 받아서 뺀 값을 출력합니다. 사용 방법은 가산과 동일합니다.

부호 반전(Negator) – 입력된 값의 부호(음수인지 양수인지)를 반대로 바꿉니다. PRC에서 직접 숫자를 입력할 수 있는 범위가 0 ~ 255로 제한되어 있기에 음수값을 입력해야 하는 경우 이 회로를 사용하면 됩니다.

최대(Maximum) – 입력받은 값들 중 가장 큰 값을 출력합니다.

최소(Minimum) – 입력받은 값들 중 가장 작은 값을 출력합니다.

PRC에는 현재 위와 같은 숫자 연산과 관련된 회로들이 있습니다. 마인크래프트의 세계에서 숫자를 취급하는게 쉽지 않다 보니 쓸 일이 많지는 않겠지만요. 그럼 숫자와 관련된 회로들을 몇가지 더 알아보겠습니다.

우선 비례(Scaler)라는 회로가 있습니다. 예를 들어 10점 만점중에 5점을 받았다면 100점 만점이라면 50점이지요. 이런 식의 서로 다른 두 범위에서 한쪽에서의 위치가 다른쪽에서는 어디쯤인지 알기 위한 회로가 비례 회로입니다. 입력으로는 입력값과 함께 입력값의 범위, 그리고 출력값의 범위를 받습니다.

그 다음은 자릿수 분해(Decompose Int -> Decimal)입니다. 숫자를 입력받으면 각 자릿수별로 출력을 내보냅니다. 만약 123이라는 숫자를 넣는다면 D0(1의 자리)에는 3, D1(10의 자리)에는 2, D2(100의 자리)에는 1을 내보냅니다. 나머지는 0을 내보냅니다. 즉, D0 부터 D9 까지가 자릿수를 나타냅니다. 그리고 가장 처음에 있는 SN은 입력된 숫자가 0이거나 양수일 경우 0, 음수일 경우 15를 출력합니다. 즉, 입력받은 숫자의 부호를 나타냅니다.

마지막으로 난수 발생(Randomizer)입니다. 난수란 무작위로 만들어지는 숫자로 난수 발생 회로는 이러한 무작위 숫자를 만들기 위한 회로입니다. 디지털 난수 발생은 별도의 입력값 없이 매 틱마다 0 또는 15를 출력하고, 아날로그 난수 발생은 최소값과 최대값을 받아서 그 범위 내의 임의의 값을 출력합니다.

프로그램 가능한 레드넷 제어기(PRC) Part.4

마인크래프트 1.6.2, 마인팩토리 리로디드 2.7.0B8 기준으로 작성되었습니다.

이번에는 파형 발생 회로에 대해 알아보겠습니다. 파형 발생 회로의 가장 유용한 용도로는 일정 시간마다 신호를 주기 위한 타이머 용도가 있습니다. 일정 시간마다 장비를 껐다가 켰다가 하는 상황이라면 유용하게 쓸 수 있습니다.

우선 PRC에서 제공하는 파형 발생 회로의 종류를 알아보겠습니다.

톱날(Sawtooth) – 톱날 모양의 파형을 발생합니다. 톱날 파형은 신호가 0에서 15까지 1씩 증가하다가 15가 되면 0으로 떨어지는 상향(Rising) 파형과 반대로 15로 올라갔다가 0까지 1씩 내려가는 하향(Falling) 파형이 있습니다.

삼각형(Triangle) – 톱날 모양의 상향과 하향을 붙인 삼각형 형태의 파형입니다. 0에서 15까지 1씩 증가하다가 15가 되면 반대로 1씩 감소하는 형태입니다.

사인(Sine) – 곡선 형태로 0부터 15까지 증가하고 감소하는 형태의 신호를 출력하지만 수치의 범위가 좁은 관계로 폭이 좁은 삼각형 파형처럼 보입니다.

사각형(Square) – 일정 시간마다 0과 15를 바꿔가면서 신호를 출력합니다.

mfr rednet historian

파형을 실제로 보고 싶으신 분은 PRC에 레드넷 파형 기록기(RedNet Historian)를 연결하면 눈으로 확인할 수 있습니다. 레드넷 파형 기록기는 매 틱마다 출력되는 레드스톤 신호의 세기를 보여주는 장비입니다. 스크린샷에 나온 파형은 삼각형 파형입니다.

PRC에서 제공하는 파형은 신호가 출력되는 간격을 조절할 수 없기에 타이머 용도로 쓰기엔 어렵지만 유일하게 사각형 파형만은 시간 간격을 조절할 수 있습니다. 그래서 이름에 따로 타이머라고 붙어 있기도 합니다. 이 사각형 파형 발생 회로를 이용해서 좀 더 다양한 환경에 대응할 수 있도록 해보겠습니다.

우선 사각형 파형의 제한 조건부터 알아보겠습니다. 우선 파형은 최대 255틱(약 13초)마다 0과 15가 바뀝니다. 그리고 일반적인 타이머처럼 매 시간마다 잠깐 신호가 출력되는게 아닌 일정 시간동안 신호가 계속 출력됩니다. 이런 제한 조건을 바꾸기 위한 회로들을 알아보겠습니다.

우선 파형이 일정 시간동안 계속 출력되는 대신 잠깐만 신호가 출력되게끔 하기 위해서 1회성 펄스(One-Shot Pulse)라는 회로를 쓸 수 있습니다. 1회성 펄스는 입력이 0에서 다른 값으로 바뀌는 순간에만 잠시 신호가 출력되고 입력이 계속 유지가 되어도 다시 0으로 돌아가기 전까지는 신호가 출력되지 않습니다.

사각형 파형의 출력을 1회성 펄스에 연결하면 0에서 15로 바뀌는 순간에만 잠시 신호가 출력되게끔 되는 것입니다. 다만, 사각형 파형의 출력 자체가 짧아지는건 아니기에 출력이 없는 시간이 2배 가까이 늘어나게 됩니다. 사각형 파형의 설정 시간이 10틱이라면 0에서 15로 올라가는 1틱만 신호가 출력되고, 나머지 15가 유지되는 9틱은 신호가 없습니다. 파형이 바뀌어서 0으로 바뀌어도 설정 시간 10틱간은 신호가 없기에 20틱마다 한번씩 신호가 나오게됩니다.

사각형 파형과 1회성 펄스를 조합해도 신호 간격은 최대 25.5초가 됩니다. 하지만 이보다 더 긴 시간 간격이 필요할 때도 있습니다. 이럴때는 지난 글에서 이야기한 계수(Counter) 회로를 쓰면 됩니다. 사각형 파형의 출력을 계수 회로의 증가나 감소에 연결하고 PRE 값에 적당한 지연 시간을 주면 됩니다. 참고로 계수 회로에는 1회성 펄스의 기능을 포함하고 있기에 1회성 펄스 회로를 추가로 연결할 필요는 없습니다.

사각형 파형과 계수 회로를 연결할 경우 사각형 파형의 지연 시간(설정 시간의 2배)와 PRE 값을 곱한 만큼 시간을 지연하게 됩니다. 간편하게 사용하려면 사각형 파형의 설정을 10(20틱 = 1초)으로 하시면 PRE 값이 그대로 초단위 설정이 됩니다. 사각형 펄스와 계수 회로를 연결하면 최대 약 6500초 정도까지 신호 발생 간격을 조절할 수 있고, 그 이상이 필요하다면 계수기를 추가로 연결하면 됩니다.

1회성 펄스나 계수 회로를 쓰면 신호가 1틱만 발생하게 됩니다. 하지만 경우에 따라서는 그보다는 긴 시간이 필요할수도 있습니다. 이럴때는 펄스 연장(Pulse Lengther) 회로를 쓰면 됩니다. I로 들어온 입력이 0이 아닐 경우 L에 설정된 틱 시간동안 15의 수치로 신호가 출력됩니다. 그리고 10틱을 설정했는데 25틱동안 신호가 들어왔다면 10의 배수로 계산해서 총 30틱동안 신호가 출력됩니다. 설정보다 입력이 길다고 해서 바로 신호를 끊어버리지는 않는 점은 기억해두시기 바랍니다.

마지막으로 조금 독특한 회로인 연속 펄스 생성(Multipulse) 회로를 알아보겠습니다. 연속 펄스 생성 회로는 신호가 들어올 경우 일정 횟수동안 신호의 출력을 켜고 끄는 동작을 하게 됩니다.

입력의 I의 값은 출력이 켜질때 출력의 Q 값으로 보내게 됩니다. 위에 이야기한 회로들의 출력은 0 또는 15만 뜨지만 연속 펄스 생성은 출력값의 세기를 조절하는게 가능합니다.

CLK값은 회로가 동작하기 위한 신호를 받는 곳입니다. CLK값이 0에서 다른 숫자로 바뀌면 연속 펄스 생성 회로는 동작하게 됩니다. 참고로 CLK 값은 1회성 펄스와 같이 0에서 다른 숫자로 바뀌는 순간에만 동작하고, 입력을 유지하고 있어도 연속 펄스 생성 회로는 정해진 횟수만큼만 동작합니다. 단, 동작하는 도중에 CLK 값이 다시 0에서 다른 숫자로 바뀐다면 처음부터 다시 회로가 동작합니다.

CNT 값은 펄스가 몇번 생성되는지를 설정하고, THi는 신호가 켜져있는 시간, TLo는 신호가 꺼져있는 시간을 의미합니다. CLK에 신호가 들어오면 CNT 횟수만큼 THi 틱동안 신호가 출력되고, TLo 틱동안 출력이 꺼지는 동작을 하는 회로입니다.

출력값의 DN은 모든 동작이 완료될 경우 신호가 출력됩니다. CNT에 정해진 횟수만큼 동작을 했다면 DN으로 신호가 출력됩니다.

연속 펄스 생성은 몬스터 트랩의 피스톤 공격처럼 버튼을 누르면 일정 횟수동안만 타이머 신호가 필요한 경우 유용하게 쓸 수 있겠습니다.