杭电计组实验九
实验报告
2016 年 5 月 11 日 成绩:
姓名周勇学号班级计科5班专业计算机科学与技术课程名称《数字电路课程设计》任课老师章复嘉老师指导老师章复嘉老师机位号实验序号9实验名称R-I指令CPU实验时间5月11日实验地点1教225实验设备号一、实验程序源代码顶层架构CPU模块:
module cpu(clk,reset,ALU_OP,inst,rs,rt,rd,rs_data,rt_data,rd_data,ZF,OF,Write_Reg,PC,PC_new,rd_rt_s,W_Addr,imm,W_Data,imm_s,imm_data
,ALU_B,rt_imm_s,Mem_Write,M_R_Data,ALU_Data,alu_mem_s);
input wire clk;
input reset;
output [2:0] ALU_OP;//操作符
output [31:0] inst;//指令存放
output [4:0] rs;//rs地址
output [4:0] rt;//rt地址
output [4:0] rd;//rd地址
output [31:0] rs_data;//rs数据
output [31:0] rt_data;//rt数据
output [31:0] rd_data;//rd数据
output [31:0] PC;
output [31:0] PC_new;
output ZF;
output OF;
output Write_Reg;//是否写入
output [31:0] W_Data;
output rd_rt_s; //控制那个作为目的寄存器
output [4:0]W_Addr;//目的操作数地址
output [15:0] imm; //立即数
output [31:0] imm_data;//被扩展的立即数
output imm_s;//是否需要扩展
output rt_imm_s;//B端选择rt或者是imm
output [31:0] ALU_B;//ALU_B端口数据
output Mem_Write;//是否写入数据rom
output [31:0]M_R_Data;//从数据rom读出来的数据
output [31:0]ALU_Data;//ALU运算出来的结果,根据alu_mem_s选择由M_W_Data或者W_Data来赋值
output alu_mem_s;//看上面
//读指令
ex7 pc (
.clka(clk),
.douta(inst),
.rst(reset),
.PC(PC),
.PC_new(PC_new)
//解析指令
);
analysis_inst analysis_inst(
.inst(inst),
.ALU_OP(ALU_OP),
.rs(rs),
.rt(rt),
.rd(rd),
.Write_Reg(Write_Reg),
.imm(imm),
.rd_rt_s(rd_rt_s),
.imm_s(imm_s),
.rt_imm_s(rt_imm_s),
.Mem_Write(Mem_Write),
.alu_mem_s(alu_mem_s)
);
//读取源操作数的值:
assign W_Addr = (rd_rt_s)?rt:rd;
assign imm_data = (imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm};
reg1 Reg(
.R_Addr_A(rs),
.R_Addr_B(rt),
.Clk(clk),
.W_Addr(W_Addr),
.W_Data(W_Data),
.R_Data_A(rs_data),
.R_Data_B(rt_data),
.Reset(reset),
.Write_Reg(Write_Reg) //不写入
);
assign ALU_B=(rt_imm_s)?imm_data:rt_data;
//对源操作数运算,存于目的操作数
ex3 ALU(
.ALU_OP(ALU_OP),
.A(rs_data),
.B(ALU_B),
.F(ALU_Data),
.ZF(ZF),
.OF(OF)
);
//----
wire clk_temp;
wire d_outn;