2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  計(jì)算機(jī)組成原理課程設(shè)計(jì)報(bào)告</p><p>  題 目 16位模型機(jī)的設(shè)計(jì) </p><p>  姓 名 </p><p>  學(xué) 號(hào) </p><p>  

2、班 號(hào) </p><p>  指導(dǎo)老師 </p><p>  成 績 </p><p>  2014年1月目 錄</p><p><b&

3、gt;  一、引言3</b></p><p><b>  1.1設(shè)計(jì)目的3</b></p><p><b>  1.2設(shè)計(jì)任務(wù)3</b></p><p>  二、 詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)4</p><p>  2.1 擬定指令系統(tǒng)4</p><p><b&

4、gt;  2.2指令格式5</b></p><p><b>  2.3尋址方式5</b></p><p>  三、16位CPU的模型7</p><p>  3.1 各功能部件的VHDL設(shè)計(jì)9</p><p>  3.2 16位模型機(jī)的設(shè)計(jì)與實(shí)現(xiàn)22</p><p><

5、b>  四、總結(jié)27</b></p><p>  五、參考文獻(xiàn):27</p><p><b>  六、 代碼28</b></p><p><b>  一、引言</b></p><p><b>  1.1設(shè)計(jì)目的</b></p><p&

6、gt;  為掌握并鞏固本學(xué)期所學(xué)習(xí)的計(jì)算機(jī)組成原理知識(shí),設(shè)計(jì)本次試驗(yàn)。運(yùn)用整合所學(xué)的相關(guān)知識(shí),一步步設(shè)計(jì)構(gòu)造一臺(tái)基本的模型計(jì)算機(jī),明確計(jì)算機(jī)的控制原理與控制過程,鞏固和靈活應(yīng)用所學(xué)的理論知識(shí),掌握計(jì)算機(jī)組成的一般設(shè)計(jì)方法,提高學(xué)生設(shè)計(jì)能力和實(shí)踐操作技能,為從事計(jì)算機(jī)研制與設(shè)計(jì)打下基礎(chǔ)。</p><p><b>  1.2設(shè)計(jì)任務(wù)</b></p><p>  本機(jī)功能:

7、計(jì)算數(shù)據(jù)塊中所有數(shù)據(jù)的累加和并存儲(chǔ)到內(nèi)存單元中。</p><p><b>  匯編代碼如下: </b></p><p>  START: MOV SI, OFFSET SRC1 ;源操作數(shù)地址送SI</p><p>  MOV DI,OFFSET DXT ;目的操作數(shù)地址送DI</p><p>  M

8、OV BX,OFFSET SRC2 ;結(jié)束地址送BX</p><p>  MOV BL 0 ;設(shè)置BL中初值為0</p><p>  NEXT:MOV AL,[SI] ;取數(shù)</p><p>  ADD BL , AL ; 數(shù)據(jù)相加</p><p>  MOV [DI],AL ;存數(shù)</p>&l

9、t;p>  CMP SI,BX ;</p><p>  JE START ;如果SI=BX,則轉(zhuǎn)向START</p><p>  INCSI ;修改源地址</p><p>  JMP NEXT ;轉(zhuǎn)向NEXT</p><p>  二、 詳細(xì)設(shè)計(jì)及實(shí)現(xiàn) </p><p&g

10、t;  2.1 擬定指令系統(tǒng)</p><p><b>  分析:</b></p><p>  依據(jù)匯編語言程序得出部件間的數(shù)據(jù)流的方向?yàn)?lt;/p><p><b>  立即數(shù)→寄存器</b></p><p>  寄存器?內(nèi)存 內(nèi)存操作數(shù)采用寄存器間址尋址方式</p&g

11、t;<p>  源與目的寄存器內(nèi)容比較,如果源等于目的轉(zhuǎn)移,轉(zhuǎn)向地址在指令中提供</p><p><b>  寄存器加1指令</b></p><p>  無條件轉(zhuǎn)移指令,轉(zhuǎn)向地址在指令中提供。</p><p>  指令類型 (指令中的立即數(shù)為一個(gè)字即16位)</p><p><b>  立即數(shù)→

12、寄存器</b></p><p>  需要在指令中指出寄存器及立即數(shù)</p><p>  如:LOADI R0,10H,此指令為雙字指令</p><p><b>  內(nèi)存操作數(shù)→寄存器</b></p><p>  需要在指令中指出間址寄存器及目的寄存器</p><p>  如:LOAD

13、 R3,[R1]; 指令為單字指令</p><p><b>  寄存器→內(nèi)存 </b></p><p>  需要指令中指出源寄存器及間址寄存器</p><p>  如:STORE [R2],R7; 指令為單字指令</p><p>  寄存器內(nèi)容比較產(chǎn)生轉(zhuǎn)移的指令</p><p>  

14、需要指令中指出源、目的寄存器以及轉(zhuǎn)向的地址</p><p>  如:BRANCHEQI 0000H; 指令為單字指令</p><p><b>  寄存器加1指令</b></p><p><b>  指令中指出寄存器</b></p><p>  如: INC R1,指令為單字指令</p>

