平衡三进制计算机模拟与构建

PS:以下内容均为本人原创,未经授权及许可,严禁引图、转载或加工,违者必究。

————2024年6月13号


1、图灵机的概述

图灵机(Turing machine)是一种理论计算模型,由英国数学家阿兰·图灵(Alan Turing)于1936年提出。它被用来研究计算过程的基本性质和计算理论的极限。图灵机被认为是现代计算机的理论基础。

1.1图灵机的组成部分:

  1. 无限长的纸带: 纸带被划分成一系列的方格,每个方格可以包含一个符号(例如0或1),纸带既可以向左也可以向右移动。
  2. 读写头: 读写头可以在纸带上移动,读取或写入符号。
  3. 状态寄存器: 状态寄存器存储着图灵机当前的状态。状态是有限的,可以是预定义的某一个状态集合中的一个。
  4. 状态转移函数: 这是一组规则,决定了图灵机在给定状态和读取到的符号时如何行动。规则包括:
    - 写入符号
     - 移动读写头(向左或向右)
    - 进入下一个状态

1.2图灵机的运行过程:

  1. 读写头读取纸带上的当前符号。
  2. 根据当前符号和当前状态,查找状态转移函数,决定接下来要执行的操作。
  3. 执行操作,更新纸带上的符号,移动读写头,更新状态寄存器中的状态。
  4. 重复上述步骤,直到达到某个停止状态(如果有的话)。

图灵机的主要意义在于它能够模拟任何计算过程,因此被称为通用图灵机(Universal Turing Machine)。任何可以被计算的问题,理论上都可以由图灵机来解决。这使得图灵机成为计算理论中的一个重要工具,用来定义和研究可计算性、算法的复杂性以及计算的极限。


2、平衡三进制图灵机的感想来源

        平时就喜欢逛blbl看看科普视频,是《苏联的三进制电脑》差评君写的,好像是几年前的视频了,那时就想那么厉害的东西没了真可惜,后面又看到很多人去辩论,呈现两边极化的现象,可见都没见过这东西,真不好评价。后面又详细的查了一下前苏联的资料,发现这东西是真的有趣,还发现很多人都想重新将这三进制计算捞回来。

        但是,三进制是它的优点也是它的缺点,自然界中太多都是两态的,如何做到三种稳定的状态是个问题,原生的三进制比二进制每1位多一状态,也就说信息密度更大,同时算的也多,理论上讲会快1.6倍左右,能实现所使用的零件也会更少,但前提是能实现,反正现在没人实现。


2.1平衡三进制的模拟

        因为硬件发展不起来,所以就不会有相应的系统与软件,就形成不了生态,简单来说,平衡三进制计算没戏,处非有研制硬件出来,而我又太想知道前苏联的三进制是怎样的,所以走了模拟一条路,虽然性能肯定不如原生的三进制计算机,但能先将它重现出来,后面如何优化,那就是后面的事了。

        道家说“道生一,一生二,二生三,三生万物”,儒家有“三人为众”及“三人行必有我师”,可见“三” 在我国传统文化中有着崇高的地位,现在就是二生三,用二进制来模拟三进制,如果能跑起来就会有优化的空间,从而不断的叠代,就像一个观点,人工智能不管你用的是什么进制,它的关键是你用的是什么样的算法。


2.2平衡三进制的二进制转述

        先看这有关三进制计算实现的一些猜想!,现在就是这样子弄;对于理论满分但从未实操过人来说,想在二进制的硬件上尽可能的高效的模拟平衡三进制,这就目前的最优法;虽然说弄出来的机器可能比原来的二进制效率还低,但是它能跑呀,如果硬件发展起来,那就可以替换,直接完成一波反超。

        二进制的1位,称为bit,可以表示0或1,然后8个bit表示1个字节(byte);相应的平衡三进制也这样的设定,1位三进制位,称为trit,可以表示T(-1)、0、1,然后6个trit表示1个三进制字节tryte;要用二进制的数,模拟平衡三进制的1位三进制位,至少要用2bit,所以在本文中:2bit=1trit;这种方法是可以跑来的,我已经用这种方式在图灵游戏中成功构建出平衡三进制全加法器,就是下图这样子的:

2.3平衡三进制的二进制编码

        使用的二进制编码为:T(00)、0(01或10)、1(11),这种方式的编码是我试了很多方案得到的最优解,这样的编码方式能极大的简化硬件的设计,对于0它为什么会有两个编码,最开始是不知道用那个好,图省事就放一起了,后面发现这两个放一起确实很好用,所以就固定一起了,平衡三进制最重要的一点就是对称,这就很平衡三进制了。

        也可以用非位置化系统来解释,00得为0、01或10得为1、11得为2,刚好是0、1、2是标准三进制的表示,转成平衡三进制就是T、0、1,再看看这文章:有趣的平衡三进制!!!,看平衡三进制的逻辑门部分,用什么样的编码方式能最简化表示,很多次尝试下来,就是上面的编码方式,先看下图:

