带溢出处理的18位定点乘法

时间:2018-11-07 15:12:46

标签: verilog fpga multiplication signed fixed-point

我正在尝试为Xilinx FPGA实现定点乘法器。输入a和b是Q9.9中的18位定点数(8位整数,9位小数部分和1个符号位)。我希望结果再次出现在Q9.9表示法中。所以我需要处理整数部分的溢出。如果整数乘法的结果大于0xFF(d255),那么我需要将值饱和到255。现在我想到的是从结果中取中间的17位并分配低9位是小数部分,而高8位是小数部分位是整数部分。结果的最高有效位是符号。

现在,在此之后,我检查整数部分是否溢出并将其饱和。

这是有符号不动点乘法的正确方法吗? 乘法后,DSP48硬乘法器给我溢出标志。我可以使用此标志以相同的方式检测和处理溢出吗?

这是我到目前为止尝试过的

module fixed_mult(
input clk,
input reset,
input [17:0] inpa,
input [17:0] inpb,
output [17:0] out
);

reg [35:0] mult_reg;
reg [17:0] mult_shift;

assign out = mult_shift;
always @(posedge clk) begin
    if(reset) begin
        mult_reg <= 0;
        mult_shift <= 0;
    end
    else begin
        if((inpa[17] == 1 && inpb[17] == 0) || (inpa[17] == 0 && inpb[17] == 1)) begin
            mult_shift[17] <= 1'b1;
        end
        else begin
            mult_shift[17] <= 1'b0;
        end

        mult_reg = inpa * inpb;
        if(mult_reg[33:18] > 255) begin
            mult_reg[33:18] <= 255;
        end
        else begin
            //mult_reg[33:18] 
        end
        mult_shift[16:0] = mult_reg >> 9;
    end
end
endmodule

一个目标也是使此参数化,因为如果将来整数或小数部分的位发生变化,我需要能够适应它。

非常感谢您的帮助。

谢谢

0 个答案:

没有答案