15、<p><b>  無條件轉(zhuǎn)移指令</b></p><p><b>  指令中提供轉(zhuǎn)向地址</b></p><p>  如:BRANCHI 0008H; 指令為單字指令</p><p><b>  2.2指令格式</b></p><p><b>

16、  單字指令格式</b></p><p>  單指令但操作數(shù):INC BRANCHI</p><p>  單指令雙操作數(shù):mov load store LOADI</p><p><b>  雙字指令格式</b></p><p>  雙字三操作數(shù): BRANCHEQI BRANCHGTI</p

17、><p><b>  2.3尋址方式</b></p><p>  依據(jù)以上設(shè)計(jì)的指令系統(tǒng),將主存中數(shù)據(jù)累加并存儲(chǔ)到內(nèi)存單元中的程序如下:</p><p>  存儲(chǔ)器初始化文件memdata.mif的內(nèi)容:</p><p>  三、16位CPU的模型</p><p>  圖1是采用單總線結(jié)構(gòu)的16位CP

18、U結(jié)構(gòu)圖,包含了基本的功能模塊,由寄存器陣列構(gòu)成的8個(gè)16位寄存器Reg0----Reg7;工作寄存器OpReg;算術(shù)邏輯運(yùn)算部件ALU;移位器Shifter;輸出寄存器OutReg;比較器Comp;指令寄存器InstrReg;程序計(jì)數(shù)器ProgCnt;地址寄存器AddrReg。所有功能模塊共用16位的三態(tài)數(shù)據(jù)總線進(jìn)行信息的傳送。 </p><p>  控制器模塊由狀態(tài)機(jī)實(shí)現(xiàn),控制器依據(jù)指令、數(shù)據(jù)通路通

19、過控制線向各功能模塊發(fā)出控制命令。</p><p>  由寄存器陣列構(gòu)成的8個(gè)16位寄存器Reg0----Reg7的優(yōu)點(diǎn)是節(jié)省資源、使用方便。它們共用一個(gè)三態(tài)開關(guān),由控制器選擇與數(shù)據(jù)總線的連接。</p><p>  工作寄存器OpReg 可為ALU、比較器Comp 提供一個(gè)操作數(shù),而ALU、比較器的另一操作數(shù)直接來自數(shù)據(jù)總線。</p><p>  將ALU、移位器S

20、hifter、輸出寄存器OutReg 串接起來,由控制器統(tǒng)一控制來共同完成一些復(fù)雜的操作,由輸出寄存器OutReg存儲(chǔ)結(jié)果,輸出寄存器OutReg 向總線的輸出端含有三態(tài)開關(guān)。</p><p>  比較器Comp 由控制器直接控制,比較的結(jié)果進(jìn)入控制器。</p><p>  地址寄存器AddrReg 提供要訪問的主存單元的地址,本設(shè)計(jì)中將程序和數(shù)據(jù)放在同一存儲(chǔ)器中。</p>

21、<p>  程序計(jì)數(shù)器ProgCnt,不具備清零和+1的功能, 存放CPU要執(zhí)行的下一條指令的地址。</p><p>  指令寄存器InstrReg 存放CPU正在執(zhí)行的指令。</p><p>  工作寄存器OpReg,輸出寄存器OutReg,指令寄存器InstrReg,程序計(jì)數(shù)器ProgCnt,地址寄存器AddrReg,均為最基本的寄存器。</p><p&g

22、t;  為了驗(yàn)證CPU的功能,增加存儲(chǔ)器,存儲(chǔ)器中存入完成數(shù)據(jù)塊傳送所需的程序和數(shù)據(jù)。</p><p>  系統(tǒng)中所有向數(shù)據(jù)總線輸出數(shù)據(jù)的模塊,其輸出口必須使用三態(tài)控制器。</p><p>  模型機(jī)的實(shí)際電路如圖2所示:</p><p>  3.1 各功能部件的VHDL設(shè)計(jì)</p><p>  程序包:說明數(shù)據(jù)類型、運(yùn)算器的功能、移位寄存

23、器的操作、比較器的比較類型和用于CPU控制的狀態(tài)類型。</p><p><b>  運(yùn)算器的設(shè)計(jì)</b></p><p><b>  功能:</b></p><p><b>  說明:</b></p><p>  a[15..0]來自于總線,b[15..0]來自于工作寄存器Op

24、Reg,c[15..0]輸出送至移位器。sel[3..0]來自于控制器發(fā)出的控制信號(hào)aluSel[3..0],選擇ALU的操作。</p><p>  運(yùn)算器功能仿真波形圖如圖3所示:</p><p><b>  仿真結(jié)果說明:</b></p><p>  當(dāng)sel為0000時(shí),進(jìn)行直傳的操作。通過pass,則c=a,為1000。</p&g

