Verilog-浮点乘法

Verilog-浮点乘法,verilog,Verilog,我们的Verilog有问题。 我们必须使用两个浮点(二进制)的乘法,但它不能100%完美地工作 我们有一个请求m[31:0]。第一个数字(逗号前)是m[31:16],逗号后的数字是m[15:0],因此我们有: m[31:16]=100000000000000; m[15:0]=100000000000000 m[31:0]=100000000000000(.)100000000000000 问题是:我们想用小数位数乘法,但我们不知道怎么做。 例如:二进制中的m=2.5。m*m的结果是6.25。这

我们的Verilog有问题。 我们必须使用两个浮点(二进制)的乘法,但它不能100%完美地工作

我们有一个请求m[31:0]。第一个数字(逗号前)是m[31:16],逗号后的数字是m[15:0],因此我们有:

m[31:16]=100000000000000; m[15:0]=100000000000000

m[31:0]=100000000000000(.)100000000000000

问题是:我们想用小数位数乘法,但我们不知道怎么做。
例如:二进制中的m=2.5。m*m的结果是6.25。

这个问题没有完全涵盖对定点数字的理解,因此将涵盖一些可能与OP无关的背景知识

无符号二进制(基2)数的十进制加权,例如4位,遵循以下规则:

2^3  2^2  2^1  2^0 (Base 2)
  8    4    2    1
仅供参考,电源保持不变,电源发生变化。对于4十六进制,它将是:

16^3  16^2  16^1  16^0
4096   256    16     1
回到基数2,对于两个补码有符号数,MSB(最高有效位)变为负数

-2^3  2^2  2^1  2^0 (Base 2, Twos complement)
  -8    4    2    1
当我们插入一个二进制点或小数位时,模式继续。4个整数位4个小数位

Base 2: Twos complement 4 integer, 4 bit frational
-2^3  2^2  2^1  2^0  .  2^-1    2^-2    2^-3    2^-4
  -8    4    2    1  .   0.5    0.25   0.125  0.0625
不幸的是,Verilog没有固定的点格式,因此用户必须跟踪二进制点并处理缩放的数字。小数点
不能用于存储为
reg
logic
的verilog数字,因为它们本质上是整数格式。然而,当把verilog放在数字声明中时,它会忽略
,因此它可以用作数字中的二进制点。它的使用只是象征性的,对语言没有任何意义

在上述格式2.5中,将用
8'b010\u 1000
表示,问题有16个小数位,因此需要在
\u010\u
后放置16位,以保持二进制点在正确的位置

定点乘法位宽度 如果我们有两个数字AB,结果A*B的宽度将为:

Integer bits    = A.integer_bits    + B.integer_bits.
Fractional bits = A.fractional_bits + B.fractional_bits.
因此[4整数,4分数]*[4整数,4分数]=>[8整数,8分数]

reg [7:0] a = 0010_1000;
reg [7:0] b = 0010_1000;
reg [15:0] sum;

always @* begin
  sum = a * b ;
  $displayb(sum); //Binary
  $display(sum);  //Decimal
end

// sum == 00000110_01000000; //Decimal->6.25
举个例子

由此,您应该能够更改深度以适应任何类型的固定点编号。通过部分选择正确的位,可以将转换回16整数16小数。如果需要饱和而不是溢出,请小心


有一个具有22个小数位的关联。

您似乎在描述“定点”而不是浮点。LSB是指数(浮动)还是小数位(固定)?非常感谢。这就是我搜索的内容。:)@没问题,这是一个棘手的问题。跟踪二进制点可能很棘手。
Base 2: Twos complement 4 integer, 4 bit frational
-2^3  2^2  2^1  2^0  .  2^-1    2^-2    2^-3    2^-4
  -8    4    2    1  .   0.5    0.25   0.125  0.0625