5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告
《5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告》由會員分享,可在線閱讀,更多相關(guān)《5級流水無cache cpu實驗計算機組成原理 課程設(shè)計報告(26頁珍藏版)》請在裝配圖網(wǎ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、 2. 修改指令系統(tǒng)。具體包括: a) 16位指令改為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
3、編寫了一個ram模塊,根據(jù)讀寫信號來選擇讀寫功能。reset時將事先寫好的二進制形式程序?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”,即
4、帶內(nèi)存模塊的無cache流水線cpu。 8. 重畫數(shù)據(jù)通路圖。我們使用了Microsoft Visio軟件在原有的系統(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)存地址,讀取指令并送入指令寄存器,為下一級準備數(shù)據(jù)。 由于PC控制模塊處于取指模塊中,因此控制相關(guān)的檢測也置于取指模塊。 l 譯碼模塊(ID):讀取寄存器值和指令譯碼。我們采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數(shù)據(jù)(如立即數(shù)等),在每次時鐘上升沿到來時送入
5、下一級。實際上,結(jié)構(gòu)相關(guān)、控制相關(guān)、數(shù)據(jù)相關(guān)的檢測都可歸入譯碼部分??紤]到“相關(guān)檢測”涉及到的信號分屬不同階段以及整體結(jié)構(gòu)的清晰性,我們將“相關(guān)檢測”獨立出來。 l 執(zhí)行模塊(Ex):完成算術(shù)邏輯運算、計算有效地址和提供數(shù)據(jù)通道。 l 訪存模塊(Ma):選擇地址線的數(shù)據(jù)來源和數(shù)據(jù)線的流向。訪存和取指在功能上是獨立的,但CPU對外只有一條地址線和數(shù)據(jù)線的事實決定了訪存和取指是相互聯(lián)系的。當執(zhí)行LOAD/STORE指令時,地址線由ALU送入“訪存段”的值提供;取指時,則由PC提供。當寫內(nèi)存時,CPU內(nèi)部數(shù)據(jù)送數(shù)據(jù)線;當需要讀內(nèi)存時,CPU往數(shù)據(jù)線送高阻。 l 回寫模塊(Wb):選擇回寫數(shù)據(jù)源
6、和根據(jù)寫使能信號wRegEn將數(shù)據(jù)回寫到寄存器堆; l HazardDetectUnit模塊:檢測結(jié)構(gòu)相關(guān); l ForwardingUnit模塊:檢測數(shù)據(jù)相關(guān)。 l 內(nèi)存模塊memory,根據(jù)訪存地址mem_adr和讀寫信號wr來控制。 3 解決各種相關(guān)用到的主要信號的分析 3.1控制相關(guān) 控制相關(guān)是指因為程序的執(zhí)行方向可能改變而引起的相關(guān)。當執(zhí)行跳轉(zhuǎn)指令時,就會發(fā)生這種情況。除JR外,JRZ等條件跳轉(zhuǎn)需要根據(jù)當前狀態(tài)位來決定是否跳轉(zhuǎn),而當前狀態(tài)位是由前面最近的會影響狀態(tài)位的指令(如算術(shù)指令)決定。常規(guī)的也是比較簡單的做法是在碰到JRX之類的跳轉(zhuǎn)指令時,延遲后邊流水線的進入
7、。但我們通過分析,認為可以一點都不必延遲,通過旁路處理把控制相關(guān)轉(zhuǎn)為數(shù)據(jù)相關(guān)來處理。這樣處理,不必延遲,可以提高流水線的性能。按我們的方式解決控制相關(guān)需要做兩項工作: 1) 通過旁路,提供狀態(tài)寄存器的值和臨時狀態(tài)位的值,為判斷是否跳轉(zhuǎn)作準備; 2) 選擇PC更新的時機 1.旁路處理 在每條指令譯碼時,會產(chǎn)生一個信號setFlag,它決定了在執(zhí)行階段是否根據(jù)ALU計算結(jié)果改變狀態(tài)位。從下面的時序圖中可以發(fā)現(xiàn),只要我們在JRX指令譯碼時提供以下3個信號就可作出是否跳轉(zhuǎn)的決定: 信號 含義 tFlag ALU計算出的臨時狀態(tài)位, Flag 狀態(tài)寄存器輸出, e_setFlag
8、 狀態(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)。 涉及到控制相關(guān)的關(guān)鍵信號是setFlag信號,產(chǎn)生于譯碼模塊,作用于執(zhí)行模塊,即identity.vhdhe exentity.vhd文件中。如下圖所示。 從上圖可看出,凡是涉及到數(shù)值計算和關(guān)系運算的指令的低三位均為001,而不涉及的則為000。該信號傳到執(zhí)行模塊中用于判斷是否更
9、新狀態(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),如下圖所示,當下一指令的執(zhí)行階段需要數(shù)據(jù)時,上一指令尚未給出,這種情況是無法用旁路技術(shù)來解決的。 相關(guān)的類型有三種: 1. 2. 3. 主要用到的關(guān)鍵信號是m_wRegEn和w_wRegEn,主要使用是在數(shù)據(jù)相關(guān)檢測模塊forwardin
10、gentity.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’,則表示前一指令要回寫寄存器。此時,若e_SA或e_SB等于m_SA,則必然數(shù)據(jù)相關(guān),這是因為我們規(guī)定,若回寫寄存器,則寄存器A口選擇信號所指定的即為目的寄存器。否則無關(guān)。 2. 中間隔1條指令的兩指令數(shù)據(jù)相關(guān)的檢測
11、 若w_wRegEn=’1’,則表示第一條指令要回寫寄存器。此時,若e_SA或e_SB等于w_SA,則必然數(shù)據(jù)相關(guān)。否則無關(guān)。 當然,上述兩種情況可能會一同出現(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信號,表示是否讀寫內(nèi)存。具體出現(xiàn)在結(jié)構(gòu)相關(guān)沖突檢測與問題解決模塊Hazarddetectent
12、ity.vhd中,產(chǎn)生于譯碼模塊identity.vhd中。具體使用方法如下: 1) 沖突檢測 只有執(zhí)行訪存指令(LOAD/STORE)時,才會出現(xiàn)沖突。因此,我們在譯碼時產(chǎn)生一個標志是否訪存的信號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取
13、指(IF) 4.1.1 實現(xiàn)功能列表 取指模塊實現(xiàn)的功能是: l 給定內(nèi)存地址,讀取內(nèi)存中的指令 l 將指令送入指令寄存器,提供給下一級的譯碼模塊 l 實現(xiàn)控制相關(guān)沖突檢測 l 根據(jù)讀取到的指令是否為跳轉(zhuǎn)指令來更新PC 4.1.2輸入、輸出信號分析 主要輸入信號: Z,C 狀態(tài)寄存器 tempZ,tempC ALU計算出的臨時狀態(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 決定是否往指
14、令寄存器IR里寫入空指令,來自結(jié)構(gòu)相關(guān)檢測模塊 OuterDB 內(nèi)存讀取過來的數(shù)據(jù) 主要輸出信號: PC_addr PC作為內(nèi)存地址輸出,用于下一節(jié)拍的取指 d_PCInc1 PC + 1 d_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,其模塊圖如下:
15、 其中輸入信號的含義是: m_wrMem wrMem在訪存階段的值 w_rwMem wrMem在寫回階段的值 d_IR 指令寄存器 通過檢測訪存階段的wrMem信號即可確定是否發(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ā)送控制信號
16、 4.2.2輸入、輸出信號分析 主要輸入信號: d_IR 從取指模塊來的指令 d_PCInc1 從取指模塊來的pc+1 w_wbData 寫回數(shù)據(jù),從寫回模塊里來 w_destReg 要寫回的目標寄存器 w_wRegEn 寄存器寫使能端 主要輸出信號: e_RAOut 寄存器A輸出值 e_RBOut 寄存器B輸出值 e_IMM 立即數(shù)輸出值 e_ALUSrc ALU輸入端選擇信號 e_ALUOpr ALU運算選擇信號 e_SetFlag 狀態(tài)寄存器寫使能信號 e_wrMem 訪存信號 e_wRegEn 寄存器寫使能信號
17、 e_destReg 目標寄存器 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)的清晰性,作者將“相關(guān)檢測”獨立出來。 4.3執(zhí)行(EX) 4.3.1 實現(xiàn)功能列表 執(zhí)行模塊實現(xiàn)的功能是: l 根據(jù)控制信號完成算術(shù)邏輯運算 l 根據(jù)控制信號計算有效地址 l 提
18、供數(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_ALUOut、m_RBdata、i_tempZ、i_tempC、m_flag、m_wRegEn、m_memT
19、oReg、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é)果在寫回目標寄存器時也發(fā)往下一條指令的執(zhí)行模塊作為ALU的輸入之一。 4.4訪存(MEM) 4.4.1 實現(xiàn)功能列表 訪存模塊實現(xiàn)的功能是: l 根據(jù)地址線對
20、內(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)系和沖突的。當執(zhí)行Load/Store指令時
21、,地址線由ALU送入訪存段的值提供;取指時,則由PC提供。當寫內(nèi)存時,CPU內(nèi)部數(shù)據(jù)送往數(shù)據(jù)線。當需要讀內(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_ALUOut ALU的輸出 s_w_MemOut 內(nèi)存讀取的輸出 s_w_memToReg 決定寫入寄存器的數(shù)據(jù)來源 s_w_flag 要寫進狀態(tài)寄存器的值 4.5.3功能實現(xiàn)邏輯 此部
22、分較為簡單,即通過s_w_memToReg信號來決定是將ALU的輸出寫進寄存器還是將從內(nèi)存讀出來的數(shù)據(jù)寫進寄存器。 模塊圖如下: 5 系統(tǒng)改造 5.1新的指令系統(tǒng) 匯編語句 操作碼 功能描述 指令類型 ADD DR,SR 0000 DR+SRDR 算術(shù)邏輯指令 SUB DR,SR 0001 DR-SRDR CMP DR,SR 0010 DR-SR 比較 AND DR,SR 0011 DR and SRDR 邏輯與 OR DR,SR 0100 DR or SRDR 邏輯或 XOR
23、 DR,SR 0101 DR xor SR DR 異或 SHL DR 0110 邏輯左移,最低位補0,最高位移入C SHR DR 0111 邏輯右移,最高位補0,最低位移入C MOVI DR,IMM 1000 IMM(立即數(shù))DR,存立即數(shù)進寄存器 數(shù)據(jù)傳送指令 MOV DR,SR 1001 SR DR LOAD DR,SR 1010 [SR] DR STORE DR,SR 1011 SR [DR] JR ADR 1100 無條件跳轉(zhuǎn)到ADR , ADR=原PC值+OFFSET 控制轉(zhuǎn)移指令 JRC
24、 ADR 1101 當C=1時,跳轉(zhuǎn)到ADR, ADR=原PC值+OFFSET JRZ ADR 1110 當Z=1時,跳轉(zhuǎn)到ADR, ADR=原PC值+OFFSET NOP 1111 空操作 其他 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.2修改的代碼及說明 1)代碼段1,新增內(nèi)存模塊memory.vhd --內(nèi)存 -
25、-2015-10-30 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use work.unitPack.all; ENTITY memory IS PORT ( databus : inout STD_LOGIC_VECTOR(7 DOWNTO 0); --數(shù)據(jù)總線 addr : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --訪存地址 wr : IN STD_LOGIC; --讀寫控制信號 reset
26、: IN STD_LOGIC ); END memory; ARCHITECTURE rtl OF memory IS SIGNAL ram:ram_type; --ram_type在unitpack.vhd文件里定義 BEGIN PROCESS(addr,wr,ram,databus,reset) BEGIN IF reset=0 THEN ram(0) <= MOVI & R0 & "11"; …… --此處將程序?qū)戇M內(nèi)存中,省略 ram(15) <= JR & "1110"; END IF; --讀寫功能
27、的實現(xiàn) IF wr=0 THEN databus <= Z8; ram(conv_integer(addr)) <= databus; END IF; IF wr=1 THEN 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
28、信號進行控制,當wr為0時執(zhí)行寫功能,當wr為1時執(zhí)行讀功能。 2) 代碼段2,取指模塊ifentity.vhd op <= IR(7 downto 4); --操作碼取指令的高4位 --控制相關(guān)信號e_setFlag,用于選擇當狀態(tài)寄存器的值來源 with e_setFlag select ZZ <= Z when flag_hold, tempZ when others; with e_setFlag select CC <= C when flag_hold, --由于跳轉(zhuǎn)信號中只保留了JR、JRC、JRZ,因此此處只判
29、斷該3個OP s_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_PCInc
30、1 <= PC + x"01"; --此處修改了PC位數(shù) WITH PCIncSel SELECT --當有跳轉(zhuǎn)時pc = pc + offset,否則pc = pc +1 PCnext <= s_PCInc1 WHEN 0, PCPlusOffset WHEN 1, s_PCInc1 when others; process(reset,clk,PCStall) begin if reset =
31、 0 then PC <= x"00"; --此處修改了PC位數(shù) elsif FALLING_EDGE(clk) and (PCStall=0) then PC <= PCnext; end if; end process; 取指模塊主要修改了與pc相關(guān)的地址信號的位數(shù)和跳轉(zhuǎn)判斷,由于修改指令系統(tǒng)時只保留了JR/JRC/JRZ3條跳轉(zhuǎn)指令,因此在跳轉(zhuǎn)判斷時只考慮該3條跳轉(zhuǎn)指令,根據(jù)跳轉(zhuǎn)判斷來選擇如何更新pc的值。 1) 代碼段1,執(zhí)行模塊exentity.vhd ,,,case e_ALUOpr is --選擇ALU的運
32、算,此處主要修改了位數(shù),邏輯功能不變 when aluAdd => ALUResult := opR + opS; tempV := ((not opR(7))and(not opS(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 op
33、S(7))and opR(7)and ALUResult(7)); when aluAnd => ALUResult := opR and opS; when aluOr => ALUResult := opR or opS; when aluXor => ALUResult := opR xor opS; when aluShl => ALUResult(7 downto 1) := opR(6 downto 0); ALUResult(0) := 0; cx := opR(7); when aluShr
34、 => 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選擇信號以及alu功能信號的判斷邏輯,以及狀態(tài)寄存器的判斷邏輯,之所以修改是因為位數(shù)的修改。除此以外還增加了aluMOVI的alu功能
35、信號及其對應(yīng)的邏輯功能實現(xiàn)。 1) 代碼段1,譯碼模塊identity.vhd 新增了的WriteBack:process(reset,clk) --寫回模塊 begin if reset=0 then --新增了初始化寄存器一步 RegArray(0) <= x"00"; RegArray(1) <= x"00"; RegArray(2) <= x"00"; RegArray(3) <= x"00"; elsif FALLING_EDGE(clk) and w_wRegEn=1
36、then RegArray(wRegIndex) <= w_WBData; end if; end process; Decode_Pro:process(d_IR) --修改了op碼以及控制信號的長度 variable op : std_logic_vector(3 downto 0); variable ctrl:std_logic_vector(17 downto 0); begin op := d_IR(7 downto 4); --修改了操作碼的長度 --譯碼產(chǎn)生的信號:SA,SB,Wrmem,wRegEn,MemToRe
37、g,ALUSrc,ALUOpr,SetFlag case op is --控制信號 when ADD => 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
38、(3 downto 0)&"10"&"0"&"1"&"001"&"0001"&"001"; --新增了MOVI指令及其譯碼出來的控制信號 when MOVI => ctrl:=d_IR(3 downto 0)&"10"&"1"&"1"&"101"&"1010"&"000"; imm <= "000000"&d_IR(1 downto 0); when ORins => ctrl:=d_IR(3 downto 0)&"10"&"1"&"1"&"001"&"0011"&"001"; when XORins => ctrl:=d_IR(3 d
39、ownto 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 down
40、to 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<=d_IR(3)&d_IR(3)&d_IR(3)&d_IR(3)&d_IR(3 downto 0); when others => ctrl:=DoN
41、othing; end case; 譯碼模塊主要修改了控制信號ctrl的位數(shù),并根據(jù)“SA, SB, Wrmem, wRegEn, MemToReg, ALUSrc, ALUOpr, SetFlag”的順序增加了MOVI指令的控制信號,如下所示: when MOVI => ctrl:=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)容)
42、 6.2測試代碼 --程序1 --指令正確性測試 -- R0 R1 R2 R3 ram(0) <= MOVI & R0 & "11"; -- 3 0 0 0 ram(1) <= ADD & R0 & "01"; -- 4 0 0 0 ram(2) <= MOV & R1 & R0; -- 4 4 0 0 ram(3) <= SUBB & R1 & "11"; -- 4 1 0 0 ram(4) <= SUBB & R2 & "10"; -- 4 1 -2 0 ram(5) <= ADD & R2 & "11"; -- 4 1 1 0 ram(6) <= ORIns &
43、R1 & R0; -- 4 4 1 0 ram(7) <= ANDIns & R1 & R2; -- 4 1 1 0 ram(8) <= XORIns & R0 & R1; -- 5 1 1 0 ram(9) <= SHLIns & R1 & "00"; -- 5 2 1 0; ram(10) <= SHRIns & R0 & "00"; -- 2 2 1 0; ram(11) <= LOAD & R0 & R2; -- R0的值為ADD & R0 & "01", 即0000 00 01 ram(12) <= CMP & R0 & R1; -- CF = 1, ZF = 0 ra
44、m(13) <= JRC & "1111"; -- 跳轉(zhuǎn)到15號地址 ram(14) <= MOVI & R3 & "11"; -- 如果跳轉(zhuǎn)則不執(zhí)行該指令 ram(15) <= STORE & R3 & R0; -- 0號地址的內(nèi)容變?yōu)?0000 0001 ram(16) <= MOVI & R0 & "11"; -- R0 = 3 ram(17) <= MOVI & R1 & "01"; -- R1 = 1 ram(18) <= SUBB & R0 & R1; -- R0 = R0 – R1 ram(19) <= JRZ & "1111"; -- 此處不跳 ram(20)
45、 <= JR & "0000"; --此處跳 6.3 測試結(jié)果 測試環(huán)境 測試程序 測試結(jié)果 五級流水 Quartus 程序1 正確 6.4 測試總結(jié) 試程序的結(jié)果都與預(yù)期相符,證明測試結(jié)果是正確的。 7 本課程設(shè)計的總結(jié) 7.1 A同學(xué)總結(jié) 由于上一學(xué)期在計算機組成原理的綜合性實驗中擔當了主力隊員,對cpu的基本組織結(jié)構(gòu)也算是十分了解,因此該學(xué)期主動擔當了組長。然而事實并沒有那么簡單,當?shù)谝淮慰吹酱a時發(fā)現(xiàn),由于上次綜合性實驗大部分通過畫圖連線實現(xiàn),邏輯功能十分明確,一目了然,然而該學(xué)期的cpu頂層實體是通過vhdl代碼實現(xiàn)的,因此初期花了不少時間
46、在了解代碼的語法以及邏輯功能上,完成此步以后,我們組開展了對3種相關(guān)進行詳細分析。弄清楚流水CPU的實現(xiàn)原理后,后續(xù)的修改工作就十分簡單了。一開始我們是采用機箱+DebugController的方式進行調(diào)試,后來由于實驗室的機箱資源有限,便再次采取了用Quartus的時序功能仿真來調(diào)試,并添加了內(nèi)存模塊。 7.2B同學(xué)總結(jié) 在此次課程設(shè)計中,我主要:參與修訂指令系統(tǒng);負責(zé)數(shù)據(jù)相關(guān)模塊的修改;負責(zé)譯碼和訪存模塊的修改;負責(zé)MOVI指令的增加,主要是在常量定義文件unitpack里增加MOVI的op 碼常量以及aluMOVI的alu功能選擇信號,并在譯碼模塊增加MOVI的控制信號及相關(guān)代碼;負責(zé)擴展常量定義文件。在組長的組織下循序漸進,大部分不懂得問題都能夠通過討論解決。 7.3 C同學(xué)總結(jié) 在這次的計算機組成原理課程設(shè)計里,我負責(zé)的是:參與修訂指令系統(tǒng);負責(zé)結(jié)構(gòu)相關(guān)模塊的修改;負責(zé)執(zhí)行模塊和寫回模塊的修改;負責(zé)新頂層實體cpum.bdf文件的接線,主要是在創(chuàng)建了cpuentity和memory的bsf文件后,新建cpum.bdf文件并將上述兩個原件加入,利用Quartus的接線功能將原件連接起來。 26
- 溫馨提示:
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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案