25、t;<p>  當(dāng)sel為0001時(shí),進(jìn)行與的操作。a=1000,b=1234,與之后c為1000。</p><p>  當(dāng)sel為0010時(shí),進(jìn)行或的操作。a=1000,b=1234,c為1234。</p><p>  當(dāng)sel為0011時(shí),進(jìn)行非的操作。a=1000,a為EFFF。</p><p>  當(dāng)sel為0100時(shí),進(jìn)行異或的操作。a xo

26、r b,c為0234。</p><p>  當(dāng)sel為0101時(shí),進(jìn)行加法的操作。a=1000,c為2234。</p><p>  當(dāng)sel為0110時(shí),進(jìn)行減法的操作。a=1000,c為FDCC。</p><p>  當(dāng)sel為0111時(shí),進(jìn)行加1的操作。a=1000,c為1001。</p><p>  當(dāng)sel為1000時(shí),進(jìn)行減1的操作

27、。a=1000,c為0FFF。</p><p>  當(dāng)sel為1001時(shí),進(jìn)行清0操作,全部置0.</p><p>  當(dāng)sel為1010時(shí),為類型其他,全部輸出0.</p><p><b>  比較器的設(shè)計(jì)</b></p><p><b>  功能:</b></p><p>

28、;  比較器功能仿真波形圖如圖4所示:</p><p><b>  仿真結(jié)果說明:</b></p><p>  sel為000時(shí),進(jìn)行比較是否相等的操作,1000不等于1234,compout=0</p><p>  sel為001時(shí),進(jìn)行比較是否不等于的操作,1000不等于1234,compout=1</p><p>

29、  sel為010時(shí),進(jìn)行比較是否大于的操作,1000<1234,compout=0</p><p>  sel為011時(shí),進(jìn)行比較是否大于等于的操作,1000<1234,compout=0</p><p>  sel為100時(shí),進(jìn)行比較是否小于的操作,1000<1234,compout=1</p><p>  sel為101時(shí),進(jìn)行比較是否小于等

30、于的操作,1000<1234,compout=1</p><p>  sel為其他時(shí),compout輸出0.</p><p><b>  移位器的設(shè)計(jì)</b></p><p><b>  功能:</b></p><p>  移位器的功能仿真波形圖如圖5所示:</p><p&

31、gt;<b>  仿真結(jié)果說明:</b></p><p>  當(dāng)sel為000時(shí),進(jìn)行直傳的操作,a和y相同</p><p>  當(dāng)sel為001時(shí),進(jìn)行無符號(hào)數(shù)左移的操作,1234變?yōu)?468</p><p>  當(dāng)sel為010時(shí),進(jìn)行無符號(hào)數(shù)右移的操作,1234變?yōu)?91A</p><p>  當(dāng)sel為011時(shí),

32、進(jìn)行循環(huán)左移的操作,1234變?yōu)?468</p><p>  當(dāng)sel為100時(shí),進(jìn)行循環(huán)右移的操作,1234變?yōu)?91A</p><p>  當(dāng)sel為其他時(shí),輸出0</p><p><b>  基本寄存器</b></p><p><b>  功能:</b></p><p>

33、;<b>  功能說明:</b></p><p>  在CPU中基本寄存器的角色是工作寄存器OpReg,輸出寄存器OutReg,指令寄存器InstrReg,程序計(jì)數(shù)器ProgCnt,地址寄存器AddrReg。</p><p>  基本寄存器功能仿真波形圖如圖6所示:</p><p><b>  仿真結(jié)果說明:</b><

34、;/p><p>  0ns到5ns,還沒有遇到clk的上升沿,所以q端的輸出是0000</p><p>  5ns到20ns時(shí),clk的上升沿到來,q端輸出1000</p><p>  20ns到25ns時(shí),a發(fā)生變化,但clk上升沿沒有到來,q端輸出1000</p><p>  25ns到30ns時(shí),clk的上升沿到來,q端輸出1234<

35、/p><p><b>  寄存器組</b></p><p><b>  功能:</b></p><p><b>  功能說明:</b></p><p>  clk的上升沿,將data[15..0]寫入sel[2..0]指定的寄存器中,并在q[15..0]輸出此寄存器新寫入的內(nèi)容。否

36、則,q[15..0]輸出sel[2..0]指定的寄存器原來的內(nèi)容。如此設(shè)計(jì)的目的,便于觀察寫入指定寄存器中的內(nèi)容。</p><p>  寄存器組功能仿真波形圖如圖7所示:</p><p>  0 - 10ns,sel=000選中R0,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0001寫入R0,q=0001</p><p>  10-20ns,sel=001選中R1,當(dāng)clk

37、上升沿時(shí),將data的數(shù)據(jù)0002寫入R1,q=0002</p><p>  20-30ns,sel=010選中R2,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0003寫入R2,q=0003</p><p>  30-40ns,sel=011選中R3,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0004寫入R3,q=0004</p><p>  40-50ns,sel=100選中R4

