Minecraft中有很多吸引人的地方,其中一个就是红石电路系统。有牛人就用游戏的红石电路制作了8位计算器、数字显示器等等。

前几天看到了LeetCode上面的一道题目,对,就是那道用数字电路解法的题目。看完之后心血来潮,想着用Minecraft的红石电路弄一遍,一定会非常 COOL ~。🆒

温习功课

好吧,数字电路的内容大多数已经忘记,所以先温习一下吧,对应在Minecraft中的表现形式也一并展示出来。

与或非门

先从基本的与或非门开始。这三种逻辑电路的真值表如下:

A B 真 真 真 假 假 真 假 假
A+B 或
AB 与
~A 非

非门(即“反相器”)的输入与输出相反。输入为1的时候输出为0,输入为0的时候输出为1。在Mincraft中可以使用红石火把的阻断特性来制作。红石火把默认输出信号,当有输入信号(如拉杆)的时候,红石火把会熄灭。由此与非门的特性一致。

非门

或门的任意一个输入为1,输出就会是1。或门有两个输入端,一个输出端。根据红石火把的特性,任意一个输入端为1的时候,输出端都为0,这正好与或门的输出相反。这更像一个或非门,于是,在最后再加上一个非门就变成我们需要的或门了。

或门

与门只有当两个输入都为1的时候,输出才会是1。根据或门的思路,从逻辑公式推演$AB=\overline{\overline{AB}}=\overline{\overline{A}+\overline{B}}$,可能看推演公式看不出什么,但是看电路就会明白了。

与门

触发器

触发器是记忆电路相关的内容。上面提到的门电路的输出只与当前的输入有关,但有时候电路还需要“过去的输入”相关,也就是有记忆功能。完成这个功能的电路有锁存器触发器。在现实生活中的电子学中,锁存器指对输入信号的某个状态产生反应的电路;触发器指对输入信号的变化产生反应的电路。

最基本的是RS触发器,RS触发器有三种模式:置0、置1和保持。

RS触发器

一般常用的是精简的版本。

RS触发器精简版

RS触发器存在禁止条件,R和S不能同时为1。这给使用者带来的不便。简单变化就是D触发器。关于D触发器有好多种实现方法,这里从记忆电路 - Minecraft Wiki上找到了一个D寄存器简化的版本。

D触发器简化图

图例在这里红石图例。根据图可以构造一个简单的D寄存器。D触发器在CP=1的作用下将D端的输入数据送给触发器,当CP=0时Q(n+1)=Q(n)不变,故常用作锁存器,因此D触发器又称为D锁存器。

D触发器

请无视入镜的史莱姆同志。。。

需要的内容大概就这些了,下面开始开工。

开工

了解了一些基础内容之后,需要制作我们的三进制加法计算器了。根据LeetCode Q137 Single Number II的数电AC方法中推导的公式:

$F_1=X\overline{Z}+YZ$
$F_2=Y\overline{Z}+\overline{X}\overline{Y}Z$

分析一下,需要两个寄存器存储高位和低位,还需要一个按钮触发+1操作,最后需要一个显示的地方。这里只制作一个简单的 半加器 ,变换的顺序为00->01->10->00。不考虑进位的情况。

制作的步骤是,先放置输入端,然后再放置两个D触发器,最后将与或非门填充进去。最后的效果就是这个样子。

三进制半加器

没有电路精简,真是不忍直视呀。在制作的时候遇到了一些问题:

  1. 电路重叠的时候,下层的红石火把很可能影响上层的电路;
  2. 由于电路传输有时间间隔,很容易造成信号跳动,两个D触发器变动不一致的话很容易互相影响,出现结果不一致的情况。

对于第二个问题,没有找到一个好的解决方法,之好将两个触发器输出的延迟调高一些。从10->00的过程中出现的11的情况,最后的效果还是挺满意的吧。😂

效果展示

就这样吧,一天又过去了。。。

参考文献