Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第1頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第2頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第3頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第4頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、前言前言 這個(gè)CPU模型只是一個(gè)教學(xué)模型, 設(shè)計(jì)也不一定合理,只是從原理上說明了一個(gè)簡單的RISC_CPU的構(gòu)成。我們?cè)谶@里介紹它的目的是想說明:Verilog HDL仿真和綜合工具的潛力和本文介紹的設(shè)計(jì)方法對(duì)軟硬件聯(lián)合設(shè)計(jì)是有重要意義的。我們也希望這一章能引起對(duì) CPU 原理和復(fù)雜數(shù)字邏輯系統(tǒng)設(shè)計(jì)有興趣的同學(xué)的注意,加入我們的設(shè)計(jì)隊(duì)伍。由于我們的經(jīng)驗(yàn)與學(xué)識(shí)有限,不足之處敬請(qǐng)讀者指正。 什么是什么是CPUCPU? CPU 即中央處理單元的英文縮寫,它是計(jì)算機(jī)的核心部件。計(jì)算機(jī)進(jìn)行信息處理可分為兩個(gè)步驟:1)將數(shù)據(jù)和程序(即指令序列)輸入到計(jì)算機(jī)的存儲(chǔ)器中。2)從第一條指令的地址起開始執(zhí)行該程序

2、,得到所需結(jié)果,結(jié)束運(yùn)行。CPU的作用是協(xié)調(diào)并控制計(jì)算機(jī)的各個(gè)部件執(zhí)行程序的指令序列,使其有條不紊地進(jìn)行。因此它必須具有以下基本功能: a)取指令:當(dāng)程序已在存儲(chǔ)器中時(shí),首先根據(jù)程序入口地址取出一條程序,為此要發(fā)出指令地址及控制信號(hào)。 b)分析指令:即指令譯碼。是對(duì)當(dāng)前取得的指令進(jìn)行分析,指出它要求什么操作,并產(chǎn)生相應(yīng)的操作控制命令。 將其功能進(jìn)一步細(xì)化,可概括如下:1) 能對(duì)指令進(jìn)行譯碼并執(zhí)行規(guī)定的動(dòng)作;2) 可以進(jìn)行算術(shù)和邏輯運(yùn)算;3) 能與存儲(chǔ)器,外設(shè)交換數(shù)據(jù);4) 提供整個(gè)系統(tǒng)所需要的控制; c)執(zhí)行指令:根據(jù)分析指令時(shí)產(chǎn)生的“操作命令”形成相應(yīng)的操作控制信號(hào)序列,通過運(yùn)算器,存儲(chǔ)器及

3、輸入/輸出設(shè)備的執(zhí)行,實(shí)現(xiàn)每條指令的功能,其中包括對(duì)運(yùn)算結(jié)果的處理以及下條指令地址的形成。盡管各種CPU的性能指標(biāo)和結(jié)構(gòu)細(xì)節(jié)各不相同,但它們所能完成的基本功能相同。由功能分析,可知任何一種CPU內(nèi)部結(jié)構(gòu)至少應(yīng)包含下面這些部件: 1)算術(shù)邏輯運(yùn)算部件(ALU); 2)累加器; 3)程序計(jì)數(shù)器; 4)指令寄存器,譯碼器; 5)時(shí)序和控制部件。RISC RISC 即精簡指令集計(jì)算機(jī)(即精簡指令集計(jì)算機(jī)(Reduced Instruction Set Reduced Instruction Set ComputerComputer)的縮寫。它是一種八十年代才出現(xiàn)的的縮寫。它是一種八十年代才出現(xiàn)的CPU

4、CPU,與與一般的一般的CPU CPU 相比不僅只是簡化了指令系統(tǒng),而且是通過相比不僅只是簡化了指令系統(tǒng),而且是通過簡化指令系統(tǒng)使計(jì)算機(jī)的結(jié)構(gòu)更加簡單合理,從而提高簡化指令系統(tǒng)使計(jì)算機(jī)的結(jié)構(gòu)更加簡單合理,從而提高了運(yùn)算速度。從實(shí)現(xiàn)的途徑看,了運(yùn)算速度。從實(shí)現(xiàn)的途徑看,RISC_CPURISC_CPU與一般的與一般的CPUCPU的的不同處在于:它的時(shí)序控制信號(hào)形成部件是用硬布線邏不同處在于:它的時(shí)序控制信號(hào)形成部件是用硬布線邏輯實(shí)現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯實(shí)現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發(fā)器和邏輯門直接連線所構(gòu)成的狀態(tài)機(jī)和輯也就是用觸發(fā)器和邏輯門直接

5、連線所構(gòu)成的狀態(tài)機(jī)和組合邏輯,故產(chǎn)生控制序列的速度比用組合邏輯,故產(chǎn)生控制序列的速度比用微程序控制方式微程序控制方式快得多,因?yàn)檫@樣做省去了讀取微指令的時(shí)間??斓枚?,因?yàn)檫@樣做省去了讀取微指令的時(shí)間。RISC_CPURISC_CPU也包括上述這些部件,下面就詳細(xì)介紹一個(gè)簡也包括上述這些部件,下面就詳細(xì)介紹一個(gè)簡化的用于教學(xué)目的的化的用于教學(xué)目的的RISC_CPURISC_CPU的可綜合的可綜合VerilogHDLVerilogHDL模型模型的設(shè)計(jì)和仿真過程。的設(shè)計(jì)和仿真過程。RISC CPURISC CPU結(jié)構(gòu)結(jié)構(gòu) RISC_CPURISC_CPU是一個(gè)復(fù)雜的數(shù)字邏輯電路,但是它的是一個(gè)復(fù)雜的

