嵌入式中位宽的计算

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的二进制位宽。

  1. 分隔为3个1组:147_258_369。
  2. 将第一组的数加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 位宽的字符串的指纹或散列?

Verilog定义计算位宽的函数clogb2

嵌入式Linux裸机开发——Nandflash

FPGA位宽的转换和定义

一种RK3399+MIPI+FPGA的高速工业相机的设计方案

vivado fir ipcore 进制位宽小数位宽的问题