视频:Fixed point basics in Verilog for Beginners! Continuation of polynomial example.
承接上一篇笔记,这篇笔记主要讲述定点数相关基础知识。
浮点数的值从0到1,我们想将其转换成定点数,可以将其乘以2的幂次。
比如想构造数字17,那么17是由16(2的4次方)和1(2的0次方)组成的。我们将第4位设为1,将第0位也设为1,因为2的4次方是16加上2的0次方是1,16加1等于17。所以使用这种方法,我们可以通过构造2的幂次来构造任何有足够位数的整数数字。如果想构造1024,我们需要11位,位0到9加上第10位。
表示小数时需要一个整数位,因为小数位是严格低于1的值。如果有一个10位小数的定点数,这意味着为了表示实际值1,你需要至少有一个整数位。所以如果你只有小数位,你只能存储小于1的数字,不能存储1本身。
想表示1024.5,可以从2的幂次构造二进制数字,可以有2的负幂次,这些负幂次的2变成了2的小数幂次。所以可以通过将0.5位,也就是-1位设置为1来构造1024.5。
这种二进制格式不仅严格适用于2的0次方及更高的幂次,还适用于2的负幂次。这就是定点数的工作原理。
在将定点数相乘时,有几条规则需要遵守。
我们现在已经取了定点值并复制了一份作为b。现在我们要构造b乘以b。将一个数乘以另一个数时,需要加上整数部分的长度和小数部分的长度。b乘以b将会有双倍的整数长度和双倍的小数长度。对于b乘以b乘以b,将会加上b的长度和b乘以b的长度。
当在两个定点数之间进行乘法运算时,你需要加上整数部分、加上小数部分,才得到结果的长度。对于加法,如果要加上b和b的平方,那么要使信号具有相同的长度。因为加法规则之一是整数长度和小数长度必须相同,才能将数字加在一起。所以如果想加这些数字,就不得不对b进行符号扩展,扩展b的小数部分或截断,以便能够将数字加在一起。如果两个带符号的数相乘,规则完全相同,将符号位算作整数的一部分,然后当你将带符号的数字相乘时,只需在计算中包含符号位。对于带符号的加法,情况也完全相同,结果就是长度加一。
如果我们将两个带符号的数字相加,那么它们结果的长度加一。对带符号数进行符号扩展的方式是复制最高有效位(MSB)(Most Significant Bit),无论它的值是什么,复制足够多的位数以将其扩展到和另一个加数相同的长度。所以如果这个位的值是零,那么扩展的位数都将是零。如果这个位是一,那么这些扩展的位也将是一。最高有效位,就是符号位,如果它是一个带符号的数,就向上进行符号扩展。如果它是一个无符号数并且不是二进制补码,那么你就用零填充。这就是定点数规则的概述。
下面是代码部分:
(未完)