国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

RISC-CPU五級(jí)流水線設(shè)計(jì)

2022-01-09 17:14 作者:ZTY巉巖之劍  | 我要投稿

一、概論

基于《verilog數(shù)字系統(tǒng)設(shè)計(jì)教程》及五級(jí)流水線CPU架構(gòu)參考代碼,設(shè)計(jì)出用于實(shí)現(xiàn)整數(shù)運(yùn)算的五級(jí)流水CPU。通過前期研究、中期撰寫及后期仿真測(cè)試,進(jìn)行整體CPU架構(gòu)設(shè)計(jì)和數(shù)的運(yùn)算實(shí)現(xiàn)。

該設(shè)計(jì)主要有以下創(chuàng)新:首先,通過對(duì)教材《verilog數(shù)字系統(tǒng)設(shè)計(jì)教程》(第四版)中單周期CPU進(jìn)行改進(jìn),自行設(shè)計(jì)出可以大幅度提高運(yùn)算速度的五級(jí)流水線架構(gòu)的高性能CPU。通過分析各模塊的具體功能,探究出流水線中沖突的解決方案。其次,對(duì)于整數(shù)的運(yùn)算,在加減法的基礎(chǔ)上設(shè)計(jì)出乘法的指令編碼,并進(jìn)行仿真測(cè)試。最后,通過CPU與外設(shè)的組合連接,實(shí)現(xiàn)用七段數(shù)碼管顯示操作數(shù)及結(jié)果的相關(guān)功能,通過開發(fā)板上的開關(guān)控制操作數(shù)中的每一位數(shù)字,實(shí)現(xiàn)數(shù)據(jù)的順序輸入。

?

CPU外圍架構(gòu)

CPU內(nèi)部架構(gòu)

二、五級(jí)流水CPU架構(gòu)設(shè)計(jì)

(1)整體架構(gòu)設(shè)計(jì)

CPU的整體架構(gòu)如圖所示,按照五級(jí)流水線的標(biāo)準(zhǔn)結(jié)構(gòu),完成取址、譯碼、執(zhí)行、訪問和寫回的五個(gè)步驟。通過每一模塊的分工協(xié)作,以及沖突等待等關(guān)鍵步驟,完成流水線工作模式的整數(shù)加減乘法運(yùn)算。值得注意的是,CPU整體架構(gòu)采用的是“時(shí)序—組合—時(shí)序”的思想,在實(shí)現(xiàn)功能的組合電路兩端加上用于寄存數(shù)據(jù)的時(shí)序電路完成數(shù)據(jù)的保存以及時(shí)鐘信號(hào)控制下的輸入輸出同步。

l?取址

取址部分主要由ins_sel、ins_rn、rom核以及if_id_ir四個(gè)模塊組成,通過接受外界加減乘及jump,skz等指令按需讀取rom核中所在地址的指令編碼,該指令編碼可以完成加減乘的每一個(gè)步驟,并可以傳遞給后續(xù)的指令譯碼部分,完成后續(xù)的流水線工作。

??Ins_sel模塊:

Ins_sel模塊是時(shí)序電路,共有四個(gè)輸入,其中opr_ini控制加減乘的運(yùn)算信號(hào),告訴CPU目前執(zhí)行的是什么操作,并將該操作的起始地址通過輸出端口data_ins_addr給到Ins_rn模塊,為后續(xù)調(diào)用rom核做好準(zhǔn)備。此外,當(dāng)rom核讀到j(luò)ump指令時(shí),會(huì)通過輸入端口給到j(luò)ump信號(hào)以及jump所要跳轉(zhuǎn)的地址,通過輸出進(jìn)行后續(xù)跳轉(zhuǎn)操作。

??Ins_rn模塊:

