Sum
输入信号的加减运算

库:
Simulink /
Commonly Used Blocks
Simulink /
Math Operations
HDL Coder /
Commonly Used Blocks
HDL Coder /
Math Operations
Sum 模块的替代配置:
Add | Subtract | Sum of Elements
描述
Sum 模块对输入信号执行加减运算。Add、Subtract、Sum of Elements 和 Sum 模块是同一模块的替代配置。此模块可对标量、向量或矩阵输入执行加减运算。它还可以缩减信号的元素并执行求和。
您可以使用符号列表参数以及加号 (+
)、减号 (-
) 和分隔符 (|
) 指定模块的运算。
+
和-
字符的个数等于输入的个数。例如,+-+
需要三个输入。模块从第一个(顶部)输入信号中减去第二个(中间)输入信号,然后加上第三个(底部)输入信号。分隔符在模块图标上的端口之间产生额外空间。
如果仅执行加法,则可以使用一个与输入个数相等的数值。
如果只有一个输入端口,则一个
+
或-
会在所有维度上或在指定的维度中加上或减去元素。
Sum 模块首先将输入数据类型转换为其累加器数据类型,然后执行指定的运算。最后,模块使用指定的舍入和溢出模式,将计算结果转换为输出数据类型。
模块输出的计算
Sum 模块的输出计算取决于模块输入的个数和输入端口的符号。
Sum 模块的输入端口的数量 | 输入端口符号 | 模块输出计算公式 | 输出公式变量 |
---|---|---|---|
一个输入端口 | 输入端口符号为 + 号 |
y = e[0] + e[1] + e[2] ... + e[m] |
|
输入端口符号为 – 号 |
y = 0.0 – e[0] – e[1] – e[2] ... – e[m] | ||
两个或更多输入端口 | 所有输入端口符号均为 – 号 |
y = 0.0 – u[0] – u[1] – u[2] ... – u[n] |
|
第k 个输入端口是第一个符号为 + 号的端口 |
y = u[k] – u[0] – u[1] – u[2] – u[k–1] (+/–) u[k+1] ... (+/–) u[n] |
示例
此示例说明 Sum 模块如何对输入进行重新排序。如果您使用 -
符号作为第一项运算,模块将对输入进行重新排序(如果可能),以使用 +
运算。例如,在表达式 output = -a-b+c
中,Sum 模块对输入进行重新排序,使得 output = c-a-b
。为了初始化累加器,Sum 模块使用第一个 +
输入端口。
该模块避免对第一个操作数 a
执行一元减法运算,因为这样做会更改定点数据类型的 a
的值。在这种情况下,输出值不同于 a
、b
和 c
的值的累加结果。
两个常量输入都使用 int8
数据类型。Sum 模块还将 int8
用于累加器和输出数据类型,并启用对整数溢出进行饱和处理。Sum 模块对输入进行重新排序,以得到 127
的理想结果。
将输入从
(-Input1 + Input2)
重新排序为(Input2 - Input1)
。使用第一个
+
输入端口初始化累加器。Accumulator = int8(-1) = -1
继续累加值。
Accumulator = Accumulator - int8(-128) = 127
计算模块输出。
Output = int8(127) = 127
如果 Sum 模块没有对输入进行重新排序,则您将得到 126
的非理想结果。
使用第一个输入端口初始化累加器。
Accumulator = int8(-(-128)) = 127
由于饱和是打开的,累加器的初始值在
127
处饱和并且不绕回。继续累加值。
Accumulator = Accumulator + int8(-1) = 126
计算模块输出。
Output = int8(126) = 126
要为 output = -a-b+c
显式指定一元减法运算,可以使用 Math Operations 库中的 Unary Minus 模块。
端口
输入
输入可以具有不同的数据类型,除非您选中了要求所有输入具有相同的数据类型。
用于加法或减法运算的输入信号。如果只有一个输入信号,则对所有维度或指定维度中的元素执行加法或减法。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| Boolean
| fixed point
运算的第 n 个输入信号。输入的个数与符号列表参数中的符号个数相匹配。模块按照列出的顺序将运算应用于输入。您还可以使用一个与输入端口个数相等的数值作为符号列表参数。模块创建输入端口并将加法应用于所有输入。例如,如果为符号列表参数赋值 5
,则模块创建 5
个输入端口并将它们相加以产生输出。
所有的非标量输入信号必须具有相同的维度。标量输入将扩展为与其他输入具有相同的维度。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| Boolean
| fixed point
输出
加法和/或减法运算产生的输出信号。输出信号具有与输入信号相同的维度。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| Boolean
| fixed point
参数
常设
将模块的图标形状指定为矩形或圆形。
默认值取决于模块配置。
舍入默认值 - Sum 模块
矩形默认值 - Add、Subtract 和 Sum of Element 模块
对于矩形模块,第一个输入端口是顶部端口。对于一个圆形 Sum 模块,第一个输入端口最接近 12 点钟位置,按逆时针方向围绕模块。类似地,其他输入端口也按逆时针方向围绕模块。
编程用法
模块参数:IconShape |
类型:字符向量 |
值:'rectangular' | 'round' |
输入对输入信号执行的加法和减法运算。为每个运算创建一个输入端口。分隔符 (|
) 在模块图标上的输入端口之间产生额外空间。加法是默认运算。如果您只想将输入信号相加,请键入输入端口的个数。各项运算按所列顺序执行。
默认值取决于模块配置。
|++
默认值 - Sum 模块++
默认值 - Add 模块+-
默认值 - Subtract 模块+
默认值 - Sum of Element 模块
当您仅输入一个符号时,模块会启用应用于参数。对于一个向量输入,+
或 -
会在所有维度上或在指定的维度中加上或减去元素。
提示
您可以通过在符号列表参数中的符号之间插入分隔符 (|
) 来控制输入端口在模块上的位置。例如,“++|--
”将在第二个和第三个输入端口之间留出额外空间。
编程用法
模块参数:Inputs |
类型:字符向量 |
值:'+' | '-' | | | 整数 |
指定如何沿指定维度应用函数。
所有维度 - 对所有维度的所有输入值应用函数。
例如,在此模型中,符号列表设置为
+
,应用于设置为所有维度。该模块返回所有维度的所有输入值的总和。选择配置参数使用针对行优先数组布局优化的算法时,软件为仿真启用行优先算法。要生成行优先代码,请将配置参数数组布局 (Simulink Coder)设置为行优先,并选择使用针对行优先数组布局优化的算法。列优先算法和行优先算法仅在求和顺序上不同。在某些情况下,由于对同一数据集的运算顺序不同,列优先算法和行优先算法的输出可能存在微小的数值差异。
指定维度 - 对指定维度的所有输入值应用函数。
依赖关系
要启用此参数,请在符号列表参数中仅输入一个符号。
编程用法
模块参数:CollapseMode |
类型:字符向量 |
值:'All dimensions' | 'Specified dimension' |
默认值:'All dimensions' |
将沿其应用求和的维度指定为正整数。
模块遵循的求和规则与 MATLAB® 中的 sum
函数相同。有关详细信息,请参阅算法。
例如,在此模型中,符号列表设置为 +
,应用于设置为指定的维度,维度设置为 2
。该模块返回每行的输入值的总和。
如果指定的维度大于输入的维度,则会显示错误消息。
依赖关系
要启用此参数,请将应用于设置为指定的维度。
编程用法
模块参数:CollapseDim |
类型:字符向量 |
值:整数 |
默认值:'1' |
指定采样时间间隔。要继承采样时间,请将此参数设置为 -1
。有关详细信息,请参阅指定采样时间。
依赖关系
仅当您将此参数设置为 -1
以外的值时才可见。要了解详细信息,请参阅不建议设置采样时间的模块。
编程用法
要以编程方式设置模块参数值,请使用 set_param
函数。
参数: | SampleTime |
值: | "-1" (默认) | scalar or vector in quotes |
信号属性
数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 。有关详细信息,请参阅使用数据类型助手指定数据类型。
软件检查的输出范围的下限值。
软件使用最小值执行下列操作:
某些模块的参数范围检查(请参阅指定模块参数的最小值和最大值)。
定点数据类型的自动定标。
从模型生成的代码的优化。此优化可删除算法代码,并影响某些仿真模式(如 SIL 或外部模式)的结果。有关详细信息,请参阅Optimize using the specified minimum and maximum values (Embedded Coder)。
提示
输出最小值不会对实际输出信号进行饱和处理或截断。请改用 Saturation 模块。
编程用法
要以编程方式设置模块参数值,请使用 set_param
函数。
参数: | OutMin |
值: | '[]' (默认) | scalar in quotes |
软件检查的输出范围的上限值。
软件使用最大值执行下列操作:
某些模块的参数范围检查(请参阅指定模块参数的最小值和最大值)。
定点数据类型的自动定标。
从模型生成的代码的优化。此优化可删除算法代码,并影响某些仿真模式(如 SIL 或外部模式)的结果。有关详细信息,请参阅Optimize using the specified minimum and maximum values (Embedded Coder)。
提示
输出最大值不会对实际输出信号进行饱和处理或截断。请改用 Saturation 模块。
编程用法
要以编程方式设置模块参数值,请使用 set_param
函数。
参数: | OutMax |
值: | '[]' (默认) | scalar in quotes |
为输出选择数据类型。该类型可以继承、直接指定或表示为数据类型对象,如 Simulink.NumericType
对象。
当您选择继承的选项时,模块的行为如下所示:
继承:从内部规则继承 - 软件在考虑嵌入式目标硬件的属性的同时,会选择相应的数据类型来平衡数值准确性、性能和生成的代码大小。
注意
累加器内部规则的优点是数值更准确,而代价可能是生成的代码效率低下。要获取相同的输出精度,请将输出数据类型设置为 Inherit: Inherit same as accumulator。
注意
当输入是小于单精度的浮点数据类型时,继承: 从内部规则继承输出数据类型取决于 Inherit floating-point output type smaller than single precision 配置参数的设置。当对数据类型进行编码所需的位数小于对单精度数据类型编码所需的 32 位时,数据类型小于单精度。例如,
half
和int16
小于单精度。继承:保留 MSB - 软件选择一种能够保持运算的完整范围的数据类型,然后将输出精度降低到适合嵌入式目标硬件的大小。
提示
要获得更高效的生成代码,请将累加器数据类型设置为继承:通过内部规则继承,并清除对整数溢出进行饱和处理。
此规则从不产生溢出。
继承:保留 LSB - 软件选择一种保持运算精度的数据类型,但如果完整类型不适合嵌入式目标硬件,则会缩小范围。
提示
要获得更高效的生成代码,请将累加器数据类型设置为继承:通过内部规则继承,并清除对整数溢出进行饱和处理。
此规则可能产生溢出。
如果更改了嵌入式目标的设置,则依这些内部规则选择的数据类型可能会发生变化。有时软件不能同时满足优化代码效率和保证数值准确性这两个需求。如果这些规则不能满足您对数值准确性或性能的特定需求,请使用下列选项之一:
显式指定输出数据类型。
使用简单的选项继承: 与第一个输入相同。
显式指定默认数据类型(例如
fixdt(1,32,16)
),然后使用定点工具为您的模型提供数据类型建议。有关详细信息,请参阅fxptdlg
(Fixed-Point Designer)。要指定您自己的继承规则,请使用继承: 通过反向传播继承,然后使用 Data Type Propagation 模块。有关如何使用此模块的示例说明,请参阅 Signal Attributes 模块库中的 Data Type Propagation Examples 模块。
继承: 通过反向传播继承 - 使用驱动模块的数据类型。
继承: 与第一个输入相同 - 使用第一个输入信号的数据类型。
继承: Inherit same as accumulator - 使用累加器的数据类型。
编程用法
模块参数:OutDataTypeStr |
类型:字符向量 |
值:'Inherit: Inherit via internal rule | 'Inherit: Keep MSB' | 'Inherit: Keep LSB' | 'Inherit: Inherit via back propagation' | 'Inherit: Same as first input' | 'Inherit: Same as accumulator' | 'double' | 'single' | 'half' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' |'fixdt(1,16)' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)' | '<data type expression>' |
默认值:'Inherit: Inherit via internal rule' |
选择累加器的数据类型。该类型可以继承、直接指定或表示为数据类型对象,如 Simulink.NumericType
。如果您选择 继承: 从内部规则继承,Simulink® 在考虑嵌入式目标硬件的属性的同时,会选择相应的数据类型来平衡数值准确性、性能和生成的代码大小。
编程用法
模块参数: AccumDataTypeStr |
类型:字符向量 |
值:'Inherit: Inherit via internal rule' | 'Inherit: Same as first input' | 'double' | 'single' | 'half' | 'int8' | 'uint8' | 'int16' | 'uint16' , 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16)' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)' | '<data type expression>' |
默认值:'Inherit: Inherit via internal rule' |
指定输入信号是否必须全部具有相同的数据类型。如果启用此参数,则在输入信号类型不同时,仿真过程中会发生错误。
编程用法
模块参数:InputSameDT |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
选择此选项可锁定数据类型设置,防止使用定点工具和定点顾问进行更改。有关详细信息,请参阅Lock the Output Data Type Setting (Fixed-Point Designer)。
编程用法
模块参数:LockScale |
值:'off' | 'on' |
默认值:'off' |
指定对溢出是进行饱和处理还是绕回处理。
on
- 将溢出饱和处理为数据类型能够表示的最小值或最大值。off
- 溢出将绕回到数据类型可以表示的合适值。
例如,有符号 8 位整数 int8
可以表示的最大值是 127。任何大于此最大值的模块运算结果都会导致 8 位整数溢出。
选择此参数后,模块输出将在达到 127 时饱和。类似地,模块输出将在达到最小输出值 -128 时饱和。
清除此参数后,软件会将导致溢出的值解释为
int8
,这可能产生意外结果。例如,以int8
表示的模块结果 130(二进制 1000 0010)为 -126。
提示
如果您的模型存在可能的溢出,而您希望在生成的代码中进行显式饱和保护,请考虑选中此参数。
如果您希望优化生成的代码的效率,请考虑清除此参数。清除此参数还可以帮助您避免过度地指定信号超出范围时模块的处理方式。有关详细信息,请参阅信号范围错误故障排除。
如果选中此参数,饱和将应用于模块中的每个内部操作,而不仅仅应用于输出或结果。
一般情况下,代码生成进程可以检测到何时不可能发生溢出。在这种情况下,代码生成器不会生成饱和代码。
编程用法
要以编程方式设置模块参数值,请使用 set_param
函数。
参数: | SaturateOnIntegerOverflow |
值: | 'off' (默认) | 'on' |
模块特性
数据类型 |
|
直接馈通 |
|
多维信号 |
|
可变大小信号 |
|
过零检测 |
|
替代配置
Add 模块将图标形状设置为矩形,并将符号列表设置为 ++
。
库:
Simulink /
Math Operations
HDL Coder /
HDL Floating Point Operations
HDL Coder /
Math Operations
Subtract 模块将图标形状设置为矩形,并将符号列表设置为 +-
。
库:
Simulink /
Math Operations
HDL Coder /
HDL Floating Point Operations
HDL Coder /
Math Operations
Sum of Elements 模块将图标形状设置为矩形,并将符号列表设置为 +
。
库:
Simulink /
Math Operations
HDL Coder /
HDL Floating Point Operations
HDL Coder /
Math Operations
算法
模块遵循的求和规则与 MATLAB 中的 sum
函数相同。
假设您有一个 2×3 矩阵 U。
如果将维度设置为
1
,则输出 Y 的计算公式如下:如果将维度设置为
2
,则输出 Y 的计算公式如下:
扩展功能
C/C++ 代码生成
使用 Simulink® Coder™ 生成 C 代码和 C++ 代码。
HDL Coder™ 提供影响 HDL 实现和综合逻辑的额外配置选项。
默认的线性架构为 N 个输入生成包含 N 个运算(加法器)的运算链。
对于 Sum of Elements 模块,HDL Coder 支持对单个向量输入具有多个元素的 Sum of Elements 模块使用树架构。
此模块具有多周期实现,这会在生成的代码中引入额外的延迟。要查看增加的延迟,请查看生成的模型或验证模型。请参阅Generated Model and Validation Model (HDL Coder)。
架构 | 额外的延迟周期 | 描述 |
---|---|---|
线性 | 0 | 生成线性加法器链来计算乘积之和。 对于具有不同位宽的多个输入,Linear 架构会对加法器进行多级实现并用流水线串联各级,以优化资源利用率。每级的输出是根据该级的输入宽度来计算的。 |
树 | 0 | 生成加法器树形结构来计算乘积之和。 |
注意
要使用“HDL 模块属性”对话框的原生浮点选项卡中的 LatencyStrategy 设置,请指定线性或树作为 HDL 架构。
通用 | |
---|---|
ConstrainedOutputPipeline | 通过移动设计中现有延迟的方式来放置在输出端的寄存器的数量。分布式流水线不会重新分发这些寄存器。默认值为 |
InputPipeline | 要在生成的代码中插入的输入流水线阶段数。分布式流水线和受限输出流水线可以移动这些寄存器。默认值为 |
OutputPipeline | 要在生成的代码中插入的输出流水线阶段数。分布式流水线和受限输出流水线可以移动这些寄存器。默认值为 |
注意
Sum of Elements 模块不支持原生浮点模式下双精度数据类型的 HDL 代码生成。
原生浮点 | |
---|---|
LatencyStrategy | 指定对于浮点运算符是否将设计中的模块映射到 |
NFPCustomLatency | 要指定值,请将 LatencyStrategy 设置为 |
默认的线性实现支持复数数据。
树实现支持符号列表模块参数为 +
的复数数据。借助原生浮点支持,树实现支持符号列表为 +
和 -
的复数数据。
要为混合使用标量和向量输入的多输入 Sum 模块生成 HDL 代码,您必须在 Sum 模块的前两个输入之一上指定向量输入。
PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。
定点转换
使用 Fixed-Point Designer™ 设计和仿真定点系统。
版本历史记录
在 R2006a 之前推出当您为符号列表仅输入一个符号时,模块会启用应用于参数。对于一个向量输入,+
或 -
会在所有维度上或在指定的维度中加上或减去元素。
为了更好地反映支持的行为,求和维度参数现在更名为应用于。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)