明德扬吴老师 发表于 2019-11-28 22:37:01

FPGA中正负数和定点小数的表示方法

FPGA中正负数和定点小数的表示方法
作者:姬姬姬
      本文为明德扬原创文章,转载请注明出处!
         在日常生活中,我们常常需要到正数与负数,比如南北两级气温常年为零度以下,这个时候我们就需要负数来表示温度。那么在FPGA工程里面也是这样,我们如果想要做温度监测工程,自然而然的就会需要到负数来表达零下的温度。当然FPGA中除了数字正负的表达,还需要用到小数。在加减乘除的运算中,小数的出现是不可避免的。作为FPGA工程师,我们无法保证所有设计都不出现负数或者小数的情况,不能避免我们就客服,今天就为大家分享一下FPGA中负数与小数的表达。

一、负数的表达

       关于负数,大家都知道在任何正数前加上负号便成了负数,比如“π”前面加上负号为“-π”,“0.178”前面加上负号为“-0.178”。FPGA传输信号使用的是二进制表达,同样二进制的负数表达也是在正数前面增加一个负号。即“1110”加负号为“-1110”,“1010100”前面加负号为“-1010100”。

明确了二进制负数的表达,我们再来考虑如何通过信号传输。在计算机中,数字信号的大小常用有限位的二进制数表示。信号1为高电平,信号0为低电平,高低电平的变化即可得到对应的信号。想要传输多位信号,就增加对应的线即改变位宽。例如我们需要传输五位二进制数10100就需要5条线,第一条线为高电平传输“1”,第二条线为低电平传输“0”,第三条线为高电平传输“1”,第四条线为低电平传输“0”,第五条线为低电平传输“0”。记住信号传输的原理,我们来考虑负数的表示。

       在表示负数之前,我们需要明确一个理念—约定,即你我双方一起遵守一个协议从而达成合作。就如手机制造商和耳机制造商合作一样,如果想要耳机与手机达成适配,就需要达成约定使用一个标准。比如一致的使用圆孔,或者约定使用type-c接口;同时也要约定使用国际标准还是国家标准。如果没有达成约定,两个厂家想当然的进行设计,手机使用了国际标准的type-c接口,耳机却是国家标准的圆孔,那想要达成最终合作也只会变成一场空,无论如何都是无法成功传输声音的。关于数据传输也是一样的,甲乙两个模块之间需要传输数据,一起约定了共传输六位数据,但是第一位数据不考虑,只取后五位。即传输信号为“101011”,其实表达的为“01011”。这个时候两个模块之间一方没有遵守约定,就会得出两种截然不同的结果。

      理解了约定的概念,我们自然而然就解决了负数的问题。前面说过负数是在数的前面增加一个负数符号,那么我们就可以事先约定一条表示正负的线,并且此线为传输数据的第一条线,高电平1为负,低电平0为正。这时传输的数据就如下表所示:
二进制信号表示      约定前的十进制表示      约定后的十进制表示

001                           1                                 +1
101                           5                                  -1
010                           2                                 +2
011                           3                                 +3
111                           7                                  -3

       可以看出,我们约定为将第一位表示正负是完全没有问题的,当然我们也发现,约定前和约定后的数值是完全不一样的。因此在设计代码的时候一定要注意,模块与模块之间的传输,一定要同时遵守同一约定。遵守约定后,不论我们是约定第几条线表示正负,都可以达到数据正确传输的效果。

二、小数的表达

       学习了负数的表达,感受了约定的力量,那么小数的表达也就迎刃而解了。这里有的同学会问,我也需要增加一根线表示小数点吗,其实是不用的。就算加入了一条线,电平不会有变化,不但给数值的表示增加了困难,还浪费了资源,属于多此一举的行为。但是我们也知道一个3位二进制数字“101”,小数点的位置不同时,对应的值就不同。同样我们需要在事先约定好,这里的约定,即是小数点的位置。并不需要将小数点实际的表示出来,但是传输信号双方需要约定好,并且互相都以小数点位置是已知的为基础进行信号传输的。

   比如对于刚刚的3位二进制数字“101”,定位小数点在第二位之后,那么此二进制数字为“10.1”即十进制的“2.5”。我们管小数点位置固定的数称为定点小数。确定了小数点的位置,自然而然我么就确定了小数点后有几位数。我们使用Qn来表示小数点后有n位的定点小数,如同样是5位二进制数字“10101”,将其不同小数位置表示出来如下:

5位二进制数      小数点位置      对应小数表达

10101                  Q0                   10101
10101                  Q1                   1010.1
10101                  Q2                   101.01
10101                  Q3                   10.101
10101                  Q4                   1.0101
10101                  Q5                   0.10101

      因此我们只要定位了小数点后需要跟几位数字,就可以在FPGA中表达小数。比如约定6位二进制数字的小数点之后有4位就叫做Q4格式的定点小数,随机拿一个数字表达即“0.1010”;比如约定10为二进制的小数点之后有7位就叫做Q7格式的定点小数,随机拿一个数字表达即“011.0111010”。

       以上就是FPGA中负数和小数的表达,我们再来回顾一下,负数的表达方式为增加一位信号,小数的表达方式则是定位小数点。但是不论是哪种方式,我们都想传达给大家一个思想,就是不论多么复杂的传输内容,传输数据双方都可以对其进行约定,只要约定达成一致,那么传输任何数据都没有问题了。

明德扬专注FPGA研究,本人正在连载两本书籍: 《基于FPGA至简设计法实现的图像边缘检测系统》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=691)、《ASIC和FPGA时序约束理论与应用》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=705),有兴趣点击观看。也欢迎加入群(838209674),及时获取最新的文章信息,个性化问题也可以找我哦:Q 1744527324(明德扬小冉)。


页: [1]
查看完整版本: FPGA中正负数和定点小数的表示方法