?? cpu.v
字號(hào):
//------------------------------------------- cpu.v 文件的開始 -------------------------------------------/********************************************************************************* 模塊功能:CPU 模塊是16位RISC_ CPU的核心, 不同書上的是該模塊包含CPU的所有功能。*** 它本身也是可綜合的模塊。已經(jīng)通過門級(jí)后仿真驗(yàn)證。 *****************************************************************************/`timescale 1ns/1nsmodule CPU(input clk, //時(shí)鐘 input reset_n, //復(fù)位信號(hào) inout [15:0] rddata, //讀數(shù)據(jù) output reg wr, //寫使能 output reg rd, //讀使能 output reg halt, //停機(jī)指示 output reg [12:0] addr //地址 ); //CPU內(nèi)部用寄存器 reg [1:0] state; //狀態(tài) reg en_wr; //寫數(shù)據(jù)使能 reg [15:0] alu; //運(yùn)算器結(jié)果 reg [12:0] ip; //指令指針. reg [2:0] opcode; //操作碼 reg [12:0] opaddr; //操作地址 reg [15:0] wrdata; //寫數(shù)據(jù) // wire [15:0] wrdata; assign rddata = (en_wr)? wrdata : 16'bzzzz_zzzz_zzzz_zzzz;parameter HLT=3'd0, SKZ=3'd1, ADD=3'd2, ANDD=3'd3, XORR=3'd4, LDA=3'd5, STO=3'd6, SJMP=3'd7; parameter S0=2'b00, S1=2'b01, S2=2'b10, S3=2'b11;always@(posedge clk or negedge reset_n) if(!reset_n) //如果復(fù)位有效 begin wr<=1'b1; //寫信號(hào)無效 en_wr<=1'b0; //寫使能無效 rd<=1'b1; //讀信號(hào)無效 halt<=1'b0; //清停機(jī)指示 addr<=13'b0; //初始指令地址為0 wrdata<=16'b0; //寫數(shù)據(jù)清為0 alu<=16'b0; //累加器清為0 ip<=13'b0; //指令指針清0,從0地址執(zhí)行程序 state<=S3; //下一狀態(tài)為讀指令周期 end else case(state) S0: begin //讀指令處理 state<=S1; //設(shè)置下一狀態(tài) opcode<=rddata[15:13]; //操作碼 opaddr<=rddata[12:0]; //操作地址 case(rddata[15:13]) //根據(jù)操作碼不同進(jìn)行處理 HLT: //停機(jī) begin rd<=1'b1; wr<=1'b1; en_wr<=1'b0; //寫使能無效 halt<=1'b1; //置停機(jī)標(biāo)志 //ip<=ip+12'd1; //指令指針加1 end SKZ: //計(jì)算結(jié)果為0轉(zhuǎn)移 begin rd<=1'b1; wr<=1'b1; en_wr<=1'b0; //寫使能無效 if(alu==16'b0) ip<=ip+3'd2; //如果轉(zhuǎn)移,指令指針加2 else ip<=ip+3'd1; //不轉(zhuǎn)移,指令指針加1 end XORR,ADD,ANDD,LDA: //計(jì)算指令處理 begin en_wr<=1'b0; //寫使能無效 rd<=1'b0; //為下一狀態(tài)設(shè)置讀信號(hào) addr<=rddata[12:0]; //為下一狀態(tài)設(shè)置讀地址 ip<=ip+12'd1; //指令指針加1 end STO: //存儲(chǔ)指令處理 begin en_wr<=1'b1; //寫使能有效 rd<=1'b1; //讀信號(hào)無效 wr<=1'b0; //寫信號(hào)有效 addr<=rddata[12:0]; //寫地址 wrdata<=alu; //寫數(shù)據(jù) ip<=ip+3'd1; //指令指針加1 end SJMP: //轉(zhuǎn)移指令處理 begin rd<=1'b1; wr<=1'b1; en_wr<=1'b0; //寫使能無效 ip[12:0]<=rddata[12:0]; //設(shè)置ip end endcase end S1: //讀寫數(shù)據(jù)周期 begin state<=S2; if (opcode==STO) begin wr<=1'b1; end end S2: //計(jì)算周期 begin rd<=1'b1; //下一狀態(tài)讀無效 wr<=1'b1; en_wr<=1'b0; //寫使能無效 state<=S3; case(opcode) ADD: //加 alu<=alu+rddata; ANDD: //與 alu<=alu&rddata; XORR: //異或 alu<=alu^rddata; LDA: //裝入 alu<=rddata; endcase end S3: //準(zhǔn)備讀指令 begin state<=S0; rd<=1'b0; //設(shè)置度信號(hào) en_wr<=1'b0; //寫使能無效 wr<=1'b1; //寫信號(hào)無效 addr<=ip; //指令地址 end endcaseendmodule
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -