嵌入式中位宽的计算
Posted fendoudexiaohai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式中位宽的计算相关的知识,希望对你有一定的参考价值。
在嵌入式设计中,是经常需要和最底层打交道。无论是利用MCU实现功能还是利用电路直接实现功能,都需要对数字极其敏感。
在嵌入式中,所有的数值都是按照二进制码进行存储的。二进制与十进制的计算规则为:
二进制的101.01,等于十进制的5.25。
在不考虑小数时,我们在设计中,用的到所有的变量都要基于一个位宽,如果位宽不够时,就会出错。例如:十进制的100,转换为二进制为1100100,需要用到7位的位宽。当用低于7位的位宽去接收十进制的100时,就会得到错误的结果。
在C51设计中,比较常用的两个整数变量类型为:char和int。这两种类型可以拓展为四种类型:signed char、unsigned char 、signed int 和unsigned int。signed可以省略不写。
对于char来说,表示为1个字节(位宽为8),经常用来表示一个字符。对于数值来说,char表示有符号时,范围为-128至127;char表示无符号时,范围为0至255。所以在使用时,要牢记这个范围,当需要记录的数字超过这个范围时,将会出错。例:char类型的变量被赋值325;此时综合器的综合并不会报错,但是确得不到正确的结果。
对于int来说,表示为2个字节(位宽为16)。对于数值来说,int表示有符号时,范围为-32768至32767;int表示无符号时,范围为0至65535。所以在使用时,要牢记这个范围,当需要记录的数字超过这个范围时,将会出错。
在使用时,如果char可以时,尽量不要使用int,节省一部分资源。
在C51设计时,char和int是固定的,也没有其他的宽度的类型供给使用。
在FPGA开发时,位宽是自己随意设置的。设置位宽不够时,将会计数出错;设置位宽过大时,将会浪费一部分位宽。
在50MHz的时钟驱动下,记录一秒钟。需要记录50_000_000个时钟周期,此时记录时无符号的记录,那么需要计数器的位宽为多少位才可以呢?
可以利用PC自带的计算器,设置为程序员型,调成十进制将50_000_000输入进去,然后转换为二进制,查一下有多少位。
很明显需要26位。
如果每次的计算都需要计算器的话,很多的时候可能不太方便。这里笔者整理出一种“看一眼就知道位宽”的技巧。
首先需要牢记2的0次幂至10次幂的值,这个难度并不大。下面来看一个例子:
计算147258369的二进制位宽。
- 分隔为3个1组:147_258_369。
- 将第一组的数加1,后面的数全部换为0,如果后面组已经是0,第一组不加1。
147258369 < 148_000_000 = 148*1000*1000 < 148*1024*1024
2的次幂为1024,所以148*1024*1024为148乘以2的20次幂。148正好处于128和256中间,选择256。
最后的数字为256*1024*1024,即最后的数字为2的28次幂,也就是利用28位的二进制就可以表示此数字。
所以对于50_000_000,后面的六个0为20位,50需要用64表示,所以共需要26位。
此方法会有一定的误差,但是误差最多为1个位宽。能够比较方便快捷的计算某个数字的位宽,加快了设计进度。
在计算有符号数时,直接计算其绝对值的位宽,然后将位宽在扩大1位即可。
有符号数的表示为最高位为符号位,不表示数值大小,所以计算完绝对值的位宽后,需要加上一个符号位即可。
在上述说明中,主要阐述了整数位宽的确定。对于小数来说,重点关注的不是位宽而是位宽所能达到的精度。
在数字电路中,所有的数字都是由二进制来表示,对于很多的数字是无法用有限的二进制来进行的,所以此时就需要用一个近似值来表示。
关于小数位宽的确定不做过多介绍,有兴趣的读者可以自行查询相关资料。
设计者:郝旭帅 QQ:746833924 QQ交流群: 173560979
以上是关于嵌入式中位宽的计算的主要内容,如果未能解决你的问题,请参考以下文章
C++ 中是不是有任何函数可以计算保证至少 64 位宽的字符串的指纹或散列?