n-D Lookup Table
逼近 N 维函数
![](lookup_nd_block_icon.png)
库:
Simulink /
Lookup Tables
HDL Coder /
Lookup Tables
描述
支持的模块运算
1-D、2-D 和 n-D Lookup Table 模块计算一个函数的 N 变量采样表示
其中函数 F 可以是经验函数。此模块通过查找或插入您使用模块参数定义的值表,将输入映射到输出值。该模块支持均一(常量)、线性(线性点-斜率)、拉格朗日(线性拉格朗日)、最近、三次样条和 Akima 样条插值方法。您可以将这些方法应用于从 1 维到 30 维的表。
在下面的模块中,第一个输入标识第一个维度(行)断点,第二个输入标识第二个维度(列)断点,依此类推。
有关各种模块方向的端口顺序的描述,请参阅标识旋转或翻转模块上的端口位置。
设置数学和数据类型 > 使用针对行优先数组布局优化的算法配置参数后,2-D 和 n-D Lookup Table 模块行为会从列优先更改为行优先。对于这些模块,列优先算法和行优先算法可能在输出计算的顺序上有所不同,从而可能导致数值略有不同。此功能需要 Simulink® Coder™ 或 Embedded Coder® 许可证。有关行优先支持的详细信息,请参阅Code Generation of Matrices and Arrays (Simulink Coder)。
指定断点和表数据
以下模块参数定义断点和表数据。
模块参数 | 用途 |
---|---|
表维数 | 指定查找表的维数。 |
断点 | 指定与查找表的每个维度对应的断点向量。 |
表数据 | 定义关联的一组输出值。 |
提示
等间距断点可以使生成的代码无分割。有关详细信息,请参阅 fixpt_evenspace_cleanup
和Identify questionable fixed-point operations (Embedded Coder)。
模块如何生成输出
n-D、1-D 和 2-D Lookup Table 模块通过基于输入值查找或估计表值来生成输出。
模块输入 | n-D Lookup Table 模块行为 |
---|---|
与断点向量中的索引值匹配 | 输出位于行、列和更高维度断点的交点处的表值 |
与断点向量中的索引值不匹配,但在范围内 | 使用您选择的内插方法内插适当的表值 |
与断点向量中的索引值不匹配,且不在范围内 | 使用您选择的外插方法外插输出值 |
执行等效操作的其他模块
您可以将 Interpolation Using Prelookup 模块与 Prelookup 模块一起使用,以执行等效于一个 n-D Lookup Table 模块的操作。这种模块组合可以提供更大的灵活性,从而为线性插值实现更高效的仿真性能。
当查找操作是不需要插值的数组访问时,请使用 Direct Lookup Table (n-D) 模块。例如,如果您有一个整数值 k
,而您需要表的第 k
个元素 y = table(k)
,则不需要插值。
示例
扩展示例
端口
输入
u1 — 第一个维度(行)输入
标量 | 向量 | 矩阵
u1 端口的实数值输入,通过查找您定义的值表或对其进行插值来映射到输出值。
示例: 0:10
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| enumerated
| fixed point
uN — 第 n 维输入值
标量 | 向量 | 矩阵
uN 端口的实数值输入,通过查找或对您定义的值表进行插值来映射到输出值。
示例: 0:10
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| enumerated
| fixed point
T — 定义输出值的表
值组成的矩阵,其维度与表维数匹配,每个维度与表中每个维度的断点长度匹配
用运行时可调的信号指定输出值表。
在仿真期间,矩阵大小必须与表维数参数定义的维度匹配。但是,在编辑模块图的过程中,您可以输入空矩阵(指定为 []
)或者未定义的工作区变量。利用此方法,您可以推迟为表数据指定正确设置维度的矩阵,并继续编辑模块图。
依存关系
要启用此端口,请进行如下设置:
将数据设定设置为表和断点。
将表数据设置为输入端口。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| fixed point
bp1 — 显式断点值
单调递增值的 1×n 或 n×1 向量
根据断点设定参数的值,使用运行时可调的信号显式指定断点数据
如果您将断点设定设置为显式值,请在每个断点行中输入与表数据的每个维度对应的断点向量。对于每个维度,将断点指定为值严格单调递增的 1×n 或 n×1 向量。
您最多可以创建三个断点数据输入端口。对于断点 4 到 30,您只能通过对应的断点参数指定断点数据。
注意
要以等间距设定格式指定断点,请将断点设定设置为等间距,并使用断点的第一个点和间距参数。
依存关系
要启用此端口,请进行如下设置:
将数据设定设置为表和断点。
将断点设定设置为显式值。
将断点 1 设置为输入端口。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| enumerated
| fixed point
bp2 — 显式断点值
单调递增值的 1×n 或 n×1 向量
根据断点设定参数的值,使用运行时可调的信号显式指定断点数据。
如果您将断点设定设置为显式值,请在每个断点行中输入与表数据的每个维度对应的断点向量。对于每个维度,将断点指定为值严格单调递增的 1×n 或 n×1 向量。
您最多可以创建三个断点数据输入端口。对于断点 4 到 30,您只能通过对应的断点参数指定断点数据。
注意
要指定等间距断点数据,请使用断点参数。您无法通过输入端口指定等间距断点数据。
依存关系
要启用此端口,请进行如下设置:
将数据设定设置为表和断点。
将断点设定设置为显式值。
将断点 2 设置为输入端口。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| enumerated
| fixed point
bp3 — 显式断点值
单调递增值的 1×n 或 n×1 向量
根据断点设定参数的值,使用运行时可调的信号显式指定断点数据。
如果您将断点设定设置为显式值,请在每个断点行中输入与表数据的每个维度对应的断点向量。对于每个维度,将断点指定为值严格单调递增的 1×n 或 n×1 向量。
您最多可以创建三个断点数据输入端口。对于断点 4 到 30,您只能通过对应的断点参数指定断点数据。
注意
要指定等间距断点数据,请使用断点参数。您无法通过输入端口指定等间距断点数据。
依存关系
要启用此端口,请进行如下设置:
将数据设定设置为表和断点。
将断点设定设置为显式值。
将断点 3 设置为输入端口。
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| enumerated
| fixed point
输出
Port_1 — 通过查找或估算表值计算的输出
标量 | 向量 | 矩阵
通过查找或基于输入值估算表值生成的输出:
如果模块输入... | n-D Lookup Table 模块... |
---|---|
与断点向量中的索引值匹配 | 输出位于行、列和更高维度断点的交点处的表值 |
与断点向量中的索引值不匹配,但在范围内 | 使用您选择的内插方法内插适当的表值 |
与断点向量中的索引值不匹配,且不在范围内 | 使用您选择的外插方法外插输出值 |
数据类型: half
| single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| fixed point
参数
表和断点
表维数 — 查找表维度的数量
3
(默认) | 1
| 2
| 4
| ...
| 30
输入查找表的维数。此参数确定:
表的自变量数量以及模块输入的数量
要指定的断点向量数目
值 | 设置 |
---|---|
1、2、3 或 4 | 从下拉列表中选择值。 |
更高的表维数 | 直接在字段中输入正整数。 此模块支持的最大表维数为 30。 |
例如,大小为 M×N×... 的表表示维度 1 的大小是 M,维度 2 的大小是 N,依此类推。M 必须匹配第一个断点长度,N 必须匹配第二个断点长度,依此类推。
编程用法
模块参数:NumberOfTableDimensions |
类型:字符向量 |
值:'1' | '2' | '3' | '4' | ... | 30 |
默认值:'3' |
数据设定 — 表和断点的设定方法
表和断点 (默认) | 查找表对象
从列表中,选择:
表和断点 - 指定表数据和断点。选择此选项将启用以下参数:
表数据
断点设定
断点 1
断点 2
断点 3
编辑表和断点
要使用输入端口指定表和断点,请查看源参数。
查找表对象 - 使用现有查找表 (
Simulink.LookupTable
) 对象。选中此选项将启用名称字段和编辑表和断点按钮。
编程用法
模块参数:DataSpecification |
类型:字符向量 |
值:'Table and breakpoints' | 'Lookup table object' |
默认值:'Table and breakpoints' |
名称 — 查找表对象的名称
[]
(默认) | Simulink.LookupTable
对象
输入查找表 (Simulink.LookupTable
) 对象的名称。如果 Simulink.LookupTable
对象不存在,请点击操作按钮 并选择创建。新查找表对象的对应参数会自动用模块信息填充。
依存关系
要启用此参数,请将数据设定设置为查找表对象。
编程用法
模块参数:LookupTableObject |
类型:字符向量 |
值:Simulink.LookupTable 对象的名称 |
默认值:'' |
断点设定 — 断点设定的方法
显式值 (默认) | 等间距
指定是以显式断点形式还是参数形式输入数据,以生成等间距断点。
要显式指定断点数据,请将此参数设置为显式值,并在断点参数旁边的文本框中输入断点数据。
要指定参数以生成等间距断点,请将此参数设置为等间距,并为断点数据的每个维度的第一个点和间距参数输入值。模块将根据表数据计算要生成的点数。
依存关系
要启用此参数,请将数据设定设置为表和断点。
当此参数设置为等间距时,您只能通过对话框指定断点数据。
编程用法
模块参数:BreakpointsSpecification |
类型:字符向量 |
值:'Explicit values' | 'Even spacing' |
默认值:'Explicit values' |
源 — 表和断点数据的源
对话框 (默认) | 输入端口
将表和断点数据的源指定为:
对话框 - 在值参数中指定表或断点数据。
输入端口 - 通过关联的输入端口指定表或断点数据。
您最多可以创建三个断点数据输入端口。对于断点 4 到 30,您只能通过对应的断点参数指定断点数据。
注意
使用输入端口指定表或断点数据可能会因为运行时检查对仿真的模块性能产生负面影响。
依存关系
要启用此参数,请将数据设定设置为表和断点。
要启用关联的值,请将此参数设置为对话框。
要启用相关联的输入端口,请将此参数设置为输入端口。
将此参数设置为输入端口将禁用值字段,并隐藏数据类型选项卡上的对应参数。
对于任一参数,将此参数设置为输入端口都会禁用编辑表和断点按钮。
编程用法
模块参数:TableSource | BreakpointsForDimension1Source | BreakpointsForDimension2Source | BreakpointsForDimension3Source
|
类型:字符向量 |
值:Dialog | Input port |
默认值:'Dialog' |
表数据 — 定义输出值的表
reshape(repmat([4 5 6;16 19 20;10 18 23],1,2),[3,3,2])
(默认) | 值组成的矩阵,其维度与表维数匹配
在相关联的值字段中输入输出值的表。
在仿真期间,矩阵大小必须与表维数参数定义的维度匹配。但是,在编辑模块图的过程中,您可以输入空矩阵(指定为 []
)或者未定义的工作区变量。利用此方法,您可以推迟为表数据指定正确设置维度的矩阵,并继续编辑模块图。
依存关系
要启用此参数,请进行如下设置:
将数据设定设置为表和断点。
将表数据:源设置为对话框。
编程用法
模块参数:Table |
类型:字符向量 |
值:表值构成的矩阵 |
默认值:'reshape(repmat([4 5 6;16 19 20;10 18 23],1,2),[3,3,2])' |
断点 — 显式断点值,或断点的第一个点和间距
[10,22,31]
(默认) | 单调递增值的 1×n 或 n×1 向量
显式指定断点数据或者指定为等间距断点,具体取决于断点设定参数。
如果您将断点设定设置为显式值,请在相关联的值字段中的每个断点行中输入与表数据的每个维度对应的断点向量。对于每个维度,将断点指定为值严格单调递增的 1×n 或 n×1 向量。
如果您将断点设定设置为等间距,请在每个断点行中输入参数第一个点和间距,以便在各自的维度生成等间距断点。您的表数据决定等间距点数。
依存关系
要启用此参数,请进行如下设置:
将数据设定设置为表和断点。
将表数据:源设置为对话框。
当断点设定参数设置为等间距时,您只能通过对话框指定断点数据。
编程用法
模块参数:BreakpointsForDimension1 | BreakpointsForDimension2 | ... | BreakpointsForDimension30 | |
类型:字符向量 |
值:单调递增值的 1×n 或 n×1 向量 |
默认值:'[10, 22, 31]' |
第一个点 — 等间距断点数据中的第一个点
1
(默认) | 标量
将等间距断点数据中的第一个点指定为实数值有限标量。当断点设定设置为等间距时,此参数可用。
依存关系
要启用此参数,请将数据设定设置为表和断点,并将断点设定设置为等间距。
编程用法
模块参数:BreakpointsForDimension1FirstPoint | BreakpointsForDimension2FirstPoint | ... | BreakpointsForDimension30FirstPoint | |
类型:字符向量 |
值:实数值有限标量 |
默认值:'1' |
间距 — 等间距断点之间的间距
1
(默认) | 标量
指定等间距断点数据中各点之间的距离。
依存关系
要启用此参数,请将数据设定设置为表和断点,并将断点设定设置为等间距。
编程用法
模块参数:BreakpointsForDimension1Spacing | BreakpointsForDimension2Spacing | ... | BreakpointsForDimension30Spacing | |
类型:字符向量 |
值:正实数值有限标量 |
默认值:'1' |
编辑表和断点 — 打开“查找表编辑器”对话框
按钮
点击此按钮以打开查找表编辑器。有关详细信息,请参阅 Edit Lookup Tables。
对于查找表对象,点击此按钮可以编辑该对象并为该对象保存新值。
算法
查找方法内插方法 — 断点值之间插值的方法
线性点-斜率 (默认) | 均一 | 最邻近值 | 线性拉格朗日 | 三次样条 | Akima 样条
当输入位于两个断点值之间时,模块将根据相邻断点内插输出值。有关插值方法的详细信息,请参阅内插方法。
依存关系
如果您选择三次样条,则模块仅支持标量信号。其他插值方法支持非标量信号。
如果选择 Akima 样条,外插方法只能是 Akima 样条。
当设置为修正 Akima 插值方法时,此模块不支持:
行优先数组布局和针对行优先数组布局优化的算法
定标的双精度和定点数据类型
Simulink.LookupTable
对象选中配置参数代码生成 > 接口 > 支持非有限数复选框时的代码生成
当设置为修正 Akima 插值方法时,如果以下条件成立,此模块的运行速度会更慢:
基于代码生成的仿真目标,如加速模式、快速加速模式、受保护模型等的仿真目标。
为大型断点和数据表生成的代码。例如,表大小为 629×1601。
编程用法
模块参数:InterpMethod |
类型:字符向量 |
值:'Linear point-slope' | 'Flat' | 'Nearest' | 'Linear Lagrange' | 'Cubic spline' | 'Akima spline' |
默认值:'Linear point-slope' |
外插方法 — 处理超出断点向量范围的输入值的方法
线性 (默认) | 裁剪 | 三次样条 | Akima 样条
选择裁剪、线性或三次样条。有关详细信息,请参阅外插方法。
如果外插方法是线性,则基于所选择的线性插值方法计算外插值。例如,如果插值方法是线性拉格朗日,则外插方法继承线性拉格朗日方程以计算外插值。
依存关系
要为外插方法选择三次样条,还必须为内插方法选择三次样条。
要为外插方法选择 Akima 样条,您还必须为内插方法选择 Akima 样条。
编程用法
模块参数:ExtrapMethod |
类型:字符向量 |
值:'Linear' | 'Clip' | 'Cubic spline' | 'Akima spline' |
默认值:'Linear' |
索引搜索方法 — 计算表索引的方法
等间距点 (默认) | 线性搜索 | 二分搜索
选择等间距点、线性搜索或二分搜索。每一种搜索方法在不同的情况下均有各自的速度优势:
对于等间距断点向量(例如,10、20、30 等),您可以选择等间距点来计算表索引,以获得最佳速度。
此算法仅使用断点集的前两个断点来确定其余点的偏移量和间距。
注意
当使用
Simulink.LookupTable
对象指定表数据且引用的Simulink.LookupTable
对象的断点设定参数设置为等间距时,请将索引搜索方法设置为等间距点。对于非等间距的断点向量,请遵循以下规范:
如果输入信号在时间步之间的变化不大,选择线性搜索与使用上一个索引结果开始索引搜索可以获得最佳性能。
如果输入信号在每个时间步中跳过的表间隔超过一个或两个,选择二分搜索可以获得最佳性能。
对于严重依赖查找表的模型,选择次优索引搜索方法可能会导致性能下降。
注意
在以下情况下,生成的代码只存储第一个断点、间距和断点数量:
断点数据不可调。
索引搜索方法是等间距点。
编程用法
模块参数:IndexSearchMethod |
类型:字符向量 |
值:'Binary search' | 'Evenly spaced points' | 'Linear search' |
默认值:'Binary search' |
使用上一个索引结果开始索引搜索 — 开始使用来自上一时间步的索引
off
(默认) | on
如果您希望模块使用在上一个时间步中找到的索引开始搜索,请选中此复选框。对于相对于间隔大小而言变化缓慢的输入,启用此选项可以提高性能。否则,线性搜索和二分搜索方法可能需要更长的时间,尤其是对于大型断点向量来说。
依存关系
要启用此参数,请将索引搜索方法设置为线性搜索或二分搜索。
编程用法
模块参数:BeginIndexSearchUsingPreviousIndexResult |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
输入超出范围的诊断 — 当输入超出范围时的模块操作
无 (默认) | 警告 | 错误
指定当输入超出范围时,是否生成警告或错误消息。选项包括:
无 - 不产生任何响应。
警告 - 显示警告并继续进行仿真。
错误 - 终止仿真并显示错误。
编程用法
模块参数:DiagnosticForOutOfRangeInput |
类型:字符向量 |
值:'None' | 'Warning' | 'Error' |
默认值:'None' |
尽可能应用全精度定点算法 — 更精确的定点表查找
off
(默认) | on
尽可能使用此复选框为线性插值查找启用全精度定点算法查找。对于硬件效率高的定点舍入模式,此算法通常可以实现更高的精度。
依存关系
要启用此参数,请进行如下设置:
将表维数设置为 1。
将内插方法设置为线性点-斜率。
将外插方法设置为裁剪。
编程用法
模块参数:ApplyFullPrecisionForLinearInterpolation |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
输入等于或高于最后一个断点时使用最后一个表值 — 用于计算最后一个断点上或高于该断点的输入的输出的方法
off
(默认) | on
使用此复选框,指定模块用来定位断点向量的最后一个元素及其对应表值的索引约定。当输入等于或大于断点数据的最后一个元素时,此复选框才有意义。由于舍入原因,选中和清除此复选框可能会导致仿真与代码生成之间最后一个断点的结果不同。
复选框 | 模块使用的索引 | 区间比 |
---|---|---|
选中 | 表和断点选项卡上的断点数据的最后一个元素 | 0 |
清除 | 表和断点选项卡上的断点数据的倒数第二个元素 | 1 |
假设输入 u 在断点向量 bp 的范围内,区间比 f(在 0≦f<1 范围内)按如下所示进行计算。
假设断点向量为 [1 4 5]
,输入 u 为 5.5
。如果您选中此复选框,索引则是最后一个元素 (5
) 的索引,区间比为 0。如果您清除此复选框,索引则是倒数第二个元素 (4
) 的索引,区间比为 1。
依存关系
要启用此参数,请进行如下设置:
将内插方法设置为线性。
将外插方法设置为裁剪。
编程用法
模块参数:UseLastTableValue |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
所有输入数据使用一个输入端口 — 只使用一个输入端口
off
(默认) | on
选中此复选框,从而对 N 维表只使用一个输入端口,此端口需要宽度为 n
个元素的信号。此选项可以有效减少包含许多查找表的模块图中的杂乱线条。
注意
如果您选中此复选框,模块上将出现一个带有 u
标签的输入端口。
编程用法
模块参数:UseOneInputPortForAllInputData |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
删除生成代码中防止超范围输入的代码 — 删除检查超出范围的输入值的代码
off
(默认) | on
指定是否包含代码以检查超出范围的输入值。
复选框 | 结果 | 何时使用 |
---|---|---|
| 生成的代码中未包含用来检查超出范围的断点输入的条件语句。 当输入超出范围时,生成的代码可能会发生未定义的行为。 | 提高代码效率 |
| 生成的代码包含用来检查超出范围的输入的条件语句。 | 适用于安全性至关重要的应用领域 |
如果您的输入没有超出范围,则可以选中删除生成代码中防止超范围索引的代码复选框以提高代码效率。默认情况下,此复选框处于清除状态。对于安全性至关重要的应用,不要选中此复选框。要选中删除生成代码中防止超范围索引的代码复选框,请先检查模型输入是否在范围内。例如:
清除删除生成代码中防止超范围索引的代码复选框。
将输入超出范围的诊断参数设置为
Error
。在普通模式下进行模型仿真。
如果发生超出范围错误,请将它们更正到范围之内,然后再次运行仿真。
当仿真不再生成超出范围的输入错误时,选中删除生成代码中防止超范围索引的代码复选框。
注意
如果选中了删除生成代码中防止超范围索引的代码复选框而输入超出范围,生成的代码将发生未定义的行为。
根据您的具体应用,您可以运行以下模型顾问检查,以验证此复选框的使用情形:
按产品 > Embedded Coder > 标识哪些查找表模块会生成检查超范围值的高成本代码
按产品 > Simulink Check > 建模标准 > DO-178C/DO-331 检查 > 检查 Lookup Table 模块的使用情形
有关模型顾问的详细信息,请参阅运行模型顾问检查。
此外,要确定选中此复选框是否安全,如果您拥有 Simulink Design Verifier™ 许可证,请考虑使用 检测模块输入范围违规 (Simulink Design Verifier) 检查。
编程用法
模块参数:RemoveProtectionInput |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
在代码生成中支持可调表大小 — 在生成的代码中启用可调表大小
off
(默认) | on
选中此复选框,以使生成的代码中具有可调表大小。利用此选项,您可以更改生成的代码中的查找表与断点数据的大小和值,无需重新生成或重新编译代码。您只能减小查找表和断点数据的大小。
依存关系
如果您将内插方法设置为三次样条,此复选框将不可用。
编程用法
模块参数:SupportTunableTableSize |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
采样时间(-1 表示继承) — 采样之间的时间间隔
-1
(默认) | 标量 | 向量
指定采样时间间隔。要继承采样时间,请将此参数设置为 -1
。有关详细信息,请参阅指定采样时间。
依存关系
仅当您将此参数设置为 -1
以外的值时才可见。要了解详细信息,请参阅不建议设置采样时间的模块。
编程用法
模块参数:SampleTime |
类型:字符串标量或字符向量 |
默认值:"-1" |
每个维度的最大索引 — 每个表维度的最大索引值
[]
(默认) | 正整数值的标量或向量
示例: [4 6]
用于表示 5×7 的表
使用从零开始的索引方法指定每个表维度的最大索引值。您可以使用以下数据类型,指定正整数标量或向量值:
内置浮点类型:
double
和single
内置整数类型:
int8
、int16
、int32
、uint8
、uint16
和uint32
有效设定的示例包括:
[4 6]
用于表示 5×7 的表[int8(2) int16(5) int32(9)]
用于表示 3×6×10 的表Simulink.Parameter
,在生成代码后此参数的值比表数据的维度少一。有关详细信息,请参阅在生成的代码中具有可调表大小。
依存关系
要启用此参数,请选择在代码生成中支持可调表大小。通过在生成的代码中调整此参数,提供新的表数据和断点以及调整后的参数值。
编程用法
模块参数:MaximumIndicesForEachDimension |
类型:字符向量 |
值:正整数值的标量或向量 |
默认值:'[]' |
数据类型
表数据 — 表数据的数据类型
继承: 与输出相同 (默认) | double | single | half | int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | fixdt(1,16) | fixdt(1,16,0) | fixdt(1,16,2^0,0) | <数据类型表达式>
指定表数据类型。可以将其设置为:
继承数据类型的规则,例如继承: 与输出相同
内置数据类型的名称,例如
single
数据类型对象的名称,例如
Simulink.NumericType
对象计算结果为数据类型的表达式,例如
fixdt(1,16,0)
数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 。有关详细信息,请参阅使用数据类型助手指定数据类型。
提示
对于以下情况,指定与输出数据类型不同的表数据类型:
存储表数据(使用的类型小于输出信号)的内存要求较低
在具有不同输出数据类型的两个 n-D Lookup Table 模块之间共享预缩放的表数据
在为具有不同输出数据类型的模块生成的代码中共享自定义存储表数据
依存关系
要启用此参数,请将表和断点选项卡中的表数据设置为对话框。
编程用法
模块参数:TableDataTypeStr |
类型:字符向量 |
值:'Inherit: Inherit from 'Table data'' | 'Inherit: Same as output' | '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: Same as output' |
表数据最小值 — 表数据的最小值
[]
| scalar
指定表数据的最小值。默认值为 []
(未指定)。
编程用法
模块参数:TableMin |
类型:字符向量 |
值:标量 |
默认值:'[]' |
表数据最大值 — 表数据的最大值
[]
| scalar
指定表数据的最大值。默认值为 []
(未指定)。
编程用法
模块参数:TableMax |
类型:字符向量 |
值:标量 |
默认值:'[]' |
断点 — 断点数据类型
继承: 与对应的输入相同 (默认) | double | single | half | int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | fixdt(1,16) | fixdt(1,16,0) | fixdt(1,16,2^0,0) | Enum: <class name> | <数据类型表达式>
指定一组断点数据的数据类型。可以将其设置为:
继承数据类型的规则,例如继承: 与对应的输入相同
内置数据类型的名称,例如
single
数据类型类的名称,例如枚举数据类型类
数据类型对象的名称,例如
Simulink.NumericType
对象计算结果为数据类型的表达式,例如
fixdt(1,16,0)
提示
断点支持无序枚举数据。因此,线性搜索也是无序的,这就提供了灵活性,但可能影响性能。搜索从断点中的第一个元素开始。
如果选中使用上一个索引结果开始索引搜索复选框,则必须使用有序单调递增数据。这种排序可提高性能。
对于枚举数据,外插方法必须是
Clip
。该模块不支持枚举数据的超出范围的输入。指定枚举数据时,请将整个枚举集包含在断点向量中。例如,使用
enumeration
函数。
以下是对此模块使用枚举数据的限制:
该模块不支持枚举数据的超出范围的输入。指定枚举数据时,请将整个枚举集包含在断点向量中。例如,使用
enumeration
函数。
数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 。有关详细信息,请参阅使用数据类型助手指定数据类型。
提示
对于以下情况,指定的断点数据类型可以不同于对应的输入数据类型:
存储断点数据(使用的类型小于输出信号)的内存要求较低
在具有不同输入数据类型的两个 n-D Lookup Table 模块之间共享预缩放的断点数据
在为具有不同输入数据类型的模块生成的代码中共享自定义存储断点数据
如果断点数据类型或其对应的输入数据类型具有定点数据类型,请为二者指定相同的斜率和偏置。
依存关系
要启用此参数,请将表和断点选项卡中对应的断点参数设置为对话框。
编程用法
模块参数:BreakpointsForDimension1DataTypeStr | BreakpointsForDimension2DataTypeStr| ... | BreakpointsForDimension30DataTypeStr |
类型:字符向量 |
值:'Inherit: Same as corresponding input' | 'Inherit: Inherit from 'Breakpoint data'' | '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: Same as corresponding input' |
断点最小值 — 最小值断点数据可以有
[]
| scalar
指定一组断点数据可以具有的最小值。默认值为 []
(未指定)。
编程用法
模块参数:BreakpointsForDimension1Min | BreakpointsForDimension2Min | ... | BreakpointsForDimension30Min |
类型:字符向量 |
值:标量 |
默认值:'[]' |
断点最大值 — 最大值断点数据可以有
[]
| scalar
指定一组断点数据可以具有的最大值。默认值为 []
(未指定)。
编程用法
模块参数:BreakpointsForDimension1Max | BreakpointsForDimension2Max | ... | BreakpointsForDimension30Max |
类型:字符向量 |
值:标量 |
默认值:'[]' |
区间比 — 区间比数据类型
继承: 从内部规则继承 (默认) | double | single | fixdt(1,16,0) | <数据类型表达式>
指定区间比数据类型。可以将其设置为:
继承数据类型的规则,例如继承: 从内部规则继承
内置数据类型的名称,例如
single
数据类型对象的名称,例如
Simulink.NumericType
对象计算结果为数据类型的表达式,例如
fixdt(1,16,0)
数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 。有关详细信息,请参阅使用数据类型助手指定数据类型。
编程用法
模块参数:FractionDataTypeStr |
类型:字符向量 |
值:'Inherit: Inherit via internal rule' | 'double' | 'single' | 'fixdt(1,16,0)'|'<data type expression>' |
默认值:'Inherit: Inherit via internal rule' |
中间结果 — 中间结果数据类型
继承: 与输出相同 (默认) | 继承: 从内部规则继承 | double | single
| int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | fixdt(1,16,0) | fixdt(1,16,2^0,0) | <数据类型表达式>
指定中间结果数据类型。可以将其设置为:
继承数据类型的规则,例如继承: 与输出相同
内置数据类型的名称,例如
single
数据类型对象的名称,例如
Simulink.NumericType
对象计算结果为数据类型的表达式,例如
fixdt(1,16,0)
数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 。有关详细信息,请参阅使用数据类型助手指定数据类型。
提示
使用此参数为内部计算指定高于(或低于)表数据或输出数据的精度。
编程用法
模块参数:IntermediateResultsDataTypeStr |
类型:字符向量 |
值:'Inherit: Inherit via internal rule' | 'Inherit: Same as output' | 'double' | 'single' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)'|'<data type expression>' |
默认值:'Inherit: Same as output' |
输出 — 输出数据类型
继承: 与输入相同 (默认) | 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>
指定输出数据类型。可以将其设置为:
继承数据类型的规则,例如继承: 通过反向传播继承
内置数据类型的名称,例如
single
数据类型对象的名称,例如
Simulink.NumericType
对象计算结果为数据类型的表达式,例如
fixdt(1,16,0)
数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 。有关详细信息,请参阅使用数据类型助手指定数据类型。
编程用法
模块参数:OutDataTypeStr |
类型:字符向量 |
值:'Inherit: Inherit via back propagation' | 'Inherit: Inherit from table data' | 'Inherit: Same as first input' | 'double' | 'single' | 'half' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)'|'<data type expression' |
默认值:'Inherit: Same as first input' |
输出最小值 — 模块可以输出的最小值
[]
| scalar
指定模块输出的最小值。默认值为 []
(未指定)。Simulink 软件使用此值执行:
参数范围检查(请参阅指定模块参数的最小值和最大值)。
仿真范围检查(请参阅指定信号范围)。
定点数据类型的自动定标。
从模型生成的代码的优化。此优化可删除算法代码,并影响某些仿真模式(如 SIL 或外部模式)的结果。
编程用法
模块参数:OutMin |
类型:字符向量 |
值:标量 |
默认值:'[]' |
输出最大值 — 模块可以输出的最大值
[]
| scalar
指定模块可以输出的最大值。默认值为 []
(未指定)。Simulink 软件使用此值执行:
参数范围检查(请参阅指定模块参数的最小值和最大值)。
仿真范围检查(请参阅指定信号范围)。
定点数据类型的自动定标。
从模型生成的代码的优化。此优化可删除算法代码,并影响某些仿真模式(如 SIL 或外部模式)的结果。
编程用法
模块参数:OutMax |
类型:字符向量 |
值:标量 |
默认值:'[]' |
内部规则优先级 — 进行中间计算的内部规则
速度 (默认) | 精度
指定进行中间计算的内部规则。选择速度可以提高计算速度。但这样可能会损失精度,通常最多 2 位。
依存关系
仅当中间结果参数设置为继承:从内部规则继承。
编程用法
模块参数:InternalRulePriority |
类型:字符向量 |
值:'Speed' | 'Precision' |
默认值:'Speed' |
要求所有输入具有相同的数据类型 — 要求所有输入具有相同的数据类型
on
(默认) | off
选中此项会要求所有输入具有相同的数据类型。
编程用法
模块参数:InputSameDT |
类型:字符向量 |
值:'off' | 'on' |
默认值:'on' |
锁定数据类型设置以防止被定点工具更改 — 防止定点工具覆盖数据类型
off
(默认) | on
选择此参数可防止定点工具覆盖您对此模块指定的数据类型。有关详细信息,请参阅Lock the Output Data Type Setting (Fixed-Point Designer)。
编程用法
模块参数:LockScale |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
整数舍入模式 — 定点运算的舍入模式
最简 (默认) | 向上 | 收敛 | 向下 | 最邻近值 | 舍入 | 零
指定在仿真过程中或在执行从模型中生成的代码时发生的定点查找表计算的舍入模式。有关详细信息,请参阅舍入 (Fixed-Point Designer)。
此选项不影响模块参数值的舍入。Simulink 将此类值舍入到最邻近的可表示整数值。要控制模块参数的舍入方法,请使用 MATLAB® 舍入函数在模块对话框上的编辑字段中输入表达式。
编程用法
模块参数:RndMeth |
类型:字符向量 |
值:'Ceiling' | 'Convergent' | 'Floor' | 'Nearest' | 'Round' | 'Simplest' | 'Zero' |
默认值:'Simplest' |
对整数溢出进行饱和处理 — 溢出操作的方法
off
(默认) | on
操作 | 执行此操作的原因 | 溢出时会发生的情况 | 示例 |
---|---|---|---|
选中此复选框 ( | 您的模型可能有溢出,并且您希望在生成的代码中具有显式饱和保护。 | 将溢出饱和处理为数据类型能够表示的最小值或最大值。 | 一个有符号的 8 位整数的溢出可以饱和处理为 -128 或 127。 |
不选中此复选框 ( | 您需要优化所生成代码的效率。 您希望避免过度地指定信号超出范围时的处理方式。有关详细信息,请参阅信号范围错误故障排除。 | 溢出会绕回到由数据类型表示的适当值。 | 数字 130 不适合一个有符号 8 位整数,因此绕回 -126。 |
提示
如果您将模型保存为 R2009a 或更早版本,此复选框设置将不起作用,且不会显示饱和代码。此行为保留了向后兼容性。
如果选中此复选框,饱和将应用于模块中的每个内部操作,而不仅仅应用于输出或结果。一般情况下,代码生成进程可以检测到何时不可能发生溢出。在这种情况下,代码生成器不会生成饱和代码。
编程用法
模块参数:SaturateOnIntegerOverflow |
类型:字符向量 |
值:'off' | 'on' |
默认值:'off' |
模块特性
数据类型 |
|
直接馈通 |
|
多维信号 |
|
可变大小信号 |
|
过零检测 |
|
详细信息
在生成的代码中具有可调表大小
假设您有一个查找表,您希望它在生成的代码中可以调整大小。当使用 Simulink.LookupTable
和 Simulink.Breakpoint
对象来配置用于在生成的代码中进行标定的查找表数据时,请使用对象的 SupportTunableSize
属性启用可调表大小。如果不使用这些类,请使用 n-D Lookup Table 模块中的在代码生成中支持可调表大小参数启用可调表大小。
假设:
您在模型的
preload
函数中定义了一个Simulink.Parameter
结构体:p = Simulink.Parameter; p.Value.MaxIdx = [2 2]; p.Value.BP1 = [1 2 3]; p.Value.BP2 = [1 4 16]; p.Value.Table = [4 5 6; 16 19 20; 10 18 23]; p.DataType = 'Bus: slLookupTable'; p.CoderInfo.StorageClass = 'ExportedGlobal'; % Create bus object slBus1 from MATLAB structure Simulink.Bus.createObject(p.Value); slLookupTable = slBus1; slLookupTable.Elements(1).DataType = 'uint32';
以下模块参数适用于 n-D Lookup Table 模块。
参数 值 表维数 2
表数据 p.Table
断点 1 p.BP1
断点 2 p.BP2
在代码生成中支持可调表大小 on
每个维度的最大索引 p.MaxIdx
生成的
头文件包含与下面类似的类型定义。model
_types.h
typedef struct { uint32_T MaxIdx[2]; real_T BP1[3]; real_T BP2[3]; real_T Table[9]; } slLookupTable;
生成的
文件包含与下面类似的代码。model
.c
/* Exported block parameters */ slLookupTable p = { { 2U, 2U }, { 1.0, 2.0, 3.0 }, { 1.0, 4.0, 16.0 }, { 4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0 } } ; /* More code */ /* Model output function */ static void ex_lut_nd_tunable_table_output(int_T tid) { /* Lookup_n-D: '<Root>/n-D Lookup Table' incorporates: * Inport: '<Root>/In1' * Inport: '<Root>/In2' */ Y = look2_binlcpw(U1, U2, p.BP1, p.BP2, p.Table, ... p.MaxIdx, p.MaxIdx[0] + 1U); /* Outport: '<Root>/Out1' */ ex_lut_nd_tunable_table_Y.Out1 = Y; /* tid is required for a uniform function interface. * Argument tid is not used in the function. */ UNUSED_PARAMETER(tid); }
突出显示的代码行为查找表指定了可调表大小。您可以更改查找表与断点数据的大小和值,无需重新生成或重新编译代码。
查找表中的枚举值
假设您有一个具有类似如下定义的枚举类的查找表:
classdef(Enumeration) Gears < Simulink.IntEnumType enumeration GEAR1(1), GEAR2(2), GEAR3(4), GEAR4(8), SPORTS(16), REVERSE(-1), NEUTRAL(0) end end
n-D Lookup Table 模块具有以下设置:
维数设置为 1。
表数据值为
[5 10 20 40 80 -5 0]
。断点 1 值为
enumeration('Gears')
。内插方法为“均一”。
对于无序搜索,请将索引搜索方法设置为线性搜索并清除使用上一个索引结果开始索引搜索复选框。
仿真产生对应于 GEAR2
、REVERSE
和 SPORTS
的向量 [10 -5 80]
。
扩展功能
C/C++ 代码生成
使用 Simulink® Coder™ 生成 C 代码和 C++ 代码。
HDL 代码生成
使用 HDL Coder™ 为 FPGA 和 ASIC 设计生成 VHDL、Verilog 和 SystemVerilog 代码。
HDL Coder™ 提供影响 HDL 实现和综合逻辑的额外配置选项。
此模块具有一个默认 HDL 架构。
通用 | |
---|---|
ConstrainedOutputPipeline | 通过移动设计中现有延迟的方式来放置在输出端的寄存器的数量。分布式流水线不会重新分发这些寄存器。默认值为 |
InputPipeline | 要在生成的代码中插入的输入流水线阶段数。分布式流水线和受限输出流水线可以移动这些寄存器。默认值为 |
MapToRAM | 将查找表 (LUT) 映射到 RAM。默认值为 on。另请参阅MapToRAM (HDL Coder)。 |
OutputPipeline | 要在生成的代码中插入的输出流水线阶段数。分布式流水线和受限输出流水线可以移动这些寄存器。默认值为 |
本机浮点 | |
---|---|
HandleDenormals | 指定是否希望 HDL Coder 在设计中插入额外的逻辑来处理非正规数字。非正规数是量级非常小、必须使用包含前导零的尾数才能表示的浮点数。默认值为 inherit。另请参阅HandleDenormals (HDL Coder)。 |
LatencyStrategy | 指定对于浮点运算符是否将设计中的模块映射到 |
MantissaMultiplyStrategy | 指定在代码生成期间如何实现尾数乘法运算。通过使用不同设置,您可以控制目标 FPGA 设备上 DSP 的使用。默认值为 inherit。另请参阅MantissaMultiplyStrategy (HDL Coder)。 |
PrecomputeCoefficients | 要启用此属性,请将内插方法设置为线性点-斜率。 启用此属性时,斜率和偏置系数是根据表数据和断点静态预先计算的。此设置可减少运行时为计算系数而执行的除法运算的次数。它还会减少执行的浮点加法和乘法运算的总次数。 启用此属性可减少延迟并节省所需的查找表资源的区域数量。但是,此属性会对浮点运算进行重新排序,这可能导致细微的数值差异。您可以在生成的验证模型中观察到这些数值差异。 |
AreaOptimization | 对于四维和五维 LUT,HDL 代码生成支持完全并行和串行实现。要启用此属性,请对四维和五维 LUT 使用线性插值方法。当您将此属性设置为并行或串行时,HDL Coder 会为您的设计调配资源。要减少设计的占用面积,请使用串行实现来最小化资源。要观察完全并行和串行实现的结果,请为您的设计比较本机浮点运算符的资源利用率报告。您还可以比较完全并行和串行实现的设计的合成结果。 |
在本机浮点 (NFP) 模式下对 LUT 使用浮点数据类型时,代码生成器会根据加法、除法和乘法运算符的延迟值来计算 LUT 的延迟。LUT 的延迟还取决于 HDL 模块属性,例如 PrecomputeCoefficients 和 MapToRAM。其计算方法如下:
当 PrecomputeCoefficients 为 Off 时,LUT 的延迟计算如下:
LUT Latency = D + N(2A + M)
其中
D
是除法运算符的 NFP 延迟A
是加法运算符的 NFP 延迟M
是乘法运算符的 NFP 延迟N
是表维数当 PrecomputeCoefficients 为 On 时,LUT 的延迟计算如下:
LUT Latency = (2^N - 1)A + N(M)
当您将 LUT 的 MapToRAM 属性设置为 On 并为您的模型指定合成工具和目标设备时,会增加一个额外的延迟。
下表中列出了加法、除法和乘法等浮点运算符的延迟值。有关详细信息,请参阅Latency Values of Floating-Point Operators (HDL Coder)。
浮点运算符 | 数据类型 | 最小延迟 | 最大延迟 |
---|---|---|---|
加法 | 双精度 | 6 | 11 |
单精度 | 6 | 11 | |
半精度 | 4 | 8 | |
除法 | 双精度 | 31 | 61 |
单精度 | 17 | 32 | |
半精度 | 10 | 19 | |
乘法 | 双精度 | 6 | 9 |
单精度 | 6 | 8 | |
半精度 | 4 | 6 |
例如,假设一个一维查找表采用单精度数据类型且 PrecomputeCoefficients 为 off
。一维 LUT 的延迟为
LUT Latency = 32 + 1(2x11 + 8) = 62
.
如果您启用 MapToRAM 选项,则 LUT 延迟为 63。
此模块支持复信号的代码生成。
模块设置 | HDL Coder 支持 |
---|---|
表维数 | 选择 1 到 30 之间的表维度。 |
断点设定 | 选择显式值或等间距。 |
外插方法 | 选择裁剪或线性。代码生成器不支持超出偶边界的外插。 |
内插方法 | 选择均一或线性点-斜率。 |
输入超出范围的诊断 | 选择错误。如果您指定其他选项,HDL Coder 会生成警告。 |
输入等于或高于最后一个断点时使用最后一个表值 | 选中此复选框。 |
要求所有输入具有相同的数据类型 | 选中此复选框。 |
区间比 | 选择 Inherit: 从内部规则继承。 |
整数舍入模式 | 选择零、向下或最简。 |
所有输入数据使用一个输入端口 | 清除此复选框。 |
您可以为具有定点数据类型的模块生成代码。您可以对 n-D Lookup Table 模块中的所有维度使用定点数据类型。要为该模块生成具有定点数据类型的代码,请使用以下模块参数设置:
模块设置 | HDL Coder 支持 |
---|---|
表维数 | 选择 1 到 30 之间的表维度。 |
断点设定 | 选择显式值或等间距。 |
外插方法 | 选择裁剪 |
内插方法 | 选择均一或线性点-斜率。 |
索引搜索方法 | 等间距点 |
如果您使用 Intel® MAX 10 设备,要将查找表映射到 RAM,请当在 Quartus 工具中创建工程时添加以下 Tcl 命令:
set_global_assignment -name INTERNAL_FLASH_UPDATE_MODE "SINGLE IMAGE WITH ERAM"
如果 HDL Coder 遇到需要除法运算来匹配模型仿真行为的情况,将显示警告。这些情况会导致该模块产生除法运算符。当您使用此模块进行 HDL 代码生成时,请避免下列情况:
如果模块配置为使用插值,则要求除法运算符。要避免出现此要求,请将内插方法设置为均一。
表间距不均匀。HDL 代码生成要求模块使用等间距点算法。从输入数据类型到从 0 开始的表索引的模块映射通常需要除法。当断点间距正好是 2 的幂时,该除法实现为移位而不是除法。要调整断点间距,请调整表中断点的数量,或断点范围的左右边界之间的差。
构建表时,最好使断点之间的间距为 2 的幂。如果断点间距不符合此条件,HDL Coder 会发出警告。当断点间距是 2 的幂时,可以用右移位运算替换 prelookup 步骤中的除法运算。
模块上的所有端口都需要标量值。
当内插方法设置为均一时,该模块支持对数据输入、断点和输出使用
half
数据类型。半精度数据类型不支持线性插值。HDL 代码生成不支持超过 131072 个表元素的 LUT。
PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。
Simulink PLC Coder™ 对查询表模块的支持有限。代码生成器不支持:
大于 2 的维数
三次样条插值方法
使用先前的索引模式开始索引搜索
三次样条外插方法
定点转换
使用 Fixed-Point Designer™ 设计和仿真定点系统。
版本历史记录
在 R2011a 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)