fox32-hw/verilog-src/alu.v

52 lines
955 B
Verilog

/*
A and B are inputs, O is out
OP is the operation to perform:
000 = add
001 = sub
010 = mul_lo
011 = mul_hi
(011)
100 = and
101 = or
110 = xor
111 = not A
*/
module alu(
input [31:0] A,
input [31:0] B,
input [2:0] op,
output [31:0] O,
output Fflow,
output Fzero
);
wire [31:0] adder_out;
begin
wire subtraction = op == 3'b001;
wire [31:0] adder_B = subtraction ? ~B : B;
wire adder_cout;
carry_select_adder a(A, adder_B, subtraction, adder_out, adder_cout);
assign Fflow = subtraction ? ~adder_cout : adder_cout;
end
wire [31:0] mult_out_hi;
wire [31:0] mult_out_lo;
multiplier mult(A, B, mult_out_hi, mult_out_lo);
assign O =
op == 3'b000 ? adder_out :
op == 3'b001 ? adder_out :
op == 3'b010 ? mult_out_hi :
op == 3'b011 ? mult_out_lo :
op == 3'b100 ? A & B :
op == 3'b101 ? A | B :
op == 3'b110 ? A ^ B :
op == 3'b111 ? ~A :
'0;
assign Fzero = ~ (| O);
endmodule