异星工厂吧 关注:64,053贴子:417,832

【电路探究】电路不明白的?那就研究研究呗!

取消只看楼主收藏回复

一、前言
在吧内看到过很多篇启发思路的电路教程,阳春白雪,下里巴人。有些太基础,对于老鸟有些乏味;有些太高端曲高和寡,让菜鸟不知所云。本人对电路也是似懂非懂,不写吧心里痒痒,写吧又怕贻笑大方。纠结了一阵,看吧内有点冷清,还是先聊聊吧。大家喜欢的话我就多写点,不喜欢的话就少写点(笑,只能如此了)。本文部分内容可能会借鉴御道风云、马老师等人的贴文,为行文流畅(为了偷懒)下文中就不一一列明了,盼海涵。因本人时间有限,更新从不定期,回复从未及时,望见谅。


IP属地:四川1楼2018-07-20 00:05回复
    二、约定
    为避免混淆信号0~9和数字0~9情况,信号全部加中括号,例如:[0]~[9]。
    游戏里时间最小单位是tick(如不特别注明就简写为t),未测试过tick时长,就直接按照1s=60t的假设进行吧。
    电路设计原则应该是宜简不宜繁,红绿线的话尽量做到红线控制流,绿线信息流。
    [X]、[Y]、[Z]一般作为控制信号,不在其他的地方乱用(下方例子里有大量[Z],请注意)。


    IP属地:四川2楼2018-07-20 00:06
    回复
      2026-02-16 00:52:31
      广告
      不感兴趣
      开通SVIP免广告
      二、探究
      1、关于存储器

      这货就是游戏里最常用的存储信号设备,有18个格子,可以存储18种信号(这是废话),就像电脑里的硬盘,可以用来存储固定数据。


      IP属地:四川3楼2018-07-20 00:07
      回复
        但是,有时候是变化的信号数据,暂时存储怎么办?其实就是将瞬时信号转换成持续信号,如下图:

        不妨将左侧称为上游,将右侧称为下游。上游的瞬时信号被这个自加0的算数运算器不断运算,结果起到了“暂存”信号的目的。(当然上面预算参数改为*1也是一样的效果)
        再来一张图:

        几乎与上一张起到一个作用,但是现在可以详细说一下区别了。第一张图上游和下游其实是一个线路,信号传输延迟0tick(以后简写tick为t),上游信号河下游信号可以相互污染。第二章图上游和下游是两个线路,信号传输延迟1t,上游信号河下游信号相互隔离。
        不过这个暂存储器只能不断叠加信号,当想存储新信号时得要先清零,不过这个叠加特性也是不错的(后面会讲到)。


        IP属地:四川4楼2018-07-20 00:09
        回复
          但是想要实现新信号来自动清零并存储新的信号就要用到下面这个东西了:

          下方两个是“延时器”,就是任意信号+0直接输出,起到的作用就是将输入信号延迟1t输出。
          简述,上游有信号(不含[Z])时,1t时下游原有信号不变并增加[Z]1信号,2t时下游原有信号被上游信号替代并保持,同时[Z]归零(当然如果上游信号持续时[Z]1保持,一直到上游信号消失1t后归零)。
          信号传输延迟2t,并伴有[Z]1污染,污染时间为上游信号开始后1t至上游信号结束后1t。
          此处有变种,如图:

          其他都不变只有右上方自连线由红线变为绿线,部分功能发生改变。上游有信号(不含[Z])时,1t时下游信号不变,2t时下游信号归零,3t时下游信号变更为上游信号并保持。若上游信号为持续信号,在2t后一直保持无信号输出状态,直至上游信号消失后2t变更为最后的上游信号。
          信号延迟至少3t,无信号污染,但会出现信号断档期,断档时间为上游信号开始后2t至上游信号结束后2t。
          好了,这个就先讲到这里。顺便说一下,这个可以类比为电脑的内存。


          IP属地:四川5楼2018-07-20 00:10
          收起回复
            1、关于计数器
            其实吧,我先说的就是一个会自加的东西,比如能生成1、2、3、……序列的东西。直接上图:

            左边是个常量存储器,里面就放一个信号,比如[Z]1,这货就会自娱自乐到天荒地老。或者这样:

            左边只要给我个支点(给个信号),我就能翘起地球……
            可这有啥用?可以……嗯……可以计数呀!!!(果然是完全正确却没任何卵用的解释),其实我想要的节拍,对!就是节奏。比如每过1秒执行一次操作,就需要这个计数(时)器。


            IP属地:四川6楼2018-07-20 00:12
            回复
              好了,我们开始啦,比如这样:(常量存储器里只有[Z]1):

              凭我们多年经验都知道这个东西会自加,假如60t是1s的话,着玩儿意一秒钟就循环一次。等等,有个疑问,条件里面是[Z]<60就输出[Z]输入数值,到底下游会不会出现[Z]60这个信号呀,还是到[Z]59就返回[Z]0了呀?
              不要着急,跟着我的节拍走……
              这玩意儿上游和下游是一个线路(废话都用红线连在一起),第1个值是常量存储器的[Z]1,下游瞬间也的到该值,所以可以说是延迟为0t。下游第2个值是自加后的[Z]2,以此类推……第59个值是[Z]59,第60个值是[Z]60,(不要忘了常量存储器里的[Z]1),之后输出值为[Z]0+[Z]1=[Z]1,即第60个值是[Z]1。看到没有,压根就没有[Z]0的事儿,这个序列为1~60。
              总结下就是该计数器是从1开始一直到判断参数里小于的那个数(强调一下,包含此数,理解不了的可以自己算算,或者在游戏里做实验),延迟为0t。
              此处还有变种(*,怎么老有变种,这是X战警的节奏呀,不对也许是生化危机):

              老规矩,红线变绿线。就不详细说过程了,直接聊结果。下游是0~59的循环(看清楚没60的事儿),延迟为1t(上下游为两个线路)。
              看出点意思了,之后继续。继续啥呀,很多情况下有两层循环,我们可以嵌套!
              可能会有同学提问:“为啥不用除法及取模运算干这个呀?”
              “这个……,嗯,这个……。你是不是想拆台,不好好听讲还来捣乱,来人,把这个捣乱纪律的同学拖出去!”


              IP属地:四川7楼2018-07-20 00:14
              收起回复
                好了,我们继续,直接上图:

                大概可以看出我的意思了,左边两个就是一个每60t循环一次(1s)的计数器,第三个就是没次循环最后1t触发一次懂触发器,最右边的意思是每秒持续输出1个数的计数器。想达到的效果下游第1秒信号[Z]1,第2秒信号[Z]2,……,第10秒信号[Z]10。
                我:“看图,有问题可以提问。”
                同学A:“我有个问题想问!”
                我:“说。”
                同学A:“为什么信号老举[Z]?”
                我:“这也有捣乱的!拖出去……”
                同学A:“刀下留人,我想问的是上图不能达到想要的效果!”
                我:“对,要的就是这句话!!!”
                未完待续》》》(码字真累)


                IP属地:四川8楼2018-07-20 00:15
                收起回复
                  2026-02-16 00:46:31
                  广告
                  不感兴趣
                  开通SVIP免广告
                  书接上文
                  第1秒由于左边一直未输出,所以下游也无从叠加,所以说第1秒是[Z]1。不过这不是重点,我可以推后1秒再看呀。重点是就算这样,第10秒[Z]10也只维持了1t,之后瞬间变为[Z]0。也就是说[Z]1~[Z]9,每个都会维持60t,[Z]10只会维持1t,[Z]0会维持59t!
                  这好像和上文里的内容不大一样呀,不过细想一下你就会明白。游戏最小时间为1t,这种计数器是在一个线路中,达到判定条件边界前还会正常输出,但是和上游输出为1的一相加就会达到判定边界,但是下游已经获取到了这个边界数值。判断运算器还需要花一个游戏最小时间来归零,所以才会出现边界数值。但是在宏观情况下(多t情况下),在这么理解就会出现问题,因为判断运算器只需要花1t来纠正边界数据,所以边界数据只会昙花一现。
                  要是想达到效果可以采取变种方案,如图:

                  老规矩,红线转绿线。但这样输出效果会变为[Z]0~[Z]9,所以我在下游无耻的加了个常量箱,里面只存了一个信号——[Z]1。
                  哈哈,就是这么调皮。
                  我这一贴主要就是想告诉大家在宏观里面看到的规律和在围观里看到的规律可能是不一样的,微观甚至可以影响到宏观!这就是脍炙人口的定理——薛定谔的狗!
                  同学A:“不是薛定谔的猫吗?”
                  我:“还是得拖出去……”
                  同学A:“……”


                  IP属地:四川15楼2018-07-20 21:00
                  回复
                    3、关于大数据存储
                    上面提到的存储设备只能存储少量数据,对于大量数据存储就显得力不从心了。要存储大数据第一个想到的就是电脑硬盘,这就方便了,直接上图:

                    下面常量箱存储18个信号组成的数据,用绿线(数据用绿线连)连结上面的判断运算器,这个常量箱的地址是判断参数里的1。这个结构可以并联多个,地址可以依次标为1、2、3、……,如图:

                    红线只要输入相关地址的[T]控制信号(为啥用[T]?没啥,习惯,感觉像周期),就能从常量箱里读出其中18个信号了(从上方判断运算器的绿线传出)!只要肯一直往后连这个结构(别忘了改判断参数里的[T]值),你就可以拥有一个足够大的存储空间!
                    注:有些朋友可能会问手打每个判断运算器里的参数很累的呀,为啥不在加一点电路搞个顺序递增的信号当这里的“地址”呀!我的回答是浪费资源,如果有朋友需要这样的“硬盘”存储超多数据,他自然有办法修改这个判断参数而不花费更多的力气(我不相信他是手打常量箱里的信号的)。
                    这样只需要加上上述的计数器结构,就可以依次读取“硬盘”数据了!
                    总结,“硬盘”里的每个“扇区”(1个常量箱+1个判断运算器)都是由上述结构构成,每个“扇区”都有唯一的“地址”,只要输入相应“地址”的控制信号,就可以在延迟1t后读出该“扇区”里的相应数据。输入信号持续,输出数据也持续。打完收工(其实还有如何把18个信号分离,以及每个信号到底能有多少种变化这些问题,这些都留在音乐播放器及图像显示器里详解,别急慢慢来)!


                    IP属地:四川16楼2018-07-20 21:02
                    回复(7)
                      4、关于信号过滤
                      前面提到过信号污染,那么怎么怎么过滤掉摸个信号呢?其实非常简单,如图:

                      比如说我想过滤掉上游的[Z],就可以这个弄。具体原理就不详细讲了,相信大家一看就会。上下游数据隔离,延迟1t。
                      如果是这样就是过滤掉所有信号:

                      看,简单粗暴好用(***,另起一个网络不就好了吗)。
                      再继续来,如果现在需要一种“过滤”,将持续信号“过滤”为瞬时信号,规则就是如果上游的持续信号有改变,则下游传出这个瞬时信号。先上图再说:

                      比如上游有一个持续信号[A],但是会不定期改变值。这里我们就巧妙的运用“延迟”来保存一个信息,上下游信号隔离,延迟1t。
                      当然有了这个思路你就,你就可以继续做一个多信号这种过滤器了(持续转瞬时):

                      当然下游要防止[Z]污染,延迟为2t。
                      为啥我老要提到这个延迟,主要在精细化设计里总要同步呀!


                      IP属地:四川17楼2018-07-20 21:05
                      收起回复
                        5、关于显示器
                        上述内容如果你都清楚明来,恭喜你!电路的知识你已经都具备,从现在开始,我们探讨一些无关紧要细节!首先来做一个显示器!
                        显示器其实就是灯泡阵列,可以类比为数学里的矩阵,由行和列组成(又开始讲废话了)。在设计显示器前先来规划一下,两个电线杆电力覆盖之间可以插入16个灯泡,这数就可以作为矩阵的行数,列数其实也有讲究,不过先不细究,按照一般宽屏比例16:9来换算大概是28.44,四舍五入一下就是30(这是怎么舍入的呀~~,不要在意这些细节)。
                        为了演示方便(为了偷懒),就先造个方形显示器:

                        每一列灯泡从上到下的启用条件分别是[1]>0、[2]>0、……、[F]>0、[G]>0。
                        但是光有显示器也没用,必须给他数据,然后通过控制电路让其展示出来才有意义。
                        数据存储可以考虑“硬盘”,这要多大的硬盘才能表示呢?
                        一个常量箱有18个格子,存16种信号可以表示一列;多少列就需要多少个常量箱,有16列需要16个常量箱,30列需要30个常量箱就可以表示了。
                        好了,通过以上内容我们就可以做一个显示了。
                        但是!
                        16行30列灯泡矩阵能用一个常量箱完成要求吗?答案是:能!
                        异星工厂里的电路其实要比实际二极管之类的东西高级得多,光是信号种类就有[0]~[9]、[A]~[Z]、还有9种颜色信号、各种物品信号……,每种信号还有数值这个属性,可以说完爆0/1。运算符号有加法、减法、乘法、除法、指数、位移、与、或……。
                        灯泡亮和灭其实就相当于二进制的1和0,一个信号的数字可以很大表示多个灯泡状态。在游戏里面,数值这个东西是有上限的,稍一实验就可得出是4Byte的带符号的长整型,即32bit。最高位表示正负,负数用补码表示,这里就不展开了。所以一行灯泡(30个,其实31个也能行)可以由一个数字表示全部状态。矩阵只有16行,常量箱有18个格子,一个常量箱都用不完。
                        将一个数字取二进制的某一位的值需要用到二进制分解器,这货张这个模样:

                        下方的运算参数里面0,代表取二进制的第一位(最小位)。当然取第二位就写1,以此列推……


                        IP属地:四川18楼2018-07-20 22:02
                        回复
                          二进制分解器如果连成了片就构成了简易“显卡”:

                          这个就是核心模块(好low的感觉呀)!如果从常量箱里读出了[A]3、[B]2这组数据,在显示器上就会这样:

                          好了更复杂的图像就留给观众老爷们练手了(这样我就可以偷懒不动手了)。
                          但是,显示器就是要动态显示。这样子只是固定一个图像太乏味了,要让图动起来(这样就可以做电影播放什么的了),咱们就要引入“硬盘”及“控制器”了。
                          来张全家福:

                          左下角就是控制器,控制器右边就是硬盘(只做了2组扇区意思一下,有兴趣的可以做200组来玩)。

                          控制器就是输出[T]来寻址。

                          硬盘就是这样的东西,常量箱里放数据就行了。
                          未完待续》》》


                          IP属地:四川19楼2018-07-20 23:17
                          回复
                            再来说一下红线连接的距离是10:

                            再长就连不到了(不要跟我说电线杆可以加长距离,我不听):

                            由于灯泡启用条件不能运算(弱爆了),颜色又是启用后的附加判断,所以我们只能对每个灯泡加一个判断运算器帮助其判断颜色(真是操碎了心)。
                            为了演示原理,我们这里用4个灯泡和4个判断运算器来掩饰:

                            比如第1个灯泡,我们管它叫[1],如果信号[1]<8它就启用,具体颜色是有与其相连的判断运算器来辅助判断的,所以我们在判断运算器里也看到了[1]的影子。之后的3个都一样,只不过信号改为[2]、[3]、[4]而已。
                            为了便于理解,下面我放了2个常量箱:

                            左边的是一个固定内容,对每个颜色进行编号(就是数值,看清楚颜色是有数值的)。右边的是存放数据地方,比如灯泡1播放颜色1(就是红色),灯泡2播放颜色4(就是绿色),大家可以自己验证。
                            这到底是怎么实现的呢,大家请再看上面的判断运算器。灯泡1相连的判断运算器的判断参数是[黄色*]>=[1],输出为[黄色*]输入数值。大家应该已经心领神会了(不会的再看一遍前面内容)。
                            不过呢,如果要灯泡1不亮怎么搞?简单,在常量箱里把[1]改为8,由于灯泡启用条件限制,灯泡会灭掉的。


                            IP属地:四川22楼2018-07-21 14:07
                            收起回复
                              2026-02-16 00:40:31
                              广告
                              不感兴趣
                              开通SVIP免广告
                              好了,讲解完彩电的制造机理,我们就可以自己动手造一台了:

                              诶,这好像不对呀,感觉好像比上面讲的要复杂一点呀!咋回事儿?
                              其实嘛,就多加了一个功能。对,就是压缩数据!(最下方的是硬盘,[T]1播放第1个扇区,[T]2播放第2个扇区,以此类推)
                              黑白电视只用二进制的1位就可以表示,但是加入色彩就需要用3位(8种排列)来表示!
                              由于红线最多距离10,所以中间灯泡有9行,前4行与上面相连,后5行与下面相连。用到的东西就是黑白电视里面的“二进制分解器”(当然别忘记该参数哈)。
                              只强调一点,二进制分解器按3位分解出来的数范围是0~7,0代表不启动,所以灯泡的启用条件改为>0较好(比上面讲原理时<8要好)。

                              好了,彩电的“砖”抛完了,坐等“玉”自动上钩的(偷笑)。


                              IP属地:四川24楼2018-07-21 14:16
                              收起回复