38、,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0005寫入R4,q=0005</p><p>  50-60ns,sel=101選中R5,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0006寫入R5,q=0006</p><p>  60-70ns,sel=110選中R6,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0007寫入R6,q=0007</p><p>  70-80ns,sel=11

39、1選中R7,當(dāng)clk上升沿時(shí),將data的數(shù)據(jù)0008寫入R7,q=0008</p><p><b>  時(shí)序電路</b></p><p><b>  功能說明:</b></p><p>  產(chǎn)生電位信號(hào)step和脈沖信號(hào)t4,每個(gè)step的上升沿狀態(tài)機(jī)的狀態(tài)發(fā)生改變,t4與寄存器的寫信號(hào)相與作為寄存器的同步打入控制信號(hào)。

40、</p><p>  時(shí)序電路的功能仿真波形圖如圖8所示:</p><p><b>  仿真結(jié)果說明:</b></p><p>  0-10ns,clr高電平,t4=0,step初始值為0;</p><p>  10-15ns,clr低電平,clk為低電平,t4,step保持不變;</p><p>

41、;  15-20ns,clr低電平,clk上升沿,x=000+1=001,t4 = x(1) and x(0)=0 and 0=0,step=x(1)=0;</p><p>  20-25ns,clr低電平,clk為低電平,t4,step保持不變;</p><p>  25-30ns,clr低電平,clk上升沿,x=001+1=010,t4 = x(1) and x(0)=0 and 0=

42、0,step=x(1)=0;</p><p>  30-35ns,clr低電平,clk為低電平,t4,step保持不變;</p><p>  35-40ns,clr低電平,clk上升沿,x=010+1=011,t4 = x(1) and x(0)=1 and 0=0,step=x(1)=1;</p><p>  40-45ns,clr低電平,clk為低電平,t4,s

43、tep保持不變;</p><p>  45-50ns,clr低電平,clk上升沿,x=011+1=100,t4 = x(1) and x(0)=1 and 1=1,step=x(1)=1;</p><p>  50-55ns,clr低電平,clk為低電平,t4,step保持不變;</p><p><b>  存儲(chǔ)器的設(shè)計(jì)</b></p&g

44、t;<p><b>  LPM_RAM定制</b></p><p>  首先,定制初始化數(shù)據(jù)文件,建立Memory Initialization File(.mif)文件,選擇File→New命令,并在New窗口選擇Other file選項(xiàng),再選擇Memory Initialization File選項(xiàng)。出現(xiàn)對(duì)話框,選擇存儲(chǔ)字的個(gè)數(shù)及字長,按下OK,出現(xiàn)如下界面,在最左列或最上

45、行擊鼠標(biāo)右鍵,選擇地址和內(nèi)存操作數(shù)所使用的基值,選擇Hexadecimal,存儲(chǔ)器里存放數(shù)據(jù)塊傳送的指令和數(shù)據(jù),CPU通過執(zhí)行此程序進(jìn)行功能驗(yàn)證。完成后,保存文件(memdata.mif)。</p><p>  之后,定制LPM_RAM。設(shè)計(jì)步驟如下:</p><p>  選擇Tools→MegaWizard Plug-In Manager命令,打開MegaWizard Plug-In M

46、anager 對(duì)話框,選中Create a new custom megafunction variation,單擊Next,出現(xiàn)下面對(duì)話框,選擇LPM_RAM_DQ,選擇所用器件的類型以及所創(chuàng)建的輸出文件的類型及名字。</p><p>  選擇NEXT,進(jìn)入如下界面。選擇數(shù)據(jù)線位數(shù)、主存容量大小(地址線位數(shù))。</p><p>  選擇NEXT,進(jìn)入下一步界面,取消q輸出端的鎖存。<

47、;/p><p>  選擇NEXT,進(jìn)入下一步,選擇內(nèi)存的初始化文件。</p><p>  依據(jù)選項(xiàng)自動(dòng)生成的代碼,注意將.mif文件的路徑改為相對(duì)路徑,存儲(chǔ)單元的個(gè)數(shù)為100個(gè)。</p><p>  ram的功能仿真波形圖如圖9所示:</p><p><b>  功能仿真說明:</b></p><p>

48、;  0-10ns,wren是讀信號(hào),address地址寄存器選擇的是地址0000單元,當(dāng)遇到clk時(shí),將ram里面的內(nèi)容讀出來是2001</p><p>  10-20ns,wren是讀信號(hào),address地址寄存器選擇的是地址0001單元,當(dāng)遇到clk時(shí),將ram里面的內(nèi)容讀出來是0030</p><p>  40-50ns,wren是寫信號(hào),address地址寄存器選擇的是地址003

49、1單元,當(dāng)遇到clk時(shí),將ram里面的內(nèi)容寫進(jìn)去是5550</p><p><b>  控制器</b></p><p><b>  功能說明:</b></p><p>  采用狀態(tài)機(jī)實(shí)現(xiàn),其中control的輸入有step,reset,compout,instrReg,這些輸入的組合可用于識(shí)別指令,并輸出相關(guān)控制信號(hào)。具體

