【设计规划】排队延迟电路:对每一个脉冲信号延迟1秒后输出
异星工厂吧
全部回复
仅看楼主
level 14
本设计经 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输出任意信号的版本。缺点是,运算用的数据可能过于庞大,可能会对电脑造成负担。
成品图:
逻辑流程图:
2019年04月05日 09点04分 1
level 14
原理解析:
1.已知每计算一次需要1tick,那么循环计算60次后输出,便是延迟了1秒。
2.信号复用:用同一数字信号的不同位数可以存储不同信息。如T1输入信号铁2,T2无信号,T3输入铁4,只用有1个信号便可记录即:A204。通过没每T信号*10然后再循环,我们就可以把每一T的信号记录到一个A信号里。
3.游戏中一个数字最高可达10位,也就是1个A信号只能记录10T的信号。但是,通过把最高位的数字转换为另一种信号的个位再次进入*10循环就可以多记10位了。以此类推,我们可以用更多的信号记录来更多的位数。
2019年04月05日 09点04分 2
level 14
拆解一下:
1信号复用部分。把之前的信号左移一次(*10),把个位空出来以便记录新汇入的信号。
2019年04月05日 10点04分 3
这里加法运算器可以不用,直接把铁信号导入循环
2019年04月05日 10点04分
level 7
可以的
2019年04月05日 11点04分 4
level 14
2.输出第十位数字。当这个运算器输入小于1G的信息时,运算器无输出。当输入大于1G时,将会输出第10位的数字。
2019年04月05日 12点04分 5
level 14
3.信号转换。把A10位转为B1位,把B10位转为铁信号。
2019年04月05日 12点04分 6
level 14
4.消除第十位。因为第十位再次*10会变成负数,且必须为9位腾出位置。所以我们必须在输出第十位数字后立即消除他,并保留1至9位。所以我们不能采用自带重置的判断器,改用乘法做一个与10位一样的负值,和原信号正负冲抵。
值得注意的是,这一步不必须与原信号同步,否则会造成信号失真,电路无效。负数合并早了,没有可冲抵的正数会污染原信号,让其成负值。合并晚了,没有及时抹除的10位会变成11位与新的10位一起输出,污染下游的信号。
2019年04月05日 13点04分 7
level 14
5.循环部分 因为信号复用,使信号合并也不会互相干扰了,所以我们可以放心大胆的做循环电路,让信号自己循环运算而无需多加运算器。原理上用1个*10运算器,换6个信号就好。然而,为了满足隔壁消除部分的同步需求。信号在进循环前,不得不运算2次毫无意义的+0,让两边耗时一样。
同时,这个两个运算器也增加了循环内的计算次数。使信号每循环一次都会延迟3T。循环10次能延迟30T。这样2个信号就能让每个脉冲延迟1秒。
2019年04月05日 13点04分 8
level 14
建议每种信号只记录9位,因为第十位不能只能有1,一旦出现大于1的数字,信号就会变成负的。
PS:本电路其实一共延迟了62tick。计算次数为3*10*2+2。如果想精确延迟1秒,请修改一下增加减少一些计算步骤,并不难,大家就当练习做了吧。
PSS:通过分配不同的信号,本电路可以延迟多种信号,比如铁:AB 铜:CD 钢:EF,不过多加几组运算器罢了。
PSSS:有的小可爱问:如果每T的信号如果大于9怎么办,一位数不够记录了。你可以做一个*100的,或者*任何一个比你每T最大峰值大的数,输出的时候改一下对应数字就可以了。
2019年04月05日 13点04分 9
level 1
你这个最高位处理十进制数还是有问题的
10^9产生进位时还在2^31-1的区间内
10^9*9产生进位时就已经超过了2^31-1的区间,也就是符号位被置1了,你这样算出来的东西就有问题
第10位的十进制数实际上是只有个位可用的
2019年04月06日 08点04分 13
是的,我之前也发现了。所以9楼建议每个信号只用9位,问题不大。这个电路是之前为了好算弄得
2019年04月06日 10点04分
我刚把16进位的搞定了,不得不说,这个用整数保存时序的思路真实****[笑眼]
2019年04月06日 11点04分
@none_loop 关键是他的运算器只能得出整数,这就很方便了
2019年04月06日 11点04分
level 2
你在讲什么?最终目的是想表达什么?谢谢
2019年04月08日 15点04分 16
???在玩梗么???
2019年04月09日 07点04分
level 7
完全没看懂, 现在文盲连玩游戏的权利都没有了么???
2019年04月09日 07点04分 17
(⊙_⊙)你在玩梗吧。。。不会电路玩游戏的不是一大把么?
2019年04月09日 07点04分
当然,你没看懂的一大部分原因可能是你在游戏里用不上这些内容
2019年04月09日 07点04分
@大蚂虾_53 Emmm 我还在传送带年代,瞎玩吧。咱也不知道咱也不敢问啊
2019年05月03日 18点05分
@什么名字让起啊 (⊙_⊙)具体哪里不懂?我现在旅游中时间很多,我重新解释
2019年05月03日 22点05分
level 1
這個 仍然是每種信號(銅鐵煤石算四種信號這樣)就要這麼一套嗎? 如果是的話
一套有7個運算器
感覺如果換成 脈衝轉常駐>>常駐信號延遲>>常駐轉脈衝+重置電路信號 這樣的思路也並不會比七個運算器多多少啊
2019年05月04日 02点05分 18
奧 不行 你這個的同種脈衝信號有可能在一次延遲週期內進來多個?
2019年05月04日 02点05分
不對啊 你這個也有這個問題啊 鐵的脈衝信號進來會和在延遲中的鐵信號疊加啊
2019年05月04日 02点05分
奧 你這個是預期進來的鐵脈衝信號不會超過10? 所以疊加也沒問題這樣?
2019年05月04日 02点05分
@星光爆碎 对,如果输入信号超过10,可以设定×/倍数大一点,超过最大值就行。游戏里运算是没有小数的,这样叠加就不会留干扰。
2019年05月04日 03点05分
level 8
通过计算次数控制延迟时间太麻烦,把信号存在寄存器中,通过计时器和触发器控制读取,可以很容易实现精确到每一tick。
2019年05月08日 16点05分 19
寄存器的问题是,触发之前会叠加,等于互相污染了
2019年05月08日 22点05分
@断羽DE天使 我明白了,你这是要每tick都进行一次输入输出,那只需要每tick左移一位加上输入值,需要延迟多少tick只需要读取对应位的值输出就可以了。
2019年05月09日 10点05分
@SP小木鱼 对,本来就想用左移的。。。但是这个游戏里的左移是换2进制左移然后再换回10进制。。。所以只好用*10,其实就是十进制的左移一格
2019年05月09日 10点05分
level 4
楼主有没有游戏的资源
2019年05月09日 02点05分 20
steam了解一下。现在玩盗版已经政治不正确了
2019年05月09日 02点05分
1 2 尾页