欢迎光临散文网 会员登陆 & 注册

#6 函数(Part.2)栈,压栈与弹栈

2023-08-05 11:41 作者:-郭两岁  | 我要投稿


1.栈

stack

用一个寄存器在中间做RAM指针,用高电平使其永久输出

然后蓝色是弹栈控制线,橙色是压栈控制线,绿色是循环线

当弹栈时,外部输出激活,RAM读取和写入激活,寄存器写入激活,寄存器输出值-1后传输到RAM地址入口(弹出RAM指针上一个值并且写入0,然后寄存器数值也跟着-1)

当压栈时,寄存器写入激活,寄存器输出值直接导入RAM指针地址,允许外部输入值并写入RAM,地址值+1后写入寄存器(指针移到下一位)

当既不弹栈也不压栈时,所有激活均关闭

2.压栈与弹栈

先给我们的指令集增加栈的操作

指令集

按照指令集设计电路

因为栈那一关做出来的元件放不了高速内存

所以我直接把整个栈的所有电路直接搬过来

然后换上了高速内存,尽量不去增加延迟

(普通内存1024的延迟这谁顶得住哇)


把栈的功能接入LEG架构

对操作码第一位进行分线控制pop和push

然后用栈控制线控制开关

参数1接入栈输入值并且由push控制线控制

栈输出值接入结果总线

压栈与弹栈

写代码~

简单~

自定义汇编别名:

add:00000000(0)

input:00000111(7)

output:00000111(7)

ram_r:00010000(16)

ram_w:00010001(17)

equal:00100000(32)

less_than:00100010(34)

pop:00110000(48)

push:00110001(49)

j:01000000(64)

i:10000000(128)

reg0-reg5:00000000-00000101(0-5)

一点题外话

我在开始写专栏的时候(下面链接这一篇)

Turing Complete开坑占位

我贴了一张图,是我一开始设计LEG架构的线路

也是做到现在这个程度,包含四个模式(算术,跳转,内存读写,栈)

但是那个时候只是自己玩,就是能过关就行,不强求那么多

但是自从我开始写攻略,每一关都几乎重新设计线路

重新复习了每一种逻辑门,复习了每一个元件的存在的意义

然后为了减少延迟,我都重新设计了一套低延迟的线路

LEG架构我也是顺着攻略的进度重新做了一次

到现在为止从数据上就能看出来优化了

旧设计(门数量16524,总延迟277)

新设计(门数量14990,总延迟112)

门数量多是因为我用了两个高速内存,每个都几千个门所以压不下去

但是总延迟在我的优化之下减少了超过一半

(这意味着速度提升了100+%)

所以!精益求精!


#6 函数(Part.2)栈,压栈与弹栈的评论 (共 条)

分享到微博请遵守国家法律