版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
數(shù)字系統(tǒng)設(shè)計實驗--流水線MIPS微處理器設(shè)計(完整版)資料(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
一、實驗?zāi)康臄?shù)字系統(tǒng)設(shè)計實驗--流水線MIPS微處理器設(shè)計(完整版)資料(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)(1)了解提高CPU性能的方法。(2)理解數(shù)據(jù)冒險、控制冒險的概念以及流水線沖突的解決方法。(3)掌握流水線MIPS微處理器的工作原理。(4)掌握流水線MIPS微處理器的測試方法。二、實驗任務(wù)設(shè)計一個32位流水線MIPS微處理器,具體要求如下設(shè)計要求:(1)至少執(zhí)行下列MIPS32指令。算數(shù)運算指令:ADDADDUSUBSUBUADDIADDU邏輯運算指令:ANDORNORXORANDIORIXORISLTSLTISLTUSLTIU移位指令:SLLSLLVSRLSRLVSRA條件分支指令:BEQBNEBGEZBGTZBLEZBLTZ無條件跳轉(zhuǎn)指令:JJR數(shù)據(jù)傳輸指令:LWSW空指令:NOP(2)在用5級流水線技術(shù),對數(shù)據(jù)冒險實現(xiàn)轉(zhuǎn)發(fā)或阻塞功能。(3)在XUPVietex-IIPro開發(fā)系統(tǒng)中實現(xiàn)MIPS微處理器,要求CPU的運行速度大于25MHz.三、實驗原理1.流水線MIPSCPU總體設(shè)計流水線是數(shù)字系統(tǒng)中一種提高系統(tǒng)穩(wěn)定性和工作速度的方法,廣泛應(yīng)用在高檔CPU的構(gòu)建中。根據(jù)MIPS處理器指令的特點,將整體的處理過程分為取指令(IF)、指令譯碼、執(zhí)行、存儲器訪問和寄存器寫回五級,對應(yīng)多周期CPU的五個處理階段。如圖1所示,一個指令的執(zhí)行需要五個時鐘周期,每個時鐘周期上升沿來臨時,此指令所代表的一系列數(shù)據(jù)和控制信息轉(zhuǎn)移到下一級處理。圖1流水線流水作業(yè)示意圖一條MIPS指令分為五個處理步驟,即五級流水線,的具體執(zhí)行過程如圖2所示。圖2五級流水線MIPSCPU初步原理框圖流水線寄存器:為了在其它四級流水線中各條指令保持各自的值,從指令存儲器中讀出的指令必須保存在寄存器中。同樣的方法應(yīng)用到每個流水線步驟中,需要在上圖中各級之間加入寄存器,如圖3所示。圖3.在各級分割線添加寄存器后的框圖由于在流水線中,數(shù)據(jù)和控制信息將在時鐘上升沿轉(zhuǎn)移到下一級,所以規(guī)定流水線轉(zhuǎn)移的變量命名遵守如下格式:名稱_流水線級名稱。例如,在ID級指令譯碼電路(DECODE)產(chǎn)生的寄存器寫允許信號RegWrite在ID級、EX級、MEM級和WB級上的命名分別為RegWrite_id、RegWrite_ex、RegWrite_men和RegWrite_wb。在頂層文件中,類似的變量名稱有近百個,這樣的命名方式起到了很好的識別作用。1.MIPS指令格式:①R型指令格式本實驗需要實現(xiàn)的R型指令有:I)算術(shù)邏輯運算指令: ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、SLTUII)移位指令:SLLV、SRLV、SRAV、SLL、SRL、SRAIII)寄存器跳轉(zhuǎn)指令:JR②I型指令格式本實驗需要實現(xiàn)的I型指令有:I)存儲器訪問指令:LW、SWII)立即數(shù)算術(shù)邏輯運算指令:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIUIII)分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ分支地址為:PC+4+(sign-extend(Imm)<<2)③J型指令格式本實驗需要實現(xiàn)的J型指令只有:無條件跳轉(zhuǎn)指令:J跳轉(zhuǎn)地址為:{PC[31:28],IR[25:0],2’b00}特別注意:寄存器跳轉(zhuǎn)指令JR不是J型指令,而是R型指令,其指令格式為:跳轉(zhuǎn)地址為:$ra,寄存器號為rs移位指令SLL、SRL、SRA只有rt一個源操作數(shù):3、取字指令的操作過程:rt<=Mem[rs+sign_extend(imm)]存字指令的操作過程:Mem[rs+sign_extend(imm)]<=rt4、I型指令中立即數(shù)算術(shù)邏輯運算指令對立即數(shù)(Imm)的處理應(yīng)分為兩類情況考慮:當指令為ADDI、ADDIU、SLTI、SLTIU時,指令中的16位立即數(shù)(Imm)應(yīng)做符號擴展為32位。此符號擴展電路在ID級完成。當指令為ANDI、ORI、XORI時,Imm應(yīng)做“0”擴展為32位??紤]到資源的限制,在執(zhí)行ANDI、ORI、XORI指令時,“0”擴展功能放在ALU內(nèi)部(即EX級)完成。流水線中的控制信號為保證CPU按照指令正常運行,分別設(shè)置各個級的控制信號:IF級:取指令級。從ROM中讀取指令,并在下一個時鐘沿到來時把指令送到ID級的指令緩沖器中。該級控制信號決定下一個指令指針的PCSource信號、阻塞流水線的PC_IFwrite信號、清空流水線的IF_flush信號。ID級:指令譯碼器。對IF級來的指令進行譯碼,并產(chǎn)生相應(yīng)的控制信號。整個CPU的控制信號基本都是在這級上產(chǎn)生。該級自身不需任何控制信號。流水線冒險檢測也在該級進行,冒險檢測電路需要上一條指令的MemRead,即在檢測到冒險條件成立時,冒險檢測電路產(chǎn)生stall信號清空ID/EX寄存器,插入一個流水線氣泡。(3)EX級:執(zhí)行級。該級進行算術(shù)或邏輯操作。此外LW、SW指令所用的RAM訪問地址也是在本級上實現(xiàn)。控制信號有ALUCode、ALUSrcA、ALUScrB和RegDst,根據(jù)這些信號確定ALU操作、選擇兩個ALU操作數(shù)A、B,并確定目標寄存器。另外,數(shù)據(jù)轉(zhuǎn)發(fā)也在該級完成。數(shù)據(jù)轉(zhuǎn)發(fā)控制電路產(chǎn)生ForwardA和ForwardB兩組控制信號。(4)MEM級:存儲器訪問級。只有在執(zhí)行LW、SW指令時才對存儲器進行讀寫,對其他指令只起到一個周期的作用。該級只需存儲器寫操作允許信號MemWrite。(5)WB級:寫回級。該級把指令執(zhí)行的結(jié)果回寫到寄存器文件中。該級設(shè)置信號MemtoReg和寄存器寫操作允許信號RegWrite,其中MemtoReg決定寫入寄存器的數(shù)據(jù)來自于MEM級上的緩沖值或來自于MEM級上的存儲器。3、流水線冒險在流水線CPU中,多條指令通知執(zhí)行,由于各種各樣的原因,在下一個時鐘周期中下一條指令不能執(zhí)行,這種情況稱為冒險。冒險分為三類:①結(jié)構(gòu)冒險:硬件不支持多條指令在同一個時鐘周期內(nèi)執(zhí)行。MIPS指令集專為流水線設(shè)計,因此在MIPSCPU中不存在此類冒險。②數(shù)據(jù)冒險:在一個操作必須等待另一操作完成后才能進行時,流水線必須停頓,這種情況稱為數(shù)據(jù)冒險。數(shù)據(jù)冒險分為兩類:ⅰ數(shù)據(jù)相關(guān):流水線內(nèi)部其中任何一條指令要用到任何其他指令的計算結(jié)果時,將導(dǎo)致數(shù)據(jù)冒險。通??梢杂脭?shù)據(jù)轉(zhuǎn)發(fā)(數(shù)據(jù)定向)來解決此類冒險。ⅱ數(shù)據(jù)冒險:此類冒險發(fā)生在當定向的目標階段在時序上早于定向的源階段時,數(shù)據(jù)轉(zhuǎn)發(fā)無效。通常是引入流水線阻塞,即氣泡(bubble)來解決。。③控制冒險:CPU需要根據(jù)分支指令的結(jié)果做出決策,而此時其他指令可能還在執(zhí)行中,這時會出現(xiàn)控制冒險,也稱為分支冒險。解決此類冒險的常用方法是延遲分支。3.1數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)下面通過具體例子來闡述數(shù)據(jù)相關(guān)。見圖3.1圖3.圖3.1數(shù)據(jù)相關(guān)性后4條指令都依賴于第一條指令得到寄存器$2的結(jié)果,但sub指令要在第五周期才寫回寄存器$2,但在第三、四、五個時鐘周期$2分別要被and、or和add三個指令用到,所以這三個指令得到的是錯誤的未更新的數(shù)據(jù),會引起錯誤的結(jié)果;而第六個時鐘周期$2要被sw指令用到,此時得到的才是正確的已更新的數(shù)據(jù)。這種數(shù)據(jù)之間的互相關(guān)聯(lián)引起的冒險就是數(shù)據(jù)相關(guān)??梢钥闯觯斠粭l依賴關(guān)系的方向與時間軸的方向相反時,就會產(chǎn)生數(shù)據(jù)冒險。(1)一階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)(EX冒險)首先討論指令sub與and之間的相關(guān)問題。sub指令在第五周期寫回寄存器$2,而and指令在第四周期就對sub指令的結(jié)果$2提出申請,顯然將得到錯誤的未更新的數(shù)據(jù)。像這類第I條指令的源操作寄存器與第I-1條指令(即上一條指令)的目標寄存器相重,導(dǎo)致的數(shù)據(jù)相關(guān)稱為一階數(shù)據(jù)相關(guān)。見圖3.2中實線所示。圖3.2一階數(shù)據(jù)相關(guān)實例圖可以發(fā)現(xiàn),sub指令的結(jié)果其實在EX級結(jié)尾,即第三周期末就產(chǎn)生了;而and指令在第四時鐘周期向sub指令結(jié)果發(fā)出請求,請求時間晚于結(jié)果產(chǎn)生時間,所以只需要sub指令結(jié)果產(chǎn)生之后直接將其轉(zhuǎn)發(fā)給and指令就可以避免一階數(shù)據(jù)相關(guān)。如圖3.3虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為ALUResult_mem數(shù)據(jù)轉(zhuǎn)發(fā)由Forwardingunit單元控制,判斷轉(zhuǎn)發(fā)條件是否成立。轉(zhuǎn)發(fā)機制硬件實現(xiàn)見圖3.3。圖3.3轉(zhuǎn)發(fā)機制的硬件實現(xiàn)轉(zhuǎn)發(fā)條件ForwardA、ForwardB作為數(shù)據(jù)選擇器的地址信號,轉(zhuǎn)發(fā)條件不成立時,ALU操作數(shù)從ID/EX流水線寄存器中讀?。晦D(zhuǎn)發(fā)條件成立時,ALU操作數(shù)取自數(shù)據(jù)旁路。轉(zhuǎn)發(fā)條件:MEM級指令是寫操作,即RegWrite_mem=1;MEM級指令寫回的目標寄存器不是$0,即RegWriteAddr_mem≠0;MEM級指令寫回的目標寄存器與在EX級指令的源寄存器是同一寄存器,即RegWriteAddr_mem=RsAddr_ex或RegWriteAddr_mem=RtAddr_ex。(2)二階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)(MEM冒險)現(xiàn)在討論sub指令與or指令之間的相關(guān)問題。sub指令在第5時鐘周期寫回寄存器,而or指令也在第5時鐘周期對sub指令的結(jié)果提出了請求,很顯然or指令讀取的數(shù)據(jù)是未被更新的錯誤內(nèi)容。這類數(shù)據(jù)相關(guān)稱為二階數(shù)據(jù)相關(guān)。見圖3.4中實線所示。圖3.4二階數(shù)據(jù)相關(guān)實例圖如前所述,or指令在第五時鐘周期向sub指令結(jié)果發(fā)出請求時,sub指令的結(jié)果已經(jīng)產(chǎn)生。所以,我們同樣采用“轉(zhuǎn)發(fā)”,即通過MEM/WB流水線寄存器,將sub指令結(jié)果轉(zhuǎn)發(fā)給or指令,而不需要先寫回寄存器堆。如圖3.4中虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為RegWriteData_wb轉(zhuǎn)發(fā)條件:WB級指令是寫操作,即RegWrite_wb=1;WB級指令寫回的目標寄存器不是$0,即RegWriteAddr_wb≠0;WB級指令寫回的目標寄存器與在EX級指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_ex或RegWriteAddr_wb=RtAddr_ex;EX冒險不成立,即RegWriteAddr_mem≠RsAddr_ex或RegWriteAddr_mem=RtAddr_ex。(3)三階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)最后討論sub指令與add指令之間的相關(guān)問題。sub指令與add指令在第五時鐘周期內(nèi)同時讀寫同一個寄存器。這類數(shù)據(jù)相關(guān)稱之為三階數(shù)據(jù)相關(guān)。如圖3.5中實線所示。圖3.5三階數(shù)據(jù)相關(guān)實例圖假設(shè)寄存器的寫操作發(fā)生在時鐘周期的上升沿,而讀操作發(fā)生在時鐘周期的下降沿,那么讀操作將讀取到最新寫入的內(nèi)容。在這種假設(shè)條件下將不會發(fā)生數(shù)據(jù)冒險。這就要求流水線中的寄存器具有“先寫后讀(ReadAfterWrite)”的特性。這類“寫操作發(fā)生在時鐘周期的上升沿,讀操作發(fā)生在時鐘周期的下降沿”的寄存器雖然在理論上是可實現(xiàn)的,但是不適合應(yīng)用于同步系統(tǒng),因為它不但影響系統(tǒng)的運行速度,而且影響系統(tǒng)的穩(wěn)定性,是不可取的。因此,我們采用“轉(zhuǎn)發(fā)”機制來解決三階數(shù)據(jù)相關(guān)冒險。該部分轉(zhuǎn)發(fā)電路我們放在寄存器堆的設(shè)計中完成。如圖3.5中虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為RegWriteData_wb。轉(zhuǎn)發(fā)條件為:WB級指令是寫操作,即RegWrite_wb=1;WB級指令寫回的目標寄存器不是$0,即RegWriteAddr_wb≠0;WB級指令寫回的目標寄存器與在ID級指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_id或RegWriteAddr_wb=RtAddr_id。3.2數(shù)據(jù)冒險與阻塞當一條指令試圖讀取一個寄存器,而它前一條指令是lw指令,并且該lw指令寫入的是同一個寄存器時,定向轉(zhuǎn)發(fā)的方法就無法解決問題。如圖3.6所示這類冒險不同于數(shù)據(jù)相關(guān)冒險,需要單獨一個“冒險檢測單元(HazardDetector)”,它在ID級完成。冒險成立的條件為:上一條指令是lw指令,即MemRead_ex=1;在EX級的lw指令與在ID級的指令讀寫的是同一個寄存器,即RegWriteAddr_ex=RsAddr_id或RegWriteAddr_ex=RtAddr_id。冒險的解決:引入流水線阻塞當HazardDetector檢測到冒險條件成立時,在lw指令和下一條指令之間插入阻塞,即流水線氣泡(bubble),使后一條指令延遲一個時鐘周期執(zhí)行,這樣就將該冒險轉(zhuǎn)化為二階數(shù)據(jù)相關(guān),可用轉(zhuǎn)發(fā)解決。如圖3.7所示。圖3.7流水線氣泡的引入需要注意的是,如果處于ID級的指令被阻塞,那么處于IF級的指令也必須阻塞,否則,處于ID級的指令就會丟失。防止這兩條指令繼續(xù)執(zhí)行的方法是:保持PC寄存器和IF/ID流水線寄存器不變,同時插入一個流水線氣泡。具體實現(xiàn)方法如下:流水線氣泡的插入:在ID級檢測到冒險條件時,HazardDetector輸出一個信號:stall,將ID/EX流水線寄存器中的EX、MEM和WB級控制信號全部清零。這些信號傳遞到流水線后面的各級,由于控制信號均為零,所以不會對任何寄存器和存儲器進行寫操作。保持PC寄存器和IF/ID流水線寄存器不變:在ID級檢測到冒險條件時,HazardDetector輸出一個信號:PC_IFWrite,作為使能信號同時送給PC寄存器和IF/ID流水線寄存器。冒險成立時,該信號為低電平,禁止PC寄存器和IF/ID流水線寄存器接收新數(shù)據(jù)。3.3分支冒險還有一類冒險是包含分支的流水線冒險,下圖。圖3.8分支冒險實例流水線每個時鐘周期都得取指令才能維持運行,但分支指令必須等到MEM級才能確定是否執(zhí)行分支。這種為了確定預(yù)取正確的指令而導(dǎo)致的延遲叫做控制冒險或分支冒險。一種比較普遍的提高分支阻塞速度的方法是假設(shè)分支不發(fā)生,并繼續(xù)執(zhí)行順序的指令流。如果分支發(fā)生的話,就丟棄已經(jīng)預(yù)取并譯碼的指令,指令的執(zhí)行沿著分支目標繼續(xù)。由于分支指令直到MEM級才能確定下一條指令的PC,這就意味著為了丟棄指令必須將流水線中的IF、ID和EX級的指令都清除掉(flush)。這種優(yōu)化方法的代價較大,效率較低。如果我們能在流水線中提前分支指令的執(zhí)行過程,那么就能減少需要清除的指令數(shù)。這是一種提高分支效率的方法,降低了執(zhí)行分支的代價。因此我們采用提前分支指令的方法解決分支冒險。提前分支指令需要提前完成兩個操作:計算分支的目的地址:由于已經(jīng)有了PC值和IF/ID流水線寄存器中的指令值,所以可以很方便地將EX級的分支地址計算電路移到ID級。我們針對所有指令都執(zhí)行分支地址的計算過程,但只有在需要它的時候才會用到。判斷分支指令的跳轉(zhuǎn)條件:我們將用于判斷分支指令成立的Zero信號檢測電路(Ztest)從ALU中獨立出來,并將它從EX級提前至ID級。具體的設(shè)計將在ID級設(shè)計中介紹。在提前完成以上兩個操作之外,我們還需丟棄IF級的指令。具體做法是:加入一個控制信號IF_flush,做為IF/ID流水線寄存器的清零信號。當分支冒險成立,即Z=1,則IF_flush=1,否則IF_flush=0,故IF_flush=Z。考慮到本系統(tǒng)還要實現(xiàn)的無條件跳轉(zhuǎn)指令:J和JR,在執(zhí)行這兩個指令時也必須要對IF/ID流水線寄存器進行清空,因此,IF_flush的表達式應(yīng)表示為:IF_flush=Z||J||JR。綜合以上分析,最終的無冒險的流水線MIPSCPU原理框圖如圖3.9。圖3.9無冒險的流水線MIPSCPU總體原理框圖四、流水線MIPS微處理器的設(shè)計根據(jù)流水線不同階段,將系統(tǒng)劃分為IF、ID、EX和MEM四大模塊,WB部分功能電路非常簡單,可直接在頂層文件中設(shè)計。另外,系統(tǒng)還包括IF/ID、ID/EX、EX/MEM、MEM/WB四個流水線寄存器。1、取指令級模塊(IF)的設(shè)計IF模塊由指令指針寄存器PC、指令存儲器子模塊InstructionROM、指令指針選擇器MUX和一個32位加法器組成,IF級模塊接口信息如下表所示:引腳名稱方向說明clkInput系統(tǒng)時鐘reset系統(tǒng)復(fù)位信號,高電平有效Z分支指令的條件判斷結(jié)果J跳轉(zhuǎn)指令JR寄存器跳轉(zhuǎn)指令PC_IFWrite阻塞流水線的信號,低電平有效JumpAddr[31:0]J指令跳轉(zhuǎn)地址JrAddr[31:0]JR指令跳轉(zhuǎn)地址BranchAddr[31:0]條件分支地址Instruction_if[31:0]Output指令機器NextPC_if[31:0]下一個PC值指令存儲器ROM用XilinxCOREGenerator實現(xiàn)產(chǎn)生的ROM無法滿足流水線CPU的指令要求,我們需用VerilogHDL設(shè)計一個ROM陣列??紤]到FPGA的資源,指令存儲器可設(shè)計為容量各為26×32bit的ROM。設(shè)計ROM時需將測試的機器碼寫入,課程提供一段簡單測試程序的機器碼,機器碼存于PipelineDemo.coe文件中。課程已提供該ROM的代碼,已設(shè)計好上述測試程序機器碼的指令存儲器,文件名為InstructionROM.v。指令指針選擇器(PC)指令指針選擇器為一8選1數(shù)據(jù)選擇器,選擇信號為PCSource={JR,J,Z},具體含義如下表:地址PC來源{JR,J,Z}=100JR指令的跳轉(zhuǎn)地址{JR,J,Z}=010J指令的跳轉(zhuǎn)地址{JR,J,Z}=001Branch指令的分支地址{JR,J,Z}=000下一條指令地址PC+4PC寄存器當發(fā)生數(shù)據(jù)冒險時,需要保持PC寄存器不變,因此PC寄存器是一個帶使能端的D型寄存器,使能信號為PC_IFWrite。2、指令譯碼模塊(ID)的設(shè)計指令譯碼模塊的主要作用是從機器碼中解析出指令,并根據(jù)解析結(jié)果輸出各種控制信號。ID模塊主要有指令譯碼(Decode)、寄存器堆(Registers)、冒險監(jiān)測、分支檢測和加法器等組成。ID模塊的接口信息如下表所示:引腳名稱方向說明clkInput系統(tǒng)時鐘Instruction_id[31:0]指令機器碼NextPC_id[31:0]指令指針RegWrite_wb寄存器寫允許信號,高電平有效RegWriteAddr_wb[4:0]寄存器的寫地址RegWriteData_wb[31:0]寫入寄存器的數(shù)據(jù)MemRead_ex冒險檢測的輸入RegWriteAddr_ex[4:0]MemtoReg_idOutput決定回寫的數(shù)據(jù)來源(0:ALU1:存儲器)RegWrite_id寄存器寫允許信號,高電平有效MemWrite_id存儲器寫允許信號,高電平有效MemRead_id存儲器讀允許信號,高電平有效ALUCode_id[4:0]決定ALU采用何種運算ALUSrcA_id決定ALU的A操作數(shù)的來源(0:rs1:Sa)ALUSrcB_id決定ALU的B操作數(shù)的來源(0:rt1:Imm)RegDst_id決定Register回寫是采用的地址(rt/rd)StallID/EX寄存器清空信號,高電平插入一個流水線氣泡Z分支指令的條件判斷結(jié)果J跳轉(zhuǎn)指令JR寄存器跳轉(zhuǎn)指令PC_IFWrite阻塞流水線的信號,低電平有效BranchAddr[31:0]條件分支地址JumpAddr[31:0]跳轉(zhuǎn)地址Imm_id[31:0]符號擴展成32位的立即數(shù)Sa_id[31:0]0擴展成32位的移位立即數(shù)RsData_id[31:0]Rs寄存器數(shù)據(jù)RtData_id[31:0]Rt寄存器數(shù)據(jù)RdAddr_id[4:0]Rd寄存器地址RsAddr_id[4:0]Rs寄存器地址RtAddr_id[4:0]Rt寄存器地址指令譯碼(Decode)子模塊的設(shè)計Decode控制器的主要作用是根據(jù)指令確定各個控制信號的值,是一個組合電路。我們將指令分成八類:R_type1:ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、SLTU、SLLV、SRLV、SRAVR_type2:SLL、SRL、SRAJR_type:JRJ_type:JI_type:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIUBranch:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZLW:LWSW:SWDecode輸出的九組控制信號:RegWrite決定是否對寄存器(Registers)進行寫操作。當RegWrite高電平有效時,將數(shù)據(jù)寫入指定的寄存器中。需要寫回寄存器的指令有:LW、R_type1、R_type2和I_type,則RegWrite_id=LW||R_type1||R_type2||I_typeRegDst決定目標寄存器是rt還是rd。當RegDst=0時,rt為目標寄存器;當RegDst=1時,rd為目標寄存器。需要寫回寄存器的指令類型有:LW、R_type1、R_type2和I_type。其中,R_type1和R_type2的目標寄存器是rd,而LW和I_type的目標寄存器是rt。所以:RegDst_id=R_type1||R_type2MemWrite決定是否對數(shù)據(jù)存儲器進行寫操作。當MemWrite有效時,將數(shù)據(jù)寫入數(shù)據(jù)存儲器指定的位置。需要對寫存儲器的指令只有SW,所以:MemWrite_id=SWMemRead決定是否對數(shù)據(jù)存儲器進行讀操作。當MemRead有效時,讀取數(shù)據(jù)存儲器指定位置的數(shù)據(jù)。需要對讀存儲器的指令只有LW,所以:MemRead_id=LWMemtoReg決定寫入寄存器(registers)的數(shù)據(jù)來自ALU還是數(shù)據(jù)存儲器。?當MemtoReg=0時,數(shù)據(jù)來自ALU;當MemtoReg=1時,數(shù)據(jù)來自數(shù)據(jù)存儲器。需要寫回寄存器的指令類型有:LW、R_type1、R_type2和I_type。其中,只有LW寫回寄存器的數(shù)據(jù)取自存儲器,所以:MemtoReg_id=LWALUSrcA決定ALU第一操作數(shù)來源。當ALUSrcA=0時,ALU第一操作數(shù)A(詳見轉(zhuǎn)發(fā)電路設(shè)計);當ALUSrcA=1時,ALU第一操作數(shù)來源于0擴展的用于移位指令的5位sa。八種指令類型中J_tpye、JR_tpye及Branch類型指令沒有使用ALU;其他使用ALU的指令類型中LW、SW、R_type1和I_type均采用的rs作為ALU第一操作數(shù),只有R_type2的第一操作數(shù)采用的是0擴展的sa,所以:ALUSrcA_id=R_type2ALUSrcB決定ALU第二操作數(shù)來源。當ALUSrcB=0時,ALU第二操作數(shù)B。當ALUSrcB=1時,ALU第二操作數(shù)來源于符號擴展的16位Imm。八種指令類型中J_tpye、JR_tpye及Branch類型指令沒有使用ALU。其他使用ALU的指令類型中R_type1和R_type2采用rt作為ALU第二操作數(shù),而LW、SW、I_type的第二操作數(shù)采用的是符號擴展的立即數(shù)Imm段,所以:ALUSrcB_id=LW||SW||I_typePCSource決定寫入PC寄存器的來源。PCSource由JR_tpye、J_tpye及Z決定:即:PCSource={JR,J,Z}?PCSource=000時,寫入值為下一條指令的地址PC+4;?PCSource=001時,寫入值為Branch指令的分支地址;?PCSource=010時,寫入值為J指令的跳轉(zhuǎn)地址;?PCSource=100時,寫入值為JR指令的跳轉(zhuǎn)地址。ALUCode決定ALU的功能,由指令中的op段、rt段和funct段決定。功能表如下:opfunctionrt運算ALUcodeBEQ_opxxxxxxxxxxZ=(A==B)5'd10BNE_opxxxxxxxxxxZ=~(A==B)5'd11BGEZ_opxxxxx5'd1Z=(A>=0)5'd12BGTZ_opxxxxx5'd0Z=(A>0)5'd13BLEZ_opxxxxx5'd0Z=(A<=1)5'd14BLTZ_opxxxxx5'd0Z=(A<0)5'd15R_type_opADD_functxxxxx加5'd0ADDU_functxxxxxAND_functxxxxx與5'd1XOR_functxxxxx異或5'd2OR_functxxxxx或5'd3NOR_functxxxxx或非5'd4SUB_functxxxxx減5'd5SUBU_functxxxxxSLT_OP_functxxxxxA<B?1:05'd19SLTU_OP_functxxxxxA<B?1:0(無符號數(shù))5'd20SLL_functxxxxxB>>A5'd16SLLV_functxxxxxSRL_functxxxxxB<<A5'd17SRLV_functxxxxxSRA_functxxxxxB>>>A5'd18ARAV_functxxxxxADDI_opxxxxxxxxxx加5'd0ADDIU_opxxxxxxxxxxANDI_opxxxxxxxxxx與5'd1XORI_opxxxxxxxxxx異或5'd2ORI_opxxxxxxxxxx或5'd3SLTI_opxxxxxxxxxxA<B?1:05'd19SLTIU_opxxxxxxxxxxA<B?1:0(無符號數(shù))5'd20SW_opxxxxxxxxxx加(計算地址)5'd0LW_opxxxxxxxxxx分支檢測(BranchTest)電路的設(shè)計Zero檢測電路主要用于判斷Branch指令的分支條件是否成立,其中BEQ、BNE兩個操作數(shù)為RsData與RtData,而BGEZ、BGTZ、BLEZ和BLTZ指令則為RsData與常數(shù)0比較,所以輸出信號Z的表達式為:RsData[31]||~(|RsData[31:0]);ALUCode=alu_blezRsData[31];ALUCode=alu_bltz~RsData[31]&&(|RsData[31:0]);ALUCode=alu_bgtzZ=~RsData[31];ALUCode=alu_bgez|(RsData[31:0]^RtData[31:0]);ALUCode=alu_bne&(RsData[31:0]~^RtData[31:0]);ALUCode=alu_beq0;ALUCode=OTHER寄存器堆(Registers)子模塊的設(shè)計寄存器堆由32個32位寄存器組成,這些寄存器通過寄存器號進行讀寫存取。寄存器堆的原理框圖如下圖所示。因為讀取寄存器不會更改其內(nèi)容,故只需提供寄存號即可讀出該寄存器內(nèi)容。讀取端口采用數(shù)據(jù)選擇器即可實現(xiàn)讀取功能。應(yīng)注意“0”號寄存器為常數(shù)0.對于往寄存器里寫數(shù)據(jù),需要目標寄存器號(WriteRegister)、待寫入數(shù)據(jù)(WriteData)、寫允許信號(RegWrite)三個變量。圖3.13中5位二進制譯碼器完成地址譯碼,其輸出控制目標寄存器的寫使能信號EN,決定將數(shù)據(jù)WriteData寫入哪個寄存器。在流水線CPU設(shè)計中,寄存器堆設(shè)計還應(yīng)解決三階數(shù)據(jù)相關(guān)的數(shù)據(jù)轉(zhuǎn)發(fā)問題。當滿足三階數(shù)據(jù)相關(guān)條件時,寄存器具有ReadafterWrite的特性。為實現(xiàn)該功能,在寄存器堆的基礎(chǔ)上加一轉(zhuǎn)發(fā)電路。如下圖所示。圖中轉(zhuǎn)發(fā)檢測電路的輸出表達式為RsSel=RegWrite_wb&&(~(RegWriteAddr_wb==0))&&(RegWriteAddr_wb==RsAddr_id)RtSel=RegWrite_wb&&(~(RegWriteAddr_wb==0))&&(RegWriteAddr_wb==RtAddr_id)冒險檢測功能電路(HazardDeterctor)的設(shè)計冒險成立的條件為:上一條指令是LW指令,即MemRead_ex=1;在EX級的LW指令與在ID級的指令讀寫的是同一個寄存器,即RegWriteAddr_ex=RsAddr_id或RegWriteAddr_ex=RtAddr_id解決冒險的方法為:插入一個流水線氣泡Stall清空ID/EX寄存器并且阻塞流水線ID級、IF級流水線,有:Stall=((RegWriteAddr_ex==RsAddr_id)||(RegWriteAddr_ex==RtAddr_id))&&MemRead_ex保持PC寄存器和IF/ID流水線寄存器不變,有:PC_IFWrite=~Stall其它單元電路的設(shè)計Branch指令分支地址的計算電路:BranchAddr=NextPC_id+(sign-extend(Imm_id)<<2)JR指令跳轉(zhuǎn)地址的計算電路:JRAddr=RsData_idJ指令跳轉(zhuǎn)地址的計算電路:Jaddr={NextPC_id[31:28],IR_id[25:0],2’b00}符號擴展的方法—針對有符號數(shù)?如果最高位(即符號位)是0,則要擴展的高位用0補齊;如果最高位是1,則用1補齊。?例:8位的+1,表示為二進制為,擴展成160擴展的方法—針對無符號數(shù)?要擴展的高位用0補齊。?例:16位二進制0xFFFF,0擴展成32位為0x0000FFFF。3、執(zhí)行模塊(EX)的設(shè)計執(zhí)行模塊主要有ALU子模塊、轉(zhuǎn)發(fā)電路Forwarding以及若干數(shù)據(jù)選擇器組成。這行模塊的接口信息如下表所示:引腳名稱方向說明RegDst_exInput決定Register回寫時采用的地址(rt/rd)ALUCode_ex[4:0]決定ALU采用何種運算ALUSrcA_ex決定ALU的A操作數(shù)的來源(rs/Sa)ALUSrcB_ex決定ALU的B操作數(shù)的來源(rt/Imm)Imm_ex[31:0]立即數(shù)Sa_ex[31:0]移位位數(shù)RsAddr_ex[4:0]Rs寄存器地址,即Instruction_id[25:21]RtAddr_ex[4:0]Rt寄存器地址,即Instruction_id[20:16]RdAddr_ex[4:0]Rd寄存器地址,即Instruction_id[15:11]RsData_ex[31:0]Rs寄存器數(shù)據(jù)RtData_ex[31:0]Rt寄存器數(shù)據(jù)RegWriteData_wb[31:0]寫入寄存器的數(shù)據(jù)ALUResult_mem[31:0]ALU輸出數(shù)據(jù)RegWriteAddr_wb[4:0]寄存器的寫地址RegWriteAddr_mem[4:0]RegWrite_wb寄存器寫允許信號RegWrite_memRegWriteAddr_ex[4:0]Output寄存器的寫地址ALUResult_ex[31:0]ALU運算結(jié)果MemWriteData_ex[31:0]寄存器的回寫數(shù)據(jù)ALU_A[31:0]ALU操作數(shù),測試時使用ALU_B[31:0]ALU子模塊的設(shè)計ALU是提供CPU基本運算能力的重要電路。ALU執(zhí)行何種運算,由控制單元中的ALU控制器輸出的ALUCode信號決定。ALU功能見下表:為了提高運算速度,可將各種運算同時執(zhí)行,得到的運算結(jié)果由ALUCode信號進行挑選。ALU的基本結(jié)構(gòu)如下圖所示。加、減電路的設(shè)計考慮減法、比較(SLT、SLTI)均可用加法器和必要的輔助電路來實現(xiàn)。上圖中的Binvert信號控制加減運算:Binvert=~(ALUCode==alu_add)對ALU來說,它的兩個操作數(shù)輸入時都已經(jīng)是補碼形式,當要完成兩個操作數(shù)的減法時,即A補-B補,可將減法轉(zhuǎn)換為加法,利用加法器來實現(xiàn):A補-B補=A補+(-B補)=A補+(B補)補=A補+(B補)反+1加法器完成的功能為:sum=A+B^{32{Binvert}}+Binvert當Binvert=0時,sum=A+B^0+0=A+B;當Binvert=1時,sum=A+B^{32’b1}+1=A-B;(B^{32’b1}即對B按位取反)即可完成加減運算。由于32位加法器的運算速度影響著CPU頻率的高低,因此設(shè)計一個高速加法器尤為重要,本實驗采用lab7中介紹的32位進位選擇加法器。比較電路的設(shè)計考慮對于比較運算,如果最高為不同,即A[31]≠B[31],則根據(jù)A[31]、B[31]決定比較結(jié)果,但應(yīng)注意有符號數(shù)和無符號數(shù)比較運算的區(qū)別。1、在有符號數(shù)比較SLT運算中,判斷A<B的方法為:若A為負數(shù)、B為0或正數(shù):A[31]&&(~B[31])若A、B符號相同,A-B為負:(A[31]~^B[31])&&sum[31]則SLTResult=(A[31]&&(~B[31]))||((A[31]~^B[31])&&sum[31])2、在無符號數(shù)比較SLT運算中,判斷A<B的方法為:若A最高位為0、B最高位為1:(~A[31])&&B[31]若A、B最高位相同,A-B為負:(A[31]~^B[31])&&sum[31]則SLTResult=((~A[31])&&B[31])||((A[31]~^B[31])&&sum[31])算術(shù)右移運算電路的設(shè)計考慮VerilogHDL的算術(shù)右移的運算符為“>>>”。要實現(xiàn)算術(shù)右移應(yīng)注意,被移位的對象必須定義為reg類型,但是在SRA指令,被移位的對象操作數(shù)B為輸入信號,不能定義為reg類型,因此必須引入reg類型中間變量B_reg,相應(yīng)的VerilogHDL語句為:regsigned[31:0]B_reg;always@(B)beginB_reg=B;end引入reg類型的中間變量B_reg后,就可對B_reg進行算術(shù)右移操作。邏輯運算與、或、或非、異或、邏輯移位等運算較為簡單,只是要注意一點,ANDI、XORI、ORI三條指令的立即數(shù)為16位無符號數(shù),應(yīng)“0擴展”為32位無符號數(shù),在運算的同時完成“0擴展”。如:ADDI指令的運算為A&{16’b0,B[15:0]}。轉(zhuǎn)發(fā)電路Forwarding的設(shè)計操作數(shù)A和B由數(shù)據(jù)選擇器決定,數(shù)據(jù)選擇器的地址信號即為ForwardA和ForwardB。其含義如下表:地址操作數(shù)來源說明ForwardA=00RsData_ex操作數(shù)A來自寄存器堆ForwardA=01RegWriteData_wb操作數(shù)A來自二階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardA=10ALUresult_mem操作數(shù)A來自一階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardB=00RtData_ex操作數(shù)B來自寄存器堆ForwardB=01RegWriteData_wb操作數(shù)B來自二階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardB=10ALUresult_mem操作數(shù)B來自一階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardA[0]=RegWrite_wb&&(RegWriteAddr_wb!=0)&&(RegWriteAddr_mem!=RsAddr_ex)&&(RegWriteAddr_wb==RsAddr_ex);ForwardA[1]=RegWrite_mem&&(RegWriteAddr_mem!=0)&&(RegWriteAddr_mem==RsAddr_ex);ForwardB[0]=RegWrite_wb&&(RegWriteAddr_wb!=0)&&(RegWriteAddr_mem!=RtAddr_ex)&&(RegWriteAddr_wb==RtAddr_ex);ForwardB[1]=RegWrite_mem&&(RegWriteAddr_mem!=0)&&(RegWriteAddr_mem==RtAddr_ex);四、存儲器訪問MEM模塊的設(shè)計數(shù)據(jù)存儲器利用XilinxCoreGenerator實現(xiàn)??紤]到FPGA的資源,數(shù)據(jù)存儲器可設(shè)計為容量各為26×32bit單端口RAM。由于MIPS系統(tǒng)的32位字地址由4個字節(jié)組成,根據(jù)“對齊限制”要求字地址必須是4的倍數(shù),也就是說字地址的低兩位必須是0,所以字地址的低兩位不接入電路。故我們設(shè)計的數(shù)據(jù)RAM的地址應(yīng)該接的信號是ALUResult_mem[7:2]。由于Virtex-IIPro系列的FPGA只能產(chǎn)生帶寄存器的內(nèi)核RAM,所以存儲器輸出繞過MEM/WB流水線寄存器,直接接入WB級的數(shù)據(jù)選擇器。五、流水線寄存器的設(shè)計流水線寄存器負責(zé)將流水線的各部分分開,共有IF/ID、ID/EX、EX/MEM、MEM/WB四組。根據(jù)前面的介紹可知,四組流水線寄存器要求不完全相同,因此設(shè)計也有不同考慮。(1)EX/MEM、MEM/WB兩組流水線寄存器只是普通D型寄存器。(2)當流水線發(fā)生數(shù)據(jù)冒險時,需清空ID/EX流水線寄存器而插入一個氣泡,因此ID/EX流水線寄存器是一個帶同步清零功能的D型寄存器,清零信號為Stall。(3)當流水線發(fā)生數(shù)據(jù)冒險時,需保持IF/ID流水線寄存器不變,因此IF/ID流水線寄存器具有使能信號輸入,使能信號為PC_IFWrite;當流水線發(fā)生分支冒險時,需清空IF/ID流水線寄存器,清零信號為IF_flush。因此,IF/ID流水線寄存器是一個帶使能功能、同步清零功能的D型寄存器。需要注意的是,由于仿真對初始值的要求,上述寄存器都應(yīng)考慮有reset信號的接入,以提供仿真時各寄存器的初值。六、頂層文件的設(shè)計按照流水線MIPS微處理器的原理框圖連接各模塊即可。為方便測試,可將關(guān)鍵變量輸出,關(guān)鍵變量有:指令指針PC、指令碼Instruction、流水線插入氣泡標志Stall、分支標志JumpFlag(即{JR,J,Z})、ALU輸入輸出(ALU_A、ALU_B、ALUResult)和數(shù)據(jù)存儲器的輸出MemDout_wb。五、實驗代碼見上傳的solution六、實驗設(shè)備裝有ISE、ModelSimSE和ChipScopePro軟件的計算機;XUPVirtex-ⅡPro開發(fā)系統(tǒng)一套;SVGA顯示器一臺。實驗仿真結(jié)果與分析1.IF級仿真分析1.1順序執(zhí)行分析:起初reset信號高電平,初始PC為0。在之后的一段時間內(nèi),{JR,J,Z}一直都是{0,0,0},沒有跳轉(zhuǎn)和分支指令,CPU每運行一周期,PC遞增4。1.2JR跳轉(zhuǎn)分析:當JR為高電平時,PC的為0x34,與JrAddr相同,完成JR跳轉(zhuǎn)。1.3J跳轉(zhuǎn)分析:J=1,當時鐘上升沿到來時執(zhí)行無條件跳轉(zhuǎn)指令,PC跳到JumpAddr=32'h2c;NextPC_if=PC+4。1.4Branch分支分析:Z=1,當時鐘上升沿到來時執(zhí)行Branch指令,PC跳到BranchAddr=32'h4;NextPC_if=PC+4。綜上,PC能夠根據(jù){JR,J,Z},完成順序執(zhí)行、JR跳轉(zhuǎn)、J跳轉(zhuǎn)、Branch分支。ALU仿真分析仿真整體波形ALUCodeABALUResultoverflow驗證ALUResult00000(add)1000200f000000(add)100001(and)ff0c0e1010df30ff100c00100100c001000010(xor)ff0c0e1010df30ffefd33eef0efd33eef00011(or)ff0c0e1010df30ffffdf3eff0ffdf3eff00100(nor)ff0c0e1010df30ff0020c10000020c10000101(sub)70f0c0e060f0908c160f0908c00110(andi)ff0c0e10ffffe0ff000111(xori)ff0c0e10ffffe0ffff0ceeef0ff0ceeef01000(ori)ff0c0e10ffffe0ffff0ceeff0ff0ceeff10000(sll)ffffe0fffffe0ff00fffe0ff010001(srl)ffffe0ff0ffffe0f00ffffe0f10010(sra)ffffe0fffffffe0f0fffffe0f10011(slt)ff000004700000ff010100(sltu)ff000004700000ff0分析:由仿真波形可知,設(shè)計的ALU能夠完成實驗所要求的算術(shù)運算和邏輯運算。Decode仿真分析3.1Instruction=32'h20210042;//addi$t0,$0,42觀察Instruction前六位,op=Instruction[31:26]=001000=ADDI_op,因此該指令A(yù)LUCode=alu_addi=00000,此外MemWrite=0,,MemRead=0,Regwrite=1(目標寄存器為rd),MemToReg=0(用ALUResult作為輸出),ALUSrcA=0,ALUSrcB=1(此時操作數(shù)B=Imm_ex)。因此譯碼結(jié)果完全符合ADDi操作的要求.3.2Instruction=32'h000c4080;//sll$t0,$t4,2 觀察Instruction前六位,op=Instruction[31:26]=000000=R_type_op,func=Instruction[5:0]=000000=SLL_funct。因此該指令A(yù)LUCode=alu_sll=5d’16=10000,此外MemWrite=0,,MemRead=0,Regwrite=1,RegDst=1(寫目標寄存器為rd),MemToReg=0(用ALUResult作為輸出),ALUSrcA=1(此時操作數(shù)A=Sa_ex),ALUSrcB=0。因此譯碼結(jié)果完全符合SLL操作的要求.綜上,驗證其他控制信號均與Instruction相符合。Top仿真分析4.1整體波形分析:與教材表7.20測試結(jié)果仔細對照得,變量的變化情況符合要求。4.2Zero檢測電路觀察Z信號可發(fā)現(xiàn)其滿足式子RsData[31]||~(|RsData[31:0]);ALUCode=alu_blezRsData[31];ALUCode=alu_bltz~RsData[31]&&(|RsData[31:0]);ALUCode=alu_bgtzZ=~RsData[31];ALUCode=alu_bgez|(RsData[31:0]^RtData[31:0]);ALUCode=alu_bne&(RsData[31:0]~^RtData[31:0]);ALUCode=alu_beq0;ALUCode=OTHER4.3阻塞分析分析:Stall信號為高電平時,Instruction與PC均持續(xù)兩個時鐘周期,即發(fā)生了阻塞4.4branch分支指令分析:JumpFlag=001,下一個時鐘上升沿PC發(fā)生分支。具體分支地址計算如下:Imm_id={{16{Instruction_id[15]}},Instruction_id[15:0]}=fffffff4;Imm_id_shift=Imm_id<<2=ffffffd0;NextPC_id=32’h34=00000034;BranchAddress=NextPC_id+Imm_id_shift=;與波形相符,仿真正確。4.5IF_flush信號分析分析:JumpFlag0時,發(fā)生跳轉(zhuǎn),F(xiàn)lush信號為高電平,下一個時鐘信號上升沿到來時,將Instruction_id、NextPC_id沖刷掉,置零,符合設(shè)計要求。4.6Jump分析注意到在波形的最后階段出現(xiàn)PC的循環(huán),JumpFlag=010,發(fā)生跳轉(zhuǎn)指令。分析:JumpAddr={NextPC_id[31:28],Instruction_id[25:0],2'b00}=8H,下一個時鐘信號上升沿到來時,PC=00000028H,與波形一致,最后PC出現(xiàn)循環(huán)。心得實驗收獲頗豐,真的很感謝自己當初做了對的選擇,選了數(shù)字系統(tǒng)設(shè)計實驗Ⅱ,雖然學(xué)分只有0.5分,但在實驗過程中收獲的不僅僅是知識,更是一種心態(tài),只有在良好的心態(tài)下去調(diào)試代碼,才能發(fā)現(xiàn)代碼中的錯誤。我們不是久經(jīng)沙場的程序員,在調(diào)試代碼時難免有點焦慮,操之過急。我就是將ID模塊中Imm_id粗心寫成了imm_id,導(dǎo)致流水線CPU頂層仿真出錯,經(jīng)過長時間的低效率的調(diào)試愣是沒找到錯誤,心情越來越煩躁、沮喪,愣愣的對著電腦發(fā)呆。后來,自己經(jīng)過反思,痛定思痛,決心靜心好好再調(diào)試一次,從reset=1開始排查代碼中的錯誤,終究是發(fā)現(xiàn)了問題出現(xiàn)在有一條線沒有連接上的,即imm_id,修改后,流水線工作正常,符合設(shè)計要求,并且成功通過唐老師驗收,自己也掌握了高效率的排錯方法,內(nèi)心的自豪感油然而生,一切都是那么美好,越是絕望之時,越是希望出現(xiàn)之時。自己對VerilogHDL語言還是很感興趣的,假期里也看了Veri
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年青海省安全員考試題庫附答案
- 2024汽車噴漆服務(wù)具體實施協(xié)議版
- 二零二五年度國際貿(mào)易領(lǐng)域知識產(chǎn)權(quán)保護實施合同2篇
- 2024年連鎖加盟合作細則合同版B版
- 二零二五年度國內(nèi)主機租用托管及云存儲優(yōu)化服務(wù)協(xié)議2篇
- 2025黑龍江省安全員B證考試題庫及答案
- 2025年度海洋漁業(yè)用地租賃與漁港建設(shè)合同3篇
- 反應(yīng)釜拆裝實訓(xùn)裝置安全操作規(guī)程
- 2024校車租賃合同附車輛安全性能評估報告3篇
- 2024甲乙雙方關(guān)于智慧農(nóng)業(yè)項目投資合同
- 2024年計算機二級WPS考試題庫(共380題含答案)
- 施工現(xiàn)場環(huán)境因素識別、評價及環(huán)境因素清單、控制措施
- 【9道期末】安徽省宣城市2023-2024學(xué)年九年級上學(xué)期期末道德與法治試題(含解析)
- 2024年醫(yī)藥行業(yè)年終總結(jié).政策篇 易聯(lián)招采2024
- 《工程造價專業(yè)應(yīng)用型本科畢業(yè)設(shè)計指導(dǎo)標準》
- 廣州英語小學(xué)六年級英語六上冊作文范文1-6單元
- 接觸鏡臨床驗配智慧樹知到期末考試答案2024年
- 徐州市2023-2024學(xué)年八年級上學(xué)期期末英語試卷(含答案解析)
- 譯林版小學(xué)英語六年級上冊英文作文范文
- Ishow中級班文本2.0精編版40頁
- 某城市污水處理廠設(shè)計污水處理廠設(shè)計說明書
評論
0/150
提交評論