11-09 1,508 views
作者:nenn(贴吧id:正正正正正好)
旧帖地址:http://tieba.baidu.com/p/3419179382
机械电路的实现往往离不开时序的实现,我们经常需要在不同的时刻激活特定的线路。这也就是什么,了解不同线路激活过程的先后顺序对于搭建机械电路至关重要。
时序的确定一般是比较简单的。通过直观地观察一些延时元件的延时档位往往可以直接确定不同线路的时序。但实际上,类似活塞、漏斗这一类机械元件并没有标度其本身的延时特性,这给时序的确定带来了不小的麻烦。因此,非常有必要构建一种判断标准来确定时序,并使用一种标准模块来执行这个判断过程,然后给出可信的判断结果。
1t延时在红石电路中很常见且易于实现。但随着对活塞运动过程的研究深入,非整数t的延时规律也被挖掘并应用在一些机械电路中。最经典的应用即为每分钟1200发的最高射速TNT炮。实现如此高射速的途径只有一个:在红石电路中引入0.5t延时。也正是这0.5t延时在红石电路中的实现,使得时序的确定开始变得复杂。
为了能够确定这种带有0.5t延时的时序过程,我们需要一种分辨率达到0.5t的时序比较器。这里我们可以用一种经典的模型来描述这个过程:假设我们可以给两条线路输入波形同样的信号,那么这个时序比较器就能够输出两条线路中信号的相位差。而分辨率达到0.5t的时序比较器所需要达到的要求就是:如果两条线路中的信号之间出现了大于等于0.5t的相位差,那么这个时序比较器就能够检测到并定性输出这种相位差。因其分辨率达到了0.5t,小于常规红石电路中的1t延时,因此这种时序比较器我们称之为精密时序比较器。
本文实现的就是这种通过上升沿检测的精密时序比较器,其能够判断两路信号中上升沿的时序先后。下图就展示了这种精密时序比较器。下面,本文会讲解该精密时序比较器的原理以及性能,并通过实验证明该方案能够正常工作,最后本文会整理给出关于精密时序的一套系统、完整的确定方法。
精密时序比较器。当两个输入端输入的信号无相位差时,两个红石灯都不会点亮。当其中一端输入的信号优先于另一端输入的信号时,该侧的红石灯就会点亮而另一侧不会。通过观察红石灯的状态,我们可以直观且定性地确定两输入端的时序。
【精密时序比较的基本原理】
精密时序比较的难点在于如何比较0.5t的延时区别。通常来说,能够比较小至0.5t的延时区别有如下两种方法:
- 作用于能够运动的机械元件,比如作用于活塞,观察活塞的行为先后。
- 作用于能够发声的机械元件,比如作用于音符盒,倾听音符和的发声先后。
第一种方法对电脑的性能要求相对较高,不然很难排除电脑显卡性能对观察结果的过分影响。此外,仅凭肉眼观察0.5t的延时也是十分吃力的,而且如果需要展示说明这种0.5t延时差,可能需要截图多次才能截到我们希望的那个瞬间。因此第一种并不能作为一种简便有效的通用方法。
而第二种方法相对来说受电脑声卡性能的影响较小。而其他内容与第一种方法一样,对感官是一种巨大的挑战,而且展示说明的时候非常不方便。
为了解决这种问题,彭哥(@彭哥·一世 )使用了另一种方法:他使用了投掷器投掷物品的方案来帮助显示延时差(http://tieba.baidu.com/p/3418416945)。通过观察抛掷物品的运动状态辅助以投掷器发声,的确是一种减小了判断难度却又不失装置简单的特点。比如下图中可以直观看到,投掷器投掷出的拉杆并不同时。活塞伸长动作的耗时小于2t。但是,截图依然是一种比较考验反应和技术的操作,使用起来非常不便。
图片来源于:关于活塞延时的分析与探讨(彭哥·一世http://tieba.baidu.com/p/3418416945)
本方案使用的时序比较器基于中继器的D锁存模式。具体的原理我们先来看下图所示的概念模型:
这个概念模型可以定性判断两条线路之间的延时差。我们可以通过下面的演示实验来理解这个过程。
情况1:左路比右路迟1t
情况2:右路比左路迟1t
情况3:两路延时相同
根据输出的结果,我们很容易得到结论:只有当左路迟于右路时,输出才会是高电平;其余情况,输出均为低电平。
显然这个概念模型中,两条输入线路是等权的。因此我们可以简单地将整个电路镜像以后再使用。于是我们就会得到如下的电路。
绿色和红色线路就是两路待比较的线路。比较的结果可以直观地表达如下:
当绿色线路先于红色线路:黄色线路输出高平,淡蓝线路输出低平。当红色线路先于绿色线路:黄色线路输出低平,淡蓝线路输出高平。当绿色、红色线路同时:黄色、淡蓝线路均输出低平。
根据上面的分析,不难想到,通过黄色和淡蓝线路输出的情况,我们很容易定性地判断红色和绿色线路上的延时差。
但上述的分析至多只能说明这个时序比较器的分辨率达到1t。那么,精密到底体现在何处呢?体现在对于0.5t延时的判断。
在继续下去之前,我们首先需要明确一下,何为0.5t延时?0.5t是如何产生的?这类基础问题。当然,这里不会展开讲述具体内容,但是会对重点进行说明。我们首先来看德芙(@defanive2)从活塞代码的角度解释活塞的运动。
对话内容摘自德芙(@defanive2)在OctopusCraft群的发言。以上图片来自【解说向,第二发】红石原理(雾)(范围有点大了额)(@凤合草酸泥煤http://tieba.baidu.com/p/3130205779)
不难理解,如果活塞单独被激活,那么活塞伸长总耗时1.5t。其中,1t为伸长过程,0.5t为启动延时。当活塞被激活前,线路中已有其他活塞被激活或者以经过其他带有延时的元件(比如中继器、比较器、红石火把等等),那么活塞伸长总耗时1t。所以所有红石电路中的非整数t延时,都是通过活塞的启动延时引入的。
既然我们从代码层面清楚了活塞运动时的过程,那么接下来的问题就是,如何通过实验,观察到这个所谓的0.5t延时。彭哥(@彭哥·一世 )基于投掷器的声音可以很清楚地证明活塞引入1.5t延时的存在(http://tieba.baidu.com/p/3418416945)。因此,现在我们就要把本帖中的时序比较器应用在同样的场景下,看看其能否鉴别出0.5t的延时差。
时序比较器的精密证明实验我们会分为两个小实验。两个小实验的装置分别如下:
实验一:带有启动延时的活塞与1t中继器延时的比较。
实验二:带有启动延时的活塞与2t中继器延时的比较。
【时序比较器的精密证明实验】
上一部分【精密时序比较的基本原理】的末尾,我们提及了关于精密性的实验。这一部分,我们就主要呈现实验过程和实验结果。下图中即经过布线优化以后的精密时序比较器。现在我们来看实验结果和实验分析:
实验一:实验结果
实验二:实验结果
显然,根据精密时序比较器的显示,带有启动延时的活塞,其伸长动作总耗时小于2t而大于1t。考虑到游戏以gametick为周期进行刷新,因此,带有启动延时的活塞其伸长动作总耗时1.5t。
那么如果经过带有延时的元件以后,活塞的启动延时是不是会变成0t呢?为了检验德芙提供的关于游戏源代码的准确性,我们又进行了如下三个实验:
实验三:不带有启动延时的活塞与1t中继器延时的比较。
实验四:不带有启动延时的活塞与2t中继器延时的比较。
实验五:不带有启动延时的活塞与0t延时的比较。
它们的实验结果和实验分析如下:
实验三:实验结果
实验四:实验结果
实验五:实验结果
根据精密时序比较器的显示,不带有启动延时的活塞,其伸长动作总耗时1t。这个实验结果充分证明了德芙关于源代码阐述完全正确。
至此,我们可以证明,本帖的精密时序比较器的分辨率为0.5t。
【精密时序的确定】
上一部分我们证明了精密时序比较器的分辨率为0.5t。那是不是我们就可以放心使用这个模块来定性判断时序了呢?
答案是:基本上是。
为何是呢?因为它可以分辨0.5t的延时差。
为何是基本上?因为还有其不能分辨的时序。
还有不能分辨的时序?对。
那岂不是0t的延时差么?答对了。
0t的延时差,在一般人的理解看来,就是同时的意思。但实际上,如果我们更进一步研究,我们会发现,其实存在不少证据证明,所谓的0t延时差并不是那么同时。我们可以来看下面的实验。
这个实验能够很轻易地证明默认档的中继器和比较器有着同样的延时。但是却无法解释下图的现象:不论这个电路如何朝向,如何变形,最后中继器所指的活塞总能够伸长,而比较器所指的活塞总不能伸长。
为了解释这种可以体现先后顺序的“同时”现象,zat(@zat喵 )与2013.12提出了一种“微延时”的概念,其指的即是游戏中的微观延时。这种微观延时并不能通过一般的方法测的,但却能够在对元件作用时体现出差异。其本质即为同一个gametick内(同时)不同事件执行的先后顺序(不同时)所造成的类似延时的效果。这也是微延时这个称呼的来历。值得注意的是,微延时和代码中同一gametick内的更新顺序从本质上是同一回事,只是角度不同的两种描述方式而已。更新顺序的概念来源于源代码,而微延时这种描述方式的意义在于,微延时可以使用一个小于1gametick的延时来表示,这样有助于表达某些电路中的时序。
既然我们我们认识到游戏中根本不存在绝对的同时,那么我们所说的精密时序又到底精密到什么程度呢?回答就是:精密时序仅仅针对宏观延时而言,也就是针对那些至少0.5t的延时差。
这里既然谈到微延时了,那么就有必要谈谈一个大触才会问到的问题:请问精密时序比较器中为何使用中继器而不是其他元件?其中的一个原因就是按照同一gametick内元件更新的顺序,中继器总是最先更新的(源代码中,中继器的更新优先级为-1,优先于其他任何元件的激活以及充能释能等等过程)。使用中继器能够做到无论待比较的信号最后经过何种元件输出,都能够保证精密时序比较器内的元件同时更新而不会使得同一gametick内元件的更新顺序影响最后的结果。仅仅使用中继器的精密时序比较器能够完全避开微延时现象对检测结果的影响,这就是其设计的巧妙之所在。
不使用命令方块(下简称137)则是出于另一个道理。137受微延时影响,其能够显示同一个gametick内的更新顺序。这种优点在仅仅比较宏观延时的时候却成了缺点,因为137无法告诉我们“同时”。即使同一个gametick内,137也会显示出不同的更新顺序,这是在不利于我们判断其到底是宏观延时还是微观延时。
既然我们已经明确了精密时序究竟精密到何种程度,那么接下来,我们就应该将思路转向如何确定这种精密的时序上来了。根据前面所述的一些原理和方案,我们可以整理得到精密时序确定的步骤:
1)使用精密时序比较器判断待比较线路孰先孰后。
2)检测整数倍t的延时差。
3)抵消整数倍t的延时差之后,使用精密时序比较器判断是否存在0.5t的延时差。
4)得到完整的时序,包括顺序以及延时差。
这里目前尚无法测得的即为整数倍的延时差的检测。所以下面,我们将展开这一部分。
检测整数倍t的延时差可以简单地使用中继器组以及中继器的D锁存特性。具体的方案如下图所示。
不难想到,如果在红色线路比绿色线路多nt的延时,那么最后粉红色羊毛的区域,就会有n个中继器点亮(注意是粉红色羊毛区域)。比如当n=3的时候,输出结果如下图所示:
而当你需要红石信号输出的时候,可以选用下面的方案:
当然你也可以利用一些信号处理技术将这个信号转化成为DEC编码的信号:
为了方便实际应用,这里我们还介绍了一种控制是否交换两路信号的模块。交换通过按动石质按钮来实现。相信一个经典的T触发器方案以及一部分布线应该不会造成很大的理解障碍。
版权属于: RedstoneMachineryCommunication
原文地址: http://tieba.baidu.com/p/3419179382
转载时必须以链接形式注明原始出处及本声明。