如何使用逻辑门或触发器实现Lights-Out游戏?


9

首先,对于不熟悉游戏的人来说,这就是游戏的运作方式,

游戏玩法

游戏的目标是关闭所有灯光,因此被称为“ Lights Out”,每次按下按钮/灯光都会反转其状态以及其北/南/东/西/西相邻邻居的状态,差不多。

现在,我能想到的是使用SR触发器或JK触发器。这是由于其充当存储元素的能力(初始状态和下一个状态)。但是我似乎无法想到真正实现它们的方法。

另一个想法是每组按钮及其相邻的(NSEW)按钮/灯都将具有自己的真值表,如下所示:

逻辑表

但是,是否有可能使输入变量与输出变量相同?还有其他方法吗?

Answers:


9

显而易见的方法是使用处理器并通过固件完成所有这些操作。

但是,如果由于某些原因我真的需要用石头刀和熊皮来做这件事,那么我会在每个方块上使用一个触发器。每个方块的触发器将通过按下其按钮或四个相邻按钮中的任意一个来切换。当然,这些按钮的按下需要取消。同样,这在固件中会更容易。

硬件解决方案并不会那么复杂,但是所有内容都将被复制25次,从而使其庞大且难以构建。

添加:

显然,上面的描述不够清楚。这是每个单元格中的图表:

NAND门的其他4个输入由周围的4个按钮的去抖动信号驱动,这4个按钮也应该触发该正方形的状态。同样,来自此按钮的去抖动信号也到达四个周围单元中​​每个单元的“与非”门输入之一。


1
这听起来是最可行的事情。我将使用TFF,并将所有T输入都绑定到“ 1”。然后,每个按钮都有一个SPDT瞬时开关。将一掷并置为“ 0”,将一掷并置为“ 1”,然后将两极置为相应的TFF时钟输入。然后,当您按下一个开关时,它将通过产生单个正负边缘来切换周围的触发器。
沙姆坦(Shamtam)2012年

1
@Shamtam:是的,如果您有SPDT开关,那是一种消除抖动的方法。但是,大多数按钮只是常开SPST。
奥林·拉斯罗普

我想无论是否使用按钮,都必须使用SPDT开关进行反跳。我现在了解了如何连接该游戏的输入,但是我没有得到的是如何将输出连接到LED。我的意思是,它不只是LED的简单输出(Q)及其附近的补数(Q'),对不对?另外,还有一个问题,我需要使用TFF的时钟信号输入吗?如果是这样,怎么办?
朱利安

2
每个单元的触发器直接驱动其LED。与相邻单元有关的逻辑输入到触发器的输入中,但输出在单元本地。不,反跳不需要SPDT开关。有多种技术可用于对单个信号进行去抖动,例如来自SPST开关的信号。
奥林·拉斯洛普

1
不,你没有逻辑。通常,去抖动的输出为高电平,因此与非门的所有输入均为高电平,从而将输出驱动为低电平。当按下任何按钮时,NAND获取输入变为低电平,从而使NAND输出变为高电平。从低到高的边沿导致FF切换其状态。
Olin Lathrop

0

我想说T触发器可能是最简单的,因为您可以用单个输入切换它们的输出状态。您可以为每个LED使用单个触发器,并且将输入绑定到按钮,将输出绑定到LED。然后,您可以将每个按钮绑定到4个相邻触发器的输入,以便同时切换它们的状态。

如果您想使用JK触发器,则可以通过将输入传递到两个输入(J和K)来制作T触发器。


2
您可以通过解释如何将5个开关连接到每个触发器而不相互干扰来扩展答案。另外,开关弹跳又如何呢?
戴夫·特威德

0

如果要使用离散逻辑构建尺寸高达7x7的此类游戏,则最实际的设计可能是使用循环移位寄存器来保持电路板的状态,并使用一个六位计数器来跟踪移位数据在寄存器中的位置。通过移位器将数据以8位为一组进行移位,以驱动多路复用显示器并扫描多路复用键盘。有一个七位的“翻转灯”计数器,该计数器将在后六位不为零时或在高位的状态与当前解码的按钮的状态匹配时运行。只要满足以下所有条件,请翻转当前指示灯的状态:

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

请注意,虽然解码这些计数器状态需要大量的逻辑,但与单独实现每盏灯​​所需的芯片数量相比,这是微不足道的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.