5級(jí)流水無cache cpu實(shí)驗(yàn)計(jì)算機(jī)組成原理 課程設(shè)計(jì)報(bào)告
《5級(jí)流水無cache cpu實(shí)驗(yàn)計(jì)算機(jī)組成原理 課程設(shè)計(jì)報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《5級(jí)流水無cache cpu實(shí)驗(yàn)計(jì)算機(jī)組成原理 課程設(shè)計(jì)報(bào)告(26頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 計(jì)算機(jī)組成原理 課程設(shè)計(jì)報(bào)告 5級(jí)流水無cache CPU實(shí)驗(yàn) 1.1 實(shí)驗(yàn)內(nèi)容:無cache流水CPU的分析與改造 1. 理解無cache流水CPU的工作原理,明確系統(tǒng)總體結(jié)構(gòu)和數(shù)據(jù)通路圖,分析解決各種相關(guān)用到的主要信號(hào),以及詳細(xì)分析各流水段的功能和實(shí)現(xiàn)。 2. 將16位的指令系統(tǒng)改為8位,設(shè)計(jì)新的指令系統(tǒng),并修改相應(yīng)的數(shù)據(jù)通路。 3. 修改規(guī)則文件(cpu.txt),并編寫測(cè)試程序驗(yàn)證系統(tǒng)改造的正確性。 1.2 總體基本信息 1. 深刻理解無cache流水cpu的工作原理。在詳細(xì)分析了各流水段的功能實(shí)現(xiàn)、3種相關(guān)的產(chǎn)生原因和解決方法的基礎(chǔ)上,完成了以下后續(xù)工作。
2、 2. 修改指令系統(tǒng)。具體包括: a) 16位指令改為8位,重新編寫了指令OP碼。 b) 新增了MOVI指令。由于原指令系統(tǒng)沒有將立即數(shù)存進(jìn)指定寄存器的指令,因此此處新增一條MOVI指令。指令的匯編語句為 MOVI DR, IMM 其中DR為目的寄存器,IMM為立即數(shù)。因?yàn)橹噶铋L(zhǎng)度為8位,OP和DR共占了6位,因此IMM的大小不大于3(即二進(jìn)制“00”至“11”)。 c) 修改及刪除了部分指令。此處詳見5.1。 3. 修改系統(tǒng)控制信號(hào)。在保持原有系統(tǒng)邏輯功能基本不變的情況下,修改各個(gè)模塊里控制信號(hào)位數(shù)以及模塊接口信號(hào)位數(shù)以和新的指令系統(tǒng)兼容。 4. 增加內(nèi)存模塊。使用vhdl
3、編寫了一個(gè)ram模塊,根據(jù)讀寫信號(hào)來選擇讀寫功能。reset時(shí)將事先寫好的二進(jìn)制形式程序?qū)戇M(jìn)內(nèi)存。 5. 擴(kuò)展了常量定義文件。在常量定義文件unitpack.vhd中,具體地: a) 新增了ALU功能選擇信號(hào)常量aluMOVI。 b) 新增了寄存器編號(hào)常量R0、R1、R2和R3。 c) 新增了ram類型。 6. 使用Quartus II進(jìn)行功能仿真并debug。 7. 使用bdf構(gòu)造頂層實(shí)體cpum。由于新增了內(nèi)存模塊,而原系統(tǒng)是使用vhdl編寫的,為了方便對(duì)接,我們使用bdf的形式將無cache流水線cpu和內(nèi)存模塊連接起來構(gòu)造頂層實(shí)體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ù)通路圖: 整個(gè)CPU由以下幾個(gè)模塊組成: l 取指模塊(IF):給出內(nèi)存地址,讀取指令并送入指令寄存器,為下一級(jí)準(zhǔn)備數(shù)據(jù)。 由于PC控制模塊處于取指模塊中,因此控制相關(guān)的檢測(cè)也置于取指模塊。 l 譯碼模塊(ID):讀取寄存器值和指令譯碼。我們采取一次譯碼,逐級(jí)傳遞的方式,譯出后幾級(jí)流水所需的控制信號(hào)和數(shù)據(jù)(如立即數(shù)等),在每次時(shí)鐘上升沿到來時(shí)送入
5、下一級(jí)。實(shí)際上,結(jié)構(gòu)相關(guān)、控制相關(guān)、數(shù)據(jù)相關(guān)的檢測(cè)都可歸入譯碼部分。考慮到“相關(guān)檢測(cè)”涉及到的信號(hào)分屬不同階段以及整體結(jié)構(gòu)的清晰性,我們將“相關(guān)檢測(cè)”獨(dú)立出來。 l 執(zhí)行模塊(Ex):完成算術(shù)邏輯運(yùn)算、計(jì)算有效地址和提供數(shù)據(jù)通道。 l 訪存模塊(Ma):選擇地址線的數(shù)據(jù)來源和數(shù)據(jù)線的流向。訪存和取指在功能上是獨(dú)立的,但CPU對(duì)外只有一條地址線和數(shù)據(jù)線的事實(shí)決定了訪存和取指是相互聯(lián)系的。當(dāng)執(zhí)行LOAD/STORE指令時(shí),地址線由ALU送入“訪存段”的值提供;取指時(shí),則由PC提供。當(dāng)寫內(nèi)存時(shí),CPU內(nèi)部數(shù)據(jù)送數(shù)據(jù)線;當(dāng)需要讀內(nèi)存時(shí),CPU往數(shù)據(jù)線送高阻。 l 回寫模塊(Wb):選擇回寫數(shù)據(jù)源
6、和根據(jù)寫使能信號(hào)wRegEn將數(shù)據(jù)回寫到寄存器堆; l HazardDetectUnit模塊:檢測(cè)結(jié)構(gòu)相關(guān); l ForwardingUnit模塊:檢測(cè)數(shù)據(jù)相關(guān)。 l 內(nèi)存模塊memory,根據(jù)訪存地址mem_adr和讀寫信號(hào)wr來控制。 3 解決各種相關(guān)用到的主要信號(hào)的分析 3.1控制相關(guān) 控制相關(guān)是指因?yàn)槌绦虻膱?zhí)行方向可能改變而引起的相關(guān)。當(dāng)執(zhí)行跳轉(zhuǎn)指令時(shí),就會(huì)發(fā)生這種情況。除JR外,JRZ等條件跳轉(zhuǎn)需要根據(jù)當(dāng)前狀態(tài)位來決定是否跳轉(zhuǎn),而當(dāng)前狀態(tài)位是由前面最近的會(huì)影響狀態(tài)位的指令(如算術(shù)指令)決定。常規(guī)的也是比較簡(jiǎn)單的做法是在碰到JRX之類的跳轉(zhuǎn)指令時(shí),延遲后邊流水線的進(jìn)入
7、。但我們通過分析,認(rèn)為可以一點(diǎn)都不必延遲,通過旁路處理把控制相關(guān)轉(zhuǎn)為數(shù)據(jù)相關(guān)來處理。這樣處理,不必延遲,可以提高流水線的性能。按我們的方式解決控制相關(guān)需要做兩項(xiàng)工作: 1) 通過旁路,提供狀態(tài)寄存器的值和臨時(shí)狀態(tài)位的值,為判斷是否跳轉(zhuǎn)作準(zhǔn)備; 2) 選擇PC更新的時(shí)機(jī) 1.旁路處理 在每條指令譯碼時(shí),會(huì)產(chǎn)生一個(gè)信號(hào)setFlag,它決定了在執(zhí)行階段是否根據(jù)ALU計(jì)算結(jié)果改變狀態(tài)位。從下面的時(shí)序圖中可以發(fā)現(xiàn),只要我們?cè)贘RX指令譯碼時(shí)提供以下3個(gè)信號(hào)就可作出是否跳轉(zhuǎn)的決定: 信號(hào) 含義 tFlag ALU計(jì)算出的臨時(shí)狀態(tài)位, Flag 狀態(tài)寄存器輸出, e_setFlag
8、 狀態(tài)寄存器寫使能 表17 處理控制相關(guān)信號(hào) 若e_setFlag要寫狀態(tài)寄存器,則說明前一條指令會(huì)影響狀態(tài)位,這時(shí)根據(jù)tFlag決定是否跳轉(zhuǎn);若e_setFlag要保持狀態(tài)寄存器,則說明前一條指令不會(huì)影響狀態(tài)位,這時(shí)根據(jù)Flag決定是否跳轉(zhuǎn)。 涉及到控制相關(guān)的關(guān)鍵信號(hào)是setFlag信號(hào),產(chǎn)生于譯碼模塊,作用于執(zhí)行模塊,即identity.vhdhe exentity.vhd文件中。如下圖所示。 從上圖可看出,凡是涉及到數(shù)值計(jì)算和關(guān)系運(yùn)算的指令的低三位均為001,而不涉及的則為000。該信號(hào)傳到執(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ù)并非一勞永逸。若前一指令為L(zhǎng)OAD,而后一指令和它數(shù)據(jù)相關(guān),如下圖所示,當(dāng)下一指令的執(zhí)行階段需要數(shù)據(jù)時(shí),上一指令尚未給出,這種情況是無法用旁路技術(shù)來解決的。 相關(guān)的類型有三種: 1. 2. 3. 主要用到的關(guān)鍵信號(hào)是m_wRegEn和w_wRegEn,主要使用是在數(shù)據(jù)相關(guān)檢測(cè)模塊forwardin
10、gentity.vhd中,在identity.vhd、exentity.vhd、memaccessentity.vhd中均有使用。具體的使用方法如下。 相關(guān)的檢測(cè)都置于“執(zhí)行階段”。信號(hào)wRegEn是寄存器寫使能,SA,SB是寄存器組A,B口選擇信號(hào)。信號(hào)前綴表示信號(hào)所處的階段。如e_SA表示處于執(zhí)行階段的SA。 1.相鄰指令數(shù)據(jù)相關(guān)的檢測(cè) 若m_wRegEn=’1’,則表示前一指令要回寫寄存器。此時(shí),若e_SA或e_SB等于m_SA,則必然數(shù)據(jù)相關(guān),這是因?yàn)槲覀円?guī)定,若回寫寄存器,則寄存器A口選擇信號(hào)所指定的即為目的寄存器。否則無關(guān)。 2. 中間隔1條指令的兩指令數(shù)據(jù)相關(guān)的檢測(cè)
11、 若w_wRegEn=’1’,則表示第一條指令要回寫寄存器。此時(shí),若e_SA或e_SB等于w_SA,則必然數(shù)據(jù)相關(guān)。否則無關(guān)。 當(dāng)然,上述兩種情況可能會(huì)一同出現(xiàn)。這時(shí),我們就按情況1處理。因?yàn)榍闆r2可以理解為 接連出現(xiàn)情況1。 下圖為各個(gè)指令在譯碼時(shí)產(chǎn)生的wRegEn信號(hào),可以發(fā)現(xiàn)凡是會(huì)寫進(jìn)寄存器的指令,該信號(hào)值都為1。 3.3 結(jié)構(gòu)相關(guān) 由于在設(shè)計(jì)中不包含緩存,因此會(huì)有取指和訪存的沖突,即結(jié)構(gòu)相關(guān)。如下圖: 關(guān)鍵信號(hào)是wrMem信號(hào),表示是否讀寫內(nèi)存。具體出現(xiàn)在結(jié)構(gòu)相關(guān)沖突檢測(cè)與問題解決模塊Hazarddetectent
12、ity.vhd中,產(chǎn)生于譯碼模塊identity.vhd中。具體使用方法如下: 1) 沖突檢測(cè) 只有執(zhí)行訪存指令(LOAD/STORE)時(shí),才會(huì)出現(xiàn)沖突。因此,我們?cè)谧g碼時(shí)產(chǎn)生一個(gè)標(biāo)志是否訪存的信號(hào)wrMem。含義如下: wrMem 意義 00 寫內(nèi)存(STORE) 01 讀內(nèi)存(LOAD) 1 不占用內(nèi)存 表16 wMEM控制信號(hào) 通過檢查“訪存階段”的m_wrMem就可確定是否沖突。 2)取指延后 在每次取指時(shí),若有沖突,則往IR中寫入空指令(NOP),并保持PC不變,使取指延后一個(gè)節(jié)拍。 4 各流水段功能和實(shí)現(xiàn)的詳細(xì)分析 4.1取
13、指(IF) 4.1.1 實(shí)現(xiàn)功能列表 取指模塊實(shí)現(xiàn)的功能是: l 給定內(nèi)存地址,讀取內(nèi)存中的指令 l 將指令送入指令寄存器,提供給下一級(jí)的譯碼模塊 l 實(shí)現(xiàn)控制相關(guān)沖突檢測(cè) l 根據(jù)讀取到的指令是否為跳轉(zhuǎn)指令來更新PC 4.1.2輸入、輸出信號(hào)分析 主要輸入信號(hào): Z,C 狀態(tài)寄存器 tempZ,tempC ALU計(jì)算出的臨時(shí)狀態(tài)位,用于相關(guān)沖突檢測(cè) e_setFlag 狀態(tài)寄存器寫使能端,產(chǎn)生于譯碼時(shí)。決定是否在執(zhí)行階段根據(jù)ALU計(jì)算出來的結(jié)果改變狀態(tài)位 PCStall 決定是否保持PC不變,由結(jié)構(gòu)相關(guān)沖突檢測(cè)模塊產(chǎn)生 IFFlush 決定是否往指
14、令寄存器IR里寫入空指令,來自結(jié)構(gòu)相關(guān)檢測(cè)模塊 OuterDB 內(nèi)存讀取過來的數(shù)據(jù) 主要輸出信號(hào): PC_addr PC作為內(nèi)存地址輸出,用于下一節(jié)拍的取指 d_PCInc1 PC + 1 d_IR 指令寄存器輸出 4.1.3功能實(shí)現(xiàn)邏輯 通過分析控制信號(hào)我們可以大概了解到取指模塊的功能實(shí)現(xiàn)邏輯是如何的。廣義上來說,取指模塊包括結(jié)構(gòu)相關(guān)沖突檢測(cè)模塊,因?yàn)镻CStall信號(hào)(用來實(shí)現(xiàn)IF段對(duì)PC的更新)和IFFlush信號(hào)(對(duì)IR寫入空指令)就來自結(jié)構(gòu)相關(guān)沖突檢測(cè)模塊。 結(jié)構(gòu)相關(guān)檢測(cè)模塊叫HazardDetectEntity,其模塊圖如下:
15、 其中輸入信號(hào)的含義是: m_wrMem wrMem在訪存階段的值 w_rwMem wrMem在寫回階段的值 d_IR 指令寄存器 通過檢測(cè)訪存階段的wrMem信號(hào)即可確定是否發(fā)生了結(jié)構(gòu)沖突。 每次取指后,若有沖突,則往IR中寫入空指令(NOP),并保持PC不變,使得取指延后一個(gè)節(jié)拍。 除此之外,setFlag信號(hào)在此處的作用是,決定用狀態(tài)寄存器輸出Flag還是ALU計(jì)算出的臨時(shí)狀態(tài)位tFlag來判斷跳轉(zhuǎn)。 4.2譯碼(ID) 4.2.1 實(shí)現(xiàn)功能列表 譯碼模塊實(shí)現(xiàn)的功能是: l 讀取指令寄存器中的指令 l 對(duì)指令進(jìn)行譯碼,發(fā)送控制信號(hào)
16、 4.2.2輸入、輸出信號(hào)分析 主要輸入信號(hào): d_IR 從取指模塊來的指令 d_PCInc1 從取指模塊來的pc+1 w_wbData 寫回?cái)?shù)據(jù),從寫回模塊里來 w_destReg 要寫回的目標(biāo)寄存器 w_wRegEn 寄存器寫使能端 主要輸出信號(hào): e_RAOut 寄存器A輸出值 e_RBOut 寄存器B輸出值 e_IMM 立即數(shù)輸出值 e_ALUSrc ALU輸入端選擇信號(hào) e_ALUOpr ALU運(yùn)算選擇信號(hào) e_SetFlag 狀態(tài)寄存器寫使能信號(hào) e_wrMem 訪存信號(hào) e_wRegEn 寄存器寫使能信號(hào)
17、 e_destReg 目標(biāo)寄存器 e_MemToReg 內(nèi)存寫入寄存器使能信號(hào) 4.2.3功能實(shí)現(xiàn)邏輯 譯碼模塊內(nèi)部寫好了根據(jù)不同的指令發(fā)送不同的控制信號(hào)的代碼,采取一次譯碼,逐級(jí)傳遞的方式,譯出后幾級(jí)流水所需的控制信號(hào)和數(shù)據(jù)(如立即數(shù))。在每次時(shí)鐘上升沿到來時(shí)送入下一級(jí)。實(shí)際上,結(jié)構(gòu)相關(guān)、控制相關(guān)、數(shù)據(jù)相關(guān)的檢測(cè)都可歸入譯碼部分??紤]到“相關(guān)檢測(cè)”涉及到的信號(hào)分屬不同階段以及整體結(jié)構(gòu)的清晰性,作者將“相關(guān)檢測(cè)”獨(dú)立出來。 4.3執(zhí)行(EX) 4.3.1 實(shí)現(xiàn)功能列表 執(zhí)行模塊實(shí)現(xiàn)的功能是: l 根據(jù)控制信號(hào)完成算術(shù)邏輯運(yùn)算 l 根據(jù)控制信號(hào)計(jì)算有效地址 l 提
18、供數(shù)據(jù)通道,將上一級(jí)傳遞過來的控制信號(hào)傳到下一級(jí) 4.3.2輸入、輸出信號(hào)分析 主要輸入信號(hào): e_RAOut、e_RBOut、e_ALUSrc、e_ALUOpr、e_SetFlag、e_IMM、e_memToReg、 e_wRegEn、、 來自譯碼模塊的控制信號(hào) forwardA、forwardB 來自數(shù)據(jù)相關(guān)沖突檢測(cè)模塊的輸出 e_ALUOut 上一個(gè)指令在執(zhí)行模塊產(chǎn)生的輸出,作為下一條指令在執(zhí)行模塊執(zhí)行的輸入信號(hào)之一 主要輸出信號(hào): m_SA、m_ALUOut、m_RBdata、i_tempZ、i_tempC、m_flag、m_wRegEn、m_memT
19、oReg、m_destReg、m_wrMem 主要來自上一級(jí)模塊傳過來的控制信號(hào) 4.3.3功能實(shí)現(xiàn)邏輯 執(zhí)行模塊執(zhí)行的功能很簡(jiǎn)單,和上個(gè)學(xué)期做的CPU綜合性實(shí)驗(yàn)類似,主要是一些ALU邏輯運(yùn)算和狀態(tài)寄存器的更新操作。在這里還有向下一模塊傳遞控制信號(hào)的作用。 其中,forwardA和forwardB信號(hào)是來自數(shù)據(jù)相關(guān)沖突檢測(cè)模塊的信號(hào)。 模塊圖如下所示: 作用是在發(fā)生讀后寫數(shù)據(jù)相關(guān)時(shí),直接將計(jì)算好了的結(jié)果在寫回目標(biāo)寄存器時(shí)也發(fā)往下一條指令的執(zhí)行模塊作為ALU的輸入之一。 4.4訪存(MEM) 4.4.1 實(shí)現(xiàn)功能列表 訪存模塊實(shí)現(xiàn)的功能是: l 根據(jù)地址線對(duì)
20、內(nèi)存進(jìn)行讀操作或者寫操作 4.4.2輸入、輸出信號(hào)分析 主要輸入信號(hào): m_wrMem 內(nèi)存讀寫控制信號(hào) m_ALUOut 來自ALU的輸出結(jié)果 m_RBdata 要寫回的數(shù)據(jù) PC 程序計(jì)數(shù)器的值 主要輸出信號(hào): w_wrMem 傳送到寫回模塊的內(nèi)存讀寫控制信號(hào) wr 讀寫控制信號(hào) addr 要讀取的內(nèi)存地址 OuterDB 既可作為輸入又可作為輸出,用于傳輸數(shù)據(jù) 4.4.3功能實(shí)現(xiàn)邏輯 訪存和取指在功能上是獨(dú)立的,但是因?yàn)镃PU對(duì)外只有一條地址線和數(shù)據(jù)線,因此訪存和取指在實(shí)際上是有聯(lián)系和沖突的。當(dāng)執(zhí)行Load/Store指令時(shí)
21、,地址線由ALU送入訪存段的值提供;取指時(shí),則由PC提供。當(dāng)寫內(nèi)存時(shí),CPU內(nèi)部數(shù)據(jù)送往數(shù)據(jù)線。當(dāng)需要讀內(nèi)存時(shí),CPU往數(shù)據(jù)線送高阻。 4.5寫回(WB) 4.5.1 實(shí)現(xiàn)功能列表 寫回模塊實(shí)現(xiàn)的功能是: l 選擇寫回?cái)?shù)據(jù)源(來自ALU的輸出還是來自內(nèi)存) l 根據(jù)寫使能信號(hào)wRegEn將數(shù)據(jù)寫回到寄存器組 4.5.2輸入、輸出信號(hào)分析 主要輸入信號(hào): s_w_ALUOut ALU的輸出 s_w_MemOut 內(nèi)存讀取的輸出 s_w_memToReg 決定寫入寄存器的數(shù)據(jù)來源 s_w_flag 要寫進(jìn)狀態(tài)寄存器的值 4.5.3功能實(shí)現(xiàn)邏輯 此部
22、分較為簡(jiǎn)單,即通過s_w_memToReg信號(hào)來決定是將ALU的輸出寫進(jìn)寄存器還是將從內(nèi)存讀出來的數(shù)據(jù)寫進(jìn)寄存器。 模塊圖如下: 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 邏輯左移,最低位補(bǔ)0,最高位移入C SHR DR 0111 邏輯右移,最高位補(bǔ)0,最低位移入C MOVI DR,IMM 1000 IMM(立即數(shù))DR,存立即數(shù)進(jìn)寄存器 數(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 當(dāng)C=1時(shí),跳轉(zhuǎn)到ADR, ADR=原PC值+OFFSET JRZ ADR 1110 當(dāng)Z=1時(shí),跳轉(zhuǎn)到ADR, ADR=原PC值+OFFSET NOP 1111 空操作 其他 5.1.1選擇改動(dòng)說明 包括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; --讀寫控制信號(hào) 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(jìn)內(nèi)存中,省略 ram(15) <= JR & "1110"; END IF; --讀寫功能
27、的實(shí)現(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ù)總線,因此不能同時(shí)進(jìn)行讀寫。因?yàn)檫@樣所以會(huì)產(chǎn)生結(jié)構(gòu)相關(guān),即在取指的時(shí)候不可以訪存,否則會(huì)產(chǎn)生沖突。內(nèi)存讀寫功能由wr
28、信號(hào)進(jìn)行控制,當(dāng)wr為0時(shí)執(zhí)行寫功能,當(dāng)wr為1時(shí)執(zhí)行讀功能。 2) 代碼段2,取指模塊ifentity.vhd op <= IR(7 downto 4); --操作碼取指令的高4位 --控制相關(guān)信號(hào)e_setFlag,用于選擇當(dāng)狀態(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)信號(hào)中只保留了JR、JRC、JRZ,因此此處只判
29、斷該3個(gè)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 --當(dāng)有跳轉(zhuǎn)時(shí)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)的地址信號(hào)的位數(shù)和跳轉(zhuǎn)判斷,由于修改指令系統(tǒng)時(shí)只保留了JR/JRC/JRZ3條跳轉(zhuǎn)指令,因此在跳轉(zhuǎn)判斷時(shí)只考慮該3條跳轉(zhuǎn)指令,根據(jù)跳轉(zhuǎn)判斷來選擇如何更新pc的值。 1) 代碼段1,執(zhí)行模塊exentity.vhd ,,,case e_ALUOpr is --選擇ALU的運(yùn)
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功能選擇信號(hào)及其處理實(shí)現(xiàn) when aluMOVI => ALUResult := "00000"&opS(3 downto 0); when others => null; end case; 修改了alu選擇信號(hào)以及alu功能信號(hào)的判斷邏輯,以及狀態(tài)寄存器的判斷邏輯,之所以修改是因?yàn)槲粩?shù)的修改。除此以外還增加了aluMOVI的alu功能
35、信號(hào)及其對(duì)應(yīng)的邏輯功能實(shí)現(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碼以及控制信號(hào)的長(zhǎng)度 variable op : std_logic_vector(3 downto 0); variable ctrl:std_logic_vector(17 downto 0); begin op := d_IR(7 downto 4); --修改了操作碼的長(zhǎng)度 --譯碼產(chǎn)生的信號(hào):SA,SB,Wrmem,wRegEn,MemToRe
37、g,ALUSrc,ALUOpr,SetFlag case op is --控制信號(hào) 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指令及其譯碼出來的控制信號(hào) 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*指令,計(jì)算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; 譯碼模塊主要修改了控制信號(hào)ctrl的位數(shù),并根據(jù)“SA, SB, Wrmem, wRegEn, MemToReg, ALUSrc, ALUOpr, SetFlag”的順序增加了MOVI指令的控制信號(hào),如下所示: when MOVI => ctrl:=d_IR(3 downto 0)&"10"&"1"&"1"&"101"&"1010"&"000"; imm <= "000000"&d_IR(1 downto 0); 最后還增加了寄存器的初始化。 6 測(cè)試與總結(jié) 6.1 規(guī)則文件(cpu.txt的內(nèi)容)
42、 6.2測(cè)試代碼 --程序1 --指令正確性測(cè)試 -- 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號(hào)地址 ram(14) <= MOVI & R3 & "11"; -- 如果跳轉(zhuǎn)則不執(zhí)行該指令 ram(15) <= STORE & R3 & R0; -- 0號(hào)地址的內(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 測(cè)試結(jié)果 測(cè)試環(huán)境 測(cè)試程序 測(cè)試結(jié)果 五級(jí)流水 Quartus 程序1 正確 6.4 測(cè)試總結(jié) 試程序的結(jié)果都與預(yù)期相符,證明測(cè)試結(jié)果是正確的。 7 本課程設(shè)計(jì)的總結(jié) 7.1 A同學(xué)總結(jié) 由于上一學(xué)期在計(jì)算機(jī)組成原理的綜合性實(shí)驗(yàn)中擔(dān)當(dāng)了主力隊(duì)員,對(duì)cpu的基本組織結(jié)構(gòu)也算是十分了解,因此該學(xué)期主動(dòng)擔(dān)當(dāng)了組長(zhǎng)。然而事實(shí)并沒有那么簡(jiǎn)單,當(dāng)?shù)谝淮慰吹酱a時(shí)發(fā)現(xiàn),由于上次綜合性實(shí)驗(yàn)大部分通過畫圖連線實(shí)現(xiàn),邏輯功能十分明確,一目了然,然而該學(xué)期的cpu頂層實(shí)體是通過vhdl代碼實(shí)現(xiàn)的,因此初期花了不少時(shí)間
46、在了解代碼的語法以及邏輯功能上,完成此步以后,我們組開展了對(duì)3種相關(guān)進(jìn)行詳細(xì)分析。弄清楚流水CPU的實(shí)現(xiàn)原理后,后續(xù)的修改工作就十分簡(jiǎn)單了。一開始我們是采用機(jī)箱+DebugController的方式進(jìn)行調(diào)試,后來由于實(shí)驗(yàn)室的機(jī)箱資源有限,便再次采取了用Quartus的時(shí)序功能仿真來調(diào)試,并添加了內(nèi)存模塊。 7.2B同學(xué)總結(jié) 在此次課程設(shè)計(jì)中,我主要:參與修訂指令系統(tǒng);負(fù)責(zé)數(shù)據(jù)相關(guān)模塊的修改;負(fù)責(zé)譯碼和訪存模塊的修改;負(fù)責(zé)MOVI指令的增加,主要是在常量定義文件unitpack里增加MOVI的op 碼常量以及aluMOVI的alu功能選擇信號(hào),并在譯碼模塊增加MOVI的控制信號(hào)及相關(guān)代碼;負(fù)責(zé)擴(kuò)展常量定義文件。在組長(zhǎng)的組織下循序漸進(jìn),大部分不懂得問題都能夠通過討論解決。 7.3 C同學(xué)總結(jié) 在這次的計(jì)算機(jī)組成原理課程設(shè)計(jì)里,我負(fù)責(zé)的是:參與修訂指令系統(tǒng);負(fù)責(zé)結(jié)構(gòu)相關(guān)模塊的修改;負(fù)責(zé)執(zhí)行模塊和寫回模塊的修改;負(fù)責(zé)新頂層實(shí)體cpum.bdf文件的接線,主要是在創(chuàng)建了cpuentity和memory的bsf文件后,新建cpum.bdf文件并將上述兩個(gè)原件加入,利用Quartus的接線功能將原件連接起來。 26
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案