로직 게이트 또는 플립 플롭을 사용하여 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.