50、信號(hào)的相關(guān)功能見control.vhdl部件說明。在譯碼階段,具體來說,在一定的節(jié)拍下,contorl首先將接收的指令的前5位和后6位分開,用于分離操作數(shù)和操作碼,然后將操作數(shù)的前3位和后3位分開,用于區(qū)分源操作數(shù)和目的操作數(shù),然后根據(jù)具體的指令輸出相關(guān)控制信號(hào)。</p><p>  依據(jù)指令的格式、數(shù)據(jù)通路給出指令系統(tǒng)中所有指令的指令流程:</p><p>  3.2 16位模型機(jī)的設(shè)計(jì)

51、與實(shí)現(xiàn)</p><p><b>  創(chuàng)建頂層實(shí)體圖</b></p><p>  工程所在的文件夾中包含文件如下所示。依次在功能部件所對(duì)應(yīng)的VHD文件上擊右鍵,選擇</p><p>  Create Symbol Files for Current File,創(chuàng)建所有功能部件的圖符。</p><p><b>  

52、功能說明:</b></p><p>  整個(gè)CPU系統(tǒng)以控制器為中心,負(fù)責(zé)指令的譯碼及發(fā)出各種相關(guān)控制信號(hào)。節(jié)拍發(fā)生器控制著整個(gè)系統(tǒng)的時(shí)鐘信號(hào),系統(tǒng)的相關(guān)部件在統(tǒng)一的節(jié)拍控制下發(fā)揮自己的作用。IR為指令寄存器,負(fù)責(zé)存儲(chǔ)即將執(zhí)行的下一條指令,addr為地址寄存器,存放被訪問存儲(chǔ)單元的地址。PC為程序計(jì)數(shù)器,存放現(xiàn)行指令的地址,具有計(jì)數(shù)功能。ALU負(fù)責(zé)處理相關(guān)數(shù)據(jù)運(yùn)算操作。寄存器組負(fù)責(zé)存放相關(guān)操作數(shù)和中間

53、臨時(shí)變量。多路數(shù)據(jù)選擇器在相關(guān)控制信號(hào)的作用下將相關(guān)數(shù)據(jù)輸入ALU處理??偩€分?jǐn)?shù)據(jù)總線和地址總線,負(fù)責(zé)ram和相關(guān)寄存器之間的數(shù)據(jù)交換。RAM為存儲(chǔ)器,存放相關(guān)數(shù)據(jù)和程序。</p><p>  連接所有的功能部件形成模型機(jī)。</p><p><b>  仿真結(jié)果說明</b></p><p>  指令 LOADI R1,0020H; 執(zhí)行過程中

54、寄存器的變化情況:</p><p><b>  仿真結(jié)果說明:</b></p><p>  指令 LOAD R3,[R1] 取數(shù) 執(zhí)行過程中寄存器的變化情況:</p><p><b>  仿真結(jié)果說明:</b></p><p>  ADD R7 , R3 相加 執(zhí)行過程中寄存器的變化情況&

55、lt;/p><p><b>  仿真結(jié)果說明:</b></p><p>  指令STORE [R2],R7 ;存數(shù) 執(zhí)行過程中寄存器的變化情況:</p><p><b>  仿真結(jié)果說明:</b></p><p>  BRANCHEQI 0000H 如果R1等于R6,則轉(zhuǎn)向地址0000H 執(zhí)

56、行過程中寄存器的變化情況:</p><p><b>  四、總結(jié)</b></p><p>  經(jīng)過本次試驗(yàn),我明白到了做計(jì)算機(jī)組成原理的實(shí)驗(yàn)首先一定要注意線路的連接,有些要對(duì)應(yīng)的要一一對(duì)應(yīng),我一開始因?yàn)闆]注意.弄得數(shù)據(jù)不正確,還有要注意操作方法等等。</p><p>  總之,通過這次對(duì)指令系統(tǒng)的設(shè)計(jì),讓我對(duì)整個(gè)計(jì)算機(jī)基本原理和系統(tǒng)結(jié)構(gòu)都有了很

57、深的體會(huì)和認(rèn)識(shí),也強(qiáng)迫自己在以前不足的地方去學(xué)習(xí)了一些新的知識(shí),最重要的是,真正讓自己認(rèn)識(shí)到了自己現(xiàn)在所學(xué)過的知識(shí)還太少太少,根本不足以完成一個(gè)哪怕是最簡單的計(jì)算機(jī)項(xiàng)目,自己以前只滿足于將課本知識(shí)學(xué)會(huì)的想法也有很大的問題,需要好好反省,在接下來的時(shí)間里,自己一定要好好把握,既要加強(qiáng)基礎(chǔ)知識(shí)的學(xué)習(xí),也要鍛煉自己的實(shí)驗(yàn)?zāi)芰?,努力讓自己的專業(yè)素質(zhì)有很大的提高。</p><p><b>  五、參考文獻(xiàn):<

