5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告_第1頁
5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告_第2頁
5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告_第3頁
5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告_第4頁
5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、計算機組成原理課程設(shè)計報告5級流水無cache cpu實驗1.1 實驗內(nèi)容:無cache流水cpu的分析與改造1. 理解無cache流水cpu的工作原理,明確系統(tǒng)總體結(jié)構(gòu)和數(shù)據(jù)通路圖,分析解決各種相關(guān)用到的主要信號,以及詳細分析各流水段的功能和實現(xiàn)。2. 將16位的指令系統(tǒng)改為8位,設(shè)計新的指令系統(tǒng),并修改相應(yīng)的數(shù)據(jù)通路。3. 修改規(guī)則文件(cpu.txt),并編寫測試程序驗證系統(tǒng)改造的正確性。1.2 總體基本信息1. 深刻理解無cache流水cpu的工作原理。在詳細分析了各流水段的功能實現(xiàn)、3種相關(guān)的產(chǎn)生原因和解決方法的基礎(chǔ)上,完成了以下后續(xù)工作。2. 修改指令系統(tǒng)。具體包括:a) 16位指

2、令改為8位,重新編寫了指令op碼。b) 新增了movi指令。由于原指令系統(tǒng)沒有將立即數(shù)存進指定寄存器的指令,因此此處新增一條movi指令。指令的匯編語句為movi dr, imm其中dr為目的寄存器,imm為立即數(shù)。因為指令長度為8位,op和dr共占了6位,因此imm的大小不大于3(即二進制“00”至“11”)。c) 修改及刪除了部分指令。此處詳見5.1。3. 修改系統(tǒng)控制信號。在保持原有系統(tǒng)邏輯功能基本不變的情況下,修改各個模塊里控制信號位數(shù)以及模塊接口信號位數(shù)以和新的指令系統(tǒng)兼容。4. 增加內(nèi)存模塊。使用vhdl編寫了一個ram模塊,根據(jù)讀寫信號來選擇讀寫功能。reset時將事先寫好的二進

3、制形式程序?qū)戇M內(nèi)存。5. 擴展了常量定義文件。在常量定義文件unitpack.vhd中,具體地:a) 新增了alu功能選擇信號常量alumovi。b) 新增了寄存器編號常量r0、r1、r2和r3。c) 新增了ram類型。6. 使用quartus ii進行功能仿真并debug。7. 使用bdf構(gòu)造頂層實體cpum。由于新增了內(nèi)存模塊,而原系統(tǒng)是使用vhdl編寫的,為了方便對接,我們使用bdf的形式將無cache流水線cpu和內(nèi)存模塊連接起來構(gòu)造頂層實體cpum,“m”的含義是“memory”,即帶內(nèi)存模塊的無cache流水線cpu。8. 重畫數(shù)據(jù)通路圖。我們使用了microsoft visio軟

4、件在原有的系統(tǒng)總結(jié)結(jié)構(gòu)圖的基礎(chǔ)上修改并新增了部分模塊,詳見2。2、系統(tǒng)總體結(jié)構(gòu)及數(shù)據(jù)通路圖總體結(jié)構(gòu)圖:數(shù)據(jù)通路圖:整個cpu由以下幾個模塊組成:l 取指模塊(if):給出內(nèi)存地址,讀取指令并送入指令寄存器,為下一級準(zhǔn)備數(shù)據(jù)。由于pc控制模塊處于取指模塊中,因此控制相關(guān)的檢測也置于取指模塊。l 譯碼模塊(id):讀取寄存器值和指令譯碼。我們采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數(shù)據(jù)(如立即數(shù)等),在每次時鐘上升沿到來時送入下一級。實際上,結(jié)構(gòu)相關(guān)、控制相關(guān)、數(shù)據(jù)相關(guān)的檢測都可歸入譯碼部分??紤]到“相關(guān)檢測”涉及到的信號分屬不同階段以及整體結(jié)構(gòu)的清晰性,我們將“相關(guān)檢測”獨立