6、數(shù)字邏輯電路,但是它的基本部件的邏輯并不復(fù)雜??砂阉殖砂藗€(gè)基本基本部件的邏輯并不復(fù)雜??砂阉殖砂藗€(gè)基本部件:部件: 1) 1) 時(shí)鐘發(fā)生器時(shí)鐘發(fā)生器 2) 2) 指令寄存器指令寄存器 3) 3) 累加器累加器 4) 4) RISC CPURISC CPU算術(shù)邏輯運(yùn)算單元算術(shù)邏輯運(yùn)算單元 5) 5) 數(shù)據(jù)控制器數(shù)據(jù)控制器 6) 6) 狀態(tài)控制器狀態(tài)控制器 7) 7) 程序計(jì)數(shù)器程序計(jì)數(shù)器 8) 8) 地址多路器地址多路器DATA ALU_OUTACCUM zeroalu_clk alu opcodedata opc_iraddrenarst registerclk1data accumena

7、 accumrstclk1 CLK1 INC_PCZERO LOAD_ACCFETCH LOAD_PCRST CONTROL RD WR OPCODE LOAD_IR HALT DATACTL_ENA In data datactldata_ena fetch addrir_addr adrpc_addrir_addr pc_addrloadclock counterrst clk 1fetch clk alu_clk clk_genDATAIRSTICLKI OPCODE IR_ADDR ALU_OUTACCUMZEROOPCODEDATA_ENAPC_ADDRADDRDATAIHALTIL

8、OAD_IRIR_ADDRWRIRDILOAD_ACCINC_PCLOAD_PCRISCCPU中各部件的相互連接關(guān)系中各部件的相互連接關(guān)系1 1 時(shí)鐘發(fā)生器時(shí)鐘發(fā)生器 CLKCLK1CLKGENALU_CLKFETCHCLKCLK1ALU_CLK FETCH時(shí)鐘發(fā)生器RESETRESET時(shí)鐘發(fā)生器 clkgen 利用外來時(shí)鐘信號(hào)clk 來生成一系列時(shí)鐘信號(hào)clk1、fetch、alu_clk 送往CPU的其他部件。其中fetch是外來時(shí)鐘 clk 的八分頻信號(hào)。利用fetch的上升沿來觸發(fā)CPU控制器開始執(zhí)行一條指令,同時(shí)fetch信號(hào)還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk1信號(hào)用作