58、;/b></p><p>  白中英.計(jì)算機(jī)組成原理(第五版).北京:科學(xué)出版社,2005</p><p><b>  代碼</b></p><p><b>  add</b></p><p>  LIBRARY IEEE;</p><p>  USE IEEE.std

59、_logic_1164.ALL;</p><p>  USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p>  USE work.cpu_lib.all;</p><p>  entity add is </p><p>  port(a:in bit16;clk:in std_logic;q:out bit16)

60、;</p><p><b>  end add;</b></p><p>  architecture rt1 of add is</p><p><b>  begin</b></p><p><b>  process</b></p><p><

61、;b>  begin</b></p><p>  wait until clk'event and clk='1';</p><p>  q<=a+"1010";</p><p>  end process;</p><p><b>  end rt1;</b

62、></p><p><b>  addout</b></p><p>  LIBRARY IEEE;</p><p>  USE IEEE.std_logic_1164.ALL;</p><p>  USE work.cpu_lib.all;</p><p>  entity addout

63、is </p><p>  port(a:in t_reg;b:in bit16;reset:in std_logic;</p><p>  q:out bit16);</p><p>  end addout;</p><p>  architecture rt1 of addout is</p><p>  sig

64、nal temp:bit16;</p><p><b>  begin</b></p><p>  process(a,b)</p><p><b>  begin</b></p><p>  if reset='1' then temp<="000000000000

65、0000";</p><p><b>  end if;</b></p><p>  if a="111" and b>temp then q<=b;temp<=b;</p><p><b>  end if;</b></p><p>  end pr

66、ocess;</p><p><b>  end rt1;</b></p><p><b>  alu</b></p><p>  LIBRARY IEEE;</p><p>  USE IEEE.std_logic_1164.ALL;</p><p>  USE IEEE.

67、std_logic_unsigned.ALL;</p><p>  USE work.cpu_lib.all;</p><p>  entity alu is </p><p>  port(a,b:in bit16;sel:in t_alu;c:out bit16);</p><p><b>  end alu;</b>

68、;</p><p>  architecture rt1 of alu is </p><p><b>  begin</b></p><p>  process(a,b,sel)</p><p><b>  begin</b></p><p>  case sel is&l

69、t;/p><p>  when alupass=> c<=a ;</p><p>  when andOp=> c<=a and b ;</p><p>  when orOp=> c<=a or b ;</p><p>  when xorOp=> c<=a xor b ;</p>

70、<p>  when notOp=> c<= not a ;</p><p>  when plus=> c<=a + b ;</p><p>  when alusub=> c<=a - b ;</p><p>  when inc => c<=a +"0000000000000001&quo

71、t; ;</p><p>  when dec => c<=a -"0000000000000001" ;</p><p>  when zero => c<="0000000000000000" ;</p><p>  when others => c<="00000000000

72、00000" ;</p><p><b>  end case;</b></p><p>  end process;</p><p><b>  end rt1;</b></p><p><b>  comp</b></p><p>  LI

73、BRARY IEEE;</p><p>  USE IEEE.std_logic_1164.ALL;</p><p>  USE IEEE.std_logic_arith.ALL;</p><p>  USE IEEE.std_logic_unsigned.ALL;</p><p>  use work.cpu_lib.all;</p&

74、gt;<p>  entity comp is </p><p>  port (a,b:in bit16;sel:in t_comp;compout:out bit);</p><p><b>  end comp;</b></p><p>  architecture rt1 of comp is </p>&l

75、t;p><b>  begin</b></p><p>  process(a,b,sel)</p><p><b>  begin</b></p><p>  case sel is </p><p>  when eq => if a=b then compout <='

76、;1';</p><p>  else compout<='0' ;</p><p><b>  end if;</b></p><p>  when neq => if a/=b then compout <='1' ;</p><p>  else com

77、pout<='0' ;</p><p><b>  end if;</b></p><p>  when gt => if a>b then compout <='1' ;</p><p>  else compout<='0' ;</p><p

78、><b>  end if;</b></p><p>  when gte => if a>=b then compout <='1' ;</p><p>  else compout<='0' ;</p><p><b>  end if;</b></

79、p><p>  when lt => if a<b then compout <='1' ;</p><p>  else compout<='0' ;</p><p><b>  end if;</b></p><p>  when lte => if a&l

80、t;=b then compout <='1' ;</p><p>  else compout<='0' ;</p><p><b>  end if;</b></p><p>  when others=> compout<='0' ;</p><

81、p><b>  end case;</b></p><p>  end process;</p><p><b>  end rt1;</b></p><p><b>  control</b></p><p>  library IEEE;</p><

