用Hutton32玩转数字电路(一):逻辑门

  最近看到有人用Minecraft里面的红石电路制作出了计算器,还有一篇神文:《基于Minecraft实现的计算机工程》,视频在此,好像还能算浮点数、三角函数。我对红石不是太了解,那能不能用Hutton32做一个呢?经过不断尝试现在我的成果时能做出一个简单的加减法计算器和Ascii码显示阵列。
加减法计算器 Ascii码显示阵

什么是Hutton32?

  大家应该听说过生命游戏吧?这种在方格上根据相邻格子的状态不断演化的系统我们就叫细胞自动机。有一个强大的软件模拟计算包括生命游戏在内的细胞自动机超级快,它就是Golly。Hutton32也是一种细胞自动机规则(冯诺依曼元胞自动机的一种),Golly里面自带有一些Demo,Hutton32的设计初衷是制造出自我复制更快的机器,模拟数字电路的自动机也有,叫wirreworld,Golly里面自带有一个NB的wirreworld的质数计算器。所以用golly玩转数字电路按理说该玩wirreworld,但wirreworld里的信号不连续,必须要处理“相位差”,像生命游戏一样不允许信号随意错位,调试很麻烦,所以我选择了Hutton32,但Hutton32与一般电路不同的是信号只能在导线中单向传输。(当然免去了二极管这种元件)
  点击这里查看CFY关于冯诺依曼自动机的教程。

导线

我们用蓝导线里面的绿箭头作为信号载体。蓝导线里面的信号传到末端会译码:
(Hint:点图就能能复制代码直接粘贴到Golly上运行哦)
翻译结果:
翻译结果是在末端产生新的箭头/菱形或执行退格等操作。这些操作适合Hutton32做很快的自我复制机,是Hutton32的研发初衷。

而红导线是特殊导线,里面的信号是紫箭头,红箭头中的信号传到末端,如果末端是蓝/绿箭头或棱形,蓝/绿箭头或棱形就将会消失,感觉像被“吃”掉了一样。我们只能用蓝导线里的信号通过菱形转换为红导线里信号:

菱形

菱形作用很广,可分为以下几类:

  • 分叉器:要求必须一输入多输出,也兼有延迟器作用

  • 延迟器:一输入一输出

  • 与门:要求必须多输入一输出,有输出时也有延迟作用
  • 交叉器:要求必须二输入二输出,无延迟

注意下面这种情况任何信号都无法通过:

这是一种无用的状态,但如果我们改变Hutton32的规则我们能利用这种状态来制作小体积的非门!

信号及信号源

根据信号可以分成两类:连续信号和离散信号。其中如果要用离散信号做逻辑运算也得考虑相位差。
离散信号:
离散信号也可看做时钟信号,比如上面是以周期为7的时钟信号。(菱形作为分叉器有一代延迟)
连续信号:
它们可以相互转换:

  • 离散->连续:
    可以用一个离散信号源和一个与门(一个多个输入、一个输出的菱形)把连续信号调制成离散信号。

  • 连续->离散:
    直接用菱形(一个输入、多个输出) 的分岔功能即可。

逻辑门

或门

或门最简单:两个信号直接汇到一起即可。

与门

我们要利用Hutton32绿色菱形的一个与门特性:有多个输入、一个输出的菱形就是与门。

双/三输入与门

非门

非门有点复杂。单靠蓝导线和菱形是无法实现的。非门不输入信号(0)要有输出(1)说明非门必须自带信号源。红箭头有消掉蓝箭头的功能,所以我们可以在信号来时把它变成红箭头来抑制信号源发出信号从而实现非门。但这对离散信号才管用:因为红箭头来抑制信号源发出后只有离散周期大于5的信号才能重新翻译成向前的蓝箭头把导线重新连接。所以我们可以先把连续信号转换成离散信号,通过红箭头后再转换回连续信号。

这个机器有点复杂,当然这种非门的延迟是很严重的。
(高低电平工作状态)

数码管

最经典的7段数码管用来显示数字,在Hutton32里面还是很好做的。其中左下角是7段译码器,由一些或门构成。

左下角译码器放大版:

输入有10根线,代表0-9,输出7根线,分别点亮对应的灯管。

——

好了,有了这些部件下一步就是组合它们,实现加法、减法、锁存、译码等各种数字电路中的那些功能!
(未完待续)