我正在尝试为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
一个目标也是使此参数化,因为如果将来整数或小数部分的位发生变化,我需要能够适应它。
非常感谢您的帮助。
谢谢