#6 函數(shù)(Part.2)棧,壓棧與彈棧


1.棧

用一個寄存器在中間做RAM指針,用高電平使其永久輸出
然后藍色是彈??刂凭€,橙色是壓棧控制線,綠色是循環(huán)線
當彈棧時,外部輸出激活,RAM讀取和寫入激活,寄存器寫入激活,寄存器輸出值-1后傳輸?shù)絉AM地址入口(彈出RAM指針上一個值并且寫入0,然后寄存器數(shù)值也跟著-1)
當壓棧時,寄存器寫入激活,寄存器輸出值直接導(dǎo)入RAM指針地址,允許外部輸入值并寫入RAM,地址值+1后寫入寄存器(指針移到下一位)
當既不彈棧也不壓棧時,所有激活均關(guān)閉

2.壓棧與彈棧
先給我們的指令集增加棧的操作

按照指令集設(shè)計電路
因為棧那一關(guān)做出來的元件放不了高速內(nèi)存
所以我直接把整個棧的所有電路直接搬過來
然后換上了高速內(nèi)存,盡量不去增加延遲
(普通內(nèi)存1024的延遲這誰頂?shù)米⊥郏?/p>
把棧的功能接入LEG架構(gòu)
對操作碼第一位進行分線控制pop和push
然后用??刂凭€控制開關(guān)
參數(shù)1接入棧輸入值并且由push控制線控制
棧輸出值接入結(jié)果總線


寫代碼~
簡單~

自定義匯編別名:
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)

一點題外話
我在開始寫專欄的時候(下面鏈接這一篇)
我貼了一張圖,是我一開始設(shè)計LEG架構(gòu)的線路
也是做到現(xiàn)在這個程度,包含四個模式(算術(shù),跳轉(zhuǎn),內(nèi)存讀寫,棧)
但是那個時候只是自己玩,就是能過關(guān)就行,不強求那么多
但是自從我開始寫攻略,每一關(guān)都幾乎重新設(shè)計線路
重新復(fù)習了每一種邏輯門,復(fù)習了每一個元件的存在的意義
然后為了減少延遲,我都重新設(shè)計了一套低延遲的線路
LEG架構(gòu)我也是順著攻略的進度重新做了一次
到現(xiàn)在為止從數(shù)據(jù)上就能看出來優(yōu)化了
舊設(shè)計(門數(shù)量16524,總延遲277)
新設(shè)計(門數(shù)量14990,總延遲112)
門數(shù)量多是因為我用了兩個高速內(nèi)存,每個都幾千個門所以壓不下去
但是總延遲在我的優(yōu)化之下減少了超過一半
(這意味著速度提升了100+%)
所以!精益求精!