5、出來。l 執(zhí)行模塊(ex):完成算術(shù)邏輯運算、計算有效地址和提供數(shù)據(jù)通道。l 訪存模塊(ma):選擇地址線的數(shù)據(jù)來源和數(shù)據(jù)線的流向。訪存和取指在功能上是獨立的,但cpu對外只有一條地址線和數(shù)據(jù)線的事實決定了訪存和取指是相互聯(lián)系的。當(dāng)執(zhí)行l(wèi)oad/store指令時,地址線由alu送入“訪存段”的值提供;取指時,則由pc提供。當(dāng)寫內(nèi)存時,cpu內(nèi)部數(shù)據(jù)送數(shù)據(jù)線;當(dāng)需要讀內(nèi)存時,cpu往數(shù)據(jù)線送高阻。l 回寫模塊(wb):選擇回寫數(shù)據(jù)源和根據(jù)寫使能信號wregen將數(shù)據(jù)回寫到寄存器堆;l hazarddetectunit模塊:檢測結(jié)構(gòu)相關(guān);l forwardingunit模塊:檢測數(shù)據(jù)相關(guān)。l 內(nèi)存

6、模塊memory,根據(jù)訪存地址mem_adr和讀寫信號wr來控制。3 解決各種相關(guān)用到的主要信號的分析3.1控制相關(guān) 控制相關(guān)是指因為程序的執(zhí)行方向可能改變而引起的相關(guān)。當(dāng)執(zhí)行跳轉(zhuǎn)指令時,就會發(fā)生這種情況。除jr外,jrz等條件跳轉(zhuǎn)需要根據(jù)當(dāng)前狀態(tài)位來決定是否跳轉(zhuǎn),而當(dāng)前狀態(tài)位是由前面最近的會影響狀態(tài)位的指令(如算術(shù)指令)決定。常規(guī)的也是比較簡單的做法是在碰到j(luò)rx之類的跳轉(zhuǎn)指令時,延遲后邊流水線的進入。但我們通過分析,認為可以一點都不必延遲,通過旁路處理把控制相關(guān)轉(zhuǎn)為數(shù)據(jù)相關(guān)來處理。這樣處理,不必延遲,可以提高流水線的性能。按我們的方式解決控制相關(guān)需要做兩項工作:1) 通過旁路,提供狀態(tài)寄存

7、器的值和臨時狀態(tài)位的值,為判斷是否跳轉(zhuǎn)作準(zhǔn)備;2) 選擇pc更新的時機1旁路處理在每條指令譯碼時,會產(chǎn)生一個信號setflag,它決定了在執(zhí)行階段是否根據(jù)alu計算結(jié)果改變狀態(tài)位。從下面的時序圖中可以發(fā)現(xiàn),只要我們在jrx指令譯碼時提供以下3個信號就可作出是否跳轉(zhuǎn)的決定:信號含義tflagalu計算出的臨時狀態(tài)位,flag狀態(tài)寄存器輸出,e_setflag狀態(tài)寄存器寫使能表17 處理控制相關(guān)信號若e_setflag要寫狀態(tài)寄存器,則說明前一條指令會影響狀態(tài)位,這時根據(jù)tflag決定是否跳轉(zhuǎn);若e_setflag要保持狀態(tài)寄存器,則說明前一條指令不會影響狀態(tài)位,這時根據(jù)flag決定是否跳轉(zhuǎn)。涉及