82、;p>  use IEEE.std_logic_1164.all;</p><p>  use work.cpu_lib.all;</p><p>  entity control is</p><p>  port( step,reset,compout:in std_logic; instrReg:in bit16;</p><p>

83、;  progCntrWr,progCntrRd,addrRegWr,outRegWr,outRegRd:out std_logic;</p><p>  shiftSel:out t_shift; aluSel:out t_alu; compSel:out t_comp;</p><p>  opRegRd,opRegWr,instrWr,regRd,regWr,rw,vma:out s

84、td_logic;</p><p>  regSel:out t_reg );</p><p>  end control;</p><p>  architecture rtl of control is</p><p>  signal current_state, next_state : state;</p><p

85、><b>  begin</b></p><p>  process( current_state, instrReg, compout)</p><p><b>  begin</b></p><p>  progCntrWr <= '0'; progCntrRd <= '0&#

86、39;; addrRegWr <= '0';outRegWr <= '0';</p><p>  outRegRd <= '0'; shiftSel <= shftpass; aluSel <= alupass; compSel <= eq;</p><p>  opRegRd <= '0&#

87、39;; opRegWr <= '0'; instrWr <= '0'; regSel <= "000";</p><p>  regRd <= '0'; regWr <= '0'; rw <= '0'; vma <= '0';</p><

88、;p>  case current_state is</p><p>  when reset1 => aluSel<=zero; shiftSel<=shftpass; outRegWr<='1'; next_state<=common1;</p><p>  when common1 => outRegRd<='1

89、'; progCntrWr<='1'; next_state<=common2;</p><p>  when common2=> progcntrRd <= '1'; addrRegWr <= '1'; next_state <=common3;</p><p>  when common3 =

90、> rw<='0';vma<='1'; instrWr<='1'; next_state<=execute;</p><p>  when execute => case instrReg(15 downto 11) is</p><p>  when "00000" => nex

91、t_state <= incPc ;-- nop</p><p>  when "00001" => next_state<=load2; --load ri,[rj]</p><p>  when "00010" => next_state<=store2;-- store [ri],rj</p><

92、;p>  when "00011" => next_state<=move2;----mov ri,rj</p><p>  when "00100" => next_state<=loadI2;-----loadi ri,n</p><p>  when "00101" => next_sta

93、te<=braI2;-- branchi n</p><p>  when "00110" => next_state<=beqI2;--BranchEQi n; rs = rd then branchi n else inpc11</p><p>  when "00111" => next_state<=inc2;

94、--inc rd</p><p>  when "01000" => next_state<=add1;--add</p><p>  when others =>next_state <= incPc;</p><p><b>  end case;</b></p><p>

95、  when load2 => regSel <= instrReg(5 downto 3); regRd <= '1';addrregWr <= '1'; next_state <= load3;</p><p>  when load3 => rw <= '0'; vma <= '1';regSe

96、l <= instrReg(2 downto 0);regWr <= '1'; next_state <= incPc;</p><p>  when store2 => regSel <= instrReg(2 downto 0); regRd <= '1';addrregWr <= '1'; next_state <

97、;= store3;</p><p>  when store3=> regSel <= instrReg(5 downto 3); regRd <= '1'; rw <= '1'; next_state <= incPc;</p><p>  when move2 => regSel <= instrReg(5 d

98、ownto 3); regRd <= '1';aluSel <=alupass;shiftsel <= shftpass; outRegWr <= '1'; next_state <= move3;</p><p>  when move3 =>outRegRd <= '1';regSel <= instrReg(2

99、downto 0); regWr <= '1'; next_state <= incPc;</p><p>  when loadI2 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= '1'; next_state <= loa

100、dI3;</p><p>  when loadI3 => outregRd <= '1'; progcntrWr<='1'; addrregWr<='1';next_state<=loadI4;</p><p>  when loadI4 => rw <= '0';vma <

101、= '1';regSel <= instrReg(2 downto 0);regWr <= '1'; next_state <= incPc;</p><p>  when braI2 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <

102、;= '1'; next_state <= braI3;</p><p>  when braI3 => outregRd<='1'; addrregWr<='1';next_state<=braI4;</p><p>  when braI4 => rw <= '0';vma &l

103、t;= '1';progcntrWr <= '1'; next_state <= common2;</p><p>  when beqI2 => regSel <= instrReg(5 downto 3); regRd <= '1';opRegWr <= '1'; next_state <= beqI3;

104、</p><p>  when beqI3 => opRegRd <= '1' ;regSel <= instrReg(2 downto 0); regRd <= '1'; compsel <= eq;</p><p>  if compout = '1' then next_state <= beqI4;

105、</p><p>  else next_state <= incPc11; </p><p><b>  end if;</b></p><p>  when beqI4 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outre

106、gWr <= '1'; next_state <= beqI5;</p><p>  when beqI5 =>outregRd <= '1'; addrregWr <= '1'; next_state <= beqI6;</p><p>  when beqI6 => rw <= '

107、0';vma <= '1'; progcntrWr <= '1'; next_state <= common2;</p><p>  when inc2 => regSel <= instrReg(2 downto 0); regRd <= '1'; alusel <= inc;shiftsel <= shft

