-
前言
計算機組成原理課程設第一部分使用logisim軟件設計一個模型機器,包括但不限於CPU,主存,實現至少4條指令,在其上編織並執行一個程序(最好是循環程序)。
-
題目
logisim設計相應的課程設計邏輯電路。
1. 課程設計基本完成作業
具體電路功能爲
(1)有清晰是時序邏輯。
(2)有完整的微操作發生器(四條基本指令:ADD LDA JMP STP)。
(3)數據傳遞正確,並能運行出結果,結果存在ACC(累加器)中。
2. 課程設計選做作業
具體電路功能爲
(1)有清晰是時序邏輯。
(2)有完整的微操作發生器(八條基本指令、建議可以實現一個循環程序段)。
(3)數據傳遞正確,並能運行出結果,結果存在ACC(累加器)中。
-
設計方案
- 設計指令集
- 爲每個指令設計微操作
- 做微操作時間表
- 根據時間表製作微操作發生器Microoperation signal generator(我簡稱爲MOG)
- 製作CPU和存儲器等部件
- 調試執行
-
具體實施
-
設計指令集
該指令集設計爲8位的指令字長,高四位爲OP,低四位爲地址碼或者立即數。
我首先設計並完成了8條指令:LDA(取數) ADD STA(存數) SHL SHR NOT JMP STP(停止)
爲了實現循環又添加了4條指令:CMP INC LDI(取數至ID寄存器) JE
如下圖所示
需要注意的是在相關文檔中,提到在數據尋址時,高位自動補1010,在跳轉指令尋址時高位自動補0001
比如:0000 0001 識別爲LDA [1010 0001]; 1100 0001 識別爲JMP [0001 0001] 如下圖所示
故而需要在尋址時設計一個 根據指令不同 自動補齊高位的電路。(在下面的指令寄存器電路模塊有所體現)。
-
爲每個指令設計微操作
在此舉幾個例子:
· ADD
EF:
T0: PC->MAR; 1->R
T1: M[MAR]->MDR; PC+1->PC
T2: MDR->IR
T3:
EX:
T0: Ad(IR)->MAR; 1->R
T1: M[MAR]->MDR
T2: MDR->X
T3: X+ACC->ACC
· LDA
EF:
T0: PC->MAR; 1->R
T1: M[MAR]->MDR; PC+1->PC
T2: MDR->IR
T3:
EX:
T0: Ad(IR)->MAR; 1->R
T1: M[MAR]->MDR
T2: MDR->ACC
T3:
FE是取指令週期,EX是執行週期。這裏不考慮間址週期。
-
微操作時間表
週期 |
時鐘 |
微操作(本文件中hex(op)碼) |
LDA(0) |
CMP(1) |
ADD(2) |
INC(3) |
STA(4) |
LDI(5) |
SHL(6) |
SHR(8) |
NOT(a) |
JMP(c) |
STP(e) |
JE(f) |
FE |
T0 |
PC->MAR |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
1->R |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
||
T1 |
M[MAR]->MDR |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
|
PC+1->PC |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
||
T2 |
MDR->IR |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
|
T3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EX |
T0
|
Ad(IR)->MAR |
√ |
|
√ |
|
√ |
√ |
|
|
|
√ |
|
|
Ad(IR)->CMPer |
|
√ |
|
|
|
|
|
|
|
|
|
|
||
1->R |
√ |
|
√ |
|
|
√ |
|
|
|
|
|
|
||
1->W |
|
|
|
|
√ |
|
|
|
|
|
|
|
||
T1
|
M[MAR]->MDR |
√ |
√ |
√ |
|
|
√ |
|
|
|
|
|
|
|
ACC->MDR |
|
|
|
|
√ |
|
|
|
|
|
|
|
||
ID->CMPer |
|
√ |
|
|
|
|
|
|
|
|
|
|
||
T2 |
MDR->X |
|
|
√ |
|
|
|
|
|
|
|
|
|
|
MDR->ACC |
√ |
|
|
|
|
|
|
|
|
|
|
|
||
MDR->M[MAR] |
|
|
|
|
√ |
|
|
|
|
|
|
|
||
Ad(IR)->PC |
|
|
|
|
|
|
|
|
|
√ |
|
√ |
||
STOP |
|
|
|
|
|
|
|
|
|
|
√ |
|
||
¬AC->AC |
|
|
|
|
|
|
|
|
√ |
|
|
|
||
ACC<<< |
|
|
|
|
|
|
√ |
|
|
|
|
|
||
ACC>>> |
|
|
|
|
|
|
|
√ |
|
|
|
|
||
ID+1->ID |
|
|
|
√ |
|
|
|
|
|
|
|
|
||
MDR->ID |
|
|
|
|
|
√ |
|
|
|
|
|
|
||
T3 |
X+ACC->ACC |
|
|
√ |
|
|
|
|
|
|
|
|
|
-
根據時間表製作微操作發生器(下載鏈接)
現在的上傳資源好像不能自己定積分了,默認就是5積分?
這個圖實在太大,截圖顯示不清楚,可以使用logisim打開我完成的電路圖看。
以上是整體的MOG圖,左下角一排是輸入引腳,最上面一排是輸出引腳,最左側是一個譯碼器,根據輸入的4位OP碼譯碼選擇指令,中間和右側這整一大片是對微操作的選擇電路。關於選擇電路主要就是根據微操做時間表上的節拍和週期以及指令類型進行選擇。
當完成微操作內部時,可以通過下圖中的按鈕進入一個調整頁面,調整其他程序調用它時的顯示樣式。
-
製作CPU和存儲器等部件
可以看到這張圖比剛纔還大。。。
我來分部解說一下:
1. 時鐘控制器
2. 存儲器
3. 微操作發生器
4. ALU(加法器 位移操作器 操作數寄存器X)
5. 程序計數器
6. 相等標誌位
7. ID寄存器
8. 指令寄存器IR
9. 門控電路和時鐘控制電路
-
調試執行
1. 右鍵存儲器 Load Image... 載入數據code
首先將數據清零,然後觀察存儲器數據是這樣的
根據起那面的指令設計,不難理解這裏面的程序是這樣的
00: LDA [A0]
21: ADD [A1]
43: STA ACC,[A3]
C1: JMP 11
60: SHL
80: SHR
A0: NOT
E0: END
2. 接下來再load image cycle 這是一個循環程序
具體內容是這樣的 首先給IDload一個數,然後比較這個數是否與某個立即數相等,如果相等則結束,否則進入循環:
ID++,繼續比較是否和一個立即數相等,如果相等,這跳出循環,否則繼續循環。
詳細的彙編指令不在贅述。
0613有更新:
其實這裏我理解錯老師的意思了,老師說的ID其實是一個變址寄存器,在比較的時候時
cmp [ID],立即數
這種形式的,?,我就不再做修改了,大家只要理解循環的思路,這個也是很容易做出來的。