基于FPGA的簡(jiǎn)單RISCCUP設(shè)計(jì)_第1頁(yè)
基于FPGA的簡(jiǎn)單RISCCUP設(shè)計(jì)_第2頁(yè)
基于FPGA的簡(jiǎn)單RISCCUP設(shè)計(jì)_第3頁(yè)
基于FPGA的簡(jiǎn)單RISCCUP設(shè)計(jì)_第4頁(yè)
基于FPGA的簡(jiǎn)單RISCCUP設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于fpga的簡(jiǎn)單risc_cup設(shè)計(jì) 計(jì)算機(jī)科學(xué)學(xué)院 計(jì)算機(jī)科學(xué)與計(jì)算專業(yè) 09061059 藍(lán)瀟瑩摘要:cpu即中央處理單元,它是計(jì)算機(jī)的核心部件。risc即精減指令集計(jì)算機(jī)。它是一種20世紀(jì)80年代才出現(xiàn)的cpu,與一般的cpu相比不僅僅是簡(jiǎn)化了指令系統(tǒng),而且還通過簡(jiǎn)化指令系統(tǒng)使計(jì)算機(jī)結(jié)果更加簡(jiǎn)單合理,從而提高了運(yùn)算速度。關(guān)鍵字:fpga risc_cpu 取指令 分析指令 執(zhí)行指令一、總體概述計(jì)算機(jī)進(jìn)行信息處理可分為兩個(gè)步驟:(1) 將數(shù)據(jù)和程序(即指令序列)輸入到計(jì)算機(jī)的存儲(chǔ)器中;(2) 從第一條指令的地址起開始執(zhí)行該程序,得到程序所需的結(jié)果,結(jié)束運(yùn)行。它必須具有以下基本功能:取指令

2、當(dāng)程序已在存儲(chǔ)器中時(shí),首先根據(jù)程序入口地址取出一條程序,為此發(fā)出指令地址及控制信號(hào)。分析指令即指令譯碼,這是對(duì)當(dāng)前取得的指令進(jìn)行分析,指出它要求什么操作,并產(chǎn)生相應(yīng)的操作控制命令。執(zhí)行指令根據(jù)分析指令時(shí)產(chǎn)生的“操作命令”形成相應(yīng)的操作控制信號(hào)序列,通過運(yùn)算器、存儲(chǔ)器及輸入/輸出設(shè)備的執(zhí)行,實(shí)現(xiàn)每條指令的功能,其中包括對(duì)運(yùn)算結(jié)果的處理以及下條指令的形成。risc_cpu是一個(gè)復(fù)雜的數(shù)字邏輯電路,但他的基本部件的邏輯并不復(fù)雜。我們可以把它分成8個(gè)基本部件來考慮:(1) 時(shí)鐘發(fā)生器;(2) 指令寄存器;(3) 累加器;(4) risc_cpu算術(shù)邏輯運(yùn)算單元;(5) 數(shù)據(jù)控制器;(6) 狀態(tài)控制器;

3、(7) 程序計(jì)數(shù)器;(8) 地址多路器。三、總體框圖 risc_cpu中部件的相互連接關(guān)系三、各模塊功能說明及主要程序代碼(1) 時(shí)鐘發(fā)生器 時(shí)鐘發(fā)生器clk_gen利用外來的時(shí)鐘信號(hào)clk生成一系列時(shí)鐘信號(hào)clk1、fetch、alu_clk,并送往cpu其他部件。其中,fetch是外來時(shí)鐘clk的8分頻信號(hào),利用fetch的上升沿來觸發(fā)cpu控制器來執(zhí)行一條指令,同時(shí)fetch信號(hào)還將控制地址多路器輸出指令地址和數(shù)據(jù)地址;clk1信號(hào)用于指令寄存器、累加器、狀態(tài)控制器的時(shí)鐘信號(hào);alu_clk則用于觸發(fā)算術(shù)邏輯運(yùn)算單元。如下為時(shí)鐘發(fā)生器原理圖: 其主要的verilog代碼見下面模塊:mod

