展开

星界边境锁存器和触发器基础实例教程

来源: 飞翔小编 2016/9/11 12:40:38 浏览量:129

对于完全不懂或者稍微懂一些数字电路的人来说,其实我的建议是:不需要去仰慕那些别人做出来的什么什么触发器,什么什么译码器。你所需要的,不是在游戏里造出一个运算器,而是做出一些实用的东西来!

而实用的东西,其实用到的电路并不难,关键是创意和想法。
比如这篇教程是我在官方论坛上看到的一篇非常不错的教程,作者由浅入深给大家展示锁存器(Latch)的用处。教程的最后做出的一个实例是在联机时可以使用的一个交易室,简单而且实用。

我是学工科的,对于数字电路不能说有多在行,但是好歹也学过,也算略知一二,很多东西都忘了,这样的教程对我来说是非常实用而且有启发性的。所以决定给大家翻译一下,意在告诉大家,不要被电路吓着了,让我们一起来做一些简单实用但是有创意的东西!

PS:贴吧也是我发的~


[GUIDE] LATCHES AND FLIP-FLOPS (WITH USEFUL EXAMPLES!)

这篇教程主要是要教大家如何使用锁存器(Latch),同时也可以让大家在这个贴子里展示你所制作的任何时序逻辑电路。而如果你要找基础的电路教程,可以看这里:

锁存器(Latch)是什么?锁存器是一种非常简单的存储单元。一个锁存器可以存储一个二进制值(1或0)。
在Starbound里面使用的是一个D锁存器,它有2个输入端和1个输出端。



D:D代表数据(Data)。你输入的是什么决定了输出的就是什么。
Enable:Enable决定了D端有没有连接上输出端。当Enable为开(1),输出的值就等于输入的值。当Enable为关(0),输出的值就被固定在它之前的状态了,此时D端不再起任何作用。

如果你愿意,你可以把Enable想象为像开关一样在控制D端和输出端。严格来说这是不正确的,但也不失为一个不错的比喻。

(译者注:记住这个结论!这是基础!!)


(图注:1=闭合,即开状态,0=打开,即关状态;为防止混淆,以下翻译全部称1为开,0为关——译者注)

对于那些想要了解技术原理的人,这是D锁存器在逻辑电路中的实现。C代表控制(Control),也就是Enable。
还有两个输出端,考虑到Starbound只有正输出端Q,你并不需要去理解这张图之后再去使用锁存器。
(译者注:【Q】和【Q非】输出是互补关系,一个是1,另一个一定是0,所以只需要一个输出端就行)



我知道你一定在想:“这真是极好的!但是我到底该怎么去用这玩意?”
好问题!锁存器有很多的用处,这里就有几个基础的例子。


锁定陷阱 Locking Trap 

锁存器最简单也是最常用的用途就是“锁住”某样东西,我用一个陷阱来当例子。

如果我走上一个压力板,Enable端和D端同时被激活,同时陷阱也被激活。当我从压力板上下来的时候,陷阱还是会继续保持激活状态——这是因为Enable端和D端同时被关掉了,输出端被固定在激活状态。(这就是锁住了,译者注)

重置(reset)按钮用于关闭陷阱。按钮被连接到Enable端,可以使输出端的状态变为关。

如果你用一个按钮去代替压力板,这就是一个偷懒的办法来制造一个开关装置,而不使用控制台。之后我们会看到,如何来制造一个一键切换开关。




振荡器(2-clock[2周期])

这个电路使用一个非门反馈回路和一个开关(一个Impervium控制台)来创建一个振荡器。(注意不是压力板,这是个控制台console,如果你还不能造这个东西,完全可以其他控制台代替,比如猴子的电脑,而众所周知,在SB中console其实就是一个开关,译者注)
当开关打开的时候,输入端将会在开与关之间快速闪烁。当开关关闭的时候,输出端状态就固定住了。你可以用这个来让灯闪烁,制造一个伪随机掷硬币的装置,等等…

你可以把奇数个非门串联在一起,创建一个反馈延迟,来减缓震荡频率。
如果你想更多了解时钟信号,可以看后面关于时钟说明。




D触发器 D-Flip-flop 

