Я пытаюсь реализовать множитель с фиксированной запятой для ПЛИС Xilinx. Входы a и b представляют собой 18-битные числа с фиксированной точкой в Q9.9 (8-битное целое число, 9-битная дробная часть и 1-битный знак). Я хочу, чтобы результат был снова в нотации Q9.9. Поэтому мне нужно справиться с переполнением промежуточной части. Если результат целочисленного умножения больше 0xFF (d255), тогда мне нужно насытить значение до 255. Теперь я подумал о том, чтобы взять средние 17 битов из результата и назначить младшие 9 битов как дробную часть, а верхние 8 биты являются целочисленной частью. MSB результата является знаком.
Теперь после этого я проверяю, не переполнилась ли целая часть, и насыщаю ее.
Это правильный подход к умножению со знаком с фиксированной запятой?
Жесткий множитель 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
Одна цель также состоит в том, чтобы сделать это параметризованным, так как, если в будущем биты для целого числа или дробной части изменятся, я должен быть в состоянии приспособиться к этому.
Любая помощь очень ценится.
Спасибо