4、ule clc_gen(clk,reset,clk1,clk2,clk4,fetch,alu_clk);input clk,reset;output clk1,clk2,clk4,fetch,alu_clk;wire clk,reset;reg clk2,clk4,fetch,alu_clk;reg7:0 state;parameter s1=8b00000001, s2=8b00000010, s3=8b00000100, s4=8b00001000, s5=8b00010000, s6=8b00100000, s7=8b01000000, s8=8b10000000, idle=8b000

5、00000;assign clk1=clk;always (negedge clk) if(reset) begin clk2=0;clk4=1;fetch=0;alu_clk=0;state=idle;end else begin case(state) s1: begin clk2=clk2; alu_clk=alu_clk; state=s2;end s2: begin clk2=clk2; clk4=clk4; alu_clk=alu_clk; state=s3;end s3: begin clk2=clk2; state=s4;end s4: begin clk2=clk2; clk

6、4=clk; fetch=fetch; state=s5;end s5: begin clk2=clk2; state=s5;end s6: begin clk2=clk2; clk4=clk; state=s7;end s7: begin clk2=clk2; state=s8;ends8: begin clk2=clk2; clk4=clk; fetch=fetch; state=s1;end idle: state=s1; default: state=idle; endcase endendmodule(2) 指令寄存器指令寄存器的觸發(fā)時(shí)鐘是clk1,在clk1正沿觸發(fā)下,寄存器將數(shù)據(jù)

7、總線送來的指令存入高8位或低8位寄存器中,但并不是每個(gè)clk1的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因?yàn)閿?shù)據(jù)總線上有時(shí)傳輸指令,有時(shí)傳輸數(shù)據(jù)。什么時(shí)候寄存,什么時(shí)候不寄存由cpu狀態(tài)控制器的load_ir信號(hào)控制。而當(dāng)前取得是高8位還是低8位,由變量state記錄。state為0表示取的是高8位,存入高8為寄存器時(shí),同時(shí)將變量state置為1.下次再寄存時(shí),由于state為1,可知取的是低8位,存入低8位寄存器中。主要的verilog代碼見下面模塊:module register(opc_iraddr,data,ena,clk1,rst);output15:0 opc_iraddr;input7:0

8、data;input ena,clk1,rst;reg15:0 opc_iraddr;reg state;always (posedge clk1)begin if(rst) begin opc_iraddr=16b0000000000000000; state=1b0; end else begin if(ena) begin casex(state) 1b0: begin opc_iraddr15:8=data;state=1;end1b1: begin opc_iraddr7:0=data;state=0;end default: begin opc_iraddr15:0=16bxxxx

9、xxxxxxxxxxxx;state=1bx;endendcase endelse state=1b0;endendendmodule(3) 累加器累加器用于存放當(dāng)前的結(jié)果,它也是雙目運(yùn)算中的一個(gè)數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當(dāng)累加器通過ena口收到來自cpu狀態(tài)控制器load_acc信號(hào)時(shí),在clk1時(shí)鐘正跳沿時(shí)就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。主要的verilog代碼見下面模塊:module accum(accum,data,ena,clk1,rst);output7:0 accum;input7:0 data;input ena,clk1,rst;reg7:0 accum;always (

10、posedge clk1) begin if(rst) accum=8b00000000; else if(ena) accum=data; endendmodule(4) 算術(shù)運(yùn)算器 它根據(jù)輸入得8種不同的操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等基本操作運(yùn)算。主要的verilog代碼見下面模塊:module alu(alu_out,zero,data,accum,alu_clk,opcode);output7:0 alu_out;output zero;input7:0 data,accum;input2:0 opcode;input alu_clk;reg7:0 alu_out;param

11、eter hlt=3b000, skz=3b001, add=3b010, andd=3b011, xorr=3b100, lda=3b101, sto=3b110, jmp=3b111;assign zero=!accum;always (posedge alu_clk) begin casex(opcode) hlt: alu_out=accum; skz: alu_out=accum; add: alu_out=data+accum; andd:alu_out=data&accum; xorr:alu_out=dataaccum; lda: alu_out=data; sto: alu_

