-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathALU.v
71 lines (58 loc) · 1.27 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
module ALU
(
input clk,
input [31:0]control_signal,
input [15:0]BR_in,
input [15:0]ACC_in,
output [15:0]ACC_out,
output [15:0]MR_out,
output [15:0]DR_out
);
reg [31:0]buffer = 32'd0;
reg [15:0]re_buffer; // 存余数
assign ACC_out = buffer[15:0];
assign MR_out = buffer[31:16];
always@(posedge clk) begin
// 清零
if(control_signal[8]) begin
buffer <= 32'd0;
end
// 加
if(control_signal[9]) begin
buffer[15:0] <= ACC_in + BR_in;
end
// 减
if(control_signal[9]) begin
buffer[15:0] <= ACC_in - BR_in;
end
// 与
if(control_signal[9]) begin
buffer[15:0] <= ACC_in & BR_in;
end
// 或
if(control_signal[10]) begin
buffer[15:0] <= ACC_in | BR_in;
end
// 非
if(control_signal[10]) begin
buffer[15:0] <= ~ ACC_in;
end
// 逻辑左移
if(control_signal[10]) begin
buffer[15:0] <= ACC_in << 1;
end
// 逻辑右移
if(control_signal[10]) begin
buffer[15:0] <= ACC_in >> 1;
end
// 乘
if(control_signal[22]) begin
buffer <= ACC_in * BR_in;
end
// 除
if(control_signal[23]) begin
buffer[15:0] <= ACC_in / BR_in;
re_buffer <= ACC_in % BR_in;
end
end
endmodule