-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathALU.v
131 lines (90 loc) · 2.36 KB
/
ALU.v
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// 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'b1000)begin // ADD signed
result_o <= (tmp_src1 + tmp_src2);
end
else if(ctrl_i==4'b0110)begin //SUB
result_o <= (src1_i - src2_i);
end
else if(ctrl_i==4'b1010)begin
result_o <= (tmp_src1 - tmp_src2);
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'b1101)begin
result_o <= (src2_i << shamt_i) ; //for SLL
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*/
else if(ctrl_i==4'b0100)begin // mul
result_o <= (tmp_src1*tmp_src2);
end
/* lab2 version
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*/
if(result_o==0)begin // bne:if not equal->result!=0->but zero should=0
zero_o <= 1'b1;
end
else begin
zero_o <= 1'b0;
end
end
endmodule