1/3
2/3
3/3
《图灵完备(TURING COMPLETE)》解法分享(一)——逻辑门、算数运算、处理器架构
科G栈
2025年08月14日 18:30
收录于文集
共10篇

上学学习电路的时候,我一直搞不清楚这些电路元件用在什么地方,后来从事嵌入式领域,虽然也接触电路,但是对于硬件底层还是不很了然。直到玩了《图灵完备(turing complete)》这款包装成游戏的电路软件才有了直观深入的了解。如果你是学习计算机相关专业的学生,强烈建议你玩一下这个游戏,会让你对计算机有更深入和直观的了解。

 

进入游戏后出现如下图所示的树型结构图,从下至上,由简至繁,一步步从一个与非门开始逐步构建出一个图灵完备的计算机,之后通过汇编用自己构建的计算机解决一些实际的问题。

 

一、基础逻辑门电路

这一部分构建最基本的门电路,包括与非门(NAND)、非门(NOT)、与门(AND)、或非门(NOR)、或门(OR)、异或门(XOR)、同或门(XNOR)等等。这里值得一提的是异或门,它有很多种构建方法,但是加上一点点限制可以通过巧妙的方式构建。比如限制用4个与非门构建异或门,这是steam的一个成就,解法如下:

这里用了4个门,延迟6,进一步优化,可以只用3个门达到4延迟,解法如下:

其他逻辑门电路比较简单,这里就略过了。

二、算数运算

基本的逻辑门构建完成后,就要用这些门来实现一些特定功能的电路了。

1、成对的麻烦

这一关有多种解法,最直观最容易想到的是如下这种:

它的逻辑表达式是%EF%BC%88A%5Ccap%20B%EF%BC%89%5Ccup%20%EF%BC%88A%5Ccap%20C%EF%BC%89%5Ccup%20%EF%BC%88A%5Ccap%20D%EF%BC%89%5Ccup%20%EF%BC%88B%5Ccap%20C%EF%BC%89%5Ccup%20%EF%BC%88B%5Ccap%20D%EF%BC%89%5Ccup%20%EF%BC%88C%5Ccap%20D%EF%BC%89

这个表达式是可以化解的,每一个化解得到的表达式都可以用电路表示,对应一种解法。其他解法如下:

上面这俩看着一样,但是总延迟有区别。

 2、奇数个信号

二进制的特点,奇数个1全部异或后是1,偶数个1全部异或后是0。

3、信号计数

此关也有多种解法,最笨最直接的方法如下:

结合“成对的麻烦”那关可以优化中间部分,这里就不贴出来了。还有一种思路是把所有的输入位求和,结果和进位组合出我们想要的结果,如下:

两个或非(NOR)和与(AND)构建了一个半加器,下一关就是。

4、半加器

也可以用异或XOR和与AND实现,不过门数多了一。

5、全加器

半加器再加一位,其实在信号计数已经做过了。

6、一位取反器

这关的正常解法就是异或,如下:

如果针对这关本身的话,还可以再优化门数量和总延迟,当然这种优化除了提高分数没啥实际意义。如下:

7、8位加法器

8位或、8位非没啥好说的,这里略过。

8位加法器有多种解法,不同解法性能差异很大,所以steam有个成就是实现延迟不超过35的加法器。思路是各位求和然后跟上一位的进位相加得到最终的结果,可以用全加器实现,不过那个性能很差,这里不做演示,大家可以自行实现。如下是第一种实现方式:

可以看到总延迟是36,刚好没法满足成就要求,原因是高位的结果需要等上一位的进位算出后才能开始计算,这就拉低了计算的效率。

实际上当给定两个数后,每一位有没有进位是确定的,比如两个都是0肯定没有进位,两个1肯定有进位,一个0和一个1不确定,需要看前面的进位情况,但最终肯定是可以确定的,通过这种思路,可以让各位求和与求进位同时进行,然后把结果和进位加起来即可。如下:

这里总延迟降低到了22,图中橘红色线代表和的结果,青色线表示进位,这里还是利用了两个NOR和一个AND的半加器,理解了这个半加器看懂这里还是比较容易的。这关还能进一步优化,比如进位是0可以不用管,默认就是0,上面那7个开关可以去掉,不过为了理解我保留了。看排行榜可以达到用65个门构建16延迟的8位加法器,有耐心的可以挑战。

8、相反数

最直接的思路是取反加1

但是用加法器效率很低。

使用分立元件构建半加器实现,

利用德·摩根定律,可以去掉NOT,把AND换成OR,上面的NOR换成NAND,下面的NOR换成AND,进一步优化,如下:

还可以换个思路,一个位前面的位都是1,那该位必反转,用AND判断是否全一,XOR判断是否反转,得到下图的解法:

利用德·摩根定律,可以去掉NOT,把AND换成OR,进一步优化,如下:

这个方法总延迟减少不过门数量增加了。排行榜有人用24门达到了10的总延迟,我暂时想不出来了,欢迎大家挑战。

9、存储一字节

这里如果用上一关构造的一字节存储器,会多几个门,主要是那个非门在每个单字节存储器中都有,而实际上我们可以用一个非门同时控制8个开关,如下所示:

10、3位解码器

3位排列组合,让每一种组合想办法输出1,这里全0和全1可以与其他两个共享前级,所以可以省出2个门。

还可以换个思路,先搞个2位解码器,再根据第三位决定是1234还是5678,如下所示:

11、小盒子

这里地址可以直接接读使能,但是写必须用开关,可能是同时开读写可能会先写后读,导致同时读写错误,加个开关写比读慢了2个延时就不会有问题了。前面地址的选择可以用三个NOR和一个AND搞定,这应该是2位解码最简单的了。

12、计数器

这里如果用之前现成的元器件搭建延迟和门数量都很高

全部用分立元件搭建,这个也是加1操作,跟相反数那里一样,所以可以直接复制相反数的加1部分,下图是综合评分最好的(门+总延迟最少),其他的大家自行尝试。

13、逻辑引擎

直接使用德·摩根定律效果不好,对输入取非既增加门又增加延迟

用分立元件实现与非NAND,这样能省出两个NOT的门数量(16),总延迟还能少2

再换个思路,

 

如上图所示,可以看到,操作码低位可以确定OR/NOR运算还是NAND/AND运算,高位可以确定是否需要取反,由此,可以得到下面的电路。低位选择是OR还是NAND的结果,与高位进行异或运算决定是否需要反转。这个电路总延迟多了2,不过门数量减少了11。

排行榜上有门数量53,延迟6的方法,我实在想不出了。

三、处理器架构

1、算数引擎

在上一关的基础上加上ADD和SUB,

这里减法直接对第二个输入取相反数会增加很多门和总延时,还是回到取反加1这个规律,A-B实际就是A+(~B)+1,~B直接用NOT,1可以放到加法器的进位上,这样可以大大提高减法的效率。

这个模块以后要用,用集成元件的话比较整洁,所以损失点时间和门改成下图看着清爽些。

排行榜能优化到113门、22延时,真不知道怎么做到的。

2、条件判断

个人感觉这个题目有点难度,不是做出来难,而是用简洁的办法做出来难,理解难。steam的成就用10个蓝色元件通过条件判断,下面两个解决方案都是网上找的,自己是真的想不出来。

到此,完成图灵完备计算机的基础都搞定了,把它们拼起来就是一台可运行的计算机。