FPGA中有符号数的计算

一:定点数

定点数:小数的位宽是不变的数我们称之为定点数。
定点数的构成{符号位,整数位,小数位}
比如我们用10位表示小数,则相当于将1分成2^10次方,1024,每一份即就是1/1024 = 0.0009765625。又因为2的10次方有符号能够表示的数是(-1024 ~1023) 所以小数部分能够表示的数的范围是(-1~0.9990234375)    -1024 x 0.0009765625  = -1     1023 x  0.0009765625 =  0.9990234375;这里强调我们计算机中的数都是用二进制的补码表示,正数的补码就是源码,而负数的补码 = 源码取反 + 1;
  0 的补码有两种形式
这里说明求一个负数的补码的快捷方式:负数x的补码 y = 2^n - |x|
举例:-123   的补码就是 :  256(2^8) - 123 =   133 (10000101)

123的源码:1_111 1011  反码:1_000_0100 补码:1_000_0101
其余数字可以去尝试


二:有符号的定点数的加法:

有符号定点数做加法比如十进制 127-110=二进制 8’b0111 1111 +8’b1001 0010 = 9’b1_0001 0001=273(十进制)发现直接加出来的结果不对,我们应该得到的是 17,但是我们的到的是 273。这里为什么出错呢,原因是有符号数定点数,加法会产生溢出,我们需要提前在做加法之前把加数和被加数都扩展一位位宽,最后的结果就是{1 符号位,1 位整数位扩展的,7 位小数位}这样才对。注意负数需要把最高位符号位扩展。


三:有符号数乘法运算法则
-1.2 * 0.8 使用定点数进行定点化进行计算:
定点设定:符号位 1 位,整数位 3 位,小数位 10 位
由于乘法规则先判断结果为正还是负,目前乘法结果是负数,因为负*正=负
所以我们转化为 1.2*0.8 计算
1.2 定点数为 2^10*1.2=1228.8~=1228=2 进制(0 0100 1100 1100)
0.8 定点数为 2^10*0.8=819.2~=819=2 进制(0 0011 0011 0011)
定点数 1.2 和 0.8 不算符号位都是 13 位,请问乘法之后的结果位宽为多少
呢?
答案是 26 位,实际是整数位扩展为 6 位,小数位扩展为 20 位。两个定点数
相乘需要定点数位宽一致,结果的小数位宽和整数位宽都翻倍。
按照定点数的乘法 1.2*0.8=1228*819=1,005,732=2 进制(00 0000 1111
0101 1000 1010 0100)
转化为负数 2 进制补码方式,那么就是 26 位整数加小数位再扩展 1 位为符号
位,也就是 27 位
2^27-1005732=133,211,996=二进制(111 1111 0000 1010 0111 0101 1100)
是二进制补码的-1.2*0.8

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值