日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集

發布時間:2024/2/28 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考教材:《計算機組成與設計 硬件/軟件接口 原書第五版》第二章 第四章
↑ 這本書寫的特別好,零基礎也可以看

實驗報告
鏈接: https://pan.baidu.com/s/19YQA6YxejrAD9To6lbu5Zw
提取碼: wj38

完整電路
鏈接: https://pan.baidu.com/s/1m028MjBr0ntW9NQIeyo-Rw
提取碼: byv8

*僅供參考,指令已經過MARS對比測試,但不保證完全正確,歡迎指正
*最后一次更新:2019-6-21 14:34:17 (新增:七段數碼管、JAL指令)

頂層視圖

測試指令:

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

指令解釋:

測試結果(運行最后一條指令JAL之前):

實驗要求



以下為制作過程記錄

半加器

此半加器將在32-bit adder的第0位使用,因為第0位不需要考慮低位的進位

半加器電路是指對兩個輸入數據位相加,輸出一個結果位進位沒有進位輸入的加法器電路。

是實現兩個一位二進制數的加法運算電路。


判斷是否進位的電路

或門的使用

或門有多個輸入端,一個輸出端,只要輸入中有一個為高電平時(邏輯“1”),輸出就為高電平(邏輯“1”);只有當所有的輸入全為低電平(邏輯“0”)時,輸出才為低電平(邏輯“0”)

下圖是一個3輸入的或門:

下面這個電路用來判斷是否進位,有3個輸入,1個輸出。真值表如右圖:

全加器 full adder

用門電路實現兩個二進制數相加并求出和的組合線路,稱為一位全加器。

一位全加器可以處理低位進位,并輸出本位加法進位。

多個一位全加器進行級聯可以得到多位全加器。

下面圖左是一個一位全加器,圖右是對應的真值表。電路上面是異或,下面方塊用于判斷是否進位。

3個輸入分別是:兩個加數a(i),b(i),前一位的進位c(i)
2個輸出分別是:本位的結果s(i),下一位進位c(i+1)

異或門的使用

如下圖,使用了一個三輸入的異或門

在實際使用時,注意左側的Multiple-Input Behavior選項
應該選擇“When an odd number are on”,這樣當三個輸入為1 1 1時,輸出為1
不要選擇When one input is on,否則三個輸入為1 1 1時,輸出為 0

上圖中三輸入異或門的真值表如下:A B C是輸入,Y是輸出,F是對輸出的取反

為什么會產生這樣的真值表?解釋如下。

當有多于2個輸入時,異或邏輯的運算(半加運算)

異或運算通常用符號“?”表示,其運算規則為:

0?0=0 0同0異或,結果為0

0?1=1 0同1異或,結果為1

1?0=1 1同0異或,結果為1

1?1=0 1同1異或,結果為0

即兩個邏輯變量相異,輸出才為1,給ABCD賦值,從左向右累計運算。得答案。

第一、相信你是知道兩個命題變量的異或運算的規則的——只要你知道它的真值表就夠了,其規律是:(兩變量取值)相同則(結果為)假,不同則真;

第二、你應該知道兩個命題變量的異或運算的結果也是一個命題變量,它可以參與下一步的邏輯運算;

第三、多個異或連續運算,就類似數學上的連加、連乘運算:將前兩個數的運算結果,與第三個數繼續運算;再將結果與第四個運算;再……其中的每一步都要按照相應運算的規則進行;

現在,你可以自己進行計算了。不過我曾經對多個變量的異或(和同或)運算的規律做過分析,現將結果告訴你,你可以自行驗證:

1、多個命題的“異或”運算:其結果依賴于參與運算的所有量中,取值為“真”的量的“個數”的“奇偶性”:

若含“奇數”個“真命題”,則結果為“真”;

若含“偶數”個“真命題”,則結果為“假”;(零個也是偶數個)

換句話說:命題表達式 A?B?C?D 結果為“真”,當且僅當 A、B、C、D 中有奇數個(即 1 個或 3 個)變量的取值為“真”;而至于其中“假命題”的個數,則對結果“無任何影響”。關于這一點的證明,可以從下面兩個恒等式中找到思路:

p ? 1 = 非p;——增加一個“真命題”參與運算,總會將“原命題”變成其“反命題”;

p ? 0 = p;——增加一個“假命題”參與運算,對“原命題”永遠沒影響;

2、多個命題的“同或”運算:其結果依賴于參與運算的所有量中,取值為“假”的量的“個數”的“奇偶性”:

若含“奇數”個“假命題”,則結果為“假”;

若含“偶數”個“假命題”,則結果為“真”;

32-bit adder

第一步:添加兩個32位輸入,一個32位輸出

做一些tunnel,避免凌亂的電路

B的tunnel也做好了

中間過程不詳細描述了

1位全加器連在一起,最右面是1位半加器,因為第0位不需要考慮低位進位

一張圖放不下,截一個右邊的圖吧

32 bit substract

32位減法器,在32位加法器的基礎上制作,把減數取反加一(0x1,設置如下),與被減數相加即可

以下:完整的32位減法器

32 bit ori

或門

如果幾個條件中,只要有一個條件得到滿足,某事件就會發生,這種關系叫做“或”邏輯關系。具有“或”邏輯關系的電路叫做或門。或門有多個輸入端,一個輸出端。

只要輸入中有一個為高電平時(邏輯“1”),輸出就為高電平(邏輯“1”);
只有當所有的輸入全為低電平(邏輯“0”)時,輸出才為低電平(邏輯“0”)。

32位或的電路實現

32-bit ori用于實現mips的ori指令。電路比較簡單,圖如下