9、指令寄存器、累加器、狀態(tài)控制器的時(shí)鐘信號(hào)。alu_clk 則用于觸發(fā)算術(shù)邏輯運(yùn)算單元。 clkclk1clk2clk4fetchalu_clk時(shí)鐘發(fā)生器clkgen的波形module clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk);module clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk);input clk,reset;input clk,reset;output clk1,clk2,clk4,fetch,alu_clk;output clk1,clk2,clk4,fetch,alu_clk

10、;wire clk,reset;wire clk,reset;reg clk2,clk4,fetch,alu_clk;reg clk2,clk4,fetch,alu_clk;reg7:0 state;reg7:0 state;parameter S1 = 8b00000001,parameter S1 = 8b00000001, S2 = 8b00000010, S2 = 8b00000010, S3 = 8b00000100, S3 = 8b00000100, S4 = 8b00001000, S4 = 8b00001000, S5 = 8b00010000, S5 = 8b00010000

11、, S6 = 8b00100000, S6 = 8b00100000, S7 = 8b01000000, S7 = 8b01000000, S8 = 8b10000000, S8 = 8b10000000, idle = 8b00000000; idle = 8b00000000; assign clk1 = clk;assign clk1 = clk;always (negedge clk)always (negedge clk) if(reset) if(reset) begin begin clk2 = 0; clk2 = 0; clk4 = 1; clk4 = 1; fetch = 0

12、; fetch = 0; alu_clk = 0; alu_clk = 0; state = idle; state = idle; end end else else begin begin case(state) case(state) S1: begin S1: begin clk2 = clk2; clk2 = clk2; alu_clk = alu_clk; alu_clk = alu_clk; state = S2; state = S2; end end S2: begin S2: begin clk2 = clk2; clk2 = clk2; clk4 = clk4; clk4

13、 = clk4; alu_clk = alu_clk; alu_clk = alu_clk; state = S3; state = S3; end end S3: begin S3: begin clk2 = clk2; clk2 = clk2; state = S4; state = S4; end end S4: begin S4: begin clk2 = clk2; clk2 = clk2; clk4 = clk4; clk4 = clk4; fetch = fetch; fetch = fetch; state = S5; state = S5; end end S5: begin

14、 S5: begin clk2 = clk2; clk2 = clk2; state = S6; state = S6; end end S6: S6: begin begin clk2 = clk2; clk2 = clk2; clk4 = clk4; clk4 = clk4; state = S7; state = S7; end end S7: S7: begin begin clk2 = clk2; clk2 = clk2; state = S8; state = S8; end end S8: S8: begin begin clk2 = clk2; clk2 = clk2; clk

15、4 = clk4; clk4 = clk4; fetch = fetch; fetch = fetch; state = S1; state = S1; end end idle: state = S1; idle: state = S1; default: state = idle; default: state = idle; endcase endcase end endendmoduleendmodule2 2 指令寄存器指令寄存器 DATA7:0RSTENACLK1opc_iraddrs15:0REGISTERINSTRUCTION REGISTERDATA7:0LOAD_IRCLK

16、1RESETOPCODE2:0IR_ADDR12:0顧名思義,指令寄存器用于寄存指令。顧名思義,指令寄存器用于寄存指令。指令寄存器的觸發(fā)時(shí)鐘是指令寄存器的觸發(fā)時(shí)鐘是clk1clk1,在在clk1clk1的正沿觸發(fā)下,的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入高寄存器將數(shù)據(jù)總線送來的指令存入高8 8位或低位或低8 8位寄存器位寄存器中。但并不是每個(gè)中。但并不是每個(gè)clk1clk1的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因?yàn)閿?shù)據(jù)總線上有時(shí)傳輸指令,有時(shí)傳輸數(shù)據(jù)。什么時(shí)因?yàn)閿?shù)據(jù)總線上有時(shí)傳輸指令,有時(shí)傳輸數(shù)據(jù)。什么時(shí)候寄存,什么時(shí)候不寄存由候寄存,什么時(shí)候不寄存由CPUCPU狀

