异星工厂吧 关注:62,674贴子:401,027

【设计规划】排队延迟电路:对每一个脉冲信号延迟1秒后输出

只看楼主收藏回复

本设计经 https://tieba.baidu.com/p/6084435727
https://tieba.baidu.com/p/6079920310?share=9105&fr=share&see_lz=0&sfc=copy&client_type=2&client_version=10.0.8.4&st=1553909506&unique=F75A412947753315E9B4AA8722614C21&red_tag=2741796079
这两帖中的讨论提出,感谢@cryaciccl大佬的指导
感谢@小酱油丶打灰机 在数字电路[信号网络]控制生产浅析https://tieba.baidu.com/p/6087931317
中对位计算的教学及信号复用启示。
遗憾的是游戏中的位运算是把十进制转化为二进制运算再转回十进制,不符合需求,所以我运用的仍然是加减乘除运算。
需求解析:每个脉冲信号延迟1秒,但是这1秒中会产生多个信号,需要这些信号都延迟1秒但延迟之前不能互相合并又不能丢失,所以常用的计时电路并不适用。
为此各位大佬提出了很多设计思路,各有各的优势各有各的缺点。这里不再重复,有兴趣的可以去之前的帖子里看一看我相信能给大家不少启发用到其他设计上。
本设计复用一个信号记录多tick的信号。优点是可以减少运算器使用数量,并且修改简单,可以轻松改成延迟XXtick输出任意信号的版本。缺点是,运算用的数据可能过于庞大,可能会对电脑造成负担。
成品图:

逻辑流程图:


IP属地:海南1楼2019-04-05 17:54回复
    原理解析:
    1.已知每计算一次需要1tick,那么循环计算60次后输出,便是延迟了1秒。
    2.信号复用:用同一数字信号的不同位数可以存储不同信息。如T1输入信号铁2,T2无信号,T3输入铁4,只用有1个信号便可记录即:A204。通过没每T信号*10然后再循环,我们就可以把每一T的信号记录到一个A信号里。
    3.游戏中一个数字最高可达10位,也就是1个A信号只能记录10T的信号。但是,通过把最高位的数字转换为另一种信号的个位再次进入*10循环就可以多记10位了。以此类推,我们可以用更多的信号记录来更多的位数。


    IP属地:海南2楼2019-04-05 17:58
    回复
      2025-08-25 02:29:58
      广告
      不感兴趣
      开通SVIP免广告
      拆解一下:
      1信号复用部分。把之前的信号左移一次(*10),把个位空出来以便记录新汇入的信号。


      IP属地:海南3楼2019-04-05 18:36
      收起回复
        可以的


        IP属地:湖南来自Android客户端4楼2019-04-05 19:24
        回复
          2.输出第十位数字。当这个运算器输入小于1G的信息时,运算器无输出。当输入大于1G时,将会输出第10位的数字。


          IP属地:海南5楼2019-04-05 20:48
          回复
            3.信号转换。把A10位转为B1位,把B10位转为铁信号。


            IP属地:海南6楼2019-04-05 20:52
            回复
              4.消除第十位。因为第十位再次*10会变成负数,且必须为9位腾出位置。所以我们必须在输出第十位数字后立即消除他,并保留1至9位。所以我们不能采用自带重置的判断器,改用乘法做一个与10位一样的负值,和原信号正负冲抵。

              值得注意的是,这一步不必须与原信号同步,否则会造成信号失真,电路无效。负数合并早了,没有可冲抵的正数会污染原信号,让其成负值。合并晚了,没有及时抹除的10位会变成11位与新的10位一起输出,污染下游的信号。


              IP属地:海南7楼2019-04-05 21:07
              回复
                5.循环部分 因为信号复用,使信号合并也不会互相干扰了,所以我们可以放心大胆的做循环电路,让信号自己循环运算而无需多加运算器。原理上用1个*10运算器,换6个信号就好。然而,为了满足隔壁消除部分的同步需求。信号在进循环前,不得不运算2次毫无意义的+0,让两边耗时一样。
                同时,这个两个运算器也增加了循环内的计算次数。使信号每循环一次都会延迟3T。循环10次能延迟30T。这样2个信号就能让每个脉冲延迟1秒。


                IP属地:海南8楼2019-04-05 21:26
                回复
                  2025-08-25 02:23:58
                  广告
                  不感兴趣
                  开通SVIP免广告
                  建议每种信号只记录9位,因为第十位不能只能有1,一旦出现大于1的数字,信号就会变成负的。
                  PS:本电路其实一共延迟了62tick。计算次数为3*10*2+2。如果想精确延迟1秒,请修改一下增加减少一些计算步骤,并不难,大家就当练习做了吧。
                  PSS:通过分配不同的信号,本电路可以延迟多种信号,比如铁:AB 铜:CD 钢:EF,不过多加几组运算器罢了。
                  PSSS:有的小可爱问:如果每T的信号如果大于9怎么办,一位数不够记录了。你可以做一个*100的,或者*任何一个比你每T最大峰值大的数,输出的时候改一下对应数字就可以了。


                  IP属地:海南9楼2019-04-05 21:52
                  回复
                    你这个最高位处理十进制数还是有问题的
                    10^9产生进位时还在2^31-1的区间内
                    10^9*9产生进位时就已经超过了2^31-1的区间,也就是符号位被置1了,你这样算出来的东西就有问题
                    第10位的十进制数实际上是只有个位可用的


                    13楼2019-04-06 16:44
                    收起回复
                      你在讲什么?最终目的是想表达什么?谢谢


                      IP属地:江苏来自iPhone客户端16楼2019-04-08 23:09
                      收起回复
                        完全没看懂, 现在文盲连玩游戏的权利都没有了么???


                        IP属地:河南17楼2019-04-09 15:23
                        收起回复
                          這個 仍然是每種信號(銅鐵煤石算四種信號這樣)就要這麼一套嗎? 如果是的話
                          一套有7個運算器
                          感覺如果換成 脈衝轉常駐>>常駐信號延遲>>常駐轉脈衝+重置電路信號 這樣的思路也並不會比七個運算器多多少啊


                          IP属地:美国18楼2019-05-04 10:01
                          收起回复
                            通过计算次数控制延迟时间太麻烦,把信号存在寄存器中,通过计时器和触发器控制读取,可以很容易实现精确到每一tick。


                            IP属地:安徽19楼2019-05-09 00:58
                            收起回复
                              2025-08-25 02:17:58
                              广告
                              不感兴趣
                              开通SVIP免广告
                              楼主有没有游戏的资源


                              来自Android客户端20楼2019-05-09 10:41
                              收起回复