12、out=accum; jmp: alu_out=accum;default: alu_out=8bxxxxxxxx; endcase endendmodule(5) 數(shù)據(jù)控制器數(shù)據(jù)控制器的作用是控制累加器的數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時(shí)傳送數(shù)據(jù)的公共通道,不同情況下傳送不同的內(nèi)容。主要的verilog代碼見下面模塊:module datactl(data,in,data_ena);output7:0 data;input7:0 in;input data_ena;assign data=(data_ena)?in:8bzzzzzzzz;endmodule(6) 地址多路器地址多路器只要的作

13、用是選擇輸出的地址是pc地址還是數(shù)據(jù)/端口地址。地址的選擇輸出信號(hào)由時(shí)鐘信號(hào)的8分頻信號(hào)fetch提供。主要的verilog代碼見下面模塊:module adr(addr,fetch,ir_addr,pc_addr);output12:0 addr;input12:0 ir_addr,pc_addr;input fetch;assign addr=fetch?pc_addr:ir_addr;endmodule(7) 程序計(jì)數(shù)器程序計(jì)數(shù)器用于提供指令地址,以便讀取指令。復(fù)位后,指令指針為零,即每次cpu重新啟動(dòng)將從rom的零地址開始讀取指令并執(zhí)行每條指令執(zhí)行完需兩個(gè)時(shí)鐘,這時(shí)pc_addr已被增

14、2,指向下一條指令。如果正在執(zhí)行的指令是跳轉(zhuǎn)語(yǔ)句,這時(shí)cpu狀態(tài)控制器將會(huì)輸出load_pc信號(hào),通過load口進(jìn)入程序計(jì)數(shù)器。程序計(jì)數(shù)器(pc_addr)將裝入目標(biāo)地址(ir_addr),而不是增2.主要的verilog代碼見下面模塊:module counter(pc_addr,ir_addr,load,rst);output12:0 pc_addr;input12:0 ir_addr;input load,clock,rst;reg12:0 pc_addr;always (posedge clock or posedge rst) begin if(rst) pc_addr=13b000

15、0000000000; else if(load)pc_addr=ir_addr;else pc_addr=pc_addr+1; endendmodule(8) 狀態(tài)控制器狀態(tài)控制器主要由兩個(gè)部分組成:a 狀態(tài)機(jī);b 狀態(tài)控制器。狀態(tài)控制器接受復(fù)位信號(hào)rst,當(dāng)rst有效時(shí),通過信號(hào)ena使其為0,輸入到狀態(tài)機(jī)中以停止?fàn)顟B(tài)機(jī)的工作。狀態(tài)控制器主要的verilog代碼見下面模塊:module machinectl(ena,fetch,rst);output ena;input fetch,rst;reg ena;always (posedge fetch or posedge rst) begi

16、n if(rst) ena=0; else ena=1; endendmodule狀態(tài)機(jī)是cpu的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或停止某些部件。cpu何時(shí)進(jìn)行讀寫指令來讀寫i/o端口及ram區(qū)等操作,都是由狀態(tài)機(jī)來控制的。狀態(tài)控制器主要的verilog代碼見下面模塊:module machine(inc_pc,load_acc,load_pc,rd,wr,load_ir,datactl_ena,halt,clk1,zero,ena,opcode);output inc_pc,load_acc,load_pc,rd,wr,load_ir;output datactl_ena,halt;

17、input clk1,zero,ena;input2:0 opcode;reg inc_pc,load_acc,load_pc,rd,wr,load_ir;reg datactl_ena,halt;reg2:0 state;paremeter hlt=3b000, skz=3b001, add=3b010, andd=3b011, xorr=3b100, lda=3b101, sto=3b110, jmp=3b111;always (negedge clk1)begin if(!ena) beginstate=3b000;inc_pc,load_acc,load,pc,rd=4b0000;wr