ALU

算術邏輯單元(arithmetic and logic unit) 是能實現多組算術運算和邏輯運算的組合邏輯電路。
大部分ALU都可以完成以下運算∶
1、整數算術運算(加、減,有時還包括乘和除,不過成本較高)
2、位邏輯運算(與、或、非、異或)
3、移位運算(將一個字向左或向右移位或浮動特定位,而無符號延伸),移位可被認為是乘以2或除以2。

bgez指令
指令用法為:bgez rs, offset
指令作用為:if rs ≥ 0 then branch,如果地址為rs的通用寄存器的值大于等于0,那么發生轉移。

Multiplexer
多路選擇器是數據選擇器的別稱。在多路數據傳送過程中,能夠根據需要將其中任意一路選出來的電路,叫做數據選擇器,也稱多路選擇器或多路開關

用下圖理解一下多路選擇器的作用:
choose=0時,輸入A有效,輸入B無效
choose=1時,輸入A無效,輸入B有效

再用下面兩張圖理解一下select bits=2 的情況

ALU整體電路圖

ALU實現Add、Sub、Ori的功能,用了兩個mux,上面的mux用于執行bgnz指令,下面的mux用于輸出執行的到底是哪一種運算(加、減還是或)。實際上,當A(上面)、B(下面)輸入都存在時,每一種運算都已經進行了,只不過由于下方mux的選擇,運算結果沒有輸出而已。

對于黃色圈內bgnz原理的解釋、Multiplexer在本電路中的作用,如下圖:
(后來我把bgnz刪了,因為實驗要求里并沒有讓寫這條指令)

至此,ALU的設計完成

存儲原件(與本實驗無關,可跳過)

鎖存器與觸發器P469

S-R鎖存器
可以存儲一位數據,數值存儲在如下圖所示的交叉耦合結構內


D鎖存器
當鎖存器處于打開狀態時,輸出Q的值隨輸入D的改變而變化。

IFU

作用:存儲指令、讀出指令

要求
4. IFU:內部包括PC、IM(指令存儲器)及相關邏輯。
a) PC:用寄存器實現,寬度為30位。PC應具有復位功能。
b) IM:容量為32bit×32字,用ROM實現。
c) 說明:由于IM地址僅為5位,因此請用2個對接的Splitter實現將PC低位地址與IM地址連接。

解釋:關于為什么PC寬度為30位,而IM寬度為32位

IM:容量為32bit×32字,用ROM實現

IFU整體圖(右下角獨立的部分沒用,沒舍得刪)


一些易錯點

Controller

作用:判斷執行的是哪一條指令,按照真值表輸出控制信號來控制main電路中的許多multiplexer

整體視圖↓

分區域放大

左邊↓

右邊↓

Regfile寄存器堆



Extender位拓展器

頂層視圖 main

整體↓

詳細圖↓



至此,CPU設計完成,下面的步驟就是測試指令了
首先給出MIPS寄存器號對應表

MIPS寄存器號表

寫了一些測試數據
(0)
lui $t0,255 #立即數加載至寄存器t0高16位
001111 00000 01000 0000000011111111
00111100000010000000000011111111
3c0800ff

(1)
lui $t1,1 #立即數加載至寄存器t1高16位
00111100000010010000000000000001
3c090001

(2)
addu t2,t2,t2,t0,$t1 #把寄存器t0與t1的值相加,結果存在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的值相減,結果存在t2中
操作碼 源1 源2 目的
00000001010010010101000000100011
01495023

(4)
ori t3,t3,t3,t0,0101010101010101 #把寄存器t0中的值與imm16相與,結果存在寄存器t3中
操作碼 源 目的
001101 t0 t3 imm16
00110101000010110101010101010101
350b5555
預期:t3 0000 0000 0101 0101 0101 0101

(5)
sw t3,1(t3,1(t3,1(t4) #把寄存器t3中的數放進以t4中存的0為base,2為偏移的內存單元中(效果為2字,因為以字尋址)
101011 01100 01011 0000000000000010
10101101100010110000000000000010
ad8b0002

(6)
lw t5,1(t5,1(t5,1(t4) #把以t4中存的0為base,2為偏移的內存單元中的數據,存放在寄存器t5中
100011 01100 01101 0000000000000010
10001101100011010000000000000010
8d8d0002

  • 以上運行結果:
    t0: 00ff 0000
    t1: 0001 0000
    t2: 00ff 0000
    t3: 00ff 5555
    t4: 0000 0000
    t5: 00ff 5555

(7)
beq t3,t3,t3,t5,(十進制7)0000000000000111 #比較t3和t5的數據,相等就跳轉到PC+7(字)
000100 01011 01101 0000000000000111 #如果不相等,就執行下一條指令PC+1(字)
00010001011011010000000000000111
116d0007

(8)
lui $t1,0 #立即數0加載至寄存器t1高16位(把t1清零)
00111100000010010000000000000000
3c090000

(14)
lui $t0,0 #立即數0加載至寄存器t0高16位(把t0清零)
001111 00000 01000 0000000000000000
00111100000010000000000000000000
3c080000

(15)
j 8 #跳轉回到第8條指令(0,1,2,3,4,5,6,7,8)
00001000000000000000000000001001
08000008

  • 以上運行結果:
    t0: 0000 0000
    t1: 0000 0000
    t2: 00ff 0000
    t3: 00ff 5555
    t4: 0000 0000
    t5: 00ff 5555

要注意,beq是相對下一條指令尋址,j是絕對地址

全部指令

總結

以上是生活随笔為你收集整理的【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。