17、態(tài)控制器的狀態(tài)控制器的load_irload_ir信信號(hào)控制。號(hào)控制。load_irload_ir信號(hào)通過信號(hào)通過ena ena 口輸入到指令寄存器。復(fù)口輸入到指令寄存器。復(fù)位后,指令寄存器被清為零。位后,指令寄存器被清為零。每條指令為每條指令為2 2個(gè)字節(jié),即個(gè)字節(jié),即1616位。高位。高3 3位是操作碼,低位是操作碼,低1313位位是地址。(是地址。(CPUCPU的地址總線為的地址總線為1313位,尋址空間為位,尋址空間為8 8K K字節(jié)。)字節(jié)。)本設(shè)計(jì)的數(shù)據(jù)總線為本設(shè)計(jì)的數(shù)據(jù)總線為8 8位,所以每條指令需取兩次。先取位,所以每條指令需取兩次。先取高高8 8位,后取低位,后取低8 8位。

18、而當(dāng)前取的是高位。而當(dāng)前取的是高8 8位還是低位還是低8 8位,由位,由變量變量statestate記錄。記錄。statestate為零表示取的高為零表示取的高8 8位,存入高位,存入高8 8位位寄存器,同時(shí)將變量寄存器,同時(shí)將變量statestate置為置為1 1。下次再寄存時(shí),由于。下次再寄存時(shí),由于statestate為為1 1,可知取的是低,可知取的是低8 8位,存入低位,存入低8 8位寄存器中。位寄存器中。module register(opc_iraddr,data,ena,clk1,rst);output 15:0 opc_iraddr;input 7:0 data;input

19、ena, clk1, rst;reg 15:0 opc_iraddr;reg state;always (posedge clk1) begin if(rst) begin opc_iraddr=16b0000_0000_0000_0000; state=1b0; endelsebegin if(ena) /如果加載指令寄存器信號(hào)load_ir到來, begin /分兩個(gè)時(shí)鐘每次8位加載指令寄存器 casex(state)/先高字節(jié),后低字節(jié) 1b0: begin opc_iraddr15:8=data; state=1; end 1b1: begin opc_iraddr7:0=data;

20、state=0;end default: begin opc_iraddr15:0=16bxxxxxxxxxxxxxxxx; state=1bx; end endcase end else state=1b0; endendendmodule3.3.累加器累加器DATA7:0RSTENACLK1ACCUM7:0ACCUMULATORACCUMULATORALU_OUT7:0LOAD_ACCCLK1RSTACCUM7:0累加器用于存放當(dāng)前的結(jié)果,它也是雙目運(yùn)算其中一個(gè)數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當(dāng)累加器通過ena口收到來自CPU狀態(tài)控制器load_acc信號(hào)時(shí),在clk1時(shí)鐘正跳沿時(shí)就收到

21、來自于數(shù)據(jù)總線的數(shù)據(jù)。module accum( accum, data, ena, clk1, rst);output7:0accum;input7:0data;input ena,clk1,rst;reg7:0accum;always(posedge clk1) begin if(rst) accum=8b0000_0000;/Reset else if(ena)/當(dāng)CPU狀態(tài)控制器發(fā)出load_acc信號(hào) accum=data;/Accumulate endendmodule4.4.算術(shù)運(yùn)算器算術(shù)運(yùn)算器 D AT A7:0ACCUM 7:0ALU_CLO CKO PCO D E2:0 Z

22、EROALU_O UT 7:0ALUD AT A7:0ACCUM 7:0ZEROALU_O UT 7:0ALU_CLO CKO PCO D E2:0算術(shù)邏輯運(yùn)算單元 根據(jù)輸入的8種不同操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等8種基本操作運(yùn)算。利用這幾種基本運(yùn)算可以實(shí)現(xiàn)很多種其它運(yùn)算以及邏輯判斷等操作。 module alu (alu_out, zero, data, accum, alu_clk, opcode);output 7:0alu_out;output zero;input 7:0 data, accum;input 2:0 opcode;input alu_clk;reg 7:0

23、alu_out;parameter HLT =3b000,SKZ =3b001,ADD =3b010,ANDD =3b011,XORR =3b100,LDA =3b101,STO =3b110,JMP =3b111;assign zero = !accum;always (posedgealu_clk) begin /操作碼來自指令寄存器的輸出opc_iaddr的 /低3位 casex (opcode) HLT: alu_out=accum; SKZ: alu_out=accum; ADD: alu_out=data+accum; ANDD: alu_out=data&accum; XORR:

