-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathALU.v
More file actions
113 lines (71 loc) · 1.88 KB
/
ALU.v
File metadata and controls
113 lines (71 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Author: 0711282 邱頎霖
module ALU(
src1_i,
src2_i,
ctrl_i,
result_o,
zero_o,
shamt_i
);
//I/O ports
input [32-1:0] src1_i;
input [32-1:0] src2_i;
input [4-1:0] ctrl_i;
input [5-1:0] shamt_i;
output [32-1:0] result_o;
output zero_o;
//Internal signals
reg [32-1:0] result_o;
reg zero_o;
wire signed [32-1:0] tmp_src1;
wire signed [32-1:0] tmp_src2;
wire signed [5-1:0] tmp_shamt;
assign tmp_src1 = src1_i;
assign tmp_src2 = src2_i;
assign tmp_shamt = shamt_i;
always @(*)begin
if(ctrl_i==4'b0010)begin //ADD
result_o <= (src1_i + src2_i);
end
else if(ctrl_i==4'b0110)begin //SUB
result_o <= (src1_i - src2_i);
end
else if(ctrl_i==4'b0000)begin //AND
result_o <= (src1_i & src2_i);
end
else if(ctrl_i==4'b0001)begin //OR
result_o <= (src1_i | src2_i);
//result_o <= src2_i;
end
else if(ctrl_i==4'b0111)begin //SLT
result_o <= (tmp_src1 < tmp_src2)?1'b1:1'b0;
//result_o <= (src1_i < src2_i)
end
else if(ctrl_i==4'b0101)begin //SLTiu
result_o <= (src1_i < src2_i)?1'b1:1'b0;
end
else if(ctrl_i==4'b1111)begin //SRAV
result_o <= (tmp_src2 >>> tmp_src1); // >>> for "signed" -> wire should be signed = =
//result_o <= tmp_src2; // >>> tmp_src2);
//SRAV rd, rt, rs
end
else if(ctrl_i==4'b1110)begin //SRA
result_o <= (tmp_src2 >>> tmp_shamt); // >>> for "signed"
end
else if(ctrl_i==4'b1011)begin //lui
result_o <= src2_i<<16;
end
else if(ctrl_i==4'b0011)begin //beq
result_o <= (src1_i - src2_i);
end
else if(ctrl_i==4'b1001)begin //bne
result_o <= (src1_i - src2_i);
end
if(ctrl_i==4'b1001)begin // bne:if not equal->result!=0->but zero should=0
zero_o <= (result_o==0)?1'b0:1'b1;
end
else begin
zero_o <= (result_o==0)?1'b1:1'b0;
end
end
endmodule