举个逻辑与为例子:

  1. 当T(00)与T(00)时,两个二进制的AND门,得到结果为T(00)
  2. 当T(00)与0(01)时,两个二进制的AND门,得到结果为T(00)
  3. 当T(00)与1(11)时,两个二进制的AND门,得到结果为T(00)
  4. 当0(01)与T(00)时,两个二进制的AND门,得到结果为T(00)
  5. 当0(01)与0(01)时,两个二进制的AND门,得到结果为0(01)
  6. 当0(01)与1(11)时,两个二进制的AND门,得到结果为0(01)
  7. 当1(11)与T(00)时,两个二进制的AND门,得到结果为T(00)
  8. 当1(11)与0(01)时,两个二进制的AND门,得到结果为0(01)
  9. 当1(11)与1(11)时,两个二进制的AND门,得到结果为1(11)

        基本上没有问题了,但注意了0有两个编码,第五条,当0同时为01或10时,得到结果正确,但一个是01另一个是10,得到结果就是T(00)了,所以这种情况要单独处理,只要处理了0与0的情况,只一个或输出01或10即可,这样就得到了一个平衡三进制的与门了。

        同样的用两个或门、两个或非门、两个与非门,同样可以得到剩下的三个表,非门也很简单就是每一位取反,T(00)取反得1(11)、1(11)取反得T(00)、0(01)取反得0(10),看0它有两个编码的好处就体现出来了,量子计算机有叠加态,那三进制计算的0有两个编码(状态)也是正常的,就像它的布尔值:FALSE(T)、UNKNOWN(0)、TRUE(1),T表示假,0表示“二者”,1表示真。


3、平衡三进制基础门的构建

        先看上图,这个定律在二进制是管用的,也就是可以取反输入或输出就转换门的类型,然后我用上述二进制构建出来的平衡三进制门,也是管用的这没有想到吧,这是用二进制模拟的三进制,低层仍是二进制,但逻辑是平衡三进制,所以说原生的平衡三进制也是管用的,这个定律在平衡三进制上得到了扩展。


3.1平衡三进制逻辑与门

平衡三进制与门(TAND)

        如上图所示,用上面的编码方式,只用了两个二进制的与门就完成电路的大部分逻辑的构建,其中的两个XOR与AND,是为了检测双0的输入情况,如果是双0输入则默认输出01,其它输出两个二进制的与门的结果。


3.1平衡三进制逻辑或门

平衡三进制或门(TOR)

        如上图所示,电路并没有大的改变,只是将两个二进制的与门,换成了两个二进制的或门,就是那么简单,得到了平衡三进制的的或门(TOR),剩下的TNOR(或非)、TNAND(与非)、TXOR(异或)、TXNOR(同或)同理可得。


3.3平衡三进制与非门、或非门

平衡三进制与非门(TNAND)
平衡三进制或非门(TNOR)

3.4平衡三进制异或门、同或门

平衡三进制异或门(TXOR)
平衡三进制同或门(TXNOR)

3.5平衡三进制摩根定律的应用

        元件工坊构建出的平衡三进制础门,它们的真值表是对称的,这四个基础逻辑门分别是:TOR、TNOR、TNAND、TAND,你可以通过如下图所示的对输入取反(垂直箭头)对输出取反(水平箭头)来转换它们。

平衡三进制摩根定律

        先看它的取反,也就是T变1、1变T、0不变,用上述的编码方案,只要分别对每一位取反,即可得平衡三进制的非门,如下图所示:

平衡三进制非门(TNOT)

        也就是说,当它为TOR组件时,想变为TNAND组件,分别对它的两个输入,用TNOT组件取反,就得到了TNAND级件,如果对输出结果再取反,就变成了TAND组件,从或门变成了非门;同样的TXOR,对输出结果取反,就得到了TXNOR组件。


4、平衡三进制基础门构建2

4.1平衡三进制三与门

平衡三进制三与门真值表
平衡三进制三与门(T3AND)

        如上图所示,这个部件是将三个trit进行与操作;二进制的与门(两个才是真,一假则全假),平衡三进制的与门可以看上面的真值表,它也是类似,TAND它是如果一个输入为T则出T,两个输入为1则出1,其余都出0;然后先用两个平衡三进制与门得到结果,再用这个结果与第三个与门就可以得出结果;所以上述的部件分别判断了是否输入中有T、是否输入全为1、及其余情况的0,这样就可以得到平衡三进制的三与门了。


4.2平衡三进制三或门

平衡三进制三或门真值表
平衡三进制三或门(T3OR)

        如上图所示,这个部件是将三个trit进行或操作;与上面的方法类似,结合真值表,其中任意一个输入为1则出1,若三个输入都为T则出T,其它出0,这样就可以得到平衡三进制的三或门了。


4.3平衡三进制三态复用器

       全称三态多路复用器,当我们要用解码或加法器时,就要用到它,也就是三选一,这里有T(00)、0(01或10)、1(11),在平衡三进制全加器中有详细讲到,按照这思路就可以三选1的电路,那一亮就是那一路的数据,如下图所示:

三选1基础件1(门6个,延迟4)
三选1基础件2(门5个,延迟6)
三选1基础件3(门3个,延迟4)

        可以看上面的三个图,都是三选1基础件,这个基础件的作用就是:输入00第一路亮绿灯,其它路红灯;输入01或10第二路亮绿灯,其它路红灯;输入11第三路亮绿灯,其它路红灯;这样再加上六个通路切换嚣,就可以构建出一个三态多路复用器,可以作为加法器的基础了,如下图所示:

三态多路复用器(3MUX1)

        这样就有三选1数据选择器了,看过平衡三进制加法器文章的,这个就是三态多路复用器;当输入T/0/1时,数据从第1/2/3路输出,因为2位bit代表1trit,所以它有10个引脚;有了这组件,平衡三进制的全加器也可以弄出来了,二进制的加法器方案放这里不管用,所以要上述的的平衡三进制加法器文章中的加法器。


4.4平衡三进制左偏门、右偏门

        这里的左偏与右偏门在全加器有用到,所以现在弄成一个基础件,它可以转换输入,从而简化输入,例如右偏:当输入T时,输出0;当输入0时,输出1;当输入1时,输出T;下面就是它的输入与输出真值表。

左右偏门真值表
平衡三进制左偏门
平衡三进制右偏门

        如上图所示,平衡三进制左右偏门都用到了前面的三选1基础件1,当然也可以用三选1基础件2,效果一样,这样确实是零件多了,但是确实也是简化了输入。


4.5平衡三进制最小门、最大门

        如上图所示,在平衡三进制全加器中,还用到了最大门与最小门,它的构建可以用类似于左偏门和右偏门的方法,这样也就形成了Max(A,0)与Min(A,0),如下图所示:

平衡三进制Max(A,0)门
平衡三进制Min(A,0)门

        说完了Max(A,0)与Min(A,0),其实平衡三进制与门和或或门,最可以当做逻辑最大门及逻辑最小门,它其实是从不同角度来解释的,思路与下面的截图来自于文章三生万物,请看下图:

        在这我们要明确一点,逻辑是逻辑,数值是数值,明白这一点很重要; 当从逻辑上去想,那么T表示假,0表示两都,1表示真,那么得到的就是平衡进制的与门及或或门; 当从数值上去想,那么T表示-1,0表示0,1表示1,那么得到的就是平衡进制的最小门及或或门,也就是与门成为了Min(A,B)及或门成为了Max(A,B),也就是说这两个门可以比较大小,输出最大或最小值,同样也可以用来构建Max(A,0)与Min(A,0),如下图所示:

平衡三进制Min(A,0)与Max(A,0)门

        这样最后得到的设计,就非常简便了,简便是简便了,但是门的数量比上面的多,延迟也大,不建议使用。

        用这个Min(A,B)门及Max(A,B)门,也就是与门及或门,可以制作一个对比数字大小的电路,对比两个数的大小有:0与0、正数与负数、0与负数、0与正数、正数与正数、负数与负数,总共6种情况,从最高位左起第一位若非 0 值,就可判断它的正负性,是 T 即为负数,是 1 即为正数。

        这样就可以解决:0与0、正数与负数、0与负数、0与正数,这些情况的判断了,剩下的双正与双负的判断,可以先在前面补0让两个数对齐,然后从最高位开始,依次对比每一位大小,相同时跳过进行下一位,只要路径中有一位大于另一位则出结果,不然全部对比完都相同,则两都数都是相同的。


5、平衡三进制加法器

        在前面平衡三进制全加器,我们已经给出它的真值表及设计图,现在就可以实现它了,它需要左偏门(A-1)、右偏门(A+1)、最大门Min(A,0)、最小门Max(A,0)门、三态复用器3Mux1,按照下面的思路就可以弄出来了。

加法器设计图

5.1平衡三进制半加器

平衡三进制半加器的真值表
半加器最初版

                如上图所示,半加器的真值表及它最初版的的图片,它没有分加和位与进位位,后面重新设计后,分开后更好的构建全加器,因为半加器作用真的不太,不能串联就不能多位计算与相加,重新设计后的半加器,如下图所示:

半加器加法位
半加器进位位

5.2平衡三进制全加器

全加器27种结果的真值表

只要其中一张就可以表示所有的输出结果了,这样将它的加法位与进位位分开,就得了它的输入逻辑了,如下图所示:

全加器真值表简化版

这样就可以完成设计了,也就是下图所示:

        如上图所示,有6个输入,最上面的2个输入代表进位位,后面的4个输入代表,可以输入两个平衡三进制数;有4个输出,上面是加和位,下面是进位位,跟二进制的加法器很想,但只是每一位trit都要2bit来表示,经过测试这个电路完全符合预期的标准,对加位的电路做了优化,也就是将输出的结果进行了左偏与右偏,再用第三位做选择,就可以少用一些电路,但对于进位位,它不能这样做,因为它偏置操作也得不到想要的数据,所以用偏置后错误的数据,再用第三位选择也得不到正确的结果。


