zoukankan      html  css  js  c++  java
  • 嵌入式中位宽的计算

    在嵌入式设计中,是经常需要和最底层打交道。无论是利用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   

  • 相关阅读:
    python接口测试
    python selenium 判断元素是否可见
    python学习之天气爬虫
    python学习之图片爬虫
    python学习之小说爬虫
    webdriver学习——css调试,jquery调用
    webdriver学习——百度设置
    bat中获取当前路径
    搭建ant脚本,全量/增量/减量包
    查询数据库中各个类型的方法名称
  • 原文地址:https://www.cnblogs.com/fendoudexiaohai/p/13141773.html
Copyright © 2011-2022 走看看