5級流水無cache cpu實驗計算機組成原理 課程設計報告
《5級流水無cache cpu實驗計算機組成原理 課程設計報告》由會員分享,可在線閱讀,更多相關《5級流水無cache cpu實驗計算機組成原理 課程設計報告(26頁珍藏版)》請在裝配圖網上搜索。
1、 計算機組成原理 課程設計報告 5級流水無cache CPU實驗 1.1 實驗內容:無cache流水CPU的分析與改造 1. 理解無cache流水CPU的工作原理,明確系統(tǒng)總體結構和數據通路圖,分析解決各種相關用到的主要信號,以及詳細分析各流水段的功能和實現。 2. 將16位的指令系統(tǒng)改為8位,設計新的指令系統(tǒng),并修改相應的數據通路。 3. 修改規(guī)則文件(cpu.txt),并編寫測試程序驗證系統(tǒng)改造的正確性。 1.2 總體基本信息 1. 深刻理解無cache流水cpu的工作原理。在詳細分析了各流水段的功能實現、3種相關的產生原因和解決方法的基礎上,完成了以下后續(xù)工作。
2、 2. 修改指令系統(tǒng)。具體包括: a) 16位指令改為8位,重新編寫了指令OP碼。 b) 新增了MOVI指令。由于原指令系統(tǒng)沒有將立即數存進指定寄存器的指令,因此此處新增一條MOVI指令。指令的匯編語句為 MOVI DR, IMM 其中DR為目的寄存器,IMM為立即數。因為指令長度為8位,OP和DR共占了6位,因此IMM的大小不大于3(即二進制“00”至“11”)。 c) 修改及刪除了部分指令。此處詳見5.1。 3. 修改系統(tǒng)控制信號。在保持原有系統(tǒng)邏輯功能基本不變的情況下,修改各個模塊里控制信號位數以及模塊接口信號位數以和新的指令系統(tǒng)兼容。 4. 增加內存模塊。使用vhdl
3、編寫了一個ram模塊,根據讀寫信號來選擇讀寫功能。reset時將事先寫好的二進制形式程序寫進內存。 5. 擴展了常量定義文件。在常量定義文件unitpack.vhd中,具體地: a) 新增了ALU功能選擇信號常量aluMOVI。 b) 新增了寄存器編號常量R0、R1、R2和R3。 c) 新增了ram類型。 6. 使用Quartus II進行功能仿真并debug。 7. 使用bdf構造頂層實體cpum。由于新增了內存模塊,而原系統(tǒng)是使用vhdl編寫的,為了方便對接,我們使用bdf的形式將無cache流水線cpu和內存模塊連接起來構造頂層實體cpum,“m”的含義是“memory”,即
4、帶內存模塊的無cache流水線cpu。 8. 重畫數據通路圖。我們使用了Microsoft Visio軟件在原有的系統(tǒng)總結結構圖的基礎上修改并新增了部分模塊,詳見2。 2、系統(tǒng)總體結構及數據通路圖 總體結構圖: 數據通路圖: 整個CPU由以下幾個模塊組成: l 取指模塊(IF):給出內存地址,讀取指令并送入指令寄存器,為下一級準備數據。 由于PC控制模塊處于取指模塊中,因此控制相關的檢測也置于取指模塊。 l 譯碼模塊(ID):讀取寄存器值和指令譯碼。我們采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數據(如立即數等),在每次時鐘上升沿到來時送入
5、下一級。實際上,結構相關、控制相關、數據相關的檢測都可歸入譯碼部分??紤]到“相關檢測”涉及到的信號分屬不同階段以及整體結構的清晰性,我們將“相關檢測”獨立出來。 l 執(zhí)行模塊(Ex):完成算術邏輯運算、計算有效地址和提供數據通道。 l 訪存模塊(Ma):選擇地址線的數據來源和數據線的流向。訪存和取指在功能上是獨立的,但CPU對外只有一條地址線和數據線的事實決定了訪存和取指是相互聯(lián)系的。當執(zhí)行LOAD/STORE指令時,地址線由ALU送入“訪存段”的值提供;取指時,則由PC提供。當寫內存時,CPU內部數據送數據線;當需要讀內存時,CPU往數據線送高阻。 l 回寫模塊(Wb):選擇回寫數據源
6、和根據寫使能信號wRegEn將數據回寫到寄存器堆; l HazardDetectUnit模塊:檢測結構相關; l ForwardingUnit模塊:檢測數據相關。 l 內存模塊memory,根據訪存地址mem_adr和讀寫信號wr來控制。 3 解決各種相關用到的主要信號的分析 3.1控制相關 控制相關是指因為程序的執(zhí)行方向可能改變而引起的相關。當執(zhí)行跳轉指令時,就會發(fā)生這種情況。除JR外,JRZ等條件跳轉需要根據當前狀態(tài)位來決定是否跳轉,而當前狀態(tài)位是由前面最近的會影響狀態(tài)位的指令(如算術指令)決定。常規(guī)的也是比較簡單的做法是在碰到JRX之類的跳轉指令時,延遲后邊流水線的進入
7、。但我們通過分析,認為可以一點都不必延遲,通過旁路處理把控制相關轉為數據相關來處理。這樣處理,不必延遲,可以提高流水線的性能。按我們的方式解決控制相關需要做兩項工作: 1) 通過旁路,提供狀態(tài)寄存器的值和臨時狀態(tài)位的值,為判斷是否跳轉作準備; 2) 選擇PC更新的時機 1.旁路處理 在每條指令譯碼時,會產生一個信號setFlag,它決定了在執(zhí)行階段是否根據ALU計算結果改變狀態(tài)位。從下面的時序圖中可以發(fā)現,只要我們在JRX指令譯碼時提供以下3個信號就可作出是否跳轉的決定: 信號 含義 tFlag ALU計算出的臨時狀態(tài)位, Flag 狀態(tài)寄存器輸出, e_setFlag
8、 狀態(tài)寄存器寫使能 表17 處理控制相關信號 若e_setFlag要寫狀態(tài)寄存器,則說明前一條指令會影響狀態(tài)位,這時根據tFlag決定是否跳轉;若e_setFlag要保持狀態(tài)寄存器,則說明前一條指令不會影響狀態(tài)位,這時根據Flag決定是否跳轉。 涉及到控制相關的關鍵信號是setFlag信號,產生于譯碼模塊,作用于執(zhí)行模塊,即identity.vhdhe exentity.vhd文件中。如下圖所示。 從上圖可看出,凡是涉及到數值計算和關系運算的指令的低三位均為001,而不涉及的則為000。該信號傳到執(zhí)行模塊中用于判斷是否更
9、新狀態(tài)寄存器。 3.2 數據相關 數據相關是指在執(zhí)行本條指令的過程中,如果用到的操作數是前面指令的執(zhí)行結果,則必須等待前面的指令執(zhí)行完成,并把結果寫回寄存器或主存之后,本條指令才能繼續(xù)執(zhí)行。此處采用設置專用數據通路來解決數據相關問題。但旁路技術并非一勞永逸。若前一指令為LOAD,而后一指令和它數據相關,如下圖所示,當下一指令的執(zhí)行階段需要數據時,上一指令尚未給出,這種情況是無法用旁路技術來解決的。 相關的類型有三種: 1. 2. 3. 主要用到的關鍵信號是m_wRegEn和w_wRegEn,主要使用是在數據相關檢測模塊forwardin
10、gentity.vhd中,在identity.vhd、exentity.vhd、memaccessentity.vhd中均有使用。具體的使用方法如下。 相關的檢測都置于“執(zhí)行階段”。信號wRegEn是寄存器寫使能,SA,SB是寄存器組A,B口選擇信號。信號前綴表示信號所處的階段。如e_SA表示處于執(zhí)行階段的SA。 1.相鄰指令數據相關的檢測 若m_wRegEn=’1’,則表示前一指令要回寫寄存器。此時,若e_SA或e_SB等于m_SA,則必然數據相關,這是因為我們規(guī)定,若回寫寄存器,則寄存器A口選擇信號所指定的即為目的寄存器。否則無關。 2. 中間隔1條指令的兩指令數據相關的檢測
11、 若w_wRegEn=’1’,則表示第一條指令要回寫寄存器。此時,若e_SA或e_SB等于w_SA,則必然數據相關。否則無關。 當然,上述兩種情況可能會一同出現。這時,我們就按情況1處理。因為情況2可以理解為 接連出現情況1。 下圖為各個指令在譯碼時產生的wRegEn信號,可以發(fā)現凡是會寫進寄存器的指令,該信號值都為1。 3.3 結構相關 由于在設計中不包含緩存,因此會有取指和訪存的沖突,即結構相關。如下圖: 關鍵信號是wrMem信號,表示是否讀寫內存。具體出現在結構相關沖突檢測與問題解決模塊Hazarddetectent
12、ity.vhd中,產生于譯碼模塊identity.vhd中。具體使用方法如下: 1) 沖突檢測 只有執(zhí)行訪存指令(LOAD/STORE)時,才會出現沖突。因此,我們在譯碼時產生一個標志是否訪存的信號wrMem。含義如下: wrMem 意義 00 寫內存(STORE) 01 讀內存(LOAD) 1 不占用內存 表16 wMEM控制信號 通過檢查“訪存階段”的m_wrMem就可確定是否沖突。 2)取指延后 在每次取指時,若有沖突,則往IR中寫入空指令(NOP),并保持PC不變,使取指延后一個節(jié)拍。 4 各流水段功能和實現的詳細分析 4.1取
13、指(IF) 4.1.1 實現功能列表 取指模塊實現的功能是: l 給定內存地址,讀取內存中的指令 l 將指令送入指令寄存器,提供給下一級的譯碼模塊 l 實現控制相關沖突檢測 l 根據讀取到的指令是否為跳轉指令來更新PC 4.1.2輸入、輸出信號分析 主要輸入信號: Z,C 狀態(tài)寄存器 tempZ,tempC ALU計算出的臨時狀態(tài)位,用于相關沖突檢測 e_setFlag 狀態(tài)寄存器寫使能端,產生于譯碼時。決定是否在執(zhí)行階段根據ALU計算出來的結果改變狀態(tài)位 PCStall 決定是否保持PC不變,由結構相關沖突檢測模塊產生 IFFlush 決定是否往指
14、令寄存器IR里寫入空指令,來自結構相關檢測模塊 OuterDB 內存讀取過來的數據 主要輸出信號: PC_addr PC作為內存地址輸出,用于下一節(jié)拍的取指 d_PCInc1 PC + 1 d_IR 指令寄存器輸出 4.1.3功能實現邏輯 通過分析控制信號我們可以大概了解到取指模塊的功能實現邏輯是如何的。廣義上來說,取指模塊包括結構相關沖突檢測模塊,因為PCStall信號(用來實現IF段對PC的更新)和IFFlush信號(對IR寫入空指令)就來自結構相關沖突檢測模塊。 結構相關檢測模塊叫HazardDetectEntity,其模塊圖如下:
15、 其中輸入信號的含義是: m_wrMem wrMem在訪存階段的值 w_rwMem wrMem在寫回階段的值 d_IR 指令寄存器 通過檢測訪存階段的wrMem信號即可確定是否發(fā)生了結構沖突。 每次取指后,若有沖突,則往IR中寫入空指令(NOP),并保持PC不變,使得取指延后一個節(jié)拍。 除此之外,setFlag信號在此處的作用是,決定用狀態(tài)寄存器輸出Flag還是ALU計算出的臨時狀態(tài)位tFlag來判斷跳轉。 4.2譯碼(ID) 4.2.1 實現功能列表 譯碼模塊實現的功能是: l 讀取指令寄存器中的指令 l 對指令進行譯碼,發(fā)送控制信號
16、 4.2.2輸入、輸出信號分析 主要輸入信號: d_IR 從取指模塊來的指令 d_PCInc1 從取指模塊來的pc+1 w_wbData 寫回數據,從寫回模塊里來 w_destReg 要寫回的目標寄存器 w_wRegEn 寄存器寫使能端 主要輸出信號: e_RAOut 寄存器A輸出值 e_RBOut 寄存器B輸出值 e_IMM 立即數輸出值 e_ALUSrc ALU輸入端選擇信號 e_ALUOpr ALU運算選擇信號 e_SetFlag 狀態(tài)寄存器寫使能信號 e_wrMem 訪存信號 e_wRegEn 寄存器寫使能信號
17、 e_destReg 目標寄存器 e_MemToReg 內存寫入寄存器使能信號 4.2.3功能實現邏輯 譯碼模塊內部寫好了根據不同的指令發(fā)送不同的控制信號的代碼,采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數據(如立即數)。在每次時鐘上升沿到來時送入下一級。實際上,結構相關、控制相關、數據相關的檢測都可歸入譯碼部分。考慮到“相關檢測”涉及到的信號分屬不同階段以及整體結構的清晰性,作者將“相關檢測”獨立出來。 4.3執(zhí)行(EX) 4.3.1 實現功能列表 執(zhí)行模塊實現的功能是: l 根據控制信號完成算術邏輯運算 l 根據控制信號計算有效地址 l 提
18、供數據通道,將上一級傳遞過來的控制信號傳到下一級 4.3.2輸入、輸出信號分析 主要輸入信號: e_RAOut、e_RBOut、e_ALUSrc、e_ALUOpr、e_SetFlag、e_IMM、e_memToReg、 e_wRegEn、、 來自譯碼模塊的控制信號 forwardA、forwardB 來自數據相關沖突檢測模塊的輸出 e_ALUOut 上一個指令在執(zhí)行模塊產生的輸出,作為下一條指令在執(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功能實現邏輯 執(zhí)行模塊執(zhí)行的功能很簡單,和上個學期做的CPU綜合性實驗類似,主要是一些ALU邏輯運算和狀態(tài)寄存器的更新操作。在這里還有向下一模塊傳遞控制信號的作用。 其中,forwardA和forwardB信號是來自數據相關沖突檢測模塊的信號。 模塊圖如下所示: 作用是在發(fā)生讀后寫數據相關時,直接將計算好了的結果在寫回目標寄存器時也發(fā)往下一條指令的執(zhí)行模塊作為ALU的輸入之一。 4.4訪存(MEM) 4.4.1 實現功能列表 訪存模塊實現的功能是: l 根據地址線對
20、內存進行讀操作或者寫操作 4.4.2輸入、輸出信號分析 主要輸入信號: m_wrMem 內存讀寫控制信號 m_ALUOut 來自ALU的輸出結果 m_RBdata 要寫回的數據 PC 程序計數器的值 主要輸出信號: w_wrMem 傳送到寫回模塊的內存讀寫控制信號 wr 讀寫控制信號 addr 要讀取的內存地址 OuterDB 既可作為輸入又可作為輸出,用于傳輸數據 4.4.3功能實現邏輯 訪存和取指在功能上是獨立的,但是因為CPU對外只有一條地址線和數據線,因此訪存和取指在實際上是有聯(lián)系和沖突的。當執(zhí)行Load/Store指令時
21、,地址線由ALU送入訪存段的值提供;取指時,則由PC提供。當寫內存時,CPU內部數據送往數據線。當需要讀內存時,CPU往數據線送高阻。 4.5寫回(WB) 4.5.1 實現功能列表 寫回模塊實現的功能是: l 選擇寫回數據源(來自ALU的輸出還是來自內存) l 根據寫使能信號wRegEn將數據寫回到寄存器組 4.5.2輸入、輸出信號分析 主要輸入信號: s_w_ALUOut ALU的輸出 s_w_MemOut 內存讀取的輸出 s_w_memToReg 決定寫入寄存器的數據來源 s_w_flag 要寫進狀態(tài)寄存器的值 4.5.3功能實現邏輯 此部
22、分較為簡單,即通過s_w_memToReg信號來決定是將ALU的輸出寫進寄存器還是將從內存讀出來的數據寫進寄存器。 模塊圖如下: 5 系統(tǒng)改造 5.1新的指令系統(tǒng) 匯編語句 操作碼 功能描述 指令類型 ADD DR,SR 0000 DR+SRDR 算術邏輯指令 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(立即數)DR,存立即數進寄存器 數據傳送指令 MOV DR,SR 1001 SR DR LOAD DR,SR 1010 [SR] DR STORE DR,SR 1011 SR [DR] JR ADR 1100 無條件跳轉到ADR , ADR=原PC值+OFFSET 控制轉移指令 JRC
24、 ADR 1101 當C=1時,跳轉到ADR, ADR=原PC值+OFFSET JRZ ADR 1110 當Z=1時,跳轉到ADR, ADR=原PC值+OFFSET NOP 1111 空操作 其他 5.1.1選擇改動說明 包括NOP空操作指令在內指令系統(tǒng)共包括16條指令,在原有的25條指令的基礎上刪除了10條,新增了1條。具體地,刪除了DEC,INC,TEST,SAR,PUSH,POP,JRNC,JRNZ,LOADH,LOADL,新增了一條數據傳送指令MOVI。 5.2修改的代碼及說明 1)代碼段1,新增內存模塊memory.vhd --內存 -
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); --數據總線 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"; …… --此處將程序寫進內存中,省略 ram(15) <= JR & "1110"; END IF; --讀寫功能
27、的實現 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; 內存模塊使用vhdl編寫,內存由ram組成,讀出數據線和寫入數據線為同一條數據總線,因此不能同時進行讀寫。因為這樣所以會產生結構相關,即在取指的時候不可以訪存,否則會產生沖突。內存讀寫功能由wr
28、信號進行控制,當wr為0時執(zhí)行寫功能,當wr為1時執(zhí)行讀功能。 2) 代碼段2,取指模塊ifentity.vhd op <= IR(7 downto 4); --操作碼取指令的高4位 --控制相關信號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, --由于跳轉信號中只保留了JR、JRC、JRZ,因此此處只判
29、斷該3個OP s_selZ <= 1 WHEN( op=JRZ AND ZZ=1) --判斷是否跳轉 OR op=JR else 0; s_selC <= 1 WHEN( op=JRC AND CC=1) --判斷是否跳轉 else 0; PCIncSel <= 1 WHEN s_selZ=1 or s_selC=1 ELSE 0; s_PCInc
30、1 <= PC + x"01"; --此處修改了PC位數 WITH PCIncSel SELECT --當有跳轉時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位數 elsif FALLING_EDGE(clk) and (PCStall=0) then PC <= PCnext; end if; end process; 取指模塊主要修改了與pc相關的地址信號的位數和跳轉判斷,由于修改指令系統(tǒng)時只保留了JR/JRC/JRZ3條跳轉指令,因此在跳轉判斷時只考慮該3條跳轉指令,根據跳轉判斷來選擇如何更新pc的值。 1) 代碼段1,執(zhí)行模塊exentity.vhd ,,,case e_ALUOpr is --選擇ALU的運
32、算,此處主要修改了位數,邏輯功能不變 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功能選擇信號及其處理實現 when aluMOVI => ALUResult := "00000"&opS(3 downto 0); when others => null; end case; 修改了alu選擇信號以及alu功能信號的判斷邏輯,以及狀態(tài)寄存器的判斷邏輯,之所以修改是因為位數的修改。除此以外還增加了aluMOVI的alu功能
35、信號及其對應的邏輯功能實現。 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); --修改了操作碼的長度 --譯碼產生的信號: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的位數,并根據“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 測試與總結 6.1 規(guī)則文件(cpu.txt的內容)
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"; -- 跳轉到15號地址 ram(14) <= MOVI & R3 & "11"; -- 如果跳轉則不執(zhí)行該指令 ram(15) <= STORE & R3 & R0; -- 0號地址的內容變?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 測試結果 測試環(huán)境 測試程序 測試結果 五級流水 Quartus 程序1 正確 6.4 測試總結 試程序的結果都與預期相符,證明測試結果是正確的。 7 本課程設計的總結 7.1 A同學總結 由于上一學期在計算機組成原理的綜合性實驗中擔當了主力隊員,對cpu的基本組織結構也算是十分了解,因此該學期主動擔當了組長。然而事實并沒有那么簡單,當第一次看到代碼時發(fā)現,由于上次綜合性實驗大部分通過畫圖連線實現,邏輯功能十分明確,一目了然,然而該學期的cpu頂層實體是通過vhdl代碼實現的,因此初期花了不少時間
46、在了解代碼的語法以及邏輯功能上,完成此步以后,我們組開展了對3種相關進行詳細分析。弄清楚流水CPU的實現原理后,后續(xù)的修改工作就十分簡單了。一開始我們是采用機箱+DebugController的方式進行調試,后來由于實驗室的機箱資源有限,便再次采取了用Quartus的時序功能仿真來調試,并添加了內存模塊。 7.2B同學總結 在此次課程設計中,我主要:參與修訂指令系統(tǒng);負責數據相關模塊的修改;負責譯碼和訪存模塊的修改;負責MOVI指令的增加,主要是在常量定義文件unitpack里增加MOVI的op 碼常量以及aluMOVI的alu功能選擇信號,并在譯碼模塊增加MOVI的控制信號及相關代碼;負責擴展常量定義文件。在組長的組織下循序漸進,大部分不懂得問題都能夠通過討論解決。 7.3 C同學總結 在這次的計算機組成原理課程設計里,我負責的是:參與修訂指令系統(tǒng);負責結構相關模塊的修改;負責執(zhí)行模塊和寫回模塊的修改;負責新頂層實體cpum.bdf文件的接線,主要是在創(chuàng)建了cpuentity和memory的bsf文件后,新建cpum.bdf文件并將上述兩個原件加入,利用Quartus的接線功能將原件連接起來。 26
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。