5.3平衡三进制多位加法器

        为什么是4位加法器,在二进制中1byte=8bit,在这里用2bit代表1trit,所以只能1byte=4trit,和前苏联的三进制计算机相比,还少了2trit,标准的是6个trit=1个三进制字节tryte;如果想达到标准的6个trit,那需要12bit才行,图灵完备只有8bit,所以只能弄4trit的平衡三进制加法器了;二进制的8位全加器串联可计算255以内的加法,也就是2个byte输入及1个进位输入,输出是1个byte输出及1个进位输出,所以设计也要类似就行,如下图所示:

        这就是类似于二进制的平衡三进制加法器了,它可以计算(-81到81)以内的加减法,是的,加减法,这个就是它的优点,加法器与减法器都是它,现在就可以试试它的计算功能了,如下图所示:

        看完了上面,是否感觉,算的太少了,那就再串联一次,这样就得到了8trit的平衡三进制加法器了,下面的8trit加法可以算(-6561~6561)内的加减法,如果还不够可以继续串联,如下图所示的方法:


5.4平衡三进制全加器优化

        再看上面的图,它的真值表有很多部分是重叠的,所以如果用半加器的输出结果,也就是Cin=0中间的表为中心,这样就可以提出一个新的方案,让中间的表交换输出,可以得到类似于Cin=-1及Cin=1的表,只要部分稍加转换,如下图所示:

        因为,这样就是在第二层的时候,不进行数据选择,而用用Cin值来控制,应该输出怎样的表格,用进位位来举例,也就是说:

当Cin=T时,当A=T时,要输出(0,T,0)、当A=0时,进位位要输出(0,0,0)、当A=1时,进位位要输出(1,0,0);

当Cin=0时,当A=T时,要输出(T,0,0)、当A=0时,进位位要输出(0,0,0)、当A=1时,进位位要输出(0,0,1);

当Cin=1时,当A=T时,要输出(0,0,T)、当A=0时,进位位要输出(0,0,0)、当A=1时,进位位要输出(0,1,0);


按照这个思路就可以,弄一个三进三出的零件了,

当Cin=0时,按顺序出;

当Cin=T时,1路出3路,2路出1路,3路出2路;

当Cin=1时,1路出2路,2路出3路,3路出1路;

三进三出输出

        然后,输出后其实差不多,就是进位位不同,所以只在特定的情况下,也就是Cin=0及Cin=-1的情况,分别对其左偏和右偏,当Cin=0时就原样输出,所以又可以建立两个零件,如下图所示:

        最后就可以,建立新的平衡三进制全加器,测试过了,结果也是一样的,原来的是188个门,现在是170个门,那就是少了18个门,那4trit的门就少了72个门,8trit的门就少了144个门,优化应该极限了,如果有更好的方法,那当我没说,新的平衡三进制全加器,如下图所示:


5.5平衡三进制逻辑引擎(4Trit)

        要弄出平衡三进制逻辑引擎,要用到前面的四种基础门,然而后面感觉这前面的基础门设计的太繁杂了,也就是门太多了,有18个,仔细分析了一下:前面两个与门是最基础的门,用了2个门;然后判断双0输入,用了 两个异或门及一个与门,用了11个门;最后是判断那一路输出,用了5个门,总共18个门。

        前面发现,异或门占了太多门,如果可以解决双0输入就可以,但只有这种方式,所以只能换一种方式,类似于之前的三与门,也就是其中一个为T则出T、双1才出1、都不是则出0,这样就得到了一种新的与门,从18门12延迟减少到了13个门8延迟,如下图所示:

优化版平衡三进制与门(TAND-New)
优化版平衡三进制或门(TOR-New)
优化版平衡三进制与非门(TNAND-New)
优化版平衡三进制或非门(TNOR-New)

        然后是多位的与、或、与非、或非,因为这游戏不能自定义输入与输出,16位的输出不够详细,所以只能用8位,也就是只能弄4trit的机器了,所以可以结合前面的平衡三进制摩根定律,就可以弄出平衡三进制的逻辑引擎,现在不知道,指令是用平衡三进制数好,还是二进制好,但二进制更简约,后面再看看改不改,目前是,00表示T0R、01表示TNOR、10表示TNAND、11表示TAND,如下图所示:

4TOR
平衡三进制逻辑引擎

6、平衡三进制的存储与计算

        前面说了,模拟平衡三进制用的是两位二进制的编码方式,虽然逻辑是平衡三进制,本质来说还是二进制,如果要弄寄存器,那就是将寄存器存的数量翻一倍;还有个问题,指令是用平衡三进制数好,还是二进制好,答案是平衡三进制数好,这是为了统一性考虑,如果可以转来转去,那开销会更大,这里用就是平衡三进制数的二进制的编码方式。

