計算機要素--第三章 時序邏輯

計算機系統要素,從零開始構建現代計算機(nand2tetris)
如果完成了本書所有的項目 你將會獲得以下成就

  • 構建出一臺計算機(在模擬器上運行)
  • 實現一門語言和相應的語言標準庫
  • 實現一個簡單的編譯器

而且,這本書的門檻非常低,只要你能熟練運用一門編程語言即可。本課程綜合了數字電路,計算機組成原理,計算機體系架構,操作系統,編譯原理,數據結構等的主要內容,搭建了計算機平臺的構建的框架,並未深入細節,如果需要了解細節,可由本書作爲主線,逐步完善的知識體系。

QQ交流羣(含資料):289682057
課程連接
項目地址Github


本章要實現的邏輯門電路

  • 1bit寄存器,16bit寄存器
  • RAM8,RAM64,RAM512,RAM4K,RAM16K
  • 程序計數器PC

內容

1位寄存器:

一個觸發器可以對1位數據進行存儲。因此這個1位寄存器使用一個觸發器來實現。
輸入管腳:in,load
輸出管腳:out
核心代碼:

Mux(a=preout, b=in, sel=load, out=o1)
DFF(in=o1, out=preout, out=out)

16位寄存器:

將16個一位寄存器排列起來,將時序信號作用於每個寄存器,然後每個寄存器接收一位的輸入,根據時序信號確定是接收輸入還是繼續保持。
輸入管腳:in[16], load
輸出管腳:out[16]
僞碼:

for i=0:15
    Bit(in=in[i], load=load, out=out[i])

RAM8:

要實現RAM8芯片,就要將一組8個寄存器排列起來。接着,必須構建一個組合邏輯,把從RAM8"in"輸入端的輸入值裝載到被選中的某個記憶單元內。依次類推,還需要構建一個組合邏輯,其對給定的address值選擇正確的寄存區,然後將它的out輸出值送到RAM8的out輸出上。
要將in[16]存儲到某個單元,首先需要定位該單元,然後將數據和控制信號送給該單元。定位某個單元,也就是將控制信號通過指定的線路輸出,這可以通過DMux8Way來實現。然後由於我們不知道具體是哪個單元,所以需要將數據和控制信號送個所有的單元,至於用哪個單元,完全由控制信號決定。根據address輸出值很顯然是個16位八選一的問題。
輸入管腳:in[16], load, address[3]
輸出管腳:out[16]
僞碼:

DMux8Way(in=address,out=loadSignal)
for i=0:7
    Register(in=in,load=loadSignal,out=out_i)
Mux8Way16(in=out_[0..7], sel=address, out=out)

RAM64:

採用的思路是類似的,不同的是,對DMux8Way傳遞的地址和對Mux8Way16傳遞的地址時不同的。我們只需要將高三位地址傳給DMux8Way和Mux8Way16讓他們對芯片進行選擇即可,然後將低三位地址傳給RAM8作爲它的地址參數,進行芯片內部的地址選擇。
依次類推,我們可以構建RAM512,RAM4K,RAM16K…
輸入管腳:in[16], load, address[6]
輸出管腳:out[16]
僞碼:

DMux8Way(in=address[3..5],out=loadSignal)
for i=0:7
    RAM8(in=in,load=loadSignal,address=address[0..2],out=out_i)
Mux8Way16(in=out_[0..7], sel=address[3..5], out=out)

PC程序計數器:

總體上來看,inc,load,reset三個管腳的信號所實現的功能都是二選一,因此可以使用Mux16來進行實現,加一操作是非常顯然的要用增量器Inc16來實現。由於PC計數器中數據有時需要改變,有時需要保持,所以還需要一個寄存器(16位)來實現。課本上是這麼說的“w位計數器包含兩個主要部分:一個常規的w位寄存器和組合邏輯。組合邏輯用來:(a)、執行計數功能。(b)、根據控制位的3種不同的命令值,將計數器置於正確的操作模式。提示:這個邏輯的大部分功能都已經在第2章中實現了。”
Inc的功能:確定是否需要對之前的數據進行加一操作,因此此二路選擇器a管腳應該輸入之前的數據值,b管腳應該輸入加一之後的數據值。顯然存儲功能是由寄存器實現的,所以要想獲得之前的數據值,就得從寄存器的輸出管腳那裏獲得,因此,將寄存器的輸出管腳分爲兩路,一路給管腳a,另一路經由增量器給管腳b。而寄存器的輸入應該是上一個器件的輸出。
load功能:確定是否加載芯片的輸入值,顯然b管腳連接in,而a管腳連接實現Inc功能的選擇器的輸出。
reset功能:確定是否將數據值置零,顯然b管腳連接常量false,而a管腳連接實現load功能的輸出。由於reset功能之後就沒有控制信號了,因此reset的輸出端給register的輸入。這樣就完成了一個簡單的計數器。至於計數器的原理和細節內容還需要參考數字電路的知識。示意圖,並不是規範的電路圖
在這裏插入圖片描述
輸入管腳: in[16],load,inc,reset
輸出管腳:out[16]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章