锁存器属于电平敏感,意思就是只要当Enable端为打开状态的时候,输出就可以被改变。
而触发器则是边沿敏感,意思就是当时钟信号改变的时候,输出状态改变(在时钟输入的上升沿和下降沿,取决于类型)。这对于制作状态机、计数器和寄存器非常有用。
(译者注:为了让大家不被大片的专有名词给吓着了,我来解释一下:数字电路中把低电平定义为0,高电平定义为1,从0到1的过程被称为上升沿,反之被称为下降沿。具体来说,一个按钮从未激活到激活的过程,就叫上升沿,反之叫下降沿。

如下所示的触发器就是一个下降沿触发的D触发器。当Clock端(时钟信号)从开变为关的时候,输出状态将会改变。这大概是最简单的触发器了,只需要两个锁存器和一个非门。注意clock端连接着两个点。

下一个例子里面我们将会用到这个触发器。

(译者补充:作者在这个例子用的是开关,效果是,当且仅当clock端的开关由开状态变为关状态时,输出端状态才会改变,并且只会变成和D端相同的状态。
这里有个衍生:如果你把开关换成2个压力板,会发现结果变得直观而且很有意思!当从右往左走经过2个压力板的时候,输出保持为开,然后再从从左往右返回的时候,输出变为关。一个实用的应用就是,进门自动开门/灯,出门自动关门/灯。如果要改变顺序的话,只要简单把两个压力板的连接反一下就行。




用按钮操纵的开关 Pushbutton Toggle

虽然Impervium控制台(Impervium consoles)好棒好棒的,不过有时候你会因为某些原因而想要用按钮来开关某样东西,但是按钮发射的是一个脉冲信号,那我们怎么用按钮来制作一个开关装置呢?

有一个办法就是使用我们刚才介绍过的触发器,不同的是还要加入一个我们之前在振荡器中用过的非门。
这样就创建了一个状态机,其输出状态与它之前的状态相反:
Q[n] = NOT( Q[n-1] )

按钮就是这个状态机的时钟信号,每按一下按钮就会引入一个脉冲信号,用来更新状态。

如果我们使用一个锁存器,在有按钮脉冲的时候,输出状态会改变好几次。由于触发器是边沿敏感,只有在每次脉冲的时候才会更新,所以我们需要的是一个触发器,而不是一个锁存器。




交易室 Trading Room 

Eht和我用按钮开关做了一个交易室。Starbound目前还没有用于交易机制,所以我想,制作一个不依赖于信誉系统的交易方式会很有意思。下面是它的工作原理:

1. 两个玩家从各自的一边进入房间,然后关上他们身后的门。门只能从内侧来控制。
2. 左边的玩家在上面,而右边的玩家在下面,两个人都各自在两扇门之间扔下一个物品。当另一个玩家也已经扔下他的物品的时候,你需要站到压力板上,表示你已经做好准备来完成交易了。
3. 两个玩家都需要站在各自的压力板上,以便让站在上方的玩家按一下那个按钮,这会切换所有门的状态(使用了2个切换状态机)。这样就可以防止你接触到你所扔下的物品,同时让你可以去捡起对方玩家扔下的物品。两个玩家交换了位置,从另一个玩家的那扇门出去。

关于振荡器(亦称时钟)的说明


你可以用不同于之前的锁存器时钟的方法来创建时钟。

一个相当缓慢的时钟就是定时器元件(游戏自带的Timer,译者注),它大约每秒闪烁一次。你可以在输入端输入1来冻结它的状态。

最快的振荡器就是把非门首尾相连。我们可以叫它1-clock[单周期](从Minecraft术语那偷来的),因为每次闪烁之间只有一个非门的延迟。

把奇数个非门串联在一起,就可以创建3-clock[3周期]、5-clock[5周期],以此类推,很明显这些会慢3倍和5倍。使用偶数个则会创建一个稳定的回路,这是没用的。

Kudos to MeMyselfAnDie for how to control odd-numbered clocks. It hadn't occurred to me in the first version of this note.(恕我无能,这句实在不知道什么意思……MeMyselfAnDie似乎是官方论坛上的某个人)



如果你想要偶数周期的时钟,利用与门添加一个使能电路:



如果你想要一个非常非常缓慢而且可控的时钟,最好的办法就是用触发器。把前面的“按钮开关”里的按钮换成计时器(timer),然后把输出端连接到另一个按钮开关的clock端,将可以慢两倍,继续连接直到最后变得足够慢。做出来的这个装置叫做二进制计数器,我已经在这个帖子里贴出了一个4位二进制计数器。


(这张图位于原帖12L)

这个方法远比慢时钟更高效,因为随着门数量的增加,缓慢程度会呈几何增长,而不是链式的线性变化。


相关攻略
精彩推荐
奔跑吧兄弟:跑男来了 梦幻西游多酷客户端
玩家留言 跟帖评论
查看更多评论