寄存器之间 (从源到目的地)

        如上图所示,这个是原版的图灵完备--寄存器之间,它有5个寄存器,每个寄存器可以存8bit,然后可以将数据从源拷贝到目的地,其中输入也可以作为源,输出可以作为目的,原理也很简单,也就是打开一个存一个,8bit前两位表示模式不用管,后面的6bit,前面3bit是作为源的地址,再后面3bit是作为目的地址。

        这上面用到了3-8译码器,也就是给3bit然后有8种情况,相应的每一种情况只会有一路绿灯,其它为红灯,也就是前面3bit决定了加载那一路的数据,后面3bit决定了将数据保存在那,用到了寄存器数据读取与保存功能,寄存器数据每一刻只能有一路数据,否则就造成了回路,在游戏中是不行了,在现实中则会短路,所以按照上面的思路就可以设计平衡三进制的寄存器之间了。


6.1平衡三进制的寄存器

平衡三进制寄存器对照表

        如上图所示,用了2个Trit来表示9组选项,寄存器有7个、输入与输出占了1个、还有1个未使用,如果是3个Trit,那就是27组选项了太多了,问题来了平衡三进制是三种布尔值的,然而控制寄存器的存储用的是二进制,你这平衡三进制怎么用,多了个两者态,怎么看都不行呀,先别急去看看之前平衡三进制三态复用器,这样就有办法了。

三选1基础件1(门6个,延迟4)

        想到了吧,就是将3种状态转化成了3组布尔值,然后平衡三进制的二进制的编码方式,不用重新转成二进制,就可以弄出2-Trit的2-9译码器,有9组布尔值输出,同样的,3Trit有27组布尔值输出,如下图所示:

2Trit-9译码器

6.2平衡三进制寄存器之间

        有了前面的2Trit-9译码器,就可以弄平衡三进制寄存器之间了,现在只要用原版的16位寄存器就可,这也是用二进制模拟平衡三进制的好处,不用考虑存储的问题,只要无脑叠加就行了,也就是16位寄存器,可以存8Trit,目前而言是够用了,如下图所示:

16位寄存器

        这图灵完备的游戏还是有点不完善,它的存储器探针只能检测最多8位,超过的不行,如果是16位,也就是前面的8位不检测,只检测后面的8bit,所以存储器探针在16位寄存器上,数值显示不准就没用了,就不加存储器探针了,结合上面的2Trit-9译码器及16位寄存器,就可以完成平衡三进制寄存器之间 ,如下图所示:

平衡三进制寄存器之间 (从源到目的地)

6.3平衡三进制算术引擎(8Trit)

        前面弄了4Trit是逻辑引擎,但并不完善,指令也没有设计,因为之前不知怎么用平衡三进制操作二进制,现在有了上面的寄存器之间的实现思路,就可以将3种状态转化成了3组布尔值,这样就真正的可以实现8-Trit的算术引擎了,要弄8-Trit的算术引擎,那8TOR、8TNAND组件要弄出来,也就是8位Trit按位或操作等,如下图所示:

8TOR
8TNAND

        弄完8TOR及8TNAND后,要再弄出8-Trit的加法器,这个加法器可以计算加法,同时也可以计算减法,得益于平衡三进制的对称性,你只要将一个8-Trit的数,按位取反就可以得它的相反数,如13(111)取反后为-13(TTT),所以可以定义出一个数取反后相加的操作,也可以是相加后再取反的操作,8-Trit的加法器,如下图所示:

        最后,就可以弄出8-Trit的算术引擎了,按照前面的地址来说,它的指令也是一一对应的,所以设计算术引擎指今集,也可以参考图灵完备的来设计,如下图所示:

        所以,按照上面的指令集,可以设计如下8-Trit的算术引擎,注意了,因为T(00)、0(01或10)、1(11)的编码方式,所以8-Trit的加法器的进位那不输入,就默认输入T(00),这样就多了个T,这个坑到了我,我说怎么算都不对的,所以要给它输入0(01)才行,不然就单独的将进位脚引出来,8-Trit的算术引擎如下图所示:

8-Trit的算术引擎

        测试过了,运行起来很稳定,结果也是正确的,这样8Trit的算术引擎的弄好了,最上面的操作码是给计算单元设计的,所以输入也是16位,但用到只是16位最后的4位,即8-Trit的操作数最后的2-Trit。


6.4平衡三进制指令集

        可以看Setun三进制计算机模拟器的第三部分,同样结合了图灵完备思路来设计,但是复制也要复制的明白,差不多的8-Trit,最前面的2-Trit也是来模式选择的,原本的设计思路,如下图所示:

        结合之前的设想、与实际的需求、原本的设计,就可以设计如下指令集,如下图所示:

        这里的立即数设计很有趣,即然是立即数,当然是输入什么就输出什么,但是有最前面的的模式选择在,会受到模式选择最前面2位的影响,所以最好的办法就是将它最高2位置为0,所以00为立即数模式,如果是其它三种都会影响输入的效果;这样平衡三进制的设计,也要是立即数模式最高2-Trit要为00(0101),所以只能将指令集移到中间去,这样对输入的立即数也没有影响,这样就指令集就设计好了。


