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


1.栈

用一个寄存器在中间做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)

一点题外话
我在开始写专栏的时候(下面链接这一篇)
我贴了一张图,是我一开始设计LEG架构的线路
也是做到现在这个程度,包含四个模式(算术,跳转,内存读写,栈)
但是那个时候只是自己玩,就是能过关就行,不强求那么多
但是自从我开始写攻略,每一关都几乎重新设计线路
重新复习了每一种逻辑门,复习了每一个元件的存在的意义
然后为了减少延迟,我都重新设计了一套低延迟的线路
LEG架构我也是顺着攻略的进度重新做了一次
到现在为止从数据上就能看出来优化了
旧设计(门数量16524,总延迟277)
新设计(门数量14990,总延迟112)
门数量多是因为我用了两个高速内存,每个都几千个门所以压不下去
但是总延迟在我的优化之下减少了超过一半
(这意味着速度提升了100+%)
所以!精益求精!