24、 alu_out=dataaccum; LDA: alu_out=data; STO: alu_out=accum; JMP: alu_out=accum; default: alu_out=8bxxxx_xxxx; endcase endendmodule5.5.數(shù)據(jù)控制器數(shù)據(jù)控制器DATACTLIN7:0DATA_ENADATA7:0ALU_OUT7:0DATACTL_ENADATA7:0數(shù)據(jù)控制器的作用是控制累加器數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時(shí)傳送數(shù)據(jù)的公共通道,不同的情況下傳送不同的內(nèi)容。有時(shí)要傳輸指令,有時(shí)要傳送RAM區(qū)或接口的數(shù)據(jù)。計(jì)算單元的數(shù)據(jù)只有在需要往RAM區(qū)或端口寫時(shí)才

25、允許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。 所以任何部件往總線上輸出數(shù)據(jù)時(shí),都需要一控制信號(hào)。而此控制信號(hào)的啟、停,則由CPU狀態(tài)控制器輸出的各信號(hào)控制決定。數(shù)據(jù)控制器何時(shí)輸出ALU的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號(hào)datactl_ena決定。module datactl (data,in,data_ena);output 7:0data;input 7:0in;input data_ena; assign data = (data_ena)? In : 8bzzzz_zzzz;endmodule6.6.地址多路器地址多路器 ADDRPC_ADDR12 : 0 IR_ADDR12

26、 : 0 FETCHADDR12 : 0PC_ADDR12 : 0IR_ADDR12 : 0FETCHADDR12 : 0地址多路器用于選擇輸出的地址是PC(程序計(jì)數(shù))地址還是數(shù)據(jù)/端口地址。每個(gè)指令周期的前4個(gè)時(shí)鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址。后4個(gè)時(shí)鐘周期用于對(duì)RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號(hào)由時(shí)鐘信號(hào)的8分頻信號(hào)fetch提供。 moduleadr(addr,fetch,ir_addr,pc_addr);output 12:0 addr;input 12:0 ir_addr, pc_addr;input fetch;assign addr =

27、fetch? pc_addr : ir_addr;endmodule7.7.程序計(jì)數(shù)器程序計(jì)數(shù)器 COUNTERIR_ADDR12 : 0LOADCLOCKRSTPC_ADDR12 : 0PC_ADDR12 : 0IR_ADDR12 : 0LOAD_PCINC_PCRESET程序計(jì)數(shù)器用于提供指令地址。以便讀取指令,指令按地址順序存放在存儲(chǔ)器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。復(fù)位后,指令指針為零,即每次CPU重新啟動(dòng)將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需2個(gè)時(shí)鐘,這時(shí)pc_addr

28、已被增2,指向下一條指令。(因?yàn)槊織l指令占兩個(gè)字節(jié)。)如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時(shí)CPU狀態(tài)控制器將會(huì)輸出load_pc信號(hào),通過load口進(jìn)入程序計(jì)數(shù)器。程序計(jì)數(shù)器(pc_addr)將裝入目標(biāo)地址(ir_addr),而不是增2。module counter ( pc_addr, ir_addr, load, clock, rst);output 12:0 pc_addr;input 12:0 ir_addr;input load, clock, rst;reg 12:0 pc_addr;always ( posedge clock or posedge rst ) begin if(rs

29、t) pc_addr=13b0_0000_0000_0000; else if(load) pc_addr=ir_addr; else pc_addr = pc_addr + 1; endendmodule狀態(tài)控制器由兩部分組成:1.狀態(tài)機(jī)(圖中的MACHINE部分)2.狀態(tài)機(jī)控制器(圖中的MACHINECTL部分)狀態(tài)機(jī)控制器接受復(fù)位信號(hào)RST,當(dāng)RST有效時(shí)通過信號(hào)ena使其為0,輸入到狀態(tài)機(jī)中停止?fàn)顟B(tài)機(jī)的工作。8.8.狀態(tài)控制器狀態(tài)控制器CLK1OPCODE2:0INT_FLAGENAENAFETCHRST machinectlCLK1ZEROZEROFETCHRSTOPCODE2:0I

