Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
ClF3 | 63751a0680 | |
ClF3 | 95205a9a83 | |
ClF3 | a58a38c291 | |
ClF3 | 6db5db52e4 |
|
@ -0,0 +1 @@
|
|||
*.dcp
|
|
@ -4,11 +4,12 @@ module ALU(
|
|||
input [32 -1:0] in2 ,
|
||||
input [5 -1:0] ALUCtl ,
|
||||
input Sign ,
|
||||
output reg [32 -1:0] out ,
|
||||
output reg [32 -1:0] out, out2,
|
||||
output zero
|
||||
);
|
||||
reg signed [7:0] in11,in12,in13,in14,in21,in22,in23,in24;
|
||||
reg [31:0] MACout;
|
||||
reg signed [31:0] in1s, in2s;
|
||||
// zero means whether the output is zero or not
|
||||
assign zero = (out == 0);
|
||||
|
||||
|
@ -51,10 +52,20 @@ module ALU(
|
|||
5'b11001: out <= ({{32{in2[31]}}, in2} >> in1[4:0]);
|
||||
5'b11010: out <= in1 * in2; // mul
|
||||
5'b11011: out <= MACout;
|
||||
5'b11100: out <= in1s>0?in1s:0;
|
||||
default: out <= 32'h00000000;
|
||||
endcase
|
||||
always @(*)
|
||||
begin
|
||||
in1s <= in1;
|
||||
in2s <= in2;
|
||||
end
|
||||
always @(*)
|
||||
case(ALUCtl)
|
||||
5'b11100: out2 <= in2s>0?in2s:0;
|
||||
default: out2 <= 32'h00000000;
|
||||
endcase
|
||||
|
||||
|
||||
|
||||
|
||||
endmodule
|
|
@ -20,6 +20,7 @@ module ALUControl(
|
|||
parameter aluSRA = 5'b11001;
|
||||
parameter aluMUL = 5'b11010; //mul
|
||||
parameter aluMAC = 5'b11011;
|
||||
parameter aluRELU= 5'b11100;
|
||||
|
||||
// Sign means whether the ALU treats the input as a signed number or an unsigned number
|
||||
assign Sign = (ALUOp[2:0] == 3'b010)? ~Funct[0]: ~ALUOp[3];
|
||||
|
@ -42,6 +43,7 @@ module ALUControl(
|
|||
6'b10_1010: aluFunct <= aluSLT;
|
||||
6'b10_1011: aluFunct <= aluSLT;
|
||||
6'b10_1101: aluFunct <= aluMAC;
|
||||
6'b10_1110: aluFunct <= aluRELU;
|
||||
default: aluFunct <= aluADD;
|
||||
endcase
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ module CPU(
|
|||
);
|
||||
|
||||
// Control
|
||||
wire ReadFrom ;
|
||||
wire [2 -1:0] RegDst ;
|
||||
wire [2 -1:0] PCSrc ;
|
||||
wire Branch ;
|
||||
|
@ -41,6 +42,7 @@ module CPU(
|
|||
wire ExtOp ;
|
||||
wire LuOp ;
|
||||
wire RegWrite ;
|
||||
wire RegWrite2 ;
|
||||
|
||||
Control control1(
|
||||
.OpCode (Instruction[31:26] ),
|
||||
|
@ -48,6 +50,8 @@ module CPU(
|
|||
.PCSrc (PCSrc ),
|
||||
.Branch (Branch ),
|
||||
.RegWrite (RegWrite ),
|
||||
.RegWrite2 (RegWrite2 ),
|
||||
.ReadFrom (ReadFrom ),
|
||||
.RegDst (RegDst ),
|
||||
.MemRead (MemRead ),
|
||||
.MemWrite (MemWrite ),
|
||||
|
@ -63,18 +67,31 @@ module CPU(
|
|||
wire [32 -1:0] Databus1;
|
||||
wire [32 -1:0] Databus2;
|
||||
wire [32 -1:0] Databus3;
|
||||
wire [32 -1:0] Databus4;
|
||||
wire [5 -1:0] Write_register;
|
||||
wire [5 -1:0] Write_register2;
|
||||
wire [5 -1:0] Read_register1;
|
||||
wire [5 -1:0] Read_register2;
|
||||
|
||||
assign Write_register = (RegDst == 2'b00)? Instruction[20:16]: (RegDst == 2'b01)? Instruction[15:11]: 5'b11111;
|
||||
assign Write_register = (RegDst == 2'b00)? Instruction[20:16]:
|
||||
(RegDst == 2'b01)? Instruction[15:11]:
|
||||
(RegDst == 2'b11)? Instruction[25:21]:
|
||||
5'b11111;
|
||||
assign Write_register2 = Instruction[15:11];
|
||||
assign Read_register1 = Instruction[25:21];
|
||||
assign Read_register2 = (ReadFrom == 1'b1)? Instruction[15:11]: Instruction[20:16];
|
||||
|
||||
RegisterFile register_file1(
|
||||
.reset (reset ),
|
||||
.clk (clk ),
|
||||
.RegWrite (RegWrite ),
|
||||
.Read_register1 (Instruction[25:21] ),
|
||||
.Read_register2 (Instruction[20:16] ),
|
||||
.Regwrite2 (RegWrite2 ),
|
||||
.Read_register1 (Read_register1 ),
|
||||
.Read_register2 (Read_register2 ),
|
||||
.Write_register (Write_register ),
|
||||
.Write_register2(Write_register2 ),
|
||||
.Write_data (Databus3 ),
|
||||
.Write_data2 (Databus4 ),
|
||||
.Read_data1 (Databus1 ),
|
||||
.Read_data2 (Databus2 )
|
||||
);
|
||||
|
@ -112,6 +129,7 @@ module CPU(
|
|||
.ALUCtl (ALUCtl ),
|
||||
.Sign (Sign ),
|
||||
.out (ALU_out ),
|
||||
.out2 (Databus4 ),
|
||||
.zero (Zero )
|
||||
);
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@ module Control(
|
|||
output [2 -1:0] PCSrc ,
|
||||
output Branch ,
|
||||
output RegWrite ,
|
||||
output RegWrite2 ,
|
||||
output ReadFrom ,
|
||||
output [2 -1:0] RegDst ,
|
||||
output MemRead ,
|
||||
output MemWrite ,
|
||||
|
@ -27,10 +29,17 @@ module Control(
|
|||
(OpCode == 6'h2b || OpCode == 6'h04 || OpCode == 6'h02)? 1'b0:
|
||||
(OpCode == 6'h00 && Funct == 6'h08)? 1'b0:
|
||||
1'b1;
|
||||
assign RegWrite2 =
|
||||
(OpCode == 6'h00 && Funct == 6'h2e)? 1'b1:
|
||||
1'b0;
|
||||
assign ReadFrom =
|
||||
(OpCode == 6'h00 && Funct == 6'h2e)? 1'b1:
|
||||
1'b0;
|
||||
assign RegDst =
|
||||
(OpCode[5:3] == 3'b001)? 2'b00:
|
||||
(OpCode == 6'h23)? 2'b00:
|
||||
(OpCode == 6'h03)? 2'b10:
|
||||
(OpCode == 6'h00 && Funct == 6'h2e)? 2'b11:
|
||||
2'b01;
|
||||
assign MemRead = (OpCode == 6'h23)? 1'b1: 1'b0;
|
||||
assign MemWrite = (OpCode == 6'h2b)? 1'b1: 1'b0;
|
||||
|
|
|
@ -7,31 +7,35 @@ module InstructionMemory(
|
|||
case (Address[9:2])
|
||||
|
||||
// -------- Paste Binary Instruction Below (Inst-q1-1/Inst-q1-2.txt)
|
||||
8'd0: Instruction <= 32'h8c080000;
|
||||
8'd1: Instruction <= 32'h8c090004;
|
||||
8'd2: Instruction <= 32'h8c0a0008;
|
||||
8'd3: Instruction <= 32'h8c0b000c;
|
||||
8'd4: Instruction <= 32'h8c0c0010;
|
||||
8'd5: Instruction <= 32'h8c0d0014;
|
||||
8'd6: Instruction <= 32'h8c0e0018;
|
||||
8'd7: Instruction <= 32'h8c0f001c;
|
||||
8'd8: Instruction <= 32'h010c802d;
|
||||
8'd9: Instruction <= 32'h012d202d;
|
||||
8'd10: Instruction <= 32'h02048020;
|
||||
8'd11: Instruction <= 32'h010e882d;
|
||||
8'd12: Instruction <= 32'h012f202d;
|
||||
8'd13: Instruction <= 32'h02248820;
|
||||
8'd14: Instruction <= 32'h014c902d;
|
||||
8'd15: Instruction <= 32'h016d202d;
|
||||
8'd16: Instruction <= 32'h02449020;
|
||||
8'd17: Instruction <= 32'h014e982d;
|
||||
8'd18: Instruction <= 32'h016f202d;
|
||||
8'd19: Instruction <= 32'h02649820;
|
||||
8'd20: Instruction <= 32'hac100020;
|
||||
8'd21: Instruction <= 32'hac110024;
|
||||
8'd22: Instruction <= 32'hac120028;
|
||||
8'd23: Instruction <= 32'hac13002c;
|
||||
8'd24: Instruction <= 32'h08100018;
|
||||
8'd0: Instruction <= 32'h8c080000;
|
||||
8'd1: Instruction <= 32'h8c090004;
|
||||
8'd2: Instruction <= 32'h8c0a0008;
|
||||
8'd3: Instruction <= 32'h8c0b000c;
|
||||
8'd4: Instruction <= 32'h8c0c0010;
|
||||
8'd5: Instruction <= 32'h8c0d0014;
|
||||
8'd6: Instruction <= 32'h8c0e0018;
|
||||
8'd7: Instruction <= 32'h8c0f001c;
|
||||
8'd8: Instruction <= 32'h010c802d;
|
||||
8'd9: Instruction <= 32'h012d202d;
|
||||
8'd10: Instruction <= 32'h02048020;
|
||||
8'd11: Instruction <= 32'h010e882d;
|
||||
8'd12: Instruction <= 32'h012f202d;
|
||||
8'd13: Instruction <= 32'h02248820;
|
||||
8'd14: Instruction <= 32'h0200882e;
|
||||
8'd15: Instruction <= 32'h014c902d;
|
||||
8'd16: Instruction <= 32'h016d202d;
|
||||
8'd17: Instruction <= 32'h02449020;
|
||||
8'd18: Instruction <= 32'h014e982d;
|
||||
8'd19: Instruction <= 32'h016f202d;
|
||||
8'd20: Instruction <= 32'h02649820;
|
||||
8'd21: Instruction <= 32'h0240982e;
|
||||
8'd22: Instruction <= 32'hac100020;
|
||||
8'd23: Instruction <= 32'hac110024;
|
||||
8'd24: Instruction <= 32'hac120028;
|
||||
8'd25: Instruction <= 32'hac13002c;
|
||||
8'd26: Instruction <= 32'h0810001a;
|
||||
|
||||
|
||||
// -------- Paste Binary Instruction Above
|
||||
default: Instruction <= 32'h00000000;
|
||||
endcase
|
||||
|
|
|
@ -3,10 +3,13 @@ module RegisterFile(
|
|||
input reset ,
|
||||
input clk ,
|
||||
input RegWrite ,
|
||||
input Regwrite2 ,
|
||||
input [5 -1:0] Read_register1 ,
|
||||
input [5 -1:0] Read_register2 ,
|
||||
input [5 -1:0] Write_register ,
|
||||
input [5 -1:0] Write_register2,
|
||||
input [32 -1:0] Write_data ,
|
||||
input [32 -1:0] Write_data2 ,
|
||||
output [32 -1:0] Read_data1 ,
|
||||
output [32 -1:0] Read_data2
|
||||
);
|
||||
|
@ -25,8 +28,12 @@ module RegisterFile(
|
|||
if (reset)
|
||||
for (i = 1; i < 32; i = i + 1)
|
||||
RF_data[i] <= 32'h00000000;
|
||||
else if (RegWrite && (Write_register != 5'b00000))
|
||||
else
|
||||
begin
|
||||
if (RegWrite && (Write_register != 5'b00000))
|
||||
RF_data[Write_register] <= Write_data;
|
||||
|
||||
if (Regwrite2 && (Write_register2 != 5'b00000))
|
||||
RF_data[Write_register2] <= Write_data2;
|
||||
end
|
||||
endmodule
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
module test_cpu();
|
||||
|
||||
reg reset ;
|
||||
reg clk ;
|
||||
|
||||
wire MemRead ;
|
||||
wire MemWrite ;
|
||||
wire [31:0] MemBus_Address ;
|
||||
wire [31:0] MemBus_Write_Data ;
|
||||
wire [31:0] Device_Read_Data ;
|
||||
|
||||
CPU cpu1(
|
||||
.reset (reset ),
|
||||
.clk (clk ),
|
||||
.MemBus_Address (MemBus_Address ),
|
||||
.Device_Read_Data (Device_Read_Data ),
|
||||
.MemBus_Write_Data (MemBus_Write_Data ),
|
||||
.MemRead (MemRead ),
|
||||
.MemWrite (MemWrite )
|
||||
);
|
||||
|
||||
initial begin
|
||||
reset = 1;
|
||||
clk = 1;
|
||||
#100 reset = 0;
|
||||
end
|
||||
|
||||
always #50 clk = ~clk;
|
||||
|
||||
endmodule
|
Binary file not shown.
Loading…
Reference in New Issue