Files
MipsPipelineProcessor/PipelineProcessor.srcs/sources_1/new/ALU.v
2024-07-10 13:32:04 +08:00

38 lines
1.5 KiB
Verilog

`timescale 1ns / 1ps
module ALU (
input [ 4:0] funct,
input [31:0] in_1,
input [31:0] in_2,
output reg [31:0] result
);
wire lt_signed;
assign lt_signed = (in_1[31] ^ in_2[31]) ? ((in_1[31] == 1'b0 && in_2[31] == 1'b1) ? 0 : 1):
(in_1[30:0] < in_2[30:0]);
always @(*) begin
case (funct)
5'b00000: result <= in_1 & in_2; // 0, and
5'b00001: result <= in_1 | in_2; // 1, or
5'b00010: result <= in_1 + in_2; // 2, add
5'b00110: result <= in_1 - in_2; // 6, sub
5'b00111: result <= {31'b0, lt_signed}; // 7, slt signed
5'b01000: result <= {31'b0, in_1 < in_2}; // 8, slt unsigned
5'b01100: result <= ~(in_1 | in_2); // 12, nor
5'b01101: result <= in_1 ^ in_2; // 13, xor
5'b10000: result <= in_2 << in_1[4:0]; // 16, sll
5'b10001: result <= {31'b0, in_1 == in_2}; // 17, eq
5'b10010: result <= {31'b0, ~(in_1 == in_2)}; // 18, neq
5'b10011: result <= {31'b0, (in_1[31] == 1'b0 && in_1 != 32'h00000000)}; // 19, gtz
5'b10100: result <= {31'b0, in_1[31] == 1'b1}; // 20, ltz
5'b10101: result <= {31'b0, (in_1[31] == 1'b1 || in_1 == 32'h00000000)}; // 21, lez
5'b11000: result <= {in_2 >> in_1[4:0]}; // 24, srl
5'b11001: result <= {{32{in_2[31]}}, in_2} >> in_1[4:0]; // 25, sra
5'b11010: result <= in_1 * in_2; // 26, mul
default: result <= 31'h00000000;
endcase
end
endmodule