Beruflich Dokumente
Kultur Dokumente
begin
case(RegDest)
1'b0 : Instruction1 = in1;
1'b1 : Instruction1 = in2;
endcase
end
endmodule
module DM (writeaddr,writedata,write,clock,readaddr,readdata,RegCell);
input [31:0] writeaddr, readaddr;
input [31:0] writedata;
input write,clock;
output [31:0] readdata;
reg [31:0] RegCellS [0:1024] ;
output reg [31:0] RegCell ;
always @(posedge clock)
begin
if (write == 1 )
begin
RegCellS[writeaddr] = writedata;
RegCell = RegCellS[writeaddr];
end
end
assign readdata = RegCellS[readaddr];
endmodule
module ALU(rs_value,rt_value, zero,clk, instruction, rd_value,operation);
input [31:0] rs_value,rt_value ;
input clk ;
output zero ;
input [31:0] instruction;
output reg [31:0] rd_value;
output reg [3:0] operation;
reg [25:0] target ;
reg zero ;
reg [5:0] funct;
reg [1:0]instruction_type;
reg [15:0] immediate_offset, PC;
reg [31:0] memory[0:4095];
reg [5:0] op;
reg [5:0] op2;
reg [31:0] rt_value1 ;
always @ (posedge clk )
begin
op [5:0] = instruction[31:26];
op2 [5:0] = instruction[10:6];
case(op)
0: /* R-type */
begin
instruction_type = 2'b00;
funct = instruction[5:
0];
end
2: /* J-type */
begin
target = instruction[25:0];
instruction_type = 2'b10;
end
default: /* I-type */
begin
immediate_offset = instruction[15:0];
instruction_type = 2'b01;
end
endcase
case(instruction_type)
2'b00: /* R-type */
begin
case(funct)
6'b100001: /* add rd, rs, rt */
begin
rd_value = rs_value + rt_value;
zero = 0;
operation= 4'b0000;
end
6'b100011: /* sub rd, rs, rt */
begin
rd_value = rs_value - rt_value;
zero = 0;
operation= 4'b0001;
end
6'b100100: /* and rd, rs, rt */
begin
rd_value = rs_value & rt_value;
zero = 0;
operation= 4'b0010;
end
6'b100101: /* or
rd, rs, rt */
begin
rd_value = rs_value | rt_value;
zero = 0;
operation= 4'b0011;
end
6'b101010: /* slt rd, rs, rt */
begin
rd_value = rs_value < rt_value? 1 : 0;
zero = 0;
operation= 4'b0100;
end
6'b000000: /* sl1 rd, rs, rt */
begin
rd_value = rt_value << op2;
zero = 0;
operation= 4'b0101;
end
6'b000010: /* srl rd, rs, rt */
begin
rd_value = rt_value >> op2;
zero = 0;
operation= 4'b0110;
end
endcase
end
2'b01: /* I-type */
begin
case(op)
6'b000100: /* beq rs, rt, offset */
begin
if(rs_value == rt_value) zero = 1;
operation= 4'b0111;
end
6'b001001: /* addi rt, rs, immediate */
begin
rd_value = rs_value + immediate_offset;
zero = 0;
operation= 4'b1000;
end
6'b001100: /* andi rt, rs, immediate */
begin
rd_value = rs_value & immediate_offset;
zer
o = 0;
operation= 4'b1001;
end
6'b001101: /* ori rt, rs, immediate */
begin
rd_value = rs_value | immediate_offset;
zero = 0;
operation= 4'b1010;
end
6'b100011: /* lw
rt, rs[offset] */
begin
rd_value = rs_value + immediate_offset;
zero = 0;
operation= 4'b1011;
end
6'b1010
11: /* sw
rt, rs[offset] */
begin
rd_value = rs_value + immediate_offset;
zero = 0;
operation= 4'b1100;
end
endcase
end
2'b10: /* J-type */
begin
case(op)
6'b000010:
begin
PC = target;
end
endcase
end
endcase
end
endmodule
case(RegDest)
1'b0 : Instruction1 = in1;
1'b1 : Instruction1 = in2;
endcase
end
endmodule
module SignExtender(in,out );
input signed [15:0] in;
output signed [31:0] out;
assign out = in; // sign-extends
endmodule
// Mux2:1
module Mux2x11 (in1,in2,RegDest,Instruction1); // Mux2x1;
input [4:0] in1;
input [4:0] in2;
input RegDest;
output reg [4:0] Instruction1;
//reg [4:0] Instruction1;
always @(RegDest )
begin
case(RegDest)
1'b0 : Instruction1 = in1;
1'b1 : Instruction1 = in2;
endcase
end
endmodule
// InstructionDecoder;
module InstructionDecoder ( Instruction,Clk,RegDest, Jump,Branch,MemtoReg,MemRe
ad,
MemWri
te,ALUSrc, RegWrite);
input [5:0]Instruction;
input Clk;
output reg RegDest;
output reg Jump;
output reg Branch;
output reg MemtoReg;
output reg MemWrite;
output reg MemRead;
output reg ALUSrc;
output reg RegWrite;
always @ (posedge Clk)
case(Instruction)
6'b000000: /* R-type */
begin
RegDest =
1;
Jump=
Branch=
MemtoReg=
MemWrite=
x;
0;
0;
0;
1'b
MemRead= 0;
ALUSrc=
RegWrite=
0;
1;
end
6'b101011: /* SW */
begin
RegDest =
1'bx;
Jump=
Branch=
MemtoReg=
0;
0;
1'b
MemWrite=
MemRead=
1;
ALUSrc=
1;
RegWrite=
0;
x;
0;
end
6'b100011: /* LW */
begin
RegDest =
0;
Jump=
Branch=
MemtoReg=
MemWrite=
MemRead=
0;
0;
1;
0;
ALUSrc=
RegWrite=
1;
1;
1;
end
6'b000100: /* BEQ*/
begin
RegDest =
1'bx;
Jump=
Branch=
MemtoReg=
0;
1;
1'b
MemWrite=
1'b
x;
x;
MemRead=
0;
ALUSrc=
RegWrite=
0;
0;
end
6'b000010: /* J-type */
begin
RegDest = 1'bx;
Jump=
Branch=
x;
1;
1'b
MemtoReg=
1'b
MemWrite=
1'b
x;
x;
MemRead=
0;
ALUSrc=
1'b
x;
RegWrite=
0;
end
endcase
endmodule
//ROM
module ROM(
input clk,
input [31:0] PC,
output [31:0] Instruction
);
reg [31:0] Instruction;
always @(posedge clk)
case (PC)
32'b00000000000000000000000000100000:
0001000000100001;
/*add*/
32'b00000000000000000000000001100000:
0001000000100011;
/*sub*/
32'b00000000000000000000000010000000:
0001000000100100;
/*and*/
32'b00000000000000000000000010100000:
0001000000100101;
/*or*/
32'b00000000000000000000000011100000:
0001000000101010;
/*slt*/
32'b00000000000000000000000100000000:
0001000010000000;/*sll*/
32'b00000000000000000000000100100000:
0001000010000010;/*srl*/
32'b00000000000000000000000101000000:
0001000000000010;/*andi*/
32'b00000000000000000000000101000000:
0001000000000010;/*addi*/
32'b00000000000000000000000101100000:
0001000000000010;/*ori*/
32'b00000000000000000000000110000000:
0001000000100100;/*beq*/
32'b00000000000000000000000110100000:
0000000000100000;/*load*/
32'b00000000000000000000000111000000:
0000000000100000;/*store*/
32'b00000000000000000000000111100000:
0000000001000000;/*jump */
endcase
endmodule
Instruction = 32'b0000000000000001
Instruction = 32'b0000000000000001
Instruction = 32'b0000000000000001
Instruction = 32'b0000000000000001
Instruction = 32'b0000000000000001
Instruction = 32'b0000000000000001
Instruction = 32'b0000000000000001
Instruction = 32'b0011000000000001
Instruction = 32'b0010010000000001
Instruction = 32'b0011010000000001
Instruction = 32'b0001000000000001
Instruction = 32'b1000110000000001
Instruction = 32'b1010110000000001
Instruction = 32'b0000100000000000
// RegisterFile
module RegisterFile(writeaddr,writedata,write,clock,readaddr1,readaddr2,readdata
1,readdata2,RegCell);
input [4:0] writeaddr, readaddr1, readaddr2;
input [31:0] writedata;
input write,clock;
output reg [31:0] readdata1,readdata2;
reg [31:0] RegCellS [0:31] ;
output reg [31:0] RegCell ;
always @(posedge clock)
begin
if (write == 1)
begin
RegCellS[writeaddr] = writedata;
RegCell = RegCellS[writeaddr];
end
if (write == 0)
begin
readdata1 = RegCellS[readaddr1];
readdata2 = RegCellS[readaddr2];
end
end
endmodule
module MIPS1(
input [31:0] PC,
input clk,
output [4:0]In11,In21,In31,In61,
output [15:0]In51,
output [25:0]In41,
output [31:0] Instruction
);
wire [31:0] Instruction;
wire [4:0] In11;
wire [4:0] In21,In31;
wire [5:0] In61;
wire [25:0] In41;
wire [15:0] In51;
ROM G1 (clk, PC,Instruction );
assign In11 = Instruction[20:16];
assign In21 = Instruction[15:11];
assign In31 = Instruction[25:21];
assign In41 = Instruction[25:00];
assign In51 = Instruction[15:00];
assign In61 = Instruction[31:26];
// Mux2x11 G2 (In1,In2,RegDest,Instruction1);
//RegisterFile G3 ( In1,In2,In2,writedata,Regwrite,clk,readdata1,readdat
a2);
endmodule
module Decoder (PC1,In111,In211,In311,In411,In511,In611,clk1,RegDest1, Jump1,B
ranch1,MemtoReg1,MemRead1,
Instru
ction1,MemWrite1,ALUSrc1, RegWrite1);
input [31:0]PC1;
input clk1;
output wire [4:0] In111;
output wire[4:0] In211,In311;
output wire[5:0] In611;
output wire[25:0] In411;
output wire[31:0] Instruction1;
output wire[15:0] In511;
output wire RegDest1;
output wire Jump1;
output wire Branch1;
output wire MemtoReg1;
output wire MemWrite1;
output wire MemRead1;
output wire ALUSrc1;
output wire RegWrite1;
MIPS1 instance_name (
.PC(PC1),
.clk(clk1),
.In11(In111),
.In21(In211),
.In31(In311),
.In61(In611),
.In51(In511),
.In41(In411),
.Instruction(Instruction1)
);
InstructionDecoder ID11 (In611,clk1,RegDest1, Jump1,Branch1,MemtoReg1,MemRead1,
MemWrite1,ALUSrc1, Reg
Write1);
endmodule
// Mux module
module a (PC11,clk11,A,B,C,D,E,F,Instructions11,RegDest11, Jump11,Branch11,Memto
Reg11,MemRead11,
Instru
ctionD1,MemWrite11,ALUSrc11, RegWrite11);
input [31:0] PC11;
input clk11;
output wire RegDest11;
output wire Jump11;
output wire Branch11;
output wire MemtoReg11;
output wire MemWrite11;
output wire MemRead11;
output wire ALUSrc11;
output wire RegWrite11;
output wire[5:0] F;
output wire[25:0] D;
output wire[15:0] E;
output wire [4:0]A,B,C;
output wire [4:0] Instructions11;
module RegisterFile1(PC21,,clk21,writeaddr1,writedata1,A1,B1,C1,D1,E1,F1,Instru
ctions21,readdata11,readdata21,RegDest21,
Jump21,Branch21,write,InstructionD11,MemtoReg21,MemRead21,MemWrite21,ALU
Src21, RegWrite21,RegCellD);
input [4:0] writeaddr1;
input [31:0] writedata1;
input [31:0] PC21;
input clk21,write;
output wire [31:0] readdata11,readdata21;
output wire RegDest21;
output wire Jump21;
output wire Branch21;
output wire MemtoReg21;
output wire MemWrite21;
output wire MemRead21;
output wire ALUSrc21;
output wire RegWrite21;
output wire[5:0] F1;
output wire[25:0] D1;
output wire[15:0] E1;
output wire [4:0]A1,B1,C1;
output wire [4:0] Instructions21;
output wire [31:0] RegCellD ;
output wire [31:0] InstructionD11 ;
a instance_name (
.PC11(PC21),
.clk11(clk21),
.A(A1),
.B(B1),
.C(C1),
.D(D1),
.E(E1),
.F(F1),
.Instructions11(Instructions21),
.RegDest11(RegDest21),
.Jump11(Jump21),
.Branch11(Branch21),
.MemtoReg11(MemtoReg21),
.MemRead11(MemRead21),
.MemWrite11(MemWrite21),
.ALUSrc11(ALUSrc21),
.RegWrite11(RegWrite21),
.InstructionD1(InstructionD11)
);
RegisterFile R1(writeaddr1,writedata1,write,clk21,C1,A1,readdata11,read
data21,RegCellD);
//RegisterFile R2(writeaddr1,writedata1,1,clk21,C1,A1,readdata11,readda
ta21);
//RegisterFile R3(writeaddr1,writedata1,0,clk21,C1,A1,readdata11,readda
ta21);
endmodule
module SignExtenderM (PCM,clkM,out1,writeaddrM,writedataM,AM,BM,CM,DM,EM,FM,Ins
tructionsM,readdata1M,readdata2M,RegDestM,
JumpM,BranchM,writeM,InstructionD12,MemtoRegM,MemReadM,MemWriteM,ALUSrcM
, RegWriteM,RegCellDM);
RegisterFile1 instance_name (
.PC21(PCM),
.clk21(clkM),
.writeaddr1(writeaddrM),
.writedata1(writedataM),
.A1(AM),
.B1(BM),
.C1(CM),
.D1(DM),
.E1(EM),
.F1(FM),
.Instructions21(InstructionsM),
.readdata11(readdata1M),
.readdata21(readdata2M),
.RegDest21(RegDestM),
.Jump21(JumpM),
.Branch21(BranchM),
.write(writeM),
.MemtoReg21(MemtoRegM),
.MemRead21(MemReadM),
.MemWrite21(MemWriteM),
.ALUSrc21(ALUSrcM),
.RegWrite21(RegWriteM),
.RegCellD(RegCellM),
.InstructionD11(InstructionD12)
);
SignExtender SE (EM,out1);
endmodule
module mux2 (PCM1,clkM1,outM1,writeaddrM1,writedataM1,AM1,BM1,CM1,DM1,EM1,FM1,I
nstructionsM1,readdata1M1,readdata2M1,RegDestM1,
JumpM1,BranchM1,writeM1,InstructionD13,MemtoRegM1,MemReadM1,MemWriteM1,A
LUSrcM1, RegWriteM1,RegCellDM1,Ali);
input [4:0] writeaddrM1;
input [31:0] writedataM1;
input [31:0] PCM1;
input clkM1,writeM1;
output wire [31:0] outM1;
output wire [31:0] readdata1M1,readdata2M1;
output wire RegDestM1;
output wire JumpM1;
output wire BranchM1;
output wire MemtoRegM1;
output wire MemWriteM1;
output wire MemReadM1;
output wire ALUSrcM1;
output wire RegWriteM1;
output wire[5:0] FM1;
output wire[25:0] DM1;
output wire[15:0] EM1;
output wire [4:0]AM1,BM1,CM1;
output wire [4:0] InstructionsM1;
output wire [31:0] RegCellDM1;
output wire [31:0] Ali;
output wire[31:0] InstructionD13;
// Instantiate the module
SignExtenderM instance_name (
.PCM(PCM1),
.clkM(clkM1),
.out1(outM1),
.writeaddrM(writeaddrM1),
.writedataM(writedataM1),
.AM(AM1),
.BM(BM1),
.CM(CM1),
.DM(DM1),
.EM(EM1),
.FM(FM1),
.InstructionsM(InstructionsM1),
.readdata1M(readdata1M1),
.readdata2M(readdata2M1),
.RegDestM(RegDestM1),
.JumpM(JumpM1),
.BranchM(BranchM1),
.writeM(writeM1),
.MemtoRegM(MemtoRegM1),
.MemReadM(MemReadM1),
.MemWriteM(MemWriteM1),
.ALUSrcM(ALUSrcM1),
.RegWriteM(RegWriteM1),
.RegCellDM(RegCellDM1),
.InstructionD12(InstructionD13)
);
MuxM M2 (readdata2M1,outM1,ALUSrcM1,Ali);
endmodule
module ALUM (PCM2,clkM2,outM2,writeaddrM2,writedataM2,AM2,BM2,CM2,DM2,EM2,FM2,In
structionsM2,
readdata1M2,readdata2M2,RegDestM2, JumpM2,BranchM2,writeM2,MemtoRegM
2,MemReadM2,
MemWriteM2,InstructionD14,ALUSrcM2, RegWriteM2,R
egCellDM2,Ali2,zero2, rd_value2,opr);
module DATAM(PCM9,clkM9,outM9,writeaddrM9,writedataM9,AM9,BM9,CM9,DM9,EM9,FM9,
InstructionsM9,readdata1M9,readdata2M9,RegDestM9, JumpM9,BranchM9,w
riteM9,
MemtoRegM9,MemReadM9,MemWriteM9,InstructionDM9,
ALUSrcM9, RegWriteM9,RegCellDM9,
Ali9,zero9, rd_value9,read_data9,mems,opr1);
input [4:0] writeaddrM9;
input [31:0] writedataM9;
input [31:0] PCM9;
input clkM9,writeM9;
output wire [31:0] outM9;
output wire [31:0] readdata1M9,readdata2M9;
output wire RegDestM9;
output wire JumpM9;
output wire BranchM9;
output wire MemtoRegM9;
output wire MemWriteM9;
output wire MemReadM9;
output wire ALUSrcM9;
output wire RegWriteM9;
output wire[5:0] FM9;
output wire[25:0] DM9;
ALUM instance_name (
.PCM2(PCM9),
.clkM2(clkM9),
.outM2(outM9),
.writeaddrM2(writeaddrM9),
.writedataM2(writedataM9),
.AM2(AM9),
.BM2(BM9),
.CM2(CM9),
.DM2(DM9),
.opr(opr1),
.EM2(EM9),
.FM2(FM9),
.InstructionsM2(InstructionsM9),
.readdata1M2(readdata1M9),
.readdata2M2(readdata2M9),
.RegDestM2(RegDestM9),
.JumpM2(JumpM9),
.BranchM2(BranchM9),
.writeM2(writeM9),
.MemtoRegM2(MemtoRegM9),
.MemReadM2(MemReadM9),
.MemWriteM2(MemWriteM9),
.InstructionD14(InstructionDM9),
.ALUSrcM2(ALUSrcM9),
.RegWriteM2(RegWriteM9),
.RegCellDM2(RegCellDM9),
.Ali2(Ali9),
.zero2(zero9),
.rd_value2(rd_value9)
);
DM dm1 (rd_value9,readdata2M9,MemWriteM9,clkM9,rd_value9,read_data9,mems);
endmodule
module MUXMemtoreg(PCM91,clkM91,outM91,writeaddrM91,writedataM91,AM91,BM
91,CM91,DM91,EM91,FM91,
InstructionsM91,readdata1M91,readdata2M91,RegDestM91, JumpM91,Branc
hM91,writeM91,
MemtoRegM91,MemReadM91,MemWriteM91,InstructionD
M91,ALUSrcM91, RegWriteM91,RegCellDM91,
Ali91,zero91, rd_value91,read_data91,mems, pout
,opr2);
.mems(mems)
);
MuxM1 mtr (rd_value91,read_data91,MemtoRegM91,pout);
endmodule
module PCSEL(PCM92,clkM92,writeaddrM92,writedataM92, JumpM92,BranchM92,writeM92,
InstructionDM92,zero92, pout92, nextPC1,opr3);
input [4:0] writeaddrM92;
input [31:0] writedataM92;
input [31:0] PCM92;
input clkM92,writeM92;
output wire JumpM92;
output wire BranchM92;
output wire zero92 ;
output wire[31:0] InstructionDM92;
output wire [31:0] nextPC1;
output wire [31:0] pout92;
output wire [3:0] opr3;
MUXMemtoreg instance_name (
.PCM91(PCM92),
.clkM91(clkM92),
.writeaddrM91(writeaddrM92),
.writedataM91(writedataM92),
.JumpM91(JumpM92),
.BranchM91(BranchM92),
.writeM91(writeM92),
.InstructionDM91(InstructionDM92),
.zero91(zero92),
.opr2(opr3),
.pout(pout92)
);
PCSel1 pcs (PCM92,InstructionDM92,Zero92,BranchM92,clkM92, JumpM92, nextPC1);
endmodule
.opr3(opr4),
.nextPC1(nextPC1)
);
endmodule