Verilog设计基础|补码的意义及Verilog中的补码定点小数计算

目录
【Verilog设计基础|补码的意义及Verilog中的补码定点小数计算】1.原码,反码,补码
2.补码的意义
3.Verilog中的补码运算与定点小数
3.1补码定点小数的加减运算
3.2补码定点小数的乘除运算
3.3对运算的结果近似截取一定位宽
3.4实际应用中的例子
1.原码,反码,补码 原码:n位的二进制数,最高位为符号位,正数为0,负数为1。剩下的n-1位表示该数的绝对值
反码:原码的符号位不变,正数不变,负数按位取反
补码:反码正数不变,负数加1
我认为在Verilog中,这样更方便:
正数的原码、反码和补码是一个;
负数补码的获得方法:负数的绝对值对应的二进制数取反加一(就不需要用原码反码了)
如果得到一个补码,如何知道其表示的负数的绝对值呢?补码所有位减一取反 等价于 取反加一。也就是说都是取反加一[1]。
2.补码的意义 学过微机原理的应该知道,计算机只会进行简单二进制的加减操作,补码的意义在于:不管这n位二进制是正负数还是有小数,计算机只看成无符号二进制直接运算,而且结果是对的。[2]
并且,在处理不同位宽的数据时,是将短的数据通过符号位拓展,这都不会影响结算结果的正确性。
符号位扩展:例如均为补码形式的8位有符号数1101 0011与16位有符号数运算,首先要将8位符号扩展,即符号位填充增加的位上,此数符号位为1,扩展后:1111 1111 1101 0011
也就是说:补码统一了计算机进行正负数运算,使得符号位也参与运算,并能得到正确结果。
3.Verilog中的补码运算与定点小数 上一步已经说了在补码运算时要进行符号位宽展,但在将补码看成定点小数,对运算结果小数位的判断、运算结果取近似截取还是要有很多注意的地方。
定点小数有两种表示方法:
1.XQN:1位符号位+X位整数位+N位小数位,例如1Q7表示位宽为9的有7位小数位的定点数。
2.fix(1+X+N)_N:例如fix9_7表示位宽为9的有7位小数位的定点数。
一个XQN的定点小数所表示的范围:Verilog设计基础|补码的意义及Verilog中的补码定点小数计算
文章图片

3.1补码定点小数的加减运算 加减是等效的,都需要进行符号位扩展,且扩展的是定点小数的整数位,
例如:两个fix9_7相加或相减,结果是fix10_7,扩展的是整数位,小数位不变,
n个数相加减,需要扩展ceil(Verilog设计基础|补码的意义及Verilog中的补码定点小数计算
文章图片
)位,向上取整。
3.2补码定点小数的乘除运算 乘法:相乘需要符号位扩展且小数位与整数位都会改变,类似于十进制的乘法
例如:两个fix9_7相乘,结果是fix18_14,
乘法简化为左移时,即低位补0,位宽变长
除法:除法一般简化为右移操作,高位补符号位,小数位不变
例如:fix9_7除以8,位宽不变,低3位舍弃,高位补符号位,仍是fix9_7,1 1.011 0101除以8,得到1 1.111 0110
3.3对运算的结果近似截取一定位宽 应该对计算的结果值的范围有一定预估,然后进行截取
xilinx的IP核很多情况下默认都是舍弃小数位,取高位,这是容易出错的。
例1:对fix14_12格式的数据累加128个后取平均,要求最后结果还是fix14_12,
首先累加后的结果是fix21_12,取平均即右移8位后还是fix21_12,这时就要取对应的低2位整数+12位小数位作为最终结果,舍弃高位(补码可以直接舍弃包括符号位的高位,对应的整数位就成了符号位)。
例2:两个fix14_12相乘,因为两个数的范围都不大,结果使用fix14_12也不会溢出,对相乘的结果fix28_24取近似,那我们就要以小数点为准,取整数位中的低2位以及小数位中的高12位,而不是直接取高14位。
3.4实际应用中的例子 有符号数映射:OFDM实现中,要对二进制数据进行调制,例如QPSK,将2b数据映射为复平面的一个点(包含实部与虚部)功率归一化后的映射关系为:
00->(-0.707,-0.707)
01->(-0.707,0.707)
11->(0.707,0.707)
10->(0.707,-0.707)
用8位二进制如何表示呢?
要用补码,因为在整个工程中考虑到我使用的数字范围都是-2~2,那我们可以采用fix8_6,
那0.707*2^6=45.248,取45,补码结果为0010 1101
-0.707*2^6=-45.248,取-45,将45的补码取反加1,得到1101 0011
然后将上述二进制赋值给Verilog里的变量,直接对二进制操作,最后得到的结果再映射回来就可以了。
定点小数是我们给定义的小数位数,是在映射回小数时用到,我们自己心里有数就好,计算机并不知道,也不影响计算结果。
参考资料:
[1]https://blog.csdn.net/jiangjieqazwsx/article/details/79942079
[2]https://blog.csdn.net/leonliu06/article/details/78685197
[3]https://blog.csdn.net/k331922164/article/details/75579230

    推荐阅读