Ins_rn模塊是時(shí)序電路,通過接受Ins_sel模塊的相關(guān)運(yùn)算的起始地址以及跳轉(zhuǎn)信號(hào),傳遞到后續(xù)的rom核當(dāng)中,與Ins_sel不同的是Ins_rn模塊有wait信號(hào),用于解決運(yùn)算過程中步驟沖突的問題,當(dāng)wait信號(hào)來(lái)臨時(shí),該模塊不工作,等待一個(gè)周期。wait信號(hào)是一個(gè)全局控制信號(hào),在之后的譯碼、操作、訪問及寫回步驟中也會(huì)涉及。

??Rom模塊:

Rom模塊是組合電路,主要實(shí)現(xiàn)的功能是在不同的地址中存放不同的指令編碼,指令編碼共十六位,由四位操作編碼和十二位地址組成。其中操作編碼表示該步驟執(zhí)行什么功能,比如加載(LDA)、相加(ADD)、停機(jī)(HLT)等主要功能。十二位地址與操作編碼一一對(duì)應(yīng),有時(shí)指代的是Ram核中存放數(shù)據(jù)的地址,有時(shí)則指代通用寄存器中寄存器的地址。所有操作編碼構(gòu)成指令集,指令集展示將在之后的內(nèi)容提到。

Rom模塊主要實(shí)現(xiàn)的是儲(chǔ)存功能,在一開始撰寫Rom模塊的代碼時(shí),發(fā)現(xiàn)如何在Rom核中初始化數(shù)據(jù)是一個(gè)很棘手的問題,如果用Initial語(yǔ)句進(jìn)行初始化賦值,則綜合后無(wú)法實(shí)行正常功能。通過思考與創(chuàng)新,總結(jié)出了如下思路:可以通過case語(yǔ)句來(lái)實(shí)現(xiàn)上述功能,case語(yǔ)句后表示的是Rom核中的各個(gè)地址,當(dāng)輸入端輸送進(jìn)來(lái)地址后,直接通過case語(yǔ)句選擇相應(yīng)的賦值操作,賦給輸出端口memory,實(shí)現(xiàn)選通相應(yīng)地址下的數(shù)據(jù)輸出。

??if_id_ir模塊:

??If_id_ir模塊的主要功能是作為時(shí)序電路保存組合電路Rom中給出的十六位指令編碼,并在下一個(gè)時(shí)鐘周期給到譯碼模塊進(jìn)行譯碼操作。同時(shí),該模塊也受wait信號(hào)控制,通過wait信號(hào)實(shí)現(xiàn)停止一個(gè)周期的操作,也就是空一格時(shí)鐘周期后再把指令編碼給到之后的譯碼模塊。

l?譯碼

??Ins_decode模塊

ins_decode模塊通過解析指令編碼,產(chǎn)生對(duì)應(yīng)的信號(hào),控制后續(xù)模塊完成相應(yīng)的執(zhí)行,訪問和寫回的操作。

??Id_ex_ir模塊與ex_mem_ir模塊

由于執(zhí)行,訪問和寫回需要三個(gè)周期才能完成,因此id_ex_ir模塊以及ex_mem_ir模塊用于暫時(shí)保存Ins_decode中還沒有用到的信號(hào)。

l?執(zhí)行

??alu模塊

alu模塊用于實(shí)現(xiàn)各種運(yùn)算,屬于組合電路,部分運(yùn)算只涉及一個(gè)操作數(shù),由通用寄存器的regb給出,如果涉及到兩個(gè)操作數(shù),則是由通用寄存器的rega和regb共同給出。

??regwait模塊

regwait模塊是時(shí)序電路,用于保存alu模塊的運(yùn)算結(jié)果,在下一個(gè)時(shí)鐘周期到來(lái)時(shí)寫回到相應(yīng)的通用寄存器中。

l?訪存與寫回

??通用寄存器模塊

通用寄存器模塊分為四個(gè)部分rega、regb、regc和regd,屬于時(shí)序電路。訪問時(shí)在時(shí)鐘上升沿讀數(shù)據(jù),寫回時(shí)在時(shí)鐘下降沿寫入數(shù)據(jù),受wait信號(hào)控制。其中加法、減法和乘法都用到rega和regb模塊,分別加載兩個(gè)操作數(shù)以及通過regb保存最后結(jié)果寫回到ram核里。此外,乘法還用到了regc和regd分別存放部分積和移位之后的乘數(shù),完成乘法運(yùn)算。

??Memory_access模塊

memory_access模塊用于保存訪存取出的數(shù)據(jù),為寫回操作做好準(zhǔn)備。

??ram模塊

ram模塊用于輸入要運(yùn)算的操作數(shù)進(jìn)行存儲(chǔ),并寫回最終的運(yùn)算結(jié)果,在七段數(shù)碼管上輸出,是連接CPU與外設(shè)的橋梁,屬于時(shí)序電路。

l?沖突等待模塊wait

沖突等待模塊wait用于解決取址、譯碼、執(zhí)行、訪問和寫回步驟中的沖突問題,與各個(gè)時(shí)序電路相連,起到控制作用。當(dāng)wait信號(hào)來(lái)臨時(shí),所控制的時(shí)序電路暫停工作一個(gè)時(shí)鐘周期,等到下一個(gè)時(shí)鐘周期時(shí)將信號(hào)輸出。通過控制取址部分的Ins_rn模塊、if_id_ir指令編碼寄存器模塊、id_ex_ir和ex_mem_ir譯碼信號(hào)寄存器模塊來(lái)解決沖突問題。同時(shí)在wait模塊中還解決了skz判斷指令的問題。wait模塊與reg_wait模塊相連,當(dāng)skz信號(hào)輸入時(shí),通過判斷reg_wait中的數(shù)據(jù)值來(lái)進(jìn)行下一步操作,如果為0,則讓if_id_ir暫停工作一個(gè)周期,由于rom核里的指令編碼一直在讀出,而在該周期if_id_ir暫停工作,無(wú)法接收rom核的指令編碼,等到下一周期時(shí),if_id_ir正常工作,接收rom核的下一條指令編碼,完成跳過一條語(yǔ)句的步驟。

(2)擴(kuò)展指令集概覽

CPU擴(kuò)展指令集概覽

?指令集通過一定擴(kuò)展,可由四位操作編碼4b0000到4b1110組成,構(gòu)成了整數(shù)加減乘運(yùn)算的基本指令集。其中乘法運(yùn)算比較復(fù)雜,需要用到skz,jump等高級(jí)指令,進(jìn)行循環(huán)操作和條件判斷。對(duì)于加法和減法來(lái)說,需要進(jìn)行基本的操作,通過xorc與“1”異或來(lái)實(shí)現(xiàn)取反的操作,通過add來(lái)實(shí)現(xiàn)相加的操作。

(3)沖突解決方式

如圖所示,如果不加wait,當(dāng)上一個(gè)步驟的數(shù)據(jù)還沒有寫回時(shí),下一步驟新的運(yùn)算就開始執(zhí)行,而下一步的運(yùn)算要用到上次運(yùn)算的結(jié)果,因此需要延遲一個(gè)時(shí)鐘周期的時(shí)間,等數(shù)據(jù)寫回完成后再執(zhí)行下一步的操作。對(duì)于訪存和寫回則沒有此問題,通過上升沿訪問和下降沿寫回可以有效避免沖突。

加法計(jì)算步驟
減法計(jì)算步驟

三、整數(shù)運(yùn)算實(shí)現(xiàn)

????分析整數(shù)運(yùn)算的實(shí)現(xiàn),離不開對(duì)CPU外圍結(jié)構(gòu)的具體分析。總的來(lái)說,CPU的外圍部分主要有以下幾個(gè)。分別是輸入模塊Inp、二進(jìn)制轉(zhuǎn)BCD模塊、七段數(shù)碼管模塊和分頻電路模塊。其中,輸入模塊Inp實(shí)現(xiàn)了數(shù)據(jù)的十進(jìn)制輸入,BCD轉(zhuǎn)二進(jìn)制的主要功能。

l?Inp模塊

Inp模塊主要實(shí)現(xiàn)以下功能:數(shù)據(jù)的十進(jìn)制輸入、BCD轉(zhuǎn)二進(jìn)制以及與CPU模塊的連接。從輸入輸出端口模塊可以看出,button,switch,num_sel,count,rst以及num端口都需要依靠開發(fā)板進(jìn)行實(shí)現(xiàn)。輸出的相關(guān)信號(hào)傳遞給CPU,完成相關(guān)的操作。理解Inp的主要功能首先要查看開發(fā)板的示意圖。

首先,將數(shù)據(jù)選擇端置0,通過位選模塊和數(shù)據(jù)輸入模塊進(jìn)行第一個(gè)整數(shù)的輸入。當(dāng)輸完第一個(gè)數(shù)時(shí),按下對(duì)應(yīng)的按鈕告知CPU目前執(zhí)行什么運(yùn)算。其次,將數(shù)據(jù)選擇端置1,再次通過位選模塊和數(shù)據(jù)輸入模塊完成第二個(gè)整數(shù)的輸入。最后,通過數(shù)據(jù)CPU控制模塊完成CPU數(shù)據(jù)輸入以及運(yùn)算,最終結(jié)果將在七段數(shù)碼管上顯示。值得注意的是,在減法操作中,數(shù)據(jù)選擇端為0時(shí)輸入的是減數(shù),數(shù)據(jù)選擇端為1時(shí)輸入的是被減數(shù)。

開發(fā)板交互示意圖
開發(fā)板使用說明



l?Bin2bcd模塊

Bin2bcd模塊是較為關(guān)鍵的模塊,由于CPU的數(shù)據(jù)是二進(jìn)制的,而七段數(shù)碼管上需要用BCD碼來(lái)進(jìn)行顯示,因此需要進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換的思路如圖十九所示:實(shí)現(xiàn)通過表格劃分?jǐn)?shù)據(jù)的個(gè)位、十位和百位。逐步右移二進(jìn)制數(shù)據(jù),每當(dāng)一個(gè)單元的數(shù)據(jù)大于等于5時(shí),給此數(shù)加3,繼續(xù)右移,直至右移結(jié)束,完成二進(jìn)制向BCD碼的轉(zhuǎn)換。

l?七段數(shù)碼管及分頻電路模塊

????七段數(shù)碼管通過動(dòng)態(tài)掃描的方法進(jìn)行四位不同數(shù)字的顯示,在顯示過程中需要考慮數(shù)據(jù)沖突的問題,比如什么時(shí)候顯示輸入的兩個(gè)操作數(shù),什么時(shí)候顯示最后的運(yùn)算結(jié)果,這些問題可以通過Inp模塊的CPU控制模塊進(jìn)行解決,當(dāng)開始CPU運(yùn)算時(shí),數(shù)碼管顯示的是最后的運(yùn)算結(jié)果,當(dāng)CPU未進(jìn)行運(yùn)算時(shí),數(shù)碼管顯示的是輸入的兩個(gè)操作數(shù)。

分頻電路主要有兩個(gè)部分,第一個(gè)分頻電路決定CPU的運(yùn)算速度,大約在3kHz左右。第二個(gè)分頻電路決定七段數(shù)碼管的動(dòng)態(tài)掃描,進(jìn)行位選的功能。

四、實(shí)驗(yàn)心得

(1)?在寫五級(jí)流水線CPU內(nèi)部代碼時(shí),對(duì)于端口名的命名是極為重要的,端口名的模糊定義將給頂層模塊的連接帶來(lái)很大的困擾。采用的命名方式如下,以參數(shù)寄存器的端口命名方式為例。主要分為以下三個(gè)部分:<執(zhí)行的步驟><作用的對(duì)象><當(dāng)前的模塊>。以ctl_mem_rega_ex_ir_in為例,首先從ctl_mem可以看出,這個(gè)信號(hào)控制的是訪問的步驟,作用對(duì)象是rega,當(dāng)前是id_ex_ir模塊的輸入端口。通過此命名方式,可以明確每個(gè)端口的具體含義,在后續(xù)模塊連接時(shí)不會(huì)混淆。

