当前位置:文档之家› 杭电计组实验十

杭电计组实验十

inst,ALU_OP,rs,rt,rd,Write_Reg,imm,rd_rt_s,imm_s,rt_imm_s,Mem_Write,alu_mem_s,address,w_r_s,wr_data_s,PC_s,ZF
);
input [31:0] inst;
output reg [2:0] ALU_OP;
);
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;
output [1:0] PC_s;//PC选择器
output [25:0] address;//地址解析数据
//读指令
ex7 pc (
.clka(clk),
.douta(inst),
.rst(reset),
.PC(PC),
.PC_new(PC_new),
.PC_s(PC_s),
.R_Data_A(rs_data),
.douta(M_R_Data) // output [31 : 0] douta
);
assign W_Data = (wr_data_s[1])?PC_new:(wr_data_s[0]?M_R_Data:ALU_Data);
endmodule
pc模块:
module ex7(clka,douta,rst,PC,PC_new,PC_s,R_Data_A,imm_data,address
,ALU_B,rt_imm_s,Mem_Write,M_R_Data,ALU_Data,alu_mem_s,w_r_s,wr_data_s,PC_s,address);
input wire clk;
input reset;
output [2:0] ALU_OP;//操作符
output [31:0] inst;//指令存放
input [25:0] address;
wire [31:0]dina;
reg [0:0] wea=0;
assign PC_new=PC+4;
ex77 regrom (
.clka(clka), // input clka
.wea(wea), // input [0 : 0] wea
.addra(PC[7:2]), // input [5 : 0] addra
begin
//--------------------处理R型指令----------------------
if(inst[31:26]==6'b000000)//判断是否为R型
begin
rd=inst[15:11];//rd
rt=inst[20:16];//rt
rs=inst[25:21];//rs
实验报告
2016年5月11日 成绩:
姓名
周勇
学号
14071225
班级
计科5班
专业
计算机科学与技术
课程名称
《数字电路课程设计》
任课老师
章复嘉老师
指导老师
章复嘉老师
机位号
实验序号
10
实验名称
R-I-J指令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
.clka(clk_temp), // input clka
.wea(Mem_Write), // input [0 : 0] wea
.addra(ALU_Data[5:0]), // input [5 : 0] addra
.dina(rt_data), // input [31 : 0] dina
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;//看上面
output [1:0] w_r_s;
output [1:0] wr_data_s;
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] 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;//目的操作数地址
wire d_outn;
reg d_out=0;
assign clk_temp = clk ^ d_out ;
assign d_outn = ~d_out ;
//----
always@(posedge clk_temp)
begin
d_out <= d_outn ;
end
//数据存储器
Data_Rom Datarom (
output reg Mem_Write;
output reg alu_mem_s;
output reg [25:0] address;
output reg [1:0] w_r_s;
output reg [1:0] wr_data_s;
output reg [1:0] PC_s;
input ZF;
always@(*)
6'b101011:begin ALU_OP=3'B110; Write_Reg=1;PC_s=2'b00;end
6'b000100:begin ALU_OP=3'B111; Write_Reg=1;PC_s=2'b00;end
6'b001000:begin ALU_OP=3'B100; Write_Reg=0;PC_s=2'b01;end
2'b00: PC<=PC_new;
2'b01: PC<=R_Data_A;
2'b10: PC<=PC_new+(imm_data<<2);
2'b11: PC<={PC_new[31:28],address,2'b00};
endcase
end
end
endmodule
analysis_inst模块:
module analysis_inst(
rd_rt_s=1;//rt作为目的存储器
rt_imm_s=1;//imm作为源操作数
// alu_mem_s=0;//以alu结果输出
w_r_s=2'b01;
Write_Reg=1;
wr_data_s=2'b00;
PC_s=2'b00;
//判断属于那条指令
case(inst[31:26])
6'b001000: begin imm_s=1; ALU_OP=3'B100;end
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) //不写入
.PC_s(PC_s),
.ZF(ZF)
);
//读取源操作数的值:
assign W_Addr = (w_r_s[1])?5'b11111:((w_r_s[0])?rt:rd);
assign imm_data = (imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm};
.imm_data(imm_data),
.address(address)
//解析指令
);
analysis_inst analysis_inst(
.inst(inst),
.ALU_OP(ALU_OP),
.rs(rs),
.rt(rt),
.rd(rd),
.Write_Reg(Write_Reg),
.imm(imm),
output reg [4:0] rs;
output reg [4:0] rt;
output reg [4:0] rd;
output reg Write_Reg;
output reg [15:0] imm;
output reg rd_rt_s;
output reg imm_s;
相关主题