完成1.3、1.4、1.5之後,我們就只差“根據時鐘滴答完成6個操作”,就可以做出來自己的晶片。下面,我們就完成這個晶片的核心管理者:Control Section
Control Section控制了晶片內部所有已有的器件。比如IAR暫存器的S開關、E開關。還記得S\E開關分別是幹啥的麼?S是設定使能開關,E是輸出使能開關。
時鐘滴答
最簡單的時鐘電路:
Control Section控制了所有暫存器的S\E開關,但是所有暫存器的開關肯定是用到的時候才能開啟,不能常開。所以我們採用如下過程生成clock s、clock e兩個時鐘訊號:
首先,藉助線路的延遲,我們將clk延遲1/4個週期得到clock d:
然後利用或門、與門,我們生成clock e、clock s:
在一個時鐘週期內,只有暫存器A的E開關和暫存器B的S開關同時為高電平時,暫存器A的內容才會複製到到暫存器B裡面。
閘電路搭建計步器
怎麼講了半天沒講到6個步驟是怎麼迴圈執行的?彆著急,馬上就來。
按照我們的要求,步進器要完成下面的功能:有6個輸出,每個中滴答有且只能有一個輸出為高電平(表示選中),且要能夠迴圈操作。
廢話不多說,上電路:
可以看到隨著時鐘滴答,step1、2、3、4、5、6、7依次變為高電平。
如何得到一個迴圈呢?我們來個取巧的方案:
當7位為高電平的時候,就復位一下:(妥妥浪費一個時鐘週期)
執行ADD指令
有了計步器,我們就可以考慮把計步器的6個輸出和對應的器件的s、e開關連線起來,執行每個時鐘滴答應該完成的動作:
左邊的暫存器輸出使能,右邊的暫存器設定使能。以計步器的輸出1位高電平使能為例講解:此時bus 1的e開關開啟,IAR暫存器的e開關開啟,MAR暫存器的s開關開啟,ACC暫存器的s開關開啟。透過匯流排,IAR的值傳遞給了ACC\MAR。bus 1的輸出直連傳遞給ALU。
還記得這個是啥麼?
- 獲取指令地址,同時“PC自增1”。複製IAR暫存器。複製到MAR(RAM地址暫存器,還記得麼),同時也複製到ALU的輸入:ACC暫存器。使能bus1暫存器(一個神奇的魔鬼數字1,和PC自增1聯絡起來了)。!!!對於step2\step3大家可以自己分析。
對於執行ADD指令,計步器這麼連線:
第4步:R1暫存器的值被設定到了TMP暫存器中。
第5步:R0暫存器的值被設定到了ACC暫存器中
第6步:ACC暫存器的值被設定到了R0暫存器。
完整電路圖
完整的連線,需要遍歷所有指令連線一遍計步器的輸出。前面ADD命令我們已經完成了,其他指令也就很簡單了。大家可以自己來一遍
你的第一個晶片
你的第一個晶片就這樣完成了,後面新增I\O輸出、顯示也不過是新增新的暫存器和指令而已。
附一個JS做得CPU模型網站:
http://www.buthowdoitknow.com/but_how_do_it_know_cpu_model.html