杭电计组实验考试
);
input Clk,Reset;
input wire Write_Reg;
input wire[4:0] R_Addr_A;
input wire[4:0] W_Addr;
input wire[4:0] R_Addr_B;
input wire[31:0] W_Data;
reg[31:0] // input [31 : 0] dina
.douta(douta) // output [31 : 0] douta
);
always@(posedge rst or posedge clka)
begin
if(rst)
PC<=32'h00000000;
else
PC<=PC_new;
,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地址
rt=inst[20:16];//rt
rs=inst[25:21];//rs
Mem_Write=0;//是否写入数据存储器
rd_rt_s=1;//rt作为目的存储器
rt_imm_s=1;//imm作为源操作数
alu_mem_s=0;//以alu结果输出
Write_Reg=1;
//判断属于那条指令
case(inst[31:26])
.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;
REG_Files[i]<=32'h00000000;
end
else
begin
if(Write_Reg)
REG_Files[W_Addr]<=W_Data;
end
end
assign R_Data_A=REG_Files[R_Addr_A];
assign R_Data_B=REG_Files[R_Addr_B];
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;
output reg rt_imm_s;
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;//被扩展的立即数
6'b001000: begin imm_s=1; ALU_OP=3'B100;end
6'b001100: begin imm_s=0; ALU_OP=3'B000;end
6'b001110: begin imm_s=0; ALU_OP=3'B010;end
6'b001011: begin imm_s=0; ALU_OP=3'B110;end
rt=inst[20:16];//rt
rs=inst[25:21];//rs
alu_mem_s=0;//以alu结果输出
Mem_Write=0;//是否写入数据存储器
rd_rt_s=0;//rd作为目的存储器
rt_imm_s=0;//rt作为源操作数
Write_Reg=(inst[5:0]==0)?1'b0:1'b1;
endmodule
ALU模块:
module ex3(ALU_OP,A,B,F,ZF,OF
);
input[2:0] ALU_OP;
input[31:0] A,B;
output reg [31:0] F;
output reg ZF,OF;
endcase
end
//----------------处理I型取数/存数指令------------------
if(inst[31:30]==2'b10&&inst[28:26]==3'b011)
begin
imm=inst[15:0];
rt=inst[20:16];//rt
rs=inst[25:21];//rs
reg [0:0] wea;
assign PC_new=PC+4;
initial
begin
PC=32'h00000000;
wea=0;
end
ex77 regrom (
.clka(clka), // input clka
.wea(wea), // input [0 : 0] wea
.addra(PC[7:2]), // input [5 : 0] addra
.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)
case(inst[5:0])//映射对应的ALU
6'b100000:ALU_OP=3'B100;
6'b100010:ALU_OP=3'B101;
6'b100100:ALU_OP=3'B000;
6'b100101:ALU_OP=3'B001;
6'b100110:ALU_OP=3'B010;
6'b100111:ALU_OP=3'B011;
endmodule
pc模块:
module ex7(clka,douta,rst,PC,PC_new
);
input rst;
input clka;
output wire[31:0] douta;
output reg[31:0] PC;
output [31:0] PC_new;
wire [31:0]dina;
6'b101011: begin Mem_Write=1;Write_Reg=0;ALU_OP=3'B100;end
endcase
end
end
endmodule
Reg模块
module reg1(R_Addr_A,R_Addr_B,Clk,W_Addr,W_Data,R_Data_A,R_Data_B,Reset,Write_Reg
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来赋值
6'b101011:ALU_OP=3'B110;
6'b000100:ALU_OP=3'B111;
endcase
end
//------------------处理I型立即寻址指令------------------------
if(inst[31:29]==3'b001)
begin
imm=inst[15:0];
);
//读取源操作数的值:
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),
.addra(ALU_Data[5:0]), // input [5 : 0] addra
.dina(rt_data), // input [31 : 0] dina
.douta(M_R_Data) // output [31 : 0] douta
);
assign W_Data = alu_mem_s?M_R_Data:ALU_Data;