8、到控制相關(guān)的關(guān)鍵信號是setflag信號,產(chǎn)生于譯碼模塊,作用于執(zhí)行模塊,即identity.vhdhe exentity.vhd文件中。如下圖所示。從上圖可看出,凡是涉及到數(shù)值計算和關(guān)系運算的指令的低三位均為001,而不涉及的則為000。該信號傳到執(zhí)行模塊中用于判斷是否更新狀態(tài)寄存器。3.2 數(shù)據(jù)相關(guān)數(shù)據(jù)相關(guān)是指在執(zhí)行本條指令的過程中,如果用到的操作數(shù)是前面指令的執(zhí)行結(jié)果,則必須等待前面的指令執(zhí)行完成,并把結(jié)果寫回寄存器或主存之后,本條指令才能繼續(xù)執(zhí)行。此處采用設(shè)置專用數(shù)據(jù)通路來解決數(shù)據(jù)相關(guān)問題。但旁路技術(shù)并非一勞永逸。若前一指令為load,而后一指令和它數(shù)據(jù)相關(guān),如下圖所示,當(dāng)下一指令的執(zhí)

9、行階段需要數(shù)據(jù)時,上一指令尚未給出,這種情況是無法用旁路技術(shù)來解決的。相關(guān)的類型有三種:1.2.3.主要用到的關(guān)鍵信號是m_wregen和w_wregen,主要使用是在數(shù)據(jù)相關(guān)檢測模塊forwardingentity.vhd中,在identity.vhd、exentity.vhd、memaccessentity.vhd中均有使用。具體的使用方法如下。相關(guān)的檢測都置于“執(zhí)行階段”。信號wregen是寄存器寫使能,sa,sb是寄存器組a,b口選擇信號。信號前綴表示信號所處的階段。如e_sa表示處于執(zhí)行階段的sa。1相鄰指令數(shù)據(jù)相關(guān)的檢測 若m_wregen=1,則表示前一指令要回寫寄存器。此時,若

10、e_sa或e_sb等于m_sa,則必然數(shù)據(jù)相關(guān),這是因為我們規(guī)定,若回寫寄存器,則寄存器a口選擇信號所指定的即為目的寄存器。否則無關(guān)。2 中間隔1條指令的兩指令數(shù)據(jù)相關(guān)的檢測 若w_wregen=1,則表示第一條指令要回寫寄存器。此時,若e_sa或e_sb等于w_sa,則必然數(shù)據(jù)相關(guān)。否則無關(guān)。當(dāng)然,上述兩種情況可能會一同出現(xiàn)。這時,我們就按情況1處理。因為情況2可以理解為接連出現(xiàn)情況1。下圖為各個指令在譯碼時產(chǎn)生的wregen信號,可以發(fā)現(xiàn)凡是會寫進寄存器的指令,該信號值都為1。3.3 結(jié)構(gòu)相關(guān)由于在設(shè)計中不包含緩存,因此會有取指和訪存的沖突,即結(jié)構(gòu)相關(guān)。如下圖:關(guān)鍵信號是wrmem信號,表

11、示是否讀寫內(nèi)存。具體出現(xiàn)在結(jié)構(gòu)相關(guān)沖突檢測與問題解決模塊hazarddetectentity.vhd中,產(chǎn)生于譯碼模塊identity.vhd中。具體使用方法如下:1) 沖突檢測只有執(zhí)行訪存指令(load/store)時,才會出現(xiàn)沖突。因此,我們在譯碼時產(chǎn)生一個標(biāo)志是否訪存的信號wrmem。含義如下:wrmem意義00寫內(nèi)存(store)01讀內(nèi)存(load)1不占用內(nèi)存 表16 wmem控制信號通過檢查“訪存階段”的m_wrmem就可確定是否沖突。2)取指延后在每次取指時,若有沖突,則往ir中寫入空指令(nop),并保持pc不變,使取指延后一個節(jié)拍。4 各流水段功能和實現(xiàn)的詳細分析4.1取指

