📄 cpu.v
字号:
//------------------------------------------- cpu.v 文件的开始 -------------------------------------------/********************************************************************************* 模块功能:CPU 模块是16位RISC_ CPU的核心, 不同书上的是该模块包含CPU的所有功能。*** 它本身也是可综合的模块。已经通过门级后仿真验证。 *****************************************************************************/`timescale 1ns/1nsmodule CPU(input clk, //时钟 input reset_n, //复位信号 inout [15:0] rddata, //读数据 output reg wr, //写使能 output reg rd, //读使能 output reg halt, //停机指示 output reg [12:0] addr //地址 ); //CPU内部用寄存器 reg [1:0] state; //状态 reg en_wr; //写数据使能 reg [15:0] alu; //运算器结果 reg [12:0] ip; //指令指针. reg [2:0] opcode; //操作码 reg [12:0] opaddr; //操作地址 reg [15:0] wrdata; //写数据 // 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) //如果复位有效 begin wr<=1'b1; //写信号无效 en_wr<=1'b0; //写使能无效 rd<=1'b1; //读信号无效 halt<=1'b0; //清停机指示 addr<=13'b0; //初始指令地址为0 wrdata<=16'b0; //写数据清为0 alu<=16'b0; //累加器清为0 ip<=13'b0; //指令指针清0,从0地址执行程序 state<=S3; //下一状态为读指令周期 end else case(state) S0: begin //读指令处理 state<=S1; //设置下一状态 opcode<=rddata[15:13]; //操作码 opaddr<=rddata[12:0]; //操作地址 case(rddata[15:13]) //根据操作码不同进行处理 HLT: //停机 begin rd<=1'b1; wr<=1'b1; en_wr<=1'b0; //写使能无效 halt<=1'b1; //置停机标志 //ip<=ip+12'd1; //指令指针加1 end SKZ: //计算结果为0转移 begin rd<=1'b1; wr<=1'b1; en_wr<=1'b0; //写使能无效 if(alu==16'b0) ip<=ip+3'd2; //如果转移,指令指针加2 else ip<=ip+3'd1; //不转移,指令指针加1 end XORR,ADD,ANDD,LDA: //计算指令处理 begin en_wr<=1'b0; //写使能无效 rd<=1'b0; //为下一状态设置读信号 addr<=rddata[12:0]; //为下一状态设置读地址 ip<=ip+12'd1; //指令指针加1 end STO: //存储指令处理 begin en_wr<=1'b1; //写使能有效 rd<=1'b1; //读信号无效 wr<=1'b0; //写信号有效 addr<=rddata[12:0]; //写地址 wrdata<=alu; //写数据 ip<=ip+3'd1; //指令指针加1 end SJMP: //转移指令处理 begin rd<=1'b1; wr<=1'b1; en_wr<=1'b0; //写使能无效 ip[12:0]<=rddata[12:0]; //设置ip end endcase end S1: //读写数据周期 begin state<=S2; if (opcode==STO) begin wr<=1'b1; end end S2: //计算周期 begin rd<=1'b1; //下一状态读无效 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: //准备读指令 begin state<=S0; rd<=1'b0; //设置度信号 en_wr<=1'b0; //写使能无效 wr<=1'b1; //写信号无效 addr<=ip; //指令地址 end endcaseendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -