32 lines
812 B
Verilog
32 lines
812 B
Verilog
module alu
|
|
(input [31:0] i_a,
|
|
input [31:0] i_b,
|
|
input [3:0] i_op,
|
|
output o_zero,
|
|
output reg [31:0] o_y);
|
|
|
|
assign o_zero = (o_y == 0);
|
|
|
|
always @(*) begin
|
|
case (i_op)
|
|
4'b0000: o_y = i_a;
|
|
4'b0001: o_y = ~i_a;
|
|
4'b0010: o_y = i_a + i_b;
|
|
4'b0011: o_y = i_a - i_b;
|
|
4'b0100: o_y = {31'd0, i_a > i_b};
|
|
4'b0101: o_y = {31'd0, i_a < i_b};
|
|
4'b0110: o_y = {31'd0, $signed(i_a) > $signed(i_b)};
|
|
4'b0111: o_y = {31'd0, $signed(i_a) < $signed(i_b)};
|
|
4'b1000: o_y = i_a & i_b;
|
|
4'b1001: o_y = i_a | i_b;
|
|
4'b1010: o_y = i_a ^ i_b;
|
|
4'b1011: o_y = i_a << i_b[4:0];
|
|
4'b1100: o_y = i_a >>> i_b[4:0];
|
|
4'b1101: o_y = i_a * i_b;
|
|
4'b1110: o_y = {{24{i_a[7]}}, i_a[7:0]};
|
|
4'b1111: o_y = {{16{i_a[15]}}, i_a[15:0]};
|
|
default: o_y = i_a;
|
|
endcase
|
|
end
|
|
endmodule // alu
|