- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
字长与定点计算
字长与定点计算 杨旭 问题的提出 在数字PWM控制系统中,使用DSP,MCU,ARM和FPGA进行数学计算应用越来越普遍。 部分处理器可以使用浮点计算,但所有的硬件都支持定点计算。 定点计算的速度优于浮点计算。 定点计算中还有很多问题需要明确: 定点计算和浮点计算哪个精度高? 定点计算所需的字长如何确定? 目录 计算机中数的表示 定点计算方法 数字控制中的字长 差分方程系数字长 一个实例 计算机中数的表示 计算机中数的表示 计算机中数的表示 用补码表示正负数 计算机中数的表示 确定小数点位置表示小数 计算机中数的表示 有正负的小数——定点表示法 定点数的精度 定点数的问题 加减法计算需要对位 乘除法会改变整数和小数的长度,从而改变了小数点的位置。 浮点数的格式 浮点数的精度 相同字长定点数与浮点数的比较 定点计算方法 采用定点计算的理由 提高计算速度,减少计算延时 提高计算精度,减少由截断误差带来的噪声 缩短代码长度,避免使用浮点库 定点计算方法 在数字逻辑电路和计算机中,用逻辑电平表示数,除浮点数外,并没有明确指出小数点的位置。 在整数计算中,默认小数点在LSB的右侧。 在有小数的定点计算中,默认的小数点位置可以变化,在编程时决定。 这意味着同样的逻辑状态组合可以对应不同的数: AX=1234H 小数点在D0后面:0001 0010 0011 0100B=1234H 小数点在D1后面:000 1001 0001 1010.0B=091A.0H 定点数的加减法 设AX和BX为16-bit寄存器,小数点定位于D4之后,则: 定点加法:AX+BX 定点减法:AX-BX 定点数的加减法 如果2数的小数点定位不同: 设AX和BX为16-bit寄存器,AX小数点定位于D4之后, BX小数点定位于D8之后,则运算前需要先对位: AX左移,导致在高位截断,造成计算错误 BX右移,导致低位截断,造成截断误差,但不会造成错误 因此通常选择将小数点在高位的数右移,截断小数部分 对位带来的问题 在小数部分截断会形成截断误差 数字控制系统中截断误差可能会造成严重错误 有符号数的移位 必须采用符号位扩展右移,才能保持符号不变 定点数的乘法 设AX和BX为16-bit寄存器,AX小数点定位于D4之后, BX小数点定位于D8之后,则相乘以后: 乘积的总位数为32 积的整数部分为12+8=20位 小数部分为4+8=12位 特例:定点数与整数相乘,小数点的位置不变 问题: 如果不截断,则需要32位字长来存储结果 如果截断,可能会损失精度 举例: 0.1H*0.01H=0.001H, 截断尾数后,结果为0 定点数的乘加 乘加是数字控制、FFT和FIR等算法中最常见的计算 设AX,BX,CX为16-bit寄存器,小数点定位于D4之后, 则加乘以后: AX*BX+CX AX*BX的乘积为32位,小数点后有8位,与CX相加之前需要对位。 定点数的除法 设AX为16-bit寄存器,AX小数点定位于D4之后, 如果不截断,则: AX除以2N后,小数部分延长N位,整数部分缩短N位。 AX除以2-N后,小数部分缩短N位,整数部分延长N位。 有符号数与无符号数运算的差别 对于乘除法运算,有符号数和无符号数需要采用不同的电路实现。 举例: 无符号数:0FFH*0FFH=0FE01H 有符号数:0FFH*0FFH=1 二者对同样的数进行计算,但应该得到不同的结果,因此需要各自不同的电路。 有符号数和无符号数之间的转换 无符号数转有符号数 无符号数总是非负的,可以直接赋值给有符号变量 如果想要其负数,可以先转换成正的有符号数,然后与零相减。 有符号变量的位数最好比无符号变量多1位。 有符号数转无符号数(等同于取绝对值) 需要采用绝对值函数ABS。 或者编写if – else 程序转换。 将最高位置零是不对的,负数会得到错误的结果。 数字控制算法中字长的确定 PI控制器计算字长 小数点定位的方法 定位的原则:保持ADC、DPWM的增益为1 控制算法部分的增益保持不变 举例: 设ADC的分辨率为12-bit 输入电压范围为0~1V 则小数点位于MSB之前: 0.1111 1111 1111B=1-2-12=0.999755859375 设ADC分辨率为12-bit 输入电压范围:0~5V 则定位为: 0.1111 1111 1111B *5 =100.1111 1111 1011B=4.998779296875 (=4095*5/4096) 双极性ADC 设ADC分辨率为12-bit 输入电压范围:-5~5V 假设ADC采用偏移码:0--5V,4095-5V 则转换为补码: AX为16位寄存器,存放ADC转换值 转换为补码:AX=AX-2048 5V对应2047,
文档评论(0)