blob: e6c69496b77845aa70911cd761350dbee619ec0d [file] [log] [blame]
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 09/22/2021 02:53:47 PM
// Design Name:
// Module Name: ALU_Opt
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ALU_Opt(
input [15:0] IN_A, //src1
input [15:0] IN_B, //src2
input [2:0] OPCODE, //function sel
input DataReady_1,
output reg [15:0] OUT_ALU, //result
output reg [14:0] OUT_ALU_MUL, //result
output reg COUT
);
wire MODE;
wire [15:0] OUT_SUM,OUT_SUB;
wire [30:0] OUT_MUL;
wire OUT_COUT,OUT_COUT1;
RPA_16bit Rp_add(.IN_A(IN_A), .IN_B(IN_B), .MODE(1'b0),.OUT_SUM(OUT_SUM),.OUT_COUT(OUT_COUT));
RPA_16bit Rp_sub(.IN_A(IN_A), .IN_B(IN_B), .MODE(1'b1),.OUT_SUM(OUT_SUB),.OUT_COUT(OUT_COUT1));
BOOTH_16BIT_SIGN Mul(.multiplier(IN_A),.multiplicand(IN_B),.product(OUT_MUL));
always @(*)
begin
if(DataReady_1)
begin
case(OPCODE)
3'b000: begin
OUT_ALU = OUT_SUM; // add
COUT = OUT_COUT;
OUT_ALU_MUL =15'bz;
end
3'b001: begin
OUT_ALU = OUT_SUB; // sub
COUT = OUT_COUT1;
OUT_ALU_MUL =15'bz;
end
3'b010: begin
OUT_ALU = OUT_MUL[15:0]; //mul
COUT = 1'b0;
OUT_ALU_MUL = OUT_MUL[30:16];
end
3'b011: begin
OUT_ALU = ~IN_A;
COUT = 1'b0;
OUT_ALU_MUL =15'bz;
end
3'b100: begin
OUT_ALU = IN_A<<IN_B; // LeftShif A by B
COUT = 1'b0;
OUT_ALU_MUL =15'bz;
end
3'b101: begin
OUT_ALU = IN_A>>IN_B; // RightShift A by B
COUT = 1'b0;
OUT_ALU_MUL =15'bz;
end
3'b110: begin
OUT_ALU = IN_A & IN_B; // and
COUT = 1'b0;
OUT_ALU_MUL =15'bz;
end
3'b111: begin
OUT_ALU = IN_A | IN_B; // or
COUT = 1'b0;
OUT_ALU_MUL =15'bz;
end
default:
begin
OUT_ALU = OUT_SUM; // add
COUT = OUT_COUT;
OUT_ALU_MUL =15'bz;
end
endcase
end
else
begin
OUT_ALU = 16'bZ;
COUT = 1'bz;
OUT_ALU_MUL = 15'bz;
end
end
endmodule