| |
//若舍入数为正数,舍入相邻位为1,舍入时必须进1;反之不用。
//若舍人数为负数,舍入相邻位为1且舍人相邻位后面还有一位为1,则舍入时需加1;反之,不加1
module round
#(
parameter DATA_IN_WIDTH = 16,
parameter DATA_OUT_WIDTH = 15
)
(
input [DATA_IN_WIDTH-1:0] data_in,
output reg [DATA_OUT_WIDTH-1:0] data_out
);
localparam CUT_WIDTH = DATA_IN_WIDTH - DATA_OUT_WIDTH;
generate
if (CUT_WIDTH == 1)
begin:ROUND_1BIT
always @ (*)
begin
if (data_in[DATA_IN_WIDTH-1] == 1'b0)
begin
if ((&data_in[DATA_IN_WIDTH-2:1] == 1'b0) && (data_in[0] == 1'b1))
data_out = data_in[DATA_IN_WIDTH-1:1] + {{(DATA_OUT_WIDTH-1){1'b0}},1'b1};
else
data_out = data_in[DATA_IN_WIDTH-1:1];
end
else
data_out = data_in[DATA_IN_WIDTH-1:1];
end
end
else
begin:ROUND_NBIT
always @ (*)
begin
if (data_in[DATA_IN_WIDTH-1] == 1'b0)
begin
if ((&data_in[DATA_IN_WIDTH-2:CUT_WIDTH] == 1'b0) && (data_in[CUT_WIDTH-1] == 1'b1))
data_out = data_in[DATA_IN_WIDTH-1:CUT_WIDTH] + {{(DATA_OUT_WIDTH-1){1'b0}},1'b1};
else
data_out = data_in[DATA_IN_WIDTH-1:CUT_WIDTH];
end
else
begin
if ((|data_in[CUT_WIDTH-2:0] == 1'b1) && (data_in[CUT_WIDTH-1] == 1'b1))
data_out = data_in[DATA_IN_WIDTH-1:CUT_WIDTH]+ {{(DATA_OUT_WIDTH-1){1'b0}},1'b1};
else
data_out = data_in[DATA_IN_WIDTH-1:CUT_WIDTH];
end
end
end
endgenerate
endmodule