RTL:数字设计定点化及Signed妙用

RTL:数字设计定点化及Signed妙用

1. 数字设计中的定点化问题

  • 什么是定点化呢?大概就是将一个小数变成整数的过程。
  • 假设某个算法中有一个浮点数a = 1.8756461。但是硬件当中是有电路来实现此算法的功能,那如何让电路中的基础线(每个基础线只能代表0或1)表示此浮点数呢?
    • 假设我们要保留a小数位的6个比特以及整数位的5个比特,则可令a2 = a * 26将a左移6位,则小数位的六位移到了整数位),比如a =(1.875)10 =(01.111000)2 ,则a2=(120) 10=(0111_1000)。
    • 但是还需要对a2进行向下取整,因为a的小数位可能不止6位,势必会对a有一个截断效应,会损失一定小数的精度。此时要么考虑向下取整,要么四舍五入。除非精度实在不够用,一般直接采用向下取整(方便)。精度不够用时,还可以采用增加小数位比特数的方式,比如增加到7位。
  1. 另外对于MATLAB中fixed toolbox(定点化工具)。由于定义的是结构体,跑复杂结构时运算速度慢,且有些时候是无法体现出RTL流程的。比如a是10位宽的,b是8位宽的,则c=ab,c应该是18位宽的,假设我们现在结果只需要用c的低5位,即c[4:0] * d。那么如果直接用fi(a * b * d)得到的结果是不符合RTL设计的,验证就会出错。正确的使用是c=fi(ab),然后对c进行移位处理后再得到结果fi(c * d) 。但是这与我们直接使用floor(a*2n)一样。
  2. 对floor(2.5) = 2,那么对floor(-2.5)=等于多少,对于浮点的定点化来说,结果等于-3。
    • 原因:假设我们取一个有效小数,则定点后-2.5^2=-5。在计算机中-5用四位的补码表示为1011(16-5),然后再还原原来的数1011/2=101,又由于这是一个四比特数,且是负数,所以最高位补1,得到最后floor(-2.5)的最后结果就是1101(这是补码),原码也就是1011,对应值就是-3。

2.Signed的妙用

2.1 有无Signed声明的输出逻辑值

在这里插入图片描述

图1 逻辑代码

  逻辑代码如图1所示,其中输入输出均是signed型。仿真结果如图2所示。

在这里插入图片描述

图2 仿真结果
  • 为什么会出现这样的结果呢?必须知道,计算机中的数都是以补码形式存在并计算。

    • a 的位长为5,值为3,则对应补码的有符号数00011。
    • b的位长为4,值为-5,对应的原码为1101,则计算机中存的补码为1011,用十六进制表示则为b。
    • 又由于c=a+b,位宽为6。计算前,先把a,b两数的补码都扩充为6个位宽正数前面补0,负数补1,所以©补码= 000011 + 111011 = 11 1110 =(3e)h。原码为26 - 111110 = 000010 = (2)10
  • 所以运算正确。

  • 如果输入时a,b没有定义为signed,那么c的结果就是00011+1011 = 1110 = (e)16 。如图3、4所示。而你又希望结果是有符号的,那么就手动操作了,过程与上述就算c的过程一样。
    在这里插入图片描述

    图3 无signed标注的输入类型

在这里插入图片描述

图4 无signed类型的输出结果

  对于上述情况,由于c只作为外部使用(a,b组合变量的直接输出,类似线网类型),且a,b都定义了signed类型,所以即使不给c定义signed类型,最后输出结果也会是signed类型。但是,如果内部使用到了的c,那么此时一定要将c定义为signed类型,否则就会当成无符号类型。如图5所示。c在always语句中用到了d<=c-b。
在这里插入图片描述

图5 c在内部使用

  再举一个例子,c的组合输出中可能含有不是signed的逻辑值,如图6、7、8、9所示。
在这里插入图片描述

图6 都是signed的逻辑输出

在这里插入图片描述

图7 都是signed的逻辑输出仿真结果图

在这里插入图片描述

图8 含有不是signed值的逻辑输出

在这里插入图片描述

图9 含有不是signed值的逻辑输出仿真结果

  不难发现,图6、8的区别在于c的组合逻辑中可能输出的值一个是0(没有指定位宽,则系统认为是signed),一个是6‘d0(指定了位宽,则系统认为不是signed型)。则由两者的输出结果来看,逻辑输出中有一个不是signed型,则对应的输出就不是signed型,否则才为signed型。

  • 所以对于有signed声明的有符号数,加减法位宽可以不用完全对齐
  • 对于无signed声明的有符号数,加减法位宽可以需要对齐

2.2 有无signed声明的符号数的算数移位

在这里插入图片描述

图10 无signed定义的符号数移位
  • 如图10所示,没有声明x2,y2,tmp1,tmp2为signed类型,但是它确实是符号数,这个程序要完成的就是将无signed定义的符号数进行移位。比如第一个case语句,将x2右移一位的值先给tmp2,在判断x2最高位是否为1(即是否为负数),如果是的话,按照有符号数的移位方式(算术移位),那么在前面需要补零(移了几位补几个)。
  • 这样手动操作就比较麻烦
    在这里插入图片描述
图11 signed定义的符号数移位

  如图11所示,其中变量都是经过signed定义的,只需要使用**>>>**(注意是三个>),则会自动进行有符号的移位操作,比图10中方便不少。

  同理左移如图12所示。左边是signed声明,右边无
在这里插入图片描述

图12 有无signed定义的符号数左移位
  • 所以对于有signed声明的有符号数,移位的时候系统会自动补齐
  • 对于无signed声明的有符号数,移位的时候需要手动操作

2.3 有无signed声明的符号数的求补

在这里插入图片描述

图13 有无signed定义的符号位求补(左边是有,右边是无)
  • 如图13中右界面所示,没有signed定义的符号数求补码时,需要用2n(其中n是符号位的位宽)减去符号数,得到其补码,而如用signed声明了,则只需要用负号加符号数即可,系统会自动进行符号数的求补。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值