18、,load_ir,datactl_ena,halt=4b0000;endelsetask ctl_cyclebegincasex(state)3b000; beginstate=3b001;inc_pc,load_acc,load,pc,rd=4b0001;wr,load_ir,datactl_ena,halt=4b0100;end3b001; beginstate=3b010;inc_pc,load_acc,load,pc,rd=4b1001;wr,load_ir,datactl_ena,halt=4b0100;end3b010; beginstate=3b011;inc_pc,load_a

19、cc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b0000;end3b011; beginif(opcode=hlt)begininc_pc,load_acc,load,pc,rd=4b1000;wr,load_ir,datactl_ena,halt=4b0001;end else begin inc_pc,load_acc,load,pc,rd=4b1000;wr,load_ir,datactl_ena,halt=4b0000; end state=3b100; end3b100; beginif(opcode=jmp)begininc_p

20、c,load_acc,load,pc,rd=4b0010;wr,load_ir,datactl_ena,halt=4b0000;end elseif(opcode=add|opcode=andd|opcode=xorr|opcode=lda) begin inc_pc,load_acc,load,pc,rd=4b0001;wr,load_ir,datactl_ena,halt=4b0000; endelseif(opcode=sto) begin inc_pc,load_acc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b0010; ende

21、lse begin inc_pc,load_acc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b0000; end state=3b101; end3b101; beginif(opcode=add|opcode=andd|opcode=xorr|opcode=lda)begininc_pc,load_acc,load,pc,rd=4b0101;wr,load_ir,datactl_ena,halt=4b0000;end elseif(opcode=skz&zero=1) begin inc_pc,load_acc,load,pc,rd=4b

22、1000;wr,load_ir,datactl_ena,halt=4b0000; endelseif(opcode=jmp) begin inc_pc,load_acc,load,pc,rd=4b1010;wr,load_ir,datactl_ena,halt=4b0000; endelseif(opcode=sto) begin inc_pc,load_acc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b1010; end else begin inc_pc,load_acc,load,pc,rd=4b0000;wr,load_ir,dat

23、actl_ena,halt=4b0000; end state=3b110; end3b110; beginif(opcode=sto)begininc_pc,load_acc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b0010;end elseif(opcode=add|opcode=andd|opcode=xorr|opcode=lda) begin inc_pc,load_acc,load,pc,rd=4b0001;wr,load_ir,datactl_ena,halt=4b0000; endelse begin inc_pc,loa

24、d_acc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b0000; end state=3b111; end3b111; beginif(opcode=skz&zero=1)begininc_pc,load_acc,load,pc,rd=4b1000;wr,load_ir,datactl_ena,halt=4b0000;end else begin inc_pc,load_acc,load,pc,rd=4b0000;wr,load_ir,datactl_ena,halt=4b0000; end state=3b000; enddefault;

25、begininc_pc,load_acc,load,pc,rd=4b1000;wr,load_ir,datactl_ena,halt=4b0000;state=3b000;endendcaseendendtaskendmodule(9) 外圍模塊為了對(duì)risc_cpu進(jìn)行測(cè)試,需要有存儲(chǔ)測(cè)試程序的rom和裝載數(shù)據(jù)的ram、地址譯碼器。地址譯碼器主要的verilog代碼見下面模塊:module addr_decode(addr,rom_sel,ram_sel);output rom_sel,ram_sel;input12:0 addr;reg rom_sel,ram_sel;always (ad

26、dr)begin casex(addr) 13b11xxxxxxxxxxx:rom_sel,ram_sel=2b01; 13b0xxxxxxxxxxxx:rom_sel,ram_sel=2b10; 13b10xxxxxxxxxxx:rom_sel,ram_sel=2b10; default:rom_sel,ram_sel=2b00; endcaseendendmoduleram主要的verilog代碼見下面模塊:module ram(data,addr,ena,read,write);inout7:0 data;input9:0 addr;input ena;input read,write;reg7:0 ram10h3ff:0;assign data=(read&ena)?ramaddr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論