6.5平衡三进制计算单元

        是时候合体了,将之前弄的平衡三进制寄存器之间及8-Trit的算术引擎结合一下,成为平衡三进制的计算单元了,如下图所示:

平衡三进制计算单元

        现在,平衡三进制的计算单元弄出来了,再弄个立即数和条件跳转,那么平衡三进制图灵机差不多,就可以筹出来了,操作码那就是用来输入指令集的,目前有了复制模式与计算模式,其实已经可以弄简单的平衡三进制计算了,也就是用复制模式,将输入分别存入REG1寄存器、REG2寄存器中,然后用计算模式将两者相加,得到结果输出到REG3寄存器中去保存,最后用复制模式将REG3寄存器的值,输出到输出端口就行了。


7、平衡三进制计算架构

        这个架构参考了Setun的24条单播指今,最值的借鉴的指令,就是类似于累加计算的指令,如:(S)+(A*)=>(S)、(A*)+(S)(R)=>(S)、(S)+(A*)(R)=>(S),它的操作大大提升了数据的操作性,将复制模式的输入与算术模式半结合的方式,少了取值的过程,加快了运算的效率,所以指今集也可以重新设计了,如下图所示:


7.1平衡三进制立即数模式

        前面的2-Trit设为(00),即为立即数模式,后面的6-Trit可以直接将其保存到REG0中去,可以保存起来备用,如下图所示:

平衡三进制立即数模式

7.2平衡三进制算术地址模式

        将复制模式的输入与算术模式半结合的方式,有利于累加计算,可加快运算的效率,去原来的设计,这样就可以输入任意一个寄存器的地址,输出它的值与S寄存器相加,再存回S寄存器中;注意,使用S寄存器前,需用合适的值覆盖S寄存器的中值,得如下设计:


7.3平衡三进制条件跳转模式

        想设计条件跳转,就先直接复制过去,要足够的抽象,逻辑是可以移过去的,但电路不行,这两者不是同一个物种,就拿正负性判断来讲,二进制只要判断最高位是不是1(0为正数,1为负数),就可以知道它是不是负数;若要判断一个平衡三进制数的正负性,可判断数字符号的最高有效数字的值,左起第一位若非 0 而是 T 的即为负数,若是 1 的则是正数,不是固定的位置,判断一个平衡三进制数的正负性的实现,也可以用逻辑非零门,请看平衡三进制计算机模拟2的逻辑非零门部分,现在先大概的将它移过来,如下图所示:

        想一下之前的3选1基础件,是不是就有思路了,也就是1Trit变成3组布尔值:当为T时,第一路亮绿灯、当为0时,第二路亮绿灯、当为1时,第三路亮绿灯,每当且只有一路亮绿灯,这样就可以判断它的正负性了,当然这只是1Trit的正负性判断。

线路(亮绿灯)数字正负性的判断
第一路(T)值为负数
第二路(0)值为0
第三路(1)值为正数

        所以,就可以用多个三选1基础件3,然后16的输入3位的输出,也就是输入8-Trit,然后输出类似上面的1Trit的正负性判断,这样就可以实现一个8Trit的正负性判断,它是零还是正数还是负数,难点也有,就是先要找到最高有效位,才能判断它的正负性,当然这难不倒聪明的我,这有点像递归的过程但又不是,它的过程是从高位到低位,依次对下去,若为0则是无效位,不为0则判断出来,记录下最高有效位的位置,然后去相应的位置去读取最高有效位,再判断1Trit的正负性,这样一层按一层,就可以判断一位8-Trit数的正负性了,如下图所示:

数据提取器(9MUX2)
8-Trit正负性判断(8Trit-MUx1)

        如上图所示,9MUX2有9组布尔值,额外的1位判断是否为0,当额外的1位为false时,输入8位的布尔值组,输入的8位只有一路亮绿灯,这样那一路亮绿灯就输出那一路的数据;额外的1位为true时,输入8位的布尔值组全为false,则输出01;最后跟8个1Trit的正负性判断,就可以得到上面的第二张图,也就是用了从最高位判断是否为零,若为零传输的信号会中断,全部为零则会传输到最后,不然就是在与中断信号做AND比较,这样会得到8位的布尔值组,只有一路会亮绿灯,而亮绿灯那一路就是最高有效位的位置,可以将位置读取出来加上最后面的信号有没有传输到最后的判断,这样就可以读取到最高有效位的数据,再将它简单判断一下,就知道它是正是负是零了,同样的化简一下可以读取最高有效位的数据,如下图所示:

读取最高有效位(8Trit-Read)

        也可以不读取数据,直接进行正常负性的判断,效果两者差不多,门与延迟也差不多,用到的就是8OR1,设计如下所示:

简化后的8Trit-MUx1(门69个,延迟26)
8Trit-MUx2(门68个,延迟28)

这样完成这个组件,接下的平衡三进制条件跳转模式就可以实现了,先设计好跳转的指今,如下表所示:

平衡三进制跳转指令
TTNever
T0REG=0时跳转
T1REG<=0时跳转
0TREG<0时跳转
00Always
01REG>0时跳转
1TREG>=0时跳转
10REG!=0时跳转
11未使用

可以实现条件跳转的基础件COND,如下图所示:

8Trit-COND

        要加入平衡三进制条件跳转模式,那指今集就要更新,如果可以的话,感觉可以缩减成6Trit的指令集,那二进制输入与输出就是12位,会更精简,指今集如下图所示:

平衡三进制指今集

这样平衡三进制条件跳转模式,就完成了,如下图所示:

平衡三进制条件跳转模式

7.4平衡三进制的程序

        想一台完整的平衡三进制图灵机,手动的输入指今是一件很麻烦的事,所以要弄成程序保存起来,这里的程序指的就保存的指令集,一条一条指令集提取,然后一条一条指令的执行,就像是原版的二进制图灵机,如下图所示:

        它有一个计数器,每运行一刻,它就取一条指令进行执行,同时还可以不用步进模式,而用覆盖模式,今步进计数器开启覆盖模式,就可以用条件跳转模式重复执行同一条指令,这在循环中会用到,或是跳转任意一处的的指令进行执行,而要用这程序来输入,就要先构建出程序的组件,也就是输入一个地址,获取这个地址的值然后输出,这里就弄个3Trit的程序存储器,可以存27条指令,所以要弄一个指令地址解析器,如下图所示:

DEC3_27_3AND(门90个,延迟8)

        这上面用了3AND来判断,1Trit用三选1基础件3变成三组布尔值,有9条线路,共有27个输出,一个输出用1个3AND来判断,感觉门有点多了,所以优化一下,如下图所示:

DEC2_9_NoDisable(门45个,延迟8)

        DEC2_9_NoDisable是一个不带禁用开关的2Trit解释器,可将2Trit转成9种结果,所以上述的3Trit指令地址解析器,就可以化简了,先用DEC2_9先弄9条线路,然后用一个Mux 3将3条线路,这样就是12条线路,就可以不用3AND,只用AND来判断27种结果,这样简化后的硬件,如下图所示:

DEC3_27

        所以有了指令地址解析器,就可以弄出程序的组件了,用多个16位常量组件来存储值,然后输入地址,就输出一条指今,共27个为了简便就用了5个,如下图所示:

程序组件

7.5平衡三进制计数器

        首先不要有惯性思维,这平衡三进制的计数器不是从0开始的,它是从负数开始,1Trit就是T到1共3个数,2Trit就是TT到11共9个数,3Trit就是TTT到111共27个数,现在是3Trit,所以从TTT开始不断的加1,也就是从TTT到000,再从000到111的过程,如下图所示:

        因为,我使用的二进制编码是:T(00)、0(01或10)、1(11),而二进制默认为0,也就是默认从T开始,所以从TTT开始不用初始化,然后不断的加一,从TTT加到111,最后再加一,进1变为1TTT,但进位位舍弃了,又变成了TTT,这样就是TTT到000到111,然后加一又变成TTT,不断的循环,这样弄出3Trit的加法器,如下图所示:

3Trit加法器

                有了3Trit加法器,就可以弄出3Trit的计数器了,从TTT开始,依次是TT0、TT1......0TT、0T0......1TT、1T0等,最前面的2位不用,3Trit的计数器,如下图所示:

3Trit计数器

        这样,图灵完备的零就弄好了,在第9小节就可以组装了,很快就可以得到一台平衡三进制图灵机了。


8、平衡三进制输入与输出

        前面说了,平衡三进制的二进制编码方式为:T(00)、0(01或10)、1(11),这种编码方式是简化了硬件的设计,但同时也给输入与输出带来了烦索的问题,特别是输入与输出是,去辨认01或是10的设计麻烦死了,天天对照个没完,还能容易对错,所以能不能出现一种固定的新编码表示形式,也就是运行还是原来的二进制编码方式,这种标准化可有可无,去掉也不影响平衡三进制计算的运算,只是为了好辨认,将输入与输出换成固定的新编码,如下表所示:

运行时:输入输出时:
T(00)T(10)
0(01或10)0(00)
1(11)1(01)

8.1平衡三进制转换输出

        这种新的编码方式,是在研究条件跳转时无意发现的,它只要较少许的组件,就可以实现两种编码的输出转换,即:T(00)输出T(10)、0(01或10)输出0(00)、1(11)输出(01),这样输出的编码固定且好读取,结合了前面的三选1基础件3组件的设计思路,编码转换输出如下图所示:

化简前Trit-Cout

然后化简一下,得以下设计:

简化后Trit-Cout