12、(if)4.1.1 實現(xiàn)功能列表取指模塊實現(xiàn)的功能是:l 給定內(nèi)存地址,讀取內(nèi)存中的指令l 將指令送入指令寄存器,提供給下一級的譯碼模塊l 實現(xiàn)控制相關(guān)沖突檢測l 根據(jù)讀取到的指令是否為跳轉(zhuǎn)指令來更新pc4.1.2輸入、輸出信號分析主要輸入信號:z,c狀態(tài)寄存器tempz,tempcalu計算出的臨時狀態(tài)位,用于相關(guān)沖突檢測e_setflag狀態(tài)寄存器寫使能端,產(chǎn)生于譯碼時。決定是否在執(zhí)行階段根據(jù)alu計算出來的結(jié)果改變狀態(tài)位pcstall決定是否保持pc不變,由結(jié)構(gòu)相關(guān)沖突檢測模塊產(chǎn)生ifflush決定是否往指令寄存器ir里寫入空指令,來自結(jié)構(gòu)相關(guān)檢測模塊outerdb內(nèi)存讀取過來的數(shù)據(jù)主要

13、輸出信號:pc_addrpc作為內(nèi)存地址輸出,用于下一節(jié)拍的取指d_pcinc1pc + 1d_ir指令寄存器輸出 4.1.3功能實現(xiàn)邏輯通過分析控制信號我們可以大概了解到取指模塊的功能實現(xiàn)邏輯是如何的。廣義上來說,取指模塊包括結(jié)構(gòu)相關(guān)沖突檢測模塊,因為pcstall信號(用來實現(xiàn)if段對pc的更新)和ifflush信號(對ir寫入空指令)就來自結(jié)構(gòu)相關(guān)沖突檢測模塊。結(jié)構(gòu)相關(guān)檢測模塊叫hazarddetectentity,其模塊圖如下:其中輸入信號的含義是:m_wrmemwrmem在訪存階段的值w_rwmemwrmem在寫回階段的值d_ir指令寄存器通過檢測訪存階段的wrmem信號即可確定是否

14、發(fā)生了結(jié)構(gòu)沖突。每次取指后,若有沖突,則往ir中寫入空指令(nop),并保持pc不變,使得取指延后一個節(jié)拍。除此之外,setflag信號在此處的作用是,決定用狀態(tài)寄存器輸出flag還是alu計算出的臨時狀態(tài)位tflag來判斷跳轉(zhuǎn)。4.2譯碼(id)4.2.1 實現(xiàn)功能列表譯碼模塊實現(xiàn)的功能是:l 讀取指令寄存器中的指令l 對指令進行譯碼,發(fā)送控制信號4.2.2輸入、輸出信號分析主要輸入信號:d_ir從取指模塊來的指令d_pcinc1從取指模塊來的pc+1w_wbdata寫回數(shù)據(jù),從寫回模塊里來w_destreg要寫回的目標(biāo)寄存器w_wregen寄存器寫使能端主要輸出信號:e_raout寄存器a

15、輸出值e_rbout寄存器b輸出值e_imm立即數(shù)輸出值e_alusrcalu輸入端選擇信號e_aluopralu運算選擇信號e_setflag狀態(tài)寄存器寫使能信號e_wrmem訪存信號e_wregen寄存器寫使能信號e_destreg目標(biāo)寄存器e_memtoreg內(nèi)存寫入寄存器使能信號4.2.3功能實現(xiàn)邏輯譯碼模塊內(nèi)部寫好了根據(jù)不同的指令發(fā)送不同的控制信號的代碼,采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數(shù)據(jù)(如立即數(shù))。在每次時鐘上升沿到來時送入下一級。實際上,結(jié)構(gòu)相關(guān)、控制相關(guān)、數(shù)據(jù)相關(guān)的檢測都可歸入譯碼部分。考慮到“相關(guān)檢測”涉及到的信號分屬不同階段以及整體結(jié)構(gòu)的清晰

