1. 程式人生 > >《計算機系統要素》學習筆記:第五章計算機體系結構

《計算機系統要素》學習筆記:第五章計算機體系結構

1.學習要點
(1)系統
系統=計算裝置+程式
前三章只是靜態的構建計算裝置,第四章描述了程式的最底層表達,即機器語言。最後第五章是對前四章的總結,構建了一個完整的動態的計算機系統工作的模型。
(2)計算機工作的要點就在於:程式儲存和程式控制。而程式儲存即表明計算機中將程式和資料都存放在儲存器中,程式控制即是通過譯碼將機器指令轉換為具體的控制訊號進行控制。
(2)Hack硬體平臺
16位馮諾依曼機,包括一個CPU,兩個獨立的記憶體模組(指令記憶體和資料記憶體)和兩個記憶體映像I/O裝置(螢幕和鍵盤)。
(3)CPU——控制和計算
由ALU,暫存器,控制單元組成。
CPU的結構圖參考P94頁的結構圖,圖中缺少控制電路部分需要自己設計,控制電路可以分為:指令譯碼,指令執行,取指令三部分。
設計控制電路需要理解第四章的機器語言的兩種指令(A指令和C指令),Hack指令為16位,從低位到高位可以依次編碼為Instruction[0]-Instruction[15],根據第四章的內容可知,
Instruction[15]位為指令型別的識別位,即識別是地址指令A(0)還是計算指令C(1)。
若為地址指令,則剩下15位表示地址。
若為計算指令,則In[0]-In[2]表示jump域,In[3]-In[5]表示dest域,In[6]-In[12]表示computer域,聯絡到具體電路結構可知In[11]-In[6]對應ALU的zx,nx,zy,f,no控制位,而jump域與zr,ng以及PC有關,dest則與暫存器的load位有關。據此可以來設計控制電路,同時控制電路(取指-譯碼-執行)也是計算機程式控制的核心。
(4)記憶體和I/O


記憶體分為資料記憶體和指令記憶體。
I/0映像:建立輸入輸出裝置的二進位制模擬,使其對於CPU而言,看上去像普通的記憶體段。
2.程式碼實現
(1)CPU

CHIP CPU {

    IN  inM[16],         // M value input  (M = contents of RAM[A])
        instruction[16], // Instruction for execution
        reset;           // Signals whether to re-start the current
                         // program (reset==1
) or continue executing // the current program (reset==0). OUT outM[16], // M value output writeM, // Write to M? addressM[15], // Address in data memory (of M) pc[15]; // address of next instruction PARTS: //當指令為A指令時,遮蔽0-5
12控制位 And(a=instruction[15],b=instruction[0],out=I0); And(a=instruction[15],b=instruction[1],out=I1); And(a=instruction[15],b=instruction[2],out=I2); And(a=instruction[15],b=instruction[3],out=I3); And(a=instruction[15],b=instruction[4],out=I4); And(a=instruction[15],b=instruction[5],out=I5); And(a=instruction[15],b=instruction[12],out=I12); Mux16(a=instruction,b=outALU,sel=instruction[15],out=outMux1); //寫入A暫存器由155兩個控制位決定,分為0011兩種情況 Xor(a=instruction[15],b=I5,out=loadA1); Not(in=loadA1,out=loadA); ARegister(in=outMux1,load=loadA,out=outA); And16(a=outA,b[0..15]=true,out[0..14]=addressM); DRegister(in=outALU,load=I4,out=outD); //地址還是資料A/M Mux16(a=outA,b=inM,sel=I12,out=outAM); ALU(x=outD,y=outAM,zx=instruction[11],nx=instruction[10],zy=instruction[9], ny=instruction[8], f=instruction[7], no=instruction[6], out=outALU,out=outM,zr=zr,ng=ng); And(a=I3,b=true,out=writeM); //j1-j3與PC控制跳轉 Not(in=zr,out=notzr); Not(in=ng,out=notng); And(a=notzr,b=notng,out=out1); And(a=I0,b=out1,out=j3); And(a=I1,b=zr,out=j2); And(a=I2,b=ng,out=j1); Or(a=j3,b=j2,out=ep); Or(a=ep,b=j1,out=loadpc1); And(a=loadpc1,b=instruction[15],out=loadpc); PC(in=outAM,load=loadpc,reset=reset,inc=true,out[0..14]=pc); }

(2)memory

CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:
    Mux(a=load, b=false, sel=address[14], out=rload);  //address[14]=0時,RAM的load有效  
    Mux(a=false, b=load, sel=address[14], out=sload); //address[14]=0時,Screen的load無效  

    RAM16K(in=in, load=rload, address=address[0..13], out=rout);  
    Screen(in=in, load=sload, address=address[0..12], out=sout);  
    Keyboard(out=kout);  

    Mux16(a=sout, b=kout, sel=address[13], out=hout);  
    Mux16(a=rout, b=hout, sel=address[14], out=out); 
}

(3)computer

CHIP Computer {

    IN reset;

    PARTS:
    CPU(inM=outM0,instruction=outins,reset=reset,writeM=writeM,outM=outM,addressM=addressM,pc=pc);  
    Memory(in=outM,load=writeM,address=addressM,out=outM0);  
    ROM32K(address=pc,out=outins); 
}