8.2平衡三进制转换输入

        输入与输出可以统一,也可以使用原来的输入,但更建议统一的输入与输出,所以输入也标准化吧,即:T(10)输出T(00)、0(00)输出0(01)、1(01)输出1(11),其中不合法输入11,输出结果也是0(01),编码转换输入如下所示:

Trit-Cin

8.3平衡三进制的输入与输出

        请记住,内部的逻辑门设计是以T(00)、0(01或10)、1(11),这种二进制编码在运行的,但这种编码输入与输出时不好用,所以最后要进行转换,用少许的组件进行编码转换你就可以得到标准的输入与输出,而不是混乱的输入与输出情况,不好判断,下面是8Tirt的输入转换:

        可以看到,这样0是要初始化为01或10的,现在也变相的初始化了,也不能手动初始化每一位了,因为图灵完备这游戏输出是没有16位的输出的,只有16位的数字输入,所以只能将16位输入值与输出对照,可以看到这转换输入的输出是正确的。

        同样的,将原始输出进行转换后,就会得到一个易于读取的结果,它的编码固定,也不会有两种情况的出现,这样就完成了模拟的平衡三进制计算机,标准的输入与输出了。


9、平衡三进制图灵机

        终于到这一步了。从此刻起,平衡三进制的图灵机再次浮现于世人眼中,它确实是独一无二的,虽然是模拟的,但它却是工程上就可能实现的方案,弄出来后就可以优化,优化后就能跑得更快,同时也会促进原生平衡三进制计算机的实现,平衡三进制计算机终将再次王者归来。


9.1平衡三进制指令集的使用

        前面的,其实用了二种指令集,一种是图灵完备原来的设计,加法运算是将REG1寄存器与REG2寄存器的值相加后,将相加后的值给REG3寄存器;另一种就参考了前苏联的Setun三进制计算机的24条指令集,是一种快速累加计算的指令集,可以减少取数据的过程,下面用两种指令进行一次加法运算,如下所示:

普通指令集(加法运算)

  1. 复制模式        Input--->REG1
  2. 立即数械        ------>REG0
  3. 复制模式        Input--->REG2
  4. 算术模式        Add   (REG1+REG2)--->REG3
  5. 复制模式        REG3--->Output

累加地址指令集(加法运算)

  1. 复制模式         Input--->REGS
  2. 立即数械         ------>REG0
  3. 算术地址模式  Add  A*(REG0)+REGS--->REGS
  4. 复制模式         REGS--->Output

        累加地址指令集可以少一条指令,完成普通指令集同样的事,当然两都的架构也是不一样的,若是多次的计算,累加地址指令集更有优势;如3次加法运算,普通指令集每次加法运算要3条指令:Copy REG3--->REG1,Copy Input-->REG2,Add (REG1+REG2)-->REG3,而累加地址指令集只有2条指令:Copy Input-->REG0,Add  A*(REG0)+REGS--->REGS,它少了结果要转移的过程,这样3次加法运算,就会少了3条的指令、9次加法运算就是9条指令、100次加法运算就是100条指令。


9.2平衡三进制图灵机的使用

        现在,是时候组装了,平衡三进制的程序组件、计数器组件和之前的框架合体,这样就是一台完整的平衡三进制图灵机了,可以进行编码做一些简单的事情了,如下图所示:

平衡三进制图灵机

        下面是一次简单的加法运算过程,共有5条指令,如下所示:

5条指令

   

平衡三进制指今集

对照表格,翻译上述指令:

  • 27327(00 000111)立即数模式 Input--->REG0
  • 28686(0100 TT10)复制模式   REG0-->REGS
  • 27136(00 00TTTT)立即数模式 Input--->REG0
  • 49158(1T00  TT00)算术地址模式Add  A*(REG0)+REGS--->REGS
  • 289911(01TT 1011)复制模式  REGS-->Output

上面为了测试立即数模式,所以还加上了立即数模式,也就是简单的加运算,将0111+TTTT=T000,01是复制模式,后面的2Trit不用管,只有立即数模式用到了,其它三种模式都是无效位。

        运行了4刻,就出结果了为43562(0000 T000),结果很正确,平衡三进制图灵机正确的运行了,如下图所示:


9.3平衡三进制计算机的优化

        这下就可以用到标准化的输入与输出了,可以将Cin分别放到指令输入端及输入端,将Cout放到输出端,这样一个标准化的输入与输出的平衡三进制计算机就弄好了,如下图所示:

        还有就是指令集的输入,不一定要用平衡三进制的计数器,也可以直接用二进制的计数器,相应的也用二进制程序组件,反正也是一条一条输入的,可以用更少的门来构建这台机器,但同时也会带来表示方法不一致,二进制与平衡三进制部分混用的问题,若用T(10)、0(00)、1(01)、11弃用,这种编码也行,可以看平衡三进制计算机模拟2,最后总结一下,所有构建用到的门吧,如下图所示:

基础组件
复合组件

结语:

        太厉害了我,竟走出了一条模拟平衡三进制计算机的路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值