38 lines
1.5 KiB
Verilog
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 [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 = {in2 >> in1[4:0]}; // 24, srl
|
|
5'b11001: result = {{32{in2[31]}}, in2} >> in1[4:0]; // 25, sra
|
|
5'b11010: result = in1 * in2; // 26, mul
|
|
default: result = 31'h00000000;
|
|
endcase
|
|
end
|
|
endmodule
|