《計算機系統要素》學習筆記:第五章計算機體系結構
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暫存器由15和5兩個控制位決定,分為00,11兩種情況
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);
}