(2)?在編寫rom核的過程中,可以適當(dāng)?shù)卦诩訙p乘運(yùn)算步驟所指的地址中間間隔幾條地址。如果不在每個(gè)運(yùn)算步驟之間間隔幾條地址,當(dāng)添加或刪去一個(gè)操作步驟時(shí),后續(xù)的地址編碼都要重新排序,耗時(shí)耗力。通過此方法,可以節(jié)約編寫代碼的時(shí)間成本。

(3)?一定要明確數(shù)據(jù)是以什么進(jìn)制進(jìn)行顯示。比如在一開始驗(yàn)證加法步驟時(shí),輸入的兩個(gè)數(shù)是0008和0009,輸出的結(jié)果是0011,一開始認(rèn)為是CPU內(nèi)部的代碼問題導(dǎo)致,最后發(fā)現(xiàn),vivado自帶的默認(rèn)仿真界面所有的數(shù)據(jù)是以十六進(jìn)制進(jìn)行顯示。0011是十六進(jìn)制的表示方式,其十進(jìn)制表示數(shù)據(jù)為0017,符合加法運(yùn)算原理:8+9=17.因此,明確數(shù)據(jù)的顯示形式可以有效避免一些不必要的麻煩。

(4)?在開始寫代碼之前,畫好五級(jí)流水CPU的架構(gòu)圖是有必要的。CPU架構(gòu)圖可以直觀清晰地表明每一個(gè)模塊的連接方式和實(shí)現(xiàn)功能。不會(huì)出現(xiàn)漏寫模塊的情況。同時(shí),CPU架構(gòu)圖有利于在debug過程中尋找問題,通過CPU架構(gòu)圖可以進(jìn)行大致的運(yùn)算模擬,逐步縮小問題出現(xiàn)的范圍,最終找到出現(xiàn)bug的模塊。

五、總結(jié)

?通過對(duì)教材《verilog數(shù)字系統(tǒng)設(shè)計(jì)教程》(第四版)中單周期CPU進(jìn)行改進(jìn),自行設(shè)計(jì)出可以大幅度提高運(yùn)算速度的五級(jí)流水線架構(gòu)的高性能CPU。通過分析各模塊的具體功能,探究出流水線中沖突的解決方案。對(duì)于整數(shù)的運(yùn)算,在加減法的基礎(chǔ)上設(shè)計(jì)出乘法的指令編碼,并進(jìn)行仿真測(cè)試。通過CPU與外設(shè)的組合連接,實(shí)現(xiàn)用七段數(shù)碼管顯示操作數(shù)及結(jié)果的相關(guān)功能,通過開發(fā)板上的開關(guān)控制操作數(shù)中的每一位數(shù)字,實(shí)現(xiàn)數(shù)據(jù)的順序輸入。在CPU的設(shè)計(jì)過程中,不僅豐富了自我的專業(yè)知識(shí),更學(xué)會(huì)了“工程化”的思考模式,掌握了解決沖突的能力,為后續(xù)更加專業(yè)化的設(shè)計(jì)奠定基礎(chǔ)。



RISC-CPU五級(jí)流水線設(shè)計(jì)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
闵行区| 延安市| 吴桥县| 湖北省| 金溪县| 银川市| 平阴县| 岑巩县| 新源县| 合山市| 金溪县| 城固县| 通许县| 青河县| 奉新县| 土默特右旗| 吐鲁番市| 湾仔区| 赤峰市| 准格尔旗| 三明市| 光泽县| 铁岭市| 汉川市| 德兴市| 文成县| 花莲市| 左云县| 于都县| 高邮市| 桓台县| 崇阳县| 克东县| 砀山县| 河西区| 阆中市| 山东省| 封开县| 东丽区| 神池县| 南雄市|