16、性,作者將“相關(guān)檢測”獨立出來。4.3執(zhí)行(ex)4.3.1 實現(xiàn)功能列表執(zhí)行模塊實現(xiàn)的功能是:l 根據(jù)控制信號完成算術(shù)邏輯運算l 根據(jù)控制信號計算有效地址l 提供數(shù)據(jù)通道,將上一級傳遞過來的控制信號傳到下一級4.3.2輸入、輸出信號分析主要輸入信號:e_raout、e_rbout、e_alusrc、e_aluopr、e_setflag、e_imm、e_memtoreg、 e_wregen、來自譯碼模塊的控制信號forwarda、forwardb來自數(shù)據(jù)相關(guān)沖突檢測模塊的輸出e_aluout上一個指令在執(zhí)行模塊產(chǎn)生的輸出,作為下一條指令在執(zhí)行模塊執(zhí)行的輸入信號之一主要輸出信號: m_sa、m_

17、aluout、m_rbdata、i_tempz、i_tempc、m_flag、m_wregen、m_memtoreg、m_destreg、m_wrmem主要來自上一級模塊傳過來的控制信號4.3.3功能實現(xiàn)邏輯執(zhí)行模塊執(zhí)行的功能很簡單,和上個學(xué)期做的cpu綜合性實驗類似,主要是一些alu邏輯運算和狀態(tài)寄存器的更新操作。在這里還有向下一模塊傳遞控制信號的作用。其中,forwarda和forwardb信號是來自數(shù)據(jù)相關(guān)沖突檢測模塊的信號。 模塊圖如下所示:作用是在發(fā)生讀后寫數(shù)據(jù)相關(guān)時,直接將計算好了的結(jié)果在寫回目標(biāo)寄存器時也發(fā)往下一條指令的執(zhí)行模塊作為alu的輸入之一。4.4訪存(mem)4.4.1

18、 實現(xiàn)功能列表訪存模塊實現(xiàn)的功能是:l 根據(jù)地址線對內(nèi)存進行讀操作或者寫操作4.4.2輸入、輸出信號分析主要輸入信號:m_wrmem內(nèi)存讀寫控制信號m_aluout來自alu的輸出結(jié)果m_rbdata要寫回的數(shù)據(jù)pc程序計數(shù)器的值主要輸出信號:w_wrmem傳送到寫回模塊的內(nèi)存讀寫控制信號wr讀寫控制信號addr要讀取的內(nèi)存地址outerdb既可作為輸入又可作為輸出,用于傳輸數(shù)據(jù)4.4.3功能實現(xiàn)邏輯訪存和取指在功能上是獨立的,但是因為cpu對外只有一條地址線和數(shù)據(jù)線,因此訪存和取指在實際上是有聯(lián)系和沖突的。當(dāng)執(zhí)行l(wèi)oad/store指令時,地址線由alu送入訪存段的值提供;取指時,則由pc提

19、供。當(dāng)寫內(nèi)存時,cpu內(nèi)部數(shù)據(jù)送往數(shù)據(jù)線。當(dāng)需要讀內(nèi)存時,cpu往數(shù)據(jù)線送高阻。4.5寫回(wb)4.5.1 實現(xiàn)功能列表寫回模塊實現(xiàn)的功能是:l 選擇寫回數(shù)據(jù)源(來自alu的輸出還是來自內(nèi)存)l 根據(jù)寫使能信號wregen將數(shù)據(jù)寫回到寄存器組4.5.2輸入、輸出信號分析主要輸入信號: s_w_aluoutalu的輸出 s_w_memout內(nèi)存讀取的輸出 s_w_memtoreg決定寫入寄存器的數(shù)據(jù)來源 s_w_flag要寫進狀態(tài)寄存器的值4.5.3功能實現(xiàn)邏輯此部分較為簡單,即通過s_w_memtoreg信號來決定是將alu的輸出寫進寄存器還是將從內(nèi)存讀出來的數(shù)據(jù)寫進寄存器。模塊圖如下:5