108、pass; outregWr <= '1'; next_state <= inc3;</p><p>  when inc3 => outregRd <= '1'; regsel <= instrReg(2 downto 0);regWr <= '1'; next_state <= incPc;</p><

109、;p>  when incPc11 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= '1'; next_state <= incPc12;</p><p>  when incPc12 => outregRd<='1';

110、progcntrWr<='1'; next_state<=incPc;</p><p>  when add1=> regSel <= instrReg(5 downto 3); regRd<= '1'; opRegWr <= '1'; next_state <=add2;</p><p>  whe

111、n add2=> regSel <= instrReg(2 downto 0); regRd<= '1'; alusel <= plus;shiftsel <= shftpass;outregWr <= '1'; next_state <= add3;</p><p>  when add3=>outregRd <= '

112、;1';regSel <= instrReg(2 downto 0); regWr <= '1';next_state <= incPc;</p><p>  when incPc => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= 

113、9;1'; next_state <= common1;</p><p>  when others => next_state <= incPc;</p><p><b>  end case;</b></p><p>  end process;</p><p>  process(step

114、, reset)</p><p><b>  begin</b></p><p>  if reset = '1' then current_state <= reset1 ;</p><p>  elsif step'event and step= '1'</p><p>

115、  then current_state <= next_state after 1 ns; </p><p><b>  end if;</b></p><p>  end process;</p><p><b>  end rtl;</b></p><p><b>  cpu_

116、lib</b></p><p>  LIBRARY IEEE;</p><p>  USE IEEE.std_logic_1164.ALL;</p><p>  USE IEEE.std_logic_arith.ALL;</p><p>  package cpu_lib is </p><p>  sub

117、type bit16 is std_logic_vector(15 downto 0);</p><p>  subtype t_reg is std_logic_vector(2 downto 0);</p><p>  subtype t_shift is unsigned (3 downto 0);</p><p>  constant shftpass :t

118、_shift:="0000";</p><p>  constant sftl :t_shift:="0001";</p><p>  constant sftr:t_shift:="0010";</p><p>  constant rotl :t_shift:="0011";<

119、/p><p>  constant rotr :t_shift:="0100";</p><p>  subtype t_alu is unsigned(3 downto 0);</p><p>  constant alupass :t_alu:="0000";</p><p>  constant an

120、dOp :t_alu:="0001";</p><p>  constant orOp:t_alu:="0010";</p><p>  constant notOp :t_alu:="0011";</p><p>  constant xorOp :t_alu:="0100";<

121、/p><p>  constant plus :t_alu:="0101";</p><p>  constant alusub :t_alu:="0110";</p><p>  constant inc :t_alu:="0111";</p><p>  constant dec :

122、t_alu:="1000";</p><p>  constant zero:t_alu:="1001";</p><p>  subtype t_comp is unsigned (3 downto 0);</p><p>  constant eq :t_comp:="0000";</p>

123、<p>  constant neq :t_comp:="0001";</p><p>  constant gt:t_comp:="0010";</p><p>  constant gte :t_comp:="0011";</p><p>  constant lt :t_comp:=&qu

124、ot;0100";</p><p>  constant lte :t_comp:="0101";</p><p>  type state is (reset1,common1,common2,common3,execute,</p><p>  load2,load3,store2,store3,store4,move2,move3

125、,incPc11,incPc12,</p><p>  incPc,incPc2,incPc3,loadIr,loadIr2,</p><p>  beqI2,beqI3,beqI4,beqI5,beqI6,braI2,braI3,braI4,</p><p>  loadI2,loadI3,loadI4,inc2,inc3,</p><p>

126、;  add1,add2,add3);</p><p>  end cpu_lib;</p><p><b>  loadreg</b></p><p>  --AddrReg ProgCnt OpReg</p><p>  LIBRARY IEEE;</p><p>  USE IEEE.s

127、td_logic_1164.ALL;</p><p>  USE work.cpu_lib.all;</p><p>  entity loadreg is </p><p>  port(a:in bit16;rst,clk,load:in std_logic;q:out bit16);</p><p>  end loadreg;<

128、/p><p>  architecture rt1 of loadreg is</p><p><b>  begin</b></p><p>  process (rst,clk)</p><p><b>  begin</b></p><p>  if rst='1&

129、#39; then q<=(OTHERS=>'0');</p><p>  elsif rising_edge(clk) then</p><p>  if load='1' then</p><p><b>  q<=a ;</b></p><p><b> 

130、 end if;</b></p><p><b>  end if;</b></p><p>  end process;</p><p><b>  end rt1;</b></p><p><b>  ram</b></p><p>  

131、-- megafunction wizard: %LPM_RAM_DQ%</p><p>  -- GENERATION: STANDARD</p><p>  -- VERSION: WM1.0</p><p>  -- MODULE: altsyncram </p><p>  -- ===========================

132、=================================</p><p>  -- File Name: ram.vhd</p><p>  -- Megafunction Name(s):</p><p>  -- altsyncram</p><p>  -- ===============================

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論