版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 16位cpu綜合設(shè)計(jì) 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)---模型機(jī)組成設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)---復(fù)雜模型機(jī)的設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)--模型計(jì)算機(jī)設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)--基本模型計(jì)算機(jī)
- 16位精簡指令cpu設(shè)計(jì)—計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)--基本模型機(jī)的實(shí)現(xiàn)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)--- 模型機(jī)設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)--模型機(jī)的設(shè)計(jì)與實(shí)現(xiàn)
- 《計(jì)算機(jī)組成原理》課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)-概念模型計(jì)算機(jī)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)-- 模型計(jì)算機(jī)的設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)--計(jì)算機(jī)組成原理復(fù)雜模型機(jī)的組成與運(yùn)行
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)——模型計(jì)算機(jī)的設(shè)計(jì)與實(shí)現(xiàn)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)報(bào)告--復(fù)雜模型計(jì)算機(jī)的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論