20、系統(tǒng)改造5.1新的指令系統(tǒng)匯編語句操作碼功能描述指令類型add dr,sr0000dr+srdr算術(shù)邏輯指令sub dr,sr0001dr-srdrcmp dr,sr0010dr-sr 比較and dr,sr0011dr and srdr 邏輯與or dr,sr0100dr or srdr 邏輯或xor dr,sr0101dr xor sr dr 異或shl dr0110邏輯左移,最低位補0,最高位移入cshr dr 0111邏輯右移,最高位補0,最低位移入cmovi dr,imm1000imm(立即數(shù))dr,存立即數(shù)進寄存器數(shù)據(jù)傳送指令mov dr,sr1001sr drload dr,sr

21、1010sr drstore dr,sr1011 sr drjr adr1100無條件跳轉(zhuǎn)到adr , adr=原pc值+offset控制轉(zhuǎn)移指令jrc adr1101當(dāng)c=1時,跳轉(zhuǎn)到adr, adr=原pc值+offsetjrz adr1110當(dāng)z=1時,跳轉(zhuǎn)到adr, adr=原pc值+offsetnop1111空操作其他5.1.1選擇改動說明包括nop空操作指令在內(nèi)指令系統(tǒng)共包括16條指令,在原有的25條指令的基礎(chǔ)上刪除了10條,新增了1條。具體地,刪除了dec,inc,test,sar,push,pop,jrnc,jrnz,loadh,loadl,新增了一條數(shù)據(jù)傳送指令movi。5.

