首先,对于那些不熟悉游戏的人来说,这就是游戏的运作方式,
游戏的目标是关闭所有灯,因此称为“熄灯”,每次按下按钮/灯都会反转其状态以及它的北/南/东/西相邻邻居,仅此而已.
现在,我能想到的是使用 SR 触发器或 JK 触发器。这是由于它能够充当存储元素(初始状态和下一个状态)。但我似乎想不出实际实施它们的方法。
另一个想法是,每组按钮及其相邻的 (NSEW) 按钮/灯都有自己的真值表,如下所示:
但是,是否可以让输入变量与输出变量相同?还有其他方法可以做到这一点吗?
首先,对于那些不熟悉游戏的人来说,这就是游戏的运作方式,
游戏的目标是关闭所有灯,因此称为“熄灯”,每次按下按钮/灯都会反转其状态以及它的北/南/东/西相邻邻居,仅此而已.
现在,我能想到的是使用 SR 触发器或 JK 触发器。这是由于它能够充当存储元素(初始状态和下一个状态)。但我似乎想不出实际实施它们的方法。
另一个想法是,每组按钮及其相邻的 (NSEW) 按钮/灯都有自己的真值表,如下所示:
但是,是否可以让输入变量与输出变量相同?还有其他方法可以做到这一点吗?
显而易见的方法是使用处理器并在固件中完成所有这些工作。
但是,如果出于某种原因我真的需要使用石刀和熊皮来执行此操作,我会在每个方格上专门设置一个切换触发器。每个方块的触发器将通过按下其按钮或四个相邻按钮中的任何一个来切换。当然,这些按钮按下需要去弹跳。同样,这在固件中会更容易。
硬件解决方案不会那么复杂,但所有东西都会被复制 25 次,这使得构建它变得庞大而乏味。
显然上面的描述不够清楚。这是每个单元格中的内容的图表:
与非门的其他 4 个输入由 4 个周围按钮的去抖信号驱动,这些按钮也应该切换该方块的状态。同样,来自该按钮的去抖信号也进入 4 个周围单元中每个单元的 NAND 门输入之一。
我会说 T 触发器可能是最简单的,因为您可以使用单个输入切换它们的输出状态。您可以为每个 LED 使用一个触发器,并将输入绑定到您的按钮,将输出绑定到您的 LED。然后,您可以将每个按钮绑定到 4 个相邻触发器的输入,以便也切换它们的状态。
如果您想使用 JK 触发器,您可以通过将输入传递给两个输入(J 和 K)来制作 T 触发器
如果想用离散逻辑构建一个大小为 7x7 的游戏,最实用的设计可能是使用循环移位寄存器来保存棋盘的状态,并使用 6 位计数器来跟踪移位数据在寄存器中的位置。通过移位器以 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
请注意,虽然解码这些计数器状态需要大量逻辑,但与分别实现每个灯所需的芯片数量相比,这将是微不足道的。