定点算术是指如何对有符号或无符号的二进制字进行运算。定点算术函数(如加减法)的简单性允许低成本的硬件实现。
gydF4y2Ba下面的部分描述了Simulink金宝app<年代up>®当对输入和参数进行算术运算时,软件紧随其后。这些规则根据所涉及的操作被组织成四组:加减、乘法、除法和移位。对于这四组中的每一组,执行指定操作的规则都通过使用这些规则的示例给出。
<年代ect我on我te米prop="content">许多处理器的核心架构包含几个计算单元,包括<一个cl一个年代年代="indexterm" name="d123e51915">算术逻辑单元(alu)<一个cl一个年代年代="indexterm" name="d123e51918">乘法和累积单位(mac),<一个cl一个年代年代="indexterm" name="d123e51923">和换档器。这些计算单元直接处理二进制数据,并为不同精度的算术计算提供支持。金宝appALU执行一组标准的算术和逻辑运算以及除法。MAC执行乘、乘/加、乘/减操作。移位器执行逻辑和算术移位、规格化、反规格化和其他操作。
年代ect我on>加法是处理器执行的最常见的算术运算。当两个n位的数字相加时,由于最左边的数字进位,总是可能产生n + 1个非零数字的结果。对于2的两个数的补加法,有三种情况需要考虑:
如果两个数字都是正数,并且它们相加的结果有一个符号位为1,那么就发生了溢出;否则,结果是正确的。
如果两个数字都为负,结果的符号为0,则发生溢出;否则,结果是正确的。
如果数字的符号不同,则不会发生溢出,并且结果总是正确的。
考虑两个数字的和。理想情况下,现实世界的值遵循这个等式
在哪里<年代p一个ncl一个年代年代="inlineequation">V<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">V<年代ub>c年代pan>输入值和<年代p一个ncl一个年代年代="inlineequation">V<年代ub>一个年代ub>年代pan>是输出值。为了了解求和是如何实际实现的,三个理想值应该被中描述的通用[Slope Bias]编码方案所取代<一个href="//www.tatmou.com/help/fixedpoint/ug/scaling.html" class="a">扩展一个>:
方程<一个href="//www.tatmou.com/help/fixedpoint/ug/recommendations-for-arithmetic-and-scaling.html" class="a">除了一个>给出所存储整数的结果方程的解,<年代p一个ncl一个年代年代="inlineequation">问<年代ub>一个年代ub>年代pan>.用简写法,这个方程就变成了
在哪里<年代p一个ncl一个年代年代="inlineequation">F<年代ub>某人年代ub>年代pan>而且<年代p一个ncl一个年代年代="inlineequation">F<年代ub>年代c年代pan>调整后的分数斜率和<年代p一个ncl一个年代年代="inlineequation">B<年代ub>网年代ub>年代pan>是净偏差。下面将讨论离线转换和在线转换及操作。
<一个cl一个年代年代="indexterm" name="d123e52012">脱机转换。年代trong><年代p一个n class="inlineequation">F<年代ub>某人年代ub>年代pan>,<年代p一个ncl一个年代年代="inlineequation">F<年代ub>年代c年代pan>,<年代p一个ncl一个年代年代="inlineequation">B<年代ub>网年代ub>年代pan>使用四舍五入和饱和度离线计算。此外,<年代p一个ncl一个年代年代="inlineequation">B<年代ub>网年代ub>年代pan>使用输出数据类型存储。
<一个cl一个年代年代="indexterm" name="d123e52042">在线转换和操作。年代trong>其余的操作由定点处理器在线执行,并依赖于输入和输出数据类型的斜率和偏差。最糟糕(最低效)的情况发生在斜率和偏差不匹配的时候。最坏情况的转换和操作由以下步骤给出:
的初始值。<年代p一个ncl一个年代年代="inlineequation">问<年代ub>一个年代ub>年代pan>是由净偏差给出的,<年代p一个ncl一个年代年代="inlineequation">B<年代ub>网年代ub>年代pan>:
第一个输入整数值,<年代p一个ncl一个年代年代="inlineequation">问<年代ub>b年代pan>,乘以调整后的斜率,<年代p一个ncl一个年代年代="inlineequation">F<年代ub>某人年代ub>年代pan>:
前面的乘积被转换为修改后的输出数据类型,其中斜率为1,偏差为0:
这种转换包括任何必要的位移位、舍入或溢出处理。
求和运算执行如下:
这个总和包括任何必要的溢出处理。
对于要求和的每个数字,重复步骤2到4。
需要注意的是,位移位、舍入和溢出处理应用于中间步骤(3和4),而不是应用于整体和。
gydF4y2Ba有关更多信息,请参见<一个href="//www.tatmou.com/help/fixedpoint/ug/the-summation-process.html" class="a">求和过程一个>.
年代ect我on>如果输入和输出信号的缩放匹配,求和操作的数量从最坏(最低效)的情况减少。例如,当输入的分数斜率与输出的分数斜率相同时,第2步就可以减少为1的乘法,并且可以消去。在模拟和代码生成过程中,求和过程中的琐碎步骤都被消除了。仅对输入信号和输出信号使用二进制点缩放是消除不匹配的斜率和偏差的常用方法,并导致最有效的模拟和生成的代码<一个cl一个年代年代="indexterm" name="d123e52113">
n位二进制数与m位二进制数相乘的结果是有符号字和无符号字的长度都不超过m + n位。大多数处理器执行n位乘n位,并产生2n位的结果(双位)。<一个cl一个年代年代="indexterm" name="d123e52124">假设不存在溢流条件。
<年代ect我on我te米prop="content">考虑两个数字的乘法。理想情况下,现实世界的值遵循这个等式
在哪里<年代p一个ncl一个年代年代="inlineequation">V<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">V<年代ub>c年代pan>输入值和<年代p一个ncl一个年代年代="inlineequation">V<年代ub>一个年代ub>年代pan>是输出值。要了解乘法是如何实际实现的,应将三个理想值替换为中描述的通用[斜率偏置]编码方案<一个href="//www.tatmou.com/help/fixedpoint/ug/scaling.html" class="a">扩展一个>:
输出存储整数的结果方程的解,<年代p一个ncl一个年代年代="inlineequation">问<年代ub>一个年代ub>年代pan>,则如下:
带有非零偏差和不匹配分数斜率的乘法。年代trong>当输入和输出信号的斜率和偏差不匹配时,上述方程的最坏情况发生。在这种情况下,需要几个低级的整数运算来执行高级的乘法(或除法)。对这些低级计算所做的实现选择可能会影响计算效率、舍入错误和溢出。
gydF4y2Ba在Si金宝appmulink块中,实际的乘法或除法运算总是在零偏差的定点变量上执行。如果输入具有非零偏差,则在操作之前将其转换为仅具有二进制点缩放的表示形式。如果结果具有非零偏差,则首先使用仅具有二进制点缩放的临时变量执行该操作。然后将结果转换为最终输出的数据类型和缩放。
gydF4y2Ba如果输入和输出都有非零偏差,则操作分解如下:
在哪里
这些方程表明临时变量只有二进制点的比例。然而,这些方程并不表示这些变量的显著性、字长或固定指数的值。Simu金宝applink软件根据以下目标将这些属性分配给临时变量:
表示原始值而不溢出。
gydF4y2Ba原始值的数据类型和缩放定义了真实值的最大值和最小值:
临时值的数据类型和缩放必须能够在不溢出的情况下表示此范围。精度损失是可能的,但溢出是不允许的。
使用能导致高效操作的数据类型。
gydF4y2Ba这个目标相对于您将用于设计的生产部署的目标。例如,假设您将在提供32位处理器的16位定点处理器上实现该设计
保持精度。
gydF4y2Ba理想情况下,由原始数据类型和缩放定义的每个可能值都由临时变量完美地表示。然而,这可能需要比效率更多的比特。比特被丢弃,导致精度损失,以保持效率所需的程度。
例如,考虑以下情况,假设目标是16位微处理器:
在哪里<年代p一个ncl一个年代年代="inlineequation">问<年代ub>原始年代ub>年代pan>是8位无符号数据类型。对于此数据类型,
所以
可能的最小值为负,因此临时变量必须是有符号整型数据类型。原始变量的斜率为1,但偏差在二进制点后用两位数字表示,精度更高。为了获得完全的精度,临时变量的固定指数必须为-2或更小。Simu金宝applink软件选择尽可能低的精度,这通常是最有效的,除非出现溢出问题。对于2的缩放<年代up>-2年代up>,选择signed 16位或signed 32位可以避免溢出。为了提高效率,Simulink软件选择了金宝app16位中较小的选项。如果原始变量是输入,则转换为临时变量的方程为
零偏差和不匹配分数斜率的乘法。年代trong>当偏差为零且分数斜率不匹配时,实现减少为
离线<一个cl一个年代年代="indexterm" name="d123e52275">转换年代trong>
的数量
使用四舍五入和饱和度离线计算。<年代p一个ncl一个年代年代="inlineequation">F<年代ub>网年代ub>年代pan>是否使用窗体的定点数据类型进行存储
在哪里<年代p一个ncl一个年代年代="inlineequation">E<年代ub>网年代ub>年代pan>而且<年代p一个ncl一个年代年代="inlineequation">问<年代ub>网年代ub>年代pan>自动选择最好的代表<年代p一个ncl一个年代年代="inlineequation">F<年代ub>网年代ub>年代pan>.
<年代trong class="emphasis bold">在线转换和操作<一个cl一个年代年代="indexterm" name="d123e52319">
整数值<年代p一个ncl一个年代年代="inlineequation">问<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">问<年代ub>c年代pan>增加:
为保持产品的全精度,二进位点<年代p一个ncl一个年代年代="inlineequation">问<年代ub>R一个wProduct年代pan>是由两个点的和给出的<年代p一个ncl一个年代年代="inlineequation">问<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">问<年代ub>c年代pan>.
前面的产品被转换为输出数据类型:
这种转换包括任何必要的位移位、舍入或溢出处理。<一个href="//www.tatmou.com/help/fixedpoint/ug/parameter-and-signal-conversions.html" class="a">信号转换一个>讨论了转换。
乘法
执行。
前面的产品被转换为输出数据类型:
这种转换包括任何必要的位移位、舍入或溢出处理。<一个href="//www.tatmou.com/help/fixedpoint/ug/parameter-and-signal-conversions.html" class="a">信号转换一个>讨论了转换。
步骤1到4重复每一个额外的数字相乘。
零偏差乘法和匹配分数斜率。年代trong>当偏差为零且分数斜率匹配时,实现减少为
离线<一个cl一个年代年代="indexterm" name="d123e52405">转换年代trong>
不执行脱机转换。
<年代trong class="emphasis bold">在线转换和操作年代trong><一个cl一个年代s="indexterm" name="d123e52413">
整数值<年代p一个ncl一个年代年代="inlineequation">问<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">问<年代ub>c年代pan>增加:
为保持产品的全精度,二进位点<年代p一个ncl一个年代年代="inlineequation">问<年代ub>R一个wProduct年代pan>是由两个点的和给出的<年代p一个ncl一个年代年代="inlineequation">问<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">问<年代ub>c年代pan>.
前面的产品被转换为输出数据类型:
这种转换包括任何必要的位移位、舍入或溢出处理。<一个href="//www.tatmou.com/help/fixedpoint/ug/parameter-and-signal-conversions.html" class="a">信号转换一个>讨论了转换。
步骤1和步骤2重复每一个额外的数字相乘。
有关更多信息,请参见<一个href="//www.tatmou.com/help/fixedpoint/ug/the-multiplication-process.html" class="a">乘法运算一个>.
年代ect我on>本节讨论零偏差量的划分。
请注意年代trong>
当除法计算的任何输入具有非零偏差时,所执行的操作与中描述的乘法操作完全匹配<一个href="//www.tatmou.com/help/fixedpoint/ug/rules-for-arithmetic-operations.html" class="intrnllnk">带有非零偏差和不匹配分数斜率的乘法一个>.
考虑两个数字的除法。理想情况下,现实世界的值遵循这个等式
在哪里<年代p一个ncl一个年代年代="inlineequation">V<年代ub>b年代pan>而且<年代p一个ncl一个年代年代="inlineequation">V<年代ub>c年代pan>输入值和<年代p一个ncl一个年代年代="inlineequation">V<年代ub>一个年代ub>年代pan>是输出值。为了了解划分是如何实际实现的,应将三个理想值替换为中描述的通用[Slope Bias]编码方案<一个href="//www.tatmou.com/help/fixedpoint/ug/scaling.html" class="a">扩展一个>:
对于斜率调整因子为1且所有信号的偏差为0的情况,输出存储整数的结果方程的解,<年代p一个ncl一个年代年代="emphasis">问年代p一个n><年代ub>一个年代ub>,由下式给出:
这个方程包含一个整数除法和一些位移位。如果<年代p一个ncl一个年代年代="inlineequation">E<年代ub>一个年代ub>>
gydF4y2Ba一般来说,值的分割是在定点嵌入式系统中应该避免的操作。输出比整数除法精度更高的除法(即:<年代p一个ncl一个年代年代="inlineequation">E<年代ub>一个年代ub><
gydF4y2Ba有关更多信息,请参见<一个href="//www.tatmou.com/help/fixedpoint/ug/the-division-process.html" class="a">除法过程一个>.
年代ect我on>几乎所有的微处理器和数字信号处理器都支持定义良好金宝app<年代p一个ncl一个年代年代="emphasis">移位年代p一个n>(或者只是<年代p一个ncl一个年代年代="emphasis">转变年代p一个n>)整数的运算。例如,考虑8位无符号整数00110101。左移2位和右移2位的结果如下表所示。
移位操作 | 二进制值 | 十进制值 |
---|---|---|
无移位(原数字) | 00110101 | 53 |
左移2位 | 11010100 | 212 |
右移2位 | 00001101 | 13 |
您可以使用Simulink执行移位金宝app<一个href="//www.tatmou.com/help/simulink/slref/shiftarithmetic.html">移位运算年代p一个n>一个>块。使用此块执行位移位,二进制点移位,或两者兼有
<年代ect我on我te米prop="content">向右移动位的特殊情况需要考虑最左边位的处理,它可以包含符号信息。向右移动也可以被归为<年代p一个ncl一个年代年代="emphasis">逻辑年代p一个n>转变<一个cl一个年代年代="indexterm" name="d123e52645">对的还是<年代p一个ncl一个年代年代="emphasis">算术年代p一个n>转变<一个cl一个年代年代="indexterm" name="d123e52650">正确的。对于逻辑右移,每次位移的最有效位都包含一个0。对于算术右移,每次移位都循环使用最高位。
gydF4y2BaShift算术块执行向右的算术移位,因此,对于每一位右移,循环使用最有效的位。例如,给定定点数字11001.011(-6.625),在二进制点不变的情况下向右移动两位将得到数字11110.010(-1.75),如下图所示:
若要使用shift算术块对有符号数执行逻辑右移,请使用<一个href="//www.tatmou.com/help/simulink/slref/datatypeconversion.html">数据类型转换年代p一个n>一个>块将该数转换为长度和缩放相等的无符号数。这个模型显示定点符号数11001.001(-6.625)变成了00110.010(6.25)。