30、NT_FLAGINC_PCLOAD_ACCLOAD_PCRDWRLOAD_IRHALTDATACTL_ENAINC_PCLOAD_ACCLOAD_PCMEM_RDMEM_WRLOAD_IRHALTDATACTL_ENAMACHINEmodule machinectl( ena, fetch, rst);output ena;input fetch, rst;reg ena;always (posedge fetch or posedge rst) begin if(rst) ena=0; else ena=1; endendmodule狀態(tài)機(jī)是CPU的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或

31、停止某些部件。CPU何時(shí)進(jìn)行讀指令讀寫I/O端口,RAM區(qū)等操作,都是由狀態(tài)機(jī)來控制的。狀態(tài)機(jī)的當(dāng)前狀態(tài),由變量state記錄,state的值就是當(dāng)前這個(gè)指令周期中已經(jīng)過的時(shí)鐘數(shù)(從零計(jì)起)。 指令周期是由8個(gè)時(shí)鐘周期組成,每個(gè)時(shí)鐘周期都要完成固定的操作1)第0個(gè)時(shí)鐘,因?yàn)镃PU狀態(tài)控制器的輸出:rd和load_ir為高電平,其余均為低電平。指令寄存器寄存由ROM送來的高8位指令代碼。2)第1個(gè)時(shí)鐘,與上一時(shí)鐘相比只是inc_pc從0變?yōu)?故PC增1,ROM送來低8位指令代碼,指令寄存器寄存該8位代碼。3)第2個(gè)時(shí)鐘,空操作。4)第3個(gè)時(shí)鐘,PC增1,指向下一條指令。若操作符為HLT,則輸出信

32、號(hào)HLT為高。如果操作符不為HLT,除了PC增一外(指向下一條指令),其它各控制線輸出為零。5)第4個(gè)時(shí)鐘,若操作符為AND、ADD、XOR或LDA,讀相應(yīng)地址的數(shù)據(jù);若為JMP,將目的地址送給程序計(jì)數(shù)器;若為STO,輸出累加器數(shù)據(jù)。6)第5個(gè)時(shí)鐘,若操作符為ANDD、ADD或XORR,算術(shù)運(yùn)算器就進(jìn)行相應(yīng)的運(yùn)算;若為LDA,就把數(shù)據(jù)通過算術(shù)運(yùn)算器送給累加器;若為SKZ,先判斷累加器的值是否為0,如果為0,PC就增1,否則保持原值;若為JMP,鎖存目的地址;若為STO,將數(shù)據(jù)寫入地址處。7)第6個(gè)時(shí)鐘,空操作。8)第7個(gè)時(shí)鐘,若操作符為SKZ且累加器值為0,則PC值再增1,跳過一條指令,否則P

33、C無變化。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;input clk1, zero, ena;input 2:0 opcode;reg inc_pc, load_acc, load_pc, rd, wr, load_ir;reg datactl_ena, halt;reg 2:0 s

34、tate;parameter HLT = 3 b000, SKZ = 3 b001, DD = 3 b010, ANDD = 3 b011, XORR = 3 b100, LDA = 3 b101, STO = 3 b110, JMP = 3 b111;always ( negedge clk1 ) begin if ( !ena ) /接收到復(fù)位信號(hào)RST,進(jìn)行復(fù)位操作 begin state=3b000; inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; end else ctl_cycle; en

35、d/-begin of task ctl_cycle-task ctl_cycle;begincasex(state) 3b000: /load high 8bits instruction begin inc_pc,load_acc,load_pc,rd=4b0001; wr,load_ir,datactl_ena,halt=4b0100; state=3b001; end3b001:/pc increased by one then load low 8bits instruction begin inc_pc,load_acc,load_pc,rd=4b1001; wr,load_ir,

36、datactl_ena,halt=4b0100; state=3b010; end3b010:/idle begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; state=3b011; end3b011:/next instruction address setup 分析指令從這里開始 begin if(opcode=HLT)/指令為暫停HLT begin inc_pc,load_acc,load_pc,rd=4b1000; wr,load_ir,datactl_ena,halt=4b0001;