22、2修改的代碼及說明1)代碼段1,新增內(nèi)存模塊memory.vhd-內(nèi)存-2015-10-30library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.unitpack.all;entity memory isport ( databus : inout std_logic_vector(7 downto 0);-數(shù)據(jù)總線addr : in std_logic_vector(7 downto 0);-訪存地址wr : in std_logic;-讀寫控制信號reset: in std_log

23、ic);end memory;architecture rtl of memory issignal ram:ram_type;-ram_type在unitpack.vhd文件里定義beginprocess(addr,wr,ram,databus,reset) beginif reset=0 thenram(0) = movi & r0 & 11;-此處將程序?qū)戇M內(nèi)存中,省略ram(15) = jr & 1110;end if;-讀寫功能的實現(xiàn)if wr=0 thendatabus = z8;ram(conv_integer(addr) = databus;end if; if wr=1 th

24、en databus = ram(conv_integer(addr);end if;end process; end rtl;內(nèi)存模塊使用vhdl編寫,內(nèi)存由ram組成,讀出數(shù)據(jù)線和寫入數(shù)據(jù)線為同一條數(shù)據(jù)總線,因此不能同時進行讀寫。因為這樣所以會產(chǎn)生結(jié)構(gòu)相關(guān),即在取指的時候不可以訪存,否則會產(chǎn)生沖突。內(nèi)存讀寫功能由wr信號進行控制,當(dāng)wr為0時執(zhí)行寫功能,當(dāng)wr為1時執(zhí)行讀功能。2) 代碼段2,取指模塊ifentity.vhdop = ir(7 downto 4);-操作碼取指令的高4位-控制相關(guān)信號e_setflag,用于選擇當(dāng)狀態(tài)寄存器的值來源with e_setflag select

25、zz = zwhen flag_hold, tempz when others;with e_setflag select cc = cwhen flag_hold,-由于跳轉(zhuǎn)信號中只保留了jr、jrc、jrz,因此此處只判斷該3個ops_selz = 1 when( op=jrz and zz=1) -判斷是否跳轉(zhuǎn) or op=jr else 0; s_selc = 1 when( op=jrc and cc=1) -判斷是否跳轉(zhuǎn) else 0; pcincsel = 1 when s_selz=1 or s_selc=1 else 0; s_pcinc1 = pc + x01;-此處修改了

26、pc位數(shù) with pcincsel select-當(dāng)有跳轉(zhuǎn)時pc = pc + offset,否則pc = pc + pcnext = s_pcinc1 when 0, pcplusoffset when 1, s_pcinc1 when others; process(reset,clk,pcstall)beginif reset = 0 thenpc = x00;-此處修改了pc位數(shù) elsif falling_edge(clk) and (pcstall=0) then pc aluresult := opr + ops; tempv := (not opr(7)and(not ops

27、(7)and aluresult(7) or (opr(7)and ops(7)and (not aluresult(7); when alusub = aluresult := opr - ops; tempv := ( ops(7)and(not opr(7)and (not aluresult(7) or (not ops(7)and opr(7)and aluresult(7); when aluand = aluresult := opr and ops;when aluor = aluresult := opr or ops;when aluxor = aluresult := o

28、pr xor ops;when alushl = aluresult(7 downto 1) := opr(6 downto 0); aluresult(0) := 0;cx := opr(7);when alushr = aluresult(6 downto 0) := opr(7 downto 1); aluresult(7) := 0;cx := opr(0); -增加了alumovi的alu功能選擇信號及其處理實現(xiàn)when alumovi = aluresult := 00000&ops(3 downto 0);when others = null;end case; 修改了alu選擇

29、信號以及alu功能信號的判斷邏輯,以及狀態(tài)寄存器的判斷邏輯,之所以修改是因為位數(shù)的修改。除此以外還增加了alumovi的alu功能信號及其對應(yīng)的邏輯功能實現(xiàn)。1) 代碼段1,譯碼模塊identity.vhd新增了的writeback:process(reset,clk) -寫回模塊begin if reset=0 then-新增了初始化寄存器一步 regarray(0) = x00; regarray(1) = x00; regarray(2) = x00; regarray(3) = x00;elsif falling_edge(clk) and w_wregen=1 thenregarra

30、y(wregindex) ctrl:=d_ir(3 downto 0)&10&1&1&001&0000&001;when subb = ctrl:=d_ir(3 downto 0)&10&1&1&001&0001&001;when andins = ctrl:=d_ir(3 downto 0)&10&1&1&001&0010&001;when cmp = ctrl:=d_ir(3 downto 0)&10&0&1&001&0001&001;-新增了movi指令及其譯碼出來的控制信號when movi = ctrl:=d_ir(3 downto 0)&10&1&1&101&1010&000; i

31、mm ctrl:=d_ir(3 downto 0)&10&1&1&001&0011&001;when xorins= ctrl:=d_ir(3 downto 0)&10&1&1&001&0100&001;when shlins = ctrl:=d_ir(3 downto 0)&10&1&1&000&0101&001;when shrins = ctrl:=d_ir(3 downto 0)&10&1&1&000&0110&001;when mov = ctrl:=d_ir(3 downto 0)&10&1&1&011&0000&000;when load = ctrl:=d_ir(3 downt

32、o 0)&01&1&0&011&0000&000;when store= ctrl:=d_ir(3 downto 0)&00&0&1&000&0000&000;when jr|jrz|jrc = ctrl:=donothing; -若是jr*指令,計算offset,并向exe插入bubble offset ctrl:=donothing; end case;譯碼模塊主要修改了控制信號ctrl的位數(shù),并根據(jù)“sa, sb, wrmem, wregen, memtoreg, alusrc, aluopr, setflag”的順序增加了movi指令的控制信號,如下所示:when movi = ctr

33、l:=d_ir(3 downto 0)&10&1&1&101&1010&000; imm = 000000&d_ir(1 downto 0);最后還增加了寄存器的初始化。6 測試與總結(jié)6.1 規(guī)則文件(cpu.txt的內(nèi)容)6.2測試代碼-程序1-指令正確性測試- r0r1r2r3ram(0) = movi & r0 & 11;- 3000ram(1) = add & r0 & 01;- 4000ram(2) = mov & r1 & r0;- 4400ram(3) = subb & r1 & 11;- 4100ram(4) = subb & r2 & 10;- 41-20ram(5) = add & r2 & 11;- 4110ram(6) = orins & r1 & r0;- 4410ram(7) = andins & r1 & r2;- 4110ram(8) = xorins & r0 & r1;- 5110ram(9) = shlins & r1 & 00;- 5210;ram(10) = shrins & r0 & 00;-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論