로직 게이트 또는 플립 플롭을 사용하여 Lights-Out 게임을 어떻게 구현합니까?


9

첫째, 게임에 익숙하지 않은 사람들에게는 이것이 게임이 작동하는 방식입니다.

게임 플레이

이 게임의 목표는 "Lights Out"이라고하는 모든 조명을 끄는 것입니다. 버튼 / 조명을 누를 때마다 북쪽 / 남쪽 / 동쪽 / 서쪽 인접 이웃뿐만 아니라 상태가 반전됩니다. .

이제 제가 생각할 수있는 것은 SR 플립 플롭 또는 JK 플립 플롭을 사용하는 것입니다. 이는 저장 요소 (초기 상태 및 다음 상태)로 작동 할 수 있기 때문입니다. 그러나 실제로 구현하는 방법을 생각할 수 없습니다.

또 다른 아이디어는 각 버튼 세트와 인접한 (NSEW) 버튼 / 표시등에 다음과 같이 고유 한 진리표가 있다는 것입니다.

논리 테이블

그러나 입력 변수를 출력 변수와 동일하게 할 수 있습니까? 다른 방법이 있습니까?

답변:


9

확실한 접근 방식은 프로세서를 사용하고 펌웨어에서이 모든 작업을 수행하는 것입니다.

그러나 스톤 나이프를 사용 하여이 작업을 수행하고 어떤 이유로 스킨을 보유 해야하는 경우 각 사각형에 플립 플롭을 토글합니다. 각 사각형의 플립 플롭은 해당 버튼 또는 네 개의 인접 버튼 중 하나를 누르면 토글됩니다. 물론 이러한 버튼 누름은 바운스 해제되어야합니다. 다시 말하지만, 이것은 펌웨어에서 더 쉬울 것입니다.

하드웨어 솔루션은 그다지 복잡하지는 않지만 모든 것이 25 번 복제되어 크기가 크고 복잡합니다.

추가 :

분명히 위의 설명은 명확하지 않습니다. 각 셀에있는 내용은 다음과 같습니다.

NAND 게이트에 대한 다른 4 개의 입력은이 사각형의 상태를 토글해야하는 4 개의 주변 버튼의 디 바운스 된 신호로부터 구동됩니다. 마찬가지로이 버튼에서 디 바운스 된 신호는 4 개의 주변 셀 각각의 NAND 게이트 입력 중 하나에 전달됩니다.


1
이것은 가장 실현 가능한 일처럼 들립니다. TFF를 사용하고 모든 T 입력을 "1"에 연결합니다. 그런 다음 각 버튼마다 SPDT 순간 스위치가 있습니다. 하나는 "0"에, 하나는 "1"에, 그런 다음 극을 해당 TFF 클록 입력에 연결합니다. 그런 다음 스위치를 누르면 단일 위치 / 부정 에지를 생성하여 주변 플립 플롭을 토글합니다.
— Shamtam

1
@Shamtam : 그렇습니다. SPDT 스위치가있는 경우 수신 거부하는 한 가지 방법입니다. 그러나 대부분의 푸시 버튼은 정상적으로 열린 SPST입니다.
— Olin Lathrop

푸시 버튼 여부에 관계없이 수신 거부를 위해 SPDT 스위치를 사용해야한다고 생각합니다. 이제이 게임의 입력을 연결하는 방법을 얻었지만 얻을 수없는 것은 출력을 LED에 연결하는 방법입니다. 내 말은, LED에 대한 간단한 출력 (Q)이 될 수 없으며 그 이웃의 보수 (Q ')가 맞습니까? 또한 또 다른 질문은 TFF의 클럭 신호 입력을 사용해야합니까? 그렇다면 어떻게?
— Julienn December

2
각 셀의 플립 플롭은 LED를 직접 구동합니다. 인접 셀과 관련된 논리 는 플립 플립 의 입력 으로 들어가 지만 출력은 셀에 로컬로 유지됩니다. SPDT 스위치는 디 바운싱에 필요하지 않습니다. SPST 스위치와 같은 단일 신호를 수신 거부하는 다양한 기술이 있습니다.
— Olin Lathrop

1
아니요, 당신은 논리를 얻지 못합니다. 일반적으로 디 바운스 된 출력은 높으므로 NAND 게이트에 대한 모든 입력이 높으므로 출력이 낮습니다. 아무 버튼이나 누르면 NAND get 입력이 낮아지고 NAND 출력이 높아집니다. 이 낮은 가장자리에서 높은 가장자리로 인해 FF가 상태를 토글합니다.
— Olin Lathrop

0

T 플립 플롭이 단일 입력으로 출력 상태를 토글 할 수 있기 때문에 아마도 가장 쉽다고 말할 것입니다. 각 LED에 단일 플립 플롭을 사용할 수 있으며 입력은 버튼에 연결되고 출력은 LED에 연결됩니다. 그런 다음 각 버튼을 4 개의 인접한 플립 플롭의 입력에 연결하여 상태를 전환 할 수 있습니다.

JK 플립 플롭을 사용하려면 두 입력 (J 및 K)에 입력을 전달하여 T 플립 플롭을 만들 수 있습니다.


2
5 개의 스위치를 서로 간섭하지 않고 각 플립 플롭에 연결하는 방법을 설명하여 답변을 확장 할 수 있습니다. 또한 스위치 바운스는 어떻습니까?
— Dave Tweed

0

이산 논리에서 최대 7x7 크기의 게임을 만들고 싶다면 가장 실용적인 디자인은 순환 시프트 레지스터를 사용하여 보드의 상태를 유지하고 6 비트 카운터를 사용하여 이동을 추적하는 것입니다. 레지스터 내의 데이터 위치. 멀티플렉싱 디스플레이를 구동하고 멀티플렉싱 키보드를 스캔하려면 8 비트 그룹으로 시프터를 통해 데이터를 이동하십시오. 맨 아래 6 비트가 0이 아니거나 맨 위 비트의 상태가 현재 디코딩 된 버튼의 상태와 일치 할 때 실행되는 7 비트 "플립 라이트"카운터가 있어야합니다. 다음이 모두 적용될 때마다 현재 조명의 상태를 뒤집습니다.

6-bit counter isn't  xxx111
6-bit counter isn't  111xxx
7-bit counter isn't xxxxx00
7-bit counter isn't xx00xxx
7-bit counter is    00xx0xx

이들 카운터 상태를 디코딩하기 위해서는 상당한 양의 로직이 필요하지만, 각각의 광을 개별적으로 구현하는데 필요한 칩의 수와 비교하면 사소한 것이 될 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.