37、 end else begin inc_pc,load_acc,load_pc,rd=4b1000; wr,load_ir,datactl_ena,halt=4b0000; end state=3b100;end3b100: /fetch oprand begin if(opcode=JMP) begin inc_pc,load_acc,load_pc,rd=4b0010; wr,load_ir,datactl_ena,halt=4b0000; end else if( opcode=ADD | opcode=ANDD | opcode=XORR | opcode=LDA) begin inc

38、_pc,load_acc,load_pc,rd=4b0001; wr,load_ir,datactl_ena,halt=4b0000; endelse if(opcode=STO) begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0010; endelse begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; end state=3b101;end3b101:/operation begin if (

39、opcode=ADD|opcode=ANDD| opcode=XORR|opcode=LDA ) begin/過一個(gè)時(shí)鐘后與累加器的內(nèi)容進(jìn)行運(yùn)算 inc_pc,load_acc,load_pc,rd=4b0101; wr,load_ir,datactl_ena,halt=4b0000; end else if( opcode=SKZ & zero=1) begin inc_pc,load_acc,load_pc,rd=4b1000; wr,load_ir,datactl_ena,halt=4b0000; end else if(opcode=JMP) begin inc_pc,load_acc

40、,load_pc,rd=4b1010; wr,load_ir,datactl_ena,halt=4b0000; end else if(opcode=STO) begin /過一個(gè)時(shí)鐘后把wr變1就可寫到RAM中 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,datactl_ena,halt=4b0000; end state=3b110; end3b110:/idle begi

41、n If ( opcode=STO ) begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0010; end else if ( opcode=ADD|opcode=ANDD| opcode=XORR|opcode=LDA) begin inc_pc,load_acc,load_pc,rd=4b0001; wr,load_ir,datactl_ena,halt=4b0000; end else begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,dat

42、actl_ena,halt=4b0000; end state=3b111; end3b111:/ begin if( opcode=SKZ & zero=1 ) begin inc_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: begin inc_pc,load_acc,load

43、_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; state=3b000; endendcaseendendtask/-end of task ctl_cycle-endmodule為了對(duì)為了對(duì)RISC_CPU進(jìn)行測(cè)試,需要有存儲(chǔ)進(jìn)行測(cè)試,需要有存儲(chǔ)測(cè)試程序的測(cè)試程序的ROM和裝載數(shù)據(jù)的和裝載數(shù)據(jù)的RAM、地地址譯碼器。址譯碼器。9.外圍模塊外圍模塊1.1.地址譯碼器地址譯碼器module addr_decode( addr, rom_sel, ram_sel);module addr_decode( addr, rom_sel, ram_s

44、el);output rom_sel, ram_sel;output rom_sel, ram_sel;input 12:0 addr;input 12:0 addr;reg rom_sel, ram_sel;reg rom_sel, ram_sel; always always ( addr )( addr ) begin begin casex(addr) casex(addr) 13b1_1xxx_xxxx_xxxx:rom_sel,ram_sel=2b01; 13b1_1xxx_xxxx_xxxx:rom_sel,ram_sel=2b01; 13b0_xxxx_xxxx_xxxx:ro

45、m_sel,ram_sel=2b10; 13b0_xxxx_xxxx_xxxx:rom_sel,ram_sel=2b10; 13b1_0 xxx_xxxx_xxxx:rom_sel,ram_sel=2b10; 13b1_0 xxx_xxxx_xxxx:rom_sel,ram_sel=2b10; default:rom_sel,ram_sel=2b00; default:rom_sel,ram_sel=2b00; endcase endcase end endendmoduleendmodule地址譯碼器用于產(chǎn)生選通地址譯碼器用于產(chǎn)生選通信號(hào),選通信號(hào),選通ROMROM或或RAMRAM。FFFFH-1800H RAMFFFFH-1800H RAM1800H-0000H ROM1800H-0000H ROM 2.RAM和ROMmodule ram( data, addr, ena, read, write );inout 7:0 data;input 9:0 addr;input ena;input read, write;reg 7:0 ram 10h3ff:0;assign data = ( read & ena )? ramaddr : 8hzz;always (posedge write

溫馨提示

  • 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. 人人文庫網(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)論