【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集
參考教材:《計(jì)算機(jī)組成與設(shè)計(jì) 硬件/軟件接口 原書第五版》第二章 第四章
↑ 這本書寫的特別好,零基礎(chǔ)也可以看
實(shí)驗(yàn)報(bào)告
鏈接: https://pan.baidu.com/s/19YQA6YxejrAD9To6lbu5Zw
提取碼: wj38
完整電路
鏈接: https://pan.baidu.com/s/1m028MjBr0ntW9NQIeyo-Rw
提取碼: byv8
*僅供參考,指令已經(jīng)過MARS對(duì)比測(cè)試,但不保證完全正確,歡迎指正
*最后一次更新:2019-6-21 14:34:17 (新增:七段數(shù)碼管、JAL指令)
頂層視圖
測(cè)試指令:
v2.0 raw 3c0800ff 3c090001 01095021 01495023 350b5555 3c0c0001 3c0d0001 35ad0001 01ac6023 01ec4021 01084021 01084021 01ef4821 018c6821 01ad6821 01ac6821 01ac7021 01cc7821 012c4821 11090001 0810000f 3c080000 ad0c0000 8d0d0000 0c100000指令解釋:
測(cè)試結(jié)果(運(yùn)行最后一條指令JAL之前):
實(shí)驗(yàn)要求
以下為制作過程記錄
半加器
此半加器將在32-bit adder的第0位使用,因?yàn)?strong>第0位不需要考慮低位的進(jìn)位
半加器電路是指對(duì)兩個(gè)輸入數(shù)據(jù)位相加,輸出一個(gè)結(jié)果位和進(jìn)位,沒有進(jìn)位輸入的加法器電路。
是實(shí)現(xiàn)兩個(gè)一位二進(jìn)制數(shù)的加法運(yùn)算電路。
判斷是否進(jìn)位的電路
或門的使用
或門有多個(gè)輸入端,一個(gè)輸出端,只要輸入中有一個(gè)為高電平時(shí)(邏輯“1”),輸出就為高電平(邏輯“1”);只有當(dāng)所有的輸入全為低電平(邏輯“0”)時(shí),輸出才為低電平(邏輯“0”)
下圖是一個(gè)3輸入的或門:
下面這個(gè)電路用來判斷是否進(jìn)位,有3個(gè)輸入,1個(gè)輸出。真值表如右圖:
全加器 full adder
用門電路實(shí)現(xiàn)兩個(gè)二進(jìn)制數(shù)相加并求出和的組合線路,稱為一位全加器。
一位全加器可以處理低位進(jìn)位,并輸出本位加法進(jìn)位。
多個(gè)一位全加器進(jìn)行級(jí)聯(lián)可以得到多位全加器。
下面圖左是一個(gè)一位全加器,圖右是對(duì)應(yīng)的真值表。電路上面是異或,下面方塊用于判斷是否進(jìn)位。
3個(gè)輸入分別是:兩個(gè)加數(shù)a(i),b(i),前一位的進(jìn)位c(i)
2個(gè)輸出分別是:本位的結(jié)果s(i),下一位進(jìn)位c(i+1)
異或門的使用
如下圖,使用了一個(gè)三輸入的異或門
在實(shí)際使用時(shí),注意左側(cè)的Multiple-Input Behavior選項(xiàng)
應(yīng)該選擇“When an odd number are on”,這樣當(dāng)三個(gè)輸入為1 1 1時(shí),輸出為1
不要選擇When one input is on,否則三個(gè)輸入為1 1 1時(shí),輸出為 0
上圖中三輸入異或門的真值表如下:A B C是輸入,Y是輸出,F是對(duì)輸出的取反
為什么會(huì)產(chǎn)生這樣的真值表?解釋如下。
當(dāng)有多于2個(gè)輸入時(shí),異或邏輯的運(yùn)算(半加運(yùn)算)
異或運(yùn)算通常用符號(hào)“?”表示,其運(yùn)算規(guī)則為:
0?0=0 0同0異或,結(jié)果為0
0?1=1 0同1異或,結(jié)果為1
1?0=1 1同0異或,結(jié)果為1
1?1=0 1同1異或,結(jié)果為0
即兩個(gè)邏輯變量相異,輸出才為1,給ABCD賦值,從左向右累計(jì)運(yùn)算。得答案。
第一、相信你是知道兩個(gè)命題變量的異或運(yùn)算的規(guī)則的——只要你知道它的真值表就夠了,其規(guī)律是:(兩變量取值)相同則(結(jié)果為)假,不同則真;
第二、你應(yīng)該知道兩個(gè)命題變量的異或運(yùn)算的結(jié)果也是一個(gè)命題變量,它可以參與下一步的邏輯運(yùn)算;
第三、多個(gè)異或連續(xù)運(yùn)算,就類似數(shù)學(xué)上的連加、連乘運(yùn)算:將前兩個(gè)數(shù)的運(yùn)算結(jié)果,與第三個(gè)數(shù)繼續(xù)運(yùn)算;再將結(jié)果與第四個(gè)運(yùn)算;再……其中的每一步都要按照相應(yīng)運(yùn)算的規(guī)則進(jìn)行;
現(xiàn)在,你可以自己進(jìn)行計(jì)算了。不過我曾經(jīng)對(duì)多個(gè)變量的異或(和同或)運(yùn)算的規(guī)律做過分析,現(xiàn)將結(jié)果告訴你,你可以自行驗(yàn)證:
1、多個(gè)命題的“異或”運(yùn)算:其結(jié)果依賴于參與運(yùn)算的所有量中,取值為“真”的量的“個(gè)數(shù)”的“奇偶性”:
若含“奇數(shù)”個(gè)“真命題”,則結(jié)果為“真”;
若含“偶數(shù)”個(gè)“真命題”,則結(jié)果為“假”;(零個(gè)也是偶數(shù)個(gè))
換句話說:命題表達(dá)式 A?B?C?D 結(jié)果為“真”,當(dāng)且僅當(dāng) A、B、C、D 中有奇數(shù)個(gè)(即 1 個(gè)或 3 個(gè))變量的取值為“真”;而至于其中“假命題”的個(gè)數(shù),則對(duì)結(jié)果“無任何影響”。關(guān)于這一點(diǎn)的證明,可以從下面兩個(gè)恒等式中找到思路:
p ? 1 = 非p;——增加一個(gè)“真命題”參與運(yùn)算,總會(huì)將“原命題”變成其“反命題”;
p ? 0 = p;——增加一個(gè)“假命題”參與運(yùn)算,對(duì)“原命題”永遠(yuǎn)沒影響;
2、多個(gè)命題的“同或”運(yùn)算:其結(jié)果依賴于參與運(yùn)算的所有量中,取值為“假”的量的“個(gè)數(shù)”的“奇偶性”:
若含“奇數(shù)”個(gè)“假命題”,則結(jié)果為“假”;
若含“偶數(shù)”個(gè)“假命題”,則結(jié)果為“真”;
32-bit adder
第一步:添加兩個(gè)32位輸入,一個(gè)32位輸出
做一些tunnel,避免凌亂的電路
B的tunnel也做好了
中間過程不詳細(xì)描述了
1位全加器連在一起,最右面是1位半加器,因?yàn)榈?位不需要考慮低位進(jìn)位
一張圖放不下,截一個(gè)右邊的圖吧
32 bit substract
32位減法器,在32位加法器的基礎(chǔ)上制作,把減數(shù)取反加一(0x1,設(shè)置如下),與被減數(shù)相加即可
以下:完整的32位減法器
32 bit ori
或門
如果幾個(gè)條件中,只要有一個(gè)條件得到滿足,某事件就會(huì)發(fā)生,這種關(guān)系叫做“或”邏輯關(guān)系。具有“或”邏輯關(guān)系的電路叫做或門。或門有多個(gè)輸入端,一個(gè)輸出端。
只要輸入中有一個(gè)為高電平時(shí)(邏輯“1”),輸出就為高電平(邏輯“1”);
只有當(dāng)所有的輸入全為低電平(邏輯“0”)時(shí),輸出才為低電平(邏輯“0”)。
32位或的電路實(shí)現(xiàn)
32-bit ori用于實(shí)現(xiàn)mips的ori指令。電路比較簡(jiǎn)單,圖如下
ALU
算術(shù)邏輯單元(arithmetic and logic unit) 是能實(shí)現(xiàn)多組算術(shù)運(yùn)算和邏輯運(yùn)算的組合邏輯電路。
大部分ALU都可以完成以下運(yùn)算∶
1、整數(shù)算術(shù)運(yùn)算(加、減,有時(shí)還包括乘和除,不過成本較高)
2、位邏輯運(yùn)算(與、或、非、異或)
3、移位運(yùn)算(將一個(gè)字向左或向右移位或浮動(dòng)特定位,而無符號(hào)延伸),移位可被認(rèn)為是乘以2或除以2。
bgez指令
指令用法為:bgez rs, offset
指令作用為:if rs ≥ 0 then branch,如果地址為rs的通用寄存器的值大于等于0,那么發(fā)生轉(zhuǎn)移。
Multiplexer
多路選擇器是數(shù)據(jù)選擇器的別稱。在多路數(shù)據(jù)傳送過程中,能夠根據(jù)需要將其中任意一路選出來的電路,叫做數(shù)據(jù)選擇器,也稱多路選擇器或多路開關(guān)
用下圖理解一下多路選擇器的作用:
choose=0時(shí),輸入A有效,輸入B無效
choose=1時(shí),輸入A無效,輸入B有效
再用下面兩張圖理解一下select bits=2 的情況
ALU整體電路圖
ALU實(shí)現(xiàn)Add、Sub、Ori的功能,用了兩個(gè)mux,上面的mux用于執(zhí)行bgnz指令,下面的mux用于輸出執(zhí)行的到底是哪一種運(yùn)算(加、減還是或)。實(shí)際上,當(dāng)A(上面)、B(下面)輸入都存在時(shí),每一種運(yùn)算都已經(jīng)進(jìn)行了,只不過由于下方mux的選擇,運(yùn)算結(jié)果沒有輸出而已。
對(duì)于黃色圈內(nèi)bgnz原理的解釋、Multiplexer在本電路中的作用,如下圖:
(后來我把bgnz刪了,因?yàn)閷?shí)驗(yàn)要求里并沒有讓寫這條指令)
至此,ALU的設(shè)計(jì)完成
存儲(chǔ)原件(與本實(shí)驗(yàn)無關(guān),可跳過)
鎖存器與觸發(fā)器P469
S-R鎖存器
可以存儲(chǔ)一位數(shù)據(jù),數(shù)值存儲(chǔ)在如下圖所示的交叉耦合結(jié)構(gòu)內(nèi)
D鎖存器
當(dāng)鎖存器處于打開狀態(tài)時(shí),輸出Q的值隨輸入D的改變而變化。
IFU
作用:存儲(chǔ)指令、讀出指令
要求
4. IFU:內(nèi)部包括PC、IM(指令存儲(chǔ)器)及相關(guān)邏輯。
a) PC:用寄存器實(shí)現(xiàn),寬度為30位。PC應(yīng)具有復(fù)位功能。
b) IM:容量為32bit×32字,用ROM實(shí)現(xiàn)。
c) 說明:由于IM地址僅為5位,因此請(qǐng)用2個(gè)對(duì)接的Splitter實(shí)現(xiàn)將PC低位地址與IM地址連接。
解釋:關(guān)于為什么PC寬度為30位,而IM寬度為32位
IM:容量為32bit×32字,用ROM實(shí)現(xiàn)
IFU整體圖(右下角獨(dú)立的部分沒用,沒舍得刪)
一些易錯(cuò)點(diǎn)
Controller
作用:判斷執(zhí)行的是哪一條指令,按照真值表輸出控制信號(hào)來控制main電路中的許多multiplexer
整體視圖↓
分區(qū)域放大
左邊↓
右邊↓
Regfile寄存器堆
Extender位拓展器
頂層視圖 main
整體↓
詳細(xì)圖↓
至此,CPU設(shè)計(jì)完成,下面的步驟就是測(cè)試指令了
首先給出MIPS寄存器號(hào)對(duì)應(yīng)表
MIPS寄存器號(hào)表
寫了一些測(cè)試數(shù)據(jù)
(0)
lui $t0,255 #立即數(shù)加載至寄存器t0高16位
001111 00000 01000 0000000011111111
00111100000010000000000011111111
3c0800ff
(1)
lui $t1,1 #立即數(shù)加載至寄存器t1高16位
00111100000010010000000000000001
3c090001
(2)
addu t2,t2,t2,t0,$t1 #把寄存器t0與t1的值相加,結(jié)果存在t2中
000000 t0 t1 t2 00000 100100
操作碼 源1 源2 目的
000000 01000 01001 01010 00000 100001
00000001000010010101000000100001
01095021
(3)
subu t2,t2,t2,t2,$t1 #把寄存器t2與t1的值相減,結(jié)果存在t2中
操作碼 源1 源2 目的
00000001010010010101000000100011
01495023
(4)
ori t3,t3,t3,t0,0101010101010101 #把寄存器t0中的值與imm16相與,結(jié)果存在寄存器t3中
操作碼 源 目的
001101 t0 t3 imm16
00110101000010110101010101010101
350b5555
預(yù)期:t3 0000 0000 0101 0101 0101 0101
(5)
sw t3,1(t3,1(t3,1(t4) #把寄存器t3中的數(shù)放進(jìn)以t4中存的0為base,2為偏移的內(nèi)存單元中(效果為2字,因?yàn)橐宰謱ぶ?#xff09;
101011 01100 01011 0000000000000010
10101101100010110000000000000010
ad8b0002
(6)
lw t5,1(t5,1(t5,1(t4) #把以t4中存的0為base,2為偏移的內(nèi)存單元中的數(shù)據(jù),存放在寄存器t5中
100011 01100 01101 0000000000000010
10001101100011010000000000000010
8d8d0002
- 以上運(yùn)行結(jié)果:
t0: 00ff 0000
t1: 0001 0000
t2: 00ff 0000
t3: 00ff 5555
t4: 0000 0000
t5: 00ff 5555
(7)
beq t3,t3,t3,t5,(十進(jìn)制7)0000000000000111 #比較t3和t5的數(shù)據(jù),相等就跳轉(zhuǎn)到PC+7(字)
000100 01011 01101 0000000000000111 #如果不相等,就執(zhí)行下一條指令PC+1(字)
00010001011011010000000000000111
116d0007
(8)
lui $t1,0 #立即數(shù)0加載至寄存器t1高16位(把t1清零)
00111100000010010000000000000000
3c090000
(14)
lui $t0,0 #立即數(shù)0加載至寄存器t0高16位(把t0清零)
001111 00000 01000 0000000000000000
00111100000010000000000000000000
3c080000
(15)
j 8 #跳轉(zhuǎn)回到第8條指令(0,1,2,3,4,5,6,7,8)
00001000000000000000000000001001
08000008
- 以上運(yùn)行結(jié)果:
t0: 0000 0000
t1: 0000 0000
t2: 00ff 0000
t3: 00ff 5555
t4: 0000 0000
t5: 00ff 5555
要注意,beq是相對(duì)下一條指令尋址,j是絕對(duì)地址
全部指令
總結(jié)
以上是生活随笔為你收集整理的【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Logisim 一个PLA电路
- 下一篇: vb 实现小超市饮料补货提醒程序 pub