FLT_MACC ############## 简介 ---- 滤波器数学加速器可执行有限脉冲响应(FIR)和无限脉冲响应(IIR)滤波。该单元允许将频繁或耗时的滤波运算从 CPU 卸载,从而让处理器专注于其他任务。在许多情况下,相比纯软件实现,它能显著加速此类计算,进而加速对时序要求严格的任务。 该单元内置一块用于输入与输出数据的本地存储器,可通过寄存器接口进行访问。 .. figur/assets/images/ip/nuclei_flt_macc_doc/images/flt_macc_block_diagram.drawio.png :alt: FLT_MACC 模块框图 :align: center :name: figure_flt_macc_block FLT_MACC 模块框图 主要特性 -------- FLT_MACC 的主要特性包括: • 支持 q7、q15、q31 数据类型 • 支持 FIR 和 IIR(直接形式 1)函数,最大抽头数 1023 • 可在本地存储器中定义至多 3 个数据缓冲区区域(两个输入,一个输出),由可编程基地址指针与配套大小寄存器指定 • 输入与输出缓冲区可配置为循环缓冲区,系数缓冲区为固定缓冲区 • 支持向量函数:点积、卷积、相关 • ICB 从机接口 • DMA 读写请求与应答通道 • 本地存储器支持由 SoC 中的其他主机访问 功能描述 -------- FLT_MACC 单元执行定点的乘法与累加(MAC)。 FLT_MACC 的框图如图 6.1 所示。 .. figur/assets/images/ip/nuclei_flt_macc_doc/images/flt_macc_block_diagram.drawio.png :alt: FLT_MACC框图 :name: figure_flt_macc_6_1 :align: center :width: 400px :height: 300px 图 6.1: FLT_MACC框图 FLT_MACC 可以从本地存储器中取两个 Q 类型数据(q7、q15 或 q31),将它们相乘并累加到累加器。本地存储器被划分为三个区域:X1 缓冲区(输入)、X2 缓冲区(系数)、Y 缓冲区(输出)。每个缓冲区的大小与基地址可由软件配置。 - 点积:CPU 或 DMA 先将输入向量与系数向量装入本地存储器;取出每对元素相乘并累加;处理完所有元素后,将累加器结果写回本地存储器,供 CPU 或 DMA 读取。 - FIR:重复计算“系数向量 B 与输入样本向量 X”的点积;每次重复输入向量右移 1 个样本(丢弃最旧、加入最新)。 - IIR:在 FIR 卷积结果基础上,再叠加“延迟输出向量与反馈系数向量”的卷积。 本地存储器和缓冲区 ~~~~~~~~~~~~~~~~~~ 该单元内置 2080×32 位读/写本地存储器,用于保存数据与系数: • 输入值存放于 X1 缓冲区(最大 1024) • 系数值存放于 X2 缓冲区(最大 1024) • 输出值存放于 Y 缓冲区(最大 32) 缓冲区的位置和大小如下所示: - x1_base:X1 缓冲区基地址 - x1_size:X1 缓冲区条目数 - x2_base:X2 缓冲区基地址 - x2_size:X2 缓冲区条目数 - y_base:Y 缓冲区基地址 - y_size:Y 缓冲区条目数 上述参数在配置单元时通过相应寄存器进行编程。 CPU 或 DMA 可通过“初始化函数”并向写数据寄存器写入,初始化各缓冲区内容。写指针每次写后自增;到达分配空间末尾后回绕至基地址。此机制用于在操作前加载向量元素,或在滤波器初始化时加载滤波器系数。 初始化函数 ~~~~~~~~~~ 以下函数用于初始化 FLT_MACC 单元: • 加载 X1 缓冲区 • 加载 X2 缓冲区 • 加载 Y 缓冲区 触发方式:向 FLT_MACC_PARAM1 寄存器的 FUNC 位字段写入对应功能值,并置位 START。与此同时,FLT_MACC_PARAM0 寄存器中的 N、M 位字段需按函数要求提供正确参数;G 在初始化函数中不使用。函数完成后,START 由硬件自动清零。 建议在初始化期间禁用 DMA 请求与中断。由于初始化无流控需求,数据写入 FLT_MACC 本地存储器可由软件或 DMA 完成。 加载X1缓冲区 ^^^^^^^^^^^^ 此函数从 X1_BASE 开始预加载 X1 缓冲区的 N 个值。连续写 FLT_MACC_XWDATA 将数据装入 X1 并递增写地址。函数完成时,写指针指向 X1_BASE + N。可用于预装输入向量元素,或初始化滤波器输入存储单元。 参数: • N:写入到 X1 的值数量 • M、G:不使用 当对 FLT_MACC_XWDATA 完成 N 次写入时,函数完成。 加载X2缓冲区 ^^^^^^^^^^^^ 此函数从 X2_BASE 开始预加载 X2 缓冲区的 N + M 个值。连续写 FLT_MACC_XWDATA 将数据装入 X2 并递增写地址。可用于预装系数或向量元素。IIR 情况下,先 N 个前馈系数后接 M 个反馈系数拼接装载,总数 N + M;FIR 情况下 M=0。 参数: • N:从 X2_BASE 开始写入到 X2 的数量 • M:从 X2_BASE + N 开始再写入到 X2 的数量 • G:不使用 当对 FLT_MACC_XWDATA 完成 N + M 次写入时,函数完成。 加载Y缓冲区 ^^^^^^^^^^^ 此函数从 Y_BASE 开始预加载 Y 缓冲区的 N 个值。连续写 FLT_MACC_YWDATA 将数据装入 Y 并递增写地址。函数完成时读指针指向 Y_BASE + N。可用于预装 IIR 的反馈延迟线。 参数: • N:写入到 Y 的值数量 • M、G:不使用 当对 FLT_MACC_YWDATA 完成 N 次写入时,函数完成。 滤波器函数 ~~~~~~~~~~ FLT_MACC 支持以下滤波器函数。通过向 FLT_MACC_PARAM1.FUNC 写入对应值并置位 START 触发。FLT_MACC_PARAM0 的 N、M、G 需按下述规定提供正确参数。 注意:滤波器函数会持续运行,直到软件清除 START 位。 FIR滤波器 ^^^^^^^^^ Y = B*X 此函数计算长度为 N+1 的系数向量 B 与无限长度输入向量 X 的卷积。对每个 n,输出 yn = B·Xn,其中 Xn = [xn−N, …, xn] 为 X 在 n−N 到 n 的 N+1 个元素。 该函数即有限脉冲响应(FIR)滤波,B 为系数,X 为采样数据。 注意:交叉相关可通过反转系数向量 B 的顺序实现。 输入: • X1:向量 X 元素,长度 N + 1 + d 的循环缓冲区 • X2:向量 B 元素,长度 N + 1 的固定缓冲区 输出: • Y:输出 yn,长度 d 的循环缓冲区 参数: • N:系数向量 B 的长度(范围内) • G:增益;输出到 Y 的值乘以 2**G,G ∈ [0:7] • M:不使用 当软件清除 FLT_MACC_PARAM1.START 时,函数完成。 IIR滤波器 ^^^^^^^^^ Y = B*X + A*Y' 此函数为无限脉冲响应(IIR)滤波。输出向量 Y 由两部分相加:长度 N+1 的系数 B 与 X 的卷积,以及长度 M 的系数 A 与延迟输出向量 Y' 的卷积。 对每个 n,yn = B·Xn + A·Yn−1,其中 Xn = [xn−N, …, xn],Yn−1 = [yn−M, …, yn−1]。 输入: • X1:向量 X 元素,长度 N + 1 + d 的循环缓冲区 • X2:系数向量 B 与 A 串接(b0…bN, a1…aM),长度 N+M+1 的固定缓冲区 输出: • Y:输出 yn,长度 M + d 的循环缓冲区 参数: • N:系数向量 B 的长度 • M:系数向量 A 的长度 • G:增益;输出到 Y 的值乘以 2**G,G ∈ [0:7] 当软件清除 FLT_MACC_PARAM1.START 时,函数完成。 使用FLT_MACC实现FIR滤波器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FLT_MACC 支持长度 N 的 FIR(N 为抽头/系数数)。最小本地存储需求:2N + 2(N 个系数、N 个输入样本、2 个输出样本)。为最大吞吐可在输入/输出缓冲区分别预留 d1 与 d2,总需求为 2N + d1 + d2。 缓冲区配置建议: - X1_BUF_SIZE = N + d1 - X2_BUF_SIZE = N - Y_BUF_SIZE = d2(如无额外空间则为 2) 缓冲区基地址可任意分配,但 X2 不得与其他区域重叠,以免系数被覆盖。示例: - X2_BASE = 0 - X1_BASE = N - Y_BASE = 2N + d1 .. note:: - X1 与 Y 缓冲区区域不得重叠。 - X1 配置寄存器 FULL_WM ≤ log2(d1),否则在写满 N 个输入样本前即标满,不再请求新样本。 - Y 配置寄存器 EMPTY_WM ≤ log2(d2)。 系数须通过“加载 X2 缓冲区”预装到 X2。X1 可选预装至多 N 个样本(q7 需 4 的倍数,q15 需 2 的倍数)。FIR 无反馈路径,无需预装 Y。 数据搬运方式(由 FLT_MACC_CR 选择): - 轮询:不使能 DMA/中断;写前检查 X1_FULL 为低,读前检查 Y_EMPTY 为低 - 中断:当 X1_FULL 为低(写)或 Y_EMPTY 为低(读)时产生中断请求 - DMA:当 X1_FULL 为低(写通道)或 Y_EMPTY 为低(读通道)时产生 DMA 请求 .. note:: 同一方向不可同时启用“中断”和“DMA”。 ======== ======== ========== ========== ============= ============= WIEN RIEN DMAWEN DMAREN 写方式 读方式 0 0 0 0 轮询 轮询 0 1 0 0 轮询 中断 1 0 0 0 中断 轮询 1 1 0 0 中断 中断 0 0 0 1 轮询 DMA 0 0 1 0 DMA 轮询 0 0 1 1 DMA DMA 0 1 1 0 DMA 中断 1 0 0 1 中断 DMA ======== ======== ========== ========== ============= ============= 启动 FIR 滤波: - FUNC = 7'b000_1000 - N = 系数数量 - M = don’t care - G = 增益 - START = 1 若 X1 预装少于 N + d − 2**FULL_WM,则 X1FULL 保持为低。 - 若 FLT_MACC_CR.WIEN 置位,则立即拉起写中断请求,提示处理器经 FLT_MACC_XWDATA 补写 2**FULL_WM 个样本;每完成 2**FULL_WM 次写入检查一次 X1FULL,直至其为高;若 DMAWEN 置位,则持续产生 DMA 写通道请求直至 X1FULL 置高。 - 当至少写入 N 个样本后产生首个输出。 - 当向 Y 写入满 2**EMPTY_WM 个输出样本时,YEMPTY 置低;若 RIEN 置位,拉起读中断请求,提示处理器经 FLT_MACC_RDATA 读取 2**EMPTY_WM 个样本;中断保持,直到 YEMPTY 置高。若 DMAREN 置位,则持续产生 DMA 读通道请求,直到 YEMPTY 置高。 - 中断服务程序应每完成 2**EMPTY_WM 次从 FLT_MACC_RDATA 读取后检查一次 YEMPTY,直至该标志置高。 滤波持续运行,直到软件清除 START。 使用FLT_MACC实现IIR滤波器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FLT_MACC 支持长度 N 的前馈与长度 M 的反馈 IIR(仅支持直接形式 1;其他结构需先转换)。为最大吞吐建议在输入与输出缓冲区额外预留 d1 与 d2,总需求为 2M + 2N + d1 + d2。 缓冲区配置: - X1_BUF_SIZE = N + d1 - X2_BUF_SIZE = N + M - Y_BUF_SIZE = M + d2 .. note:: - 各缓冲区基地址可任意分配,但不得重叠。 - FULL_WM、EMPTY_WM 的设置要求同 FIR。 系数(先 N 个前馈,再 M 个反馈)须通过“加载 X2 缓冲区”预装到 X2。X1 可选预装至多 N 个样本;Y 可选预装至多 M 个值以初始化反馈延迟线。 数据搬运方式与组合规则同 FIR。 启动配置: - 轮询:不使能 DMA/中断;写前检查 X1_FULL 为低再写 FLT_MACC_XWDATA,读前检查 Y_EMPTY 为低再读 FLT_MACC_RDATA - FUNC = 7'b001_0000 - N = 前馈系数数 - M = 反馈系数数 - G = 增益 - START = 1 若 X1 预装少于 N + d − 2**FULL_WM,则 X1FULL 保持为低: - 若 WIEN 置位,连续请求补写 2**FULL_WM 个样本;服务程序每完成 2**FULL_WM 次写入检查 X1FULL,直至为高。若 DMAWEN 置位,持续产生 DMA 写通道请求,直至 X1FULL 置高。 - 至少写入 N 个样本后计算首个输出:使用 X1 中前 N 个样本与 Y 中前 M 个样本(无论是否预装);首个输出写入地址为 Y_BASE + M。 - 当累计写入 2**EMPTY_WM 个新输出样本时,YEMPTY 置低;若 RIEN 置位,提示处理器经 FLT_MACC_RDATA 读取 2**EMPTY_WM 个样本;中断保持直到 YEMPTY 置高;若 DMAREN 置位,持续产生 DMA 读请求直到 YEMPTY 置高。 - 中断服务程序应每完成 2**EMPTY_WM 次从 FLT_MACC_RDATA 读取后检查一次 YEMPTY,直至该标志置高。 滤波持续运行,直到软件清除 START。 中断 ---- FLT_MACC 提供五个可屏蔽中断。通过 FLT_CR 可分别使能/禁止各中断;将相应屏蔽位置 1 即启用。 五个中断源如下: • 饱和错误标志(SAT) • 下溢错误标志(UNFL) • 溢出错误标志(OVFL) • 读中断标志(RIF) • 写中断标志(WIF) 寄存器 ------ FLT_MACC寄存器 ~~~~~~~~~~~~~~ FLT_MACC中寄存器和相应的偏移量如下表所示。 .. list-table:: 表 8.1: FLT_MACC中寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移量 - 寄存器名 - 功能描述 * - 0x0 - FLT_X1BUF_CFG - FLT_MACC X1缓冲区配置寄存器 * - 0x4 - FLT_X2BUF_CFG - FLT_MACC X2缓冲区配置寄存器 * - 0x8 - FLT_YBUF_CFG - FLT_MACC Y缓冲区配置寄存器 * - 0xC - FLT_PARAM0 - FLT_MACC 参数0寄存器 * - 0x10 - FLT_PARAM1 - FLT_MACC 参数1寄存器 * - 0x14 - FLT_CR - FLT_MACC 控制寄存器 * - 0x18 - FLT_SR - FLT_MACC 状态寄存器 * - 0x1C - FLT_XWDATA - FLT_MACC x缓冲区写数据寄存器 * - 0x20 - FLT_RDATA - FLT_MACC 读数据寄存器 * - 0x24 - FLT_YWDATA - FLT_MACC y缓冲区写数据寄存器 * - 0x2C - FLT_CFG - FLT_MACC 配置寄存器 * - 0x30 - FLT_MACC_VER - FLT_MACC 版本寄存器 FLT_MACC X1 缓冲区配置寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x0。 .. list-table:: 表 8.2: FLT_X1BUF_CFG格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - base - 11:0 - R/W - 0x0 - X1缓冲区的基地址 * - Reserved - 15:12 - / - 0x0 - / * - size - 26:16 - R/W - 0x0 - X1缓冲区大小。(缓冲区宽度为32位 最小缓冲区大小是滤波器中前馈抽头数(+水印阈值-1)) * - Reserved - 29:27 - / - 0x0 - / * - full_wm - 31:30 - R/W - 0x0 - 缓冲区满标志的水印 - 2'b00: 阈值=1 - 2'b01: 阈值=2 - 2'b10: 阈值=4 - 2'b11: 阈值=8 FLT_MACC X2 缓冲区配置寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x4。 .. list-table:: 表 8.3: FLT_X2BUF_CFG格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - base - 11:0 - R/W - 0x0 - X2缓冲区的基地址 * - Reserved - 15:12 - / - 0x0 - / * - size - 26:16 - R/W - 0x0 - X2缓冲区大小。(缓冲区宽度为32位 最小缓冲区大小是滤波器中前馈抽头数(+水印阈值-1)) * - Reserved - 31:27 - / - 0x0 - / FLT_MACC Y 缓冲区配置寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x8。 .. list-table:: 表 8.4: FLT_YBUF_CFG格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - base - 11:0 - R/W - 0x0 - Y缓冲区的基地址 * - Reserved - 15:12 - / - 0x0 - / * - size - 26:16 - R/W - 0x0 - Y缓冲区大小。(缓冲区宽度为32位 最小缓冲区大小是滤波器中前馈抽头数(+水印阈值-1)) * - Reserved - 29:27 - / - 0x0 - / * - empty_wm - 31:30 - R/W - 0x0 - 缓冲区空标志的水印 - 2'b00: 阈值=1 - 2'b01: 阈值=2 - 2'b10: 阈值=4 - 2'b11: 阈值=8 FLT_MACC 参数0寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0xC。 .. list-table:: 表 8.5: FLT_PARAM0格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - n - 10:0 - R/W - 0x0 - 输入参数N(前馈系数数量) 当函数正在进行时(START=1),此位字段不能被修改 * - m - 21:11 - R/W - 0x0 - 输入参数M(反馈系数数量) 当函数正在进行时(START=1),此位字段不能被修改 * - g - 26:22 - R/W - 0x0 - 输入参数G(增益系数) 当函数正在进行时(START=1),此位字段不能被修改 * - Reserved - 31:27 - / - 0x0 - / FLT_MACC 参数1寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x10。 .. list-table:: 表 8.6: FLT_PARAM1格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - func - 6:0 - R/W - 0x0 - 功能 - 7'b000_0001: 加载X1缓冲区 - 7'b000_0010: 加载X2缓冲区 - 7'b000_0100: 加载Y缓冲区 - 7'b000_1000: FIR滤波器 - 7'b001_0000: IIR滤波器(默认为直接形式1,若 n=2,m=2,则为双二阶(直接形式2)) - 其他:保留 当函数正在进行时(START=1),此位字段不能被修改 * - Reserved - 30:7 - / - 0x0 - / * - start - 31 - R/W - 0x0 - 启用执行 - 1'b0: 停止执行 - 1'b1: 开始执行 设置此位触发 FUNC 位字段中选择的函数的执行。通过软件复位它停止任何正在进行的函数。 FLT_MACC 控制寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x14。 .. list-table:: 表 8.7: FLT_CR格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - rien - 0 - R/W - 0x0 - 启用读中断 - 1'b0: 禁用。不生成读中断请求。 - 1'b1: 启用。当Y缓冲区EMPTY标志未设置时生成中断请求。 此位由软件设置和清除。读取返回位的当前状态。 * - wien - 1 - R/W - 0x0 - 启用写中断 - 1'b0: 禁用。不生成写中断请求。 - 1'b1: 启用。当X1缓冲区FULL标志未设置时生成中断请求。 此位由软件设置和清除。读取返回位的当前状态。 * - ovflien - 2 - R/W - 0x0 - 启用溢出错误中断 - 1'b0: 禁用。在溢出检测时不生成中断。 - 1'b1: 启用。如果OVFL标志被设置,则生成中断请求。 此位由软件设置和清除。读取返回位的当前状态。 * - unflien - 3 - R/W - 0x0 - 启用下溢错误中断 - 1'b0: 禁用。在下溢检测时不生成中断。 - 1'b1: 启用。如果UNFL标志被设置,则生成中断请求。 此位由软件设置和清除。读取返回位的当前状态。 * - satien - 4 - R/W - 0x0 - 启用饱和错误中断 - 1'b0: 禁用。在饱和检测时不生成中断。 - 1'b1: 启用。如果SAT标志被设置,则生成中断请求。 此位由软件设置和清除。读取返回位的当前状态。 * - dmaren - 5 - R/W - 0x0 - 启用DMA读通道请求 - 1'b0: 禁用。不生成DMA请求 - 1'b1: 启用。当Y缓冲区非空时生成DMA请求。 只有当FLT_PARAM寄存器中START=0时,此位才能被修改。读取返回位的当前状态。 * - dmawen - 6 - R/W - 0x0 - 启用DMA写通道请求 - 1'b0: 禁用。不生成DMA请求 - 1'b1: 启用。当X1缓冲区未满时生成DMA请求。 只有当FLT_PARAM寄存器中START=0时,此位才能被修改。读取返回位的当前状态。 * - clipen - 7 - R/W - 0x0 - 启用裁剪 - 1'b0: 裁剪禁用。累加器输出超出q1.15范围的值会回绕。 - 1'b1: 裁剪启用。累加器输出超出q1.15范围的值根据符号饱和到最大正值或负值(+1或-1)。 * - Reserved - 15:8 - / - 0x0 - / * - reset - 16 - R/W - 0x0 - 复位FLT_MACC单元 这复位写和读指针、内部控制逻辑、FLT_SR寄存器和FLT_PARAM寄存器,包括如果活动的START位。其他寄存器设置不受影响。此位由硬件复位。 - 1'b0: 复位非活动 - 1'b1: 复位活动 * - Reserved - 31:17 - / - 0x0 - / FLT_MACC 状态寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x18。 .. list-table:: 表 8.8: FLT_SR格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - yempty - 0 - RO - 0x1 - Y缓冲区空标志 如果未读数据的数量小于EMPTY_WM阈值,则缓冲区被标记为空。 未读数据的数量是读指针和当前输出目标地址之间的差。 - 1'b0: Y缓冲区非空。如果RIEN位被设置,中断请求被断言直到标志被设置。如果DMAREN被设置,DMA读通道请求被生成直到标志被设置。 - 1'b1: Y缓冲区空。 此位由硬件设置和清除,或通过复位。 * - x1full - 1 - RO - 0x1 - X1缓冲区满标志 如果可用空间的数量小于FULL_WM阈值,则缓冲区被标记为满。 可用空间的数量是写指针和当前使用的最近样本之间的差。 - 1'b0: X1缓冲区未满。如果WIEN位被设置,中断请求被断言直到标志被设置。如果DMAWEN被设置,DMA写通道请求被生成直到标志被设置。 - 1'b1: X1缓冲区满。 此位由硬件设置和清除,或通过复位。 * - ovfl - 2 - RO - 0x0 - 溢出错误标志 当在X1缓冲区中没有可用空间时对FLT_WDATA进行写入时发生溢出。 - 1'b0: 未检测到溢出。 - 1'b1: 检测到溢出。如果OVFILEN位被设置,则生成中断。 此标志通过单元复位清除。 * - unfl - 3 - RO - 0x0 - 下溢错误标志 当在Y缓冲区中没有有效数据可用时从FLT_RDATA进行读取时发生下溢。 - 1'b0: 未检测到下溢 - 1'b1: 检测到下溢。如果UNFLIEN被设置,则生成中断。 此标志通过单元复位清除。 * - sat - 4 - RO - 0x0 - 饱和错误标志 当累加的结果超出累加器的数值范围时发生饱和。 - 1'b0: 未检测到饱和 - 1'b1: 检测到饱和。如果SATIEN位被设置,则生成中断。 此位通过单元复位清除。 * - rif - 5 - W1C - 0x0 - 读中断标志 * - wif - 6 - W1C - 0x0 - 写中断标志 * - Reserved - 31:7 - / - 0x0 - / FLT_MACC 写数据寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x1C。 .. list-table:: 表 8.9: FLT_XWDATA格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - wdata - 31:0 - WO - 0x0 - 写数据。对该寄存器执行写访问时,写数据将被传输到由写指针指示的地址偏移;指针地址在每次写访问后自动递增。 FLT_MACC 读数据寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x20。 .. list-table:: 表 8.10: FLT_RDATA格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - rdata - 31:0 - RO - 0x0 - 读数据。对该寄存器执行读访问时,读数据为由写指针指示地址偏移处的 Y 输出缓冲区内容;指针地址在每次读访问后自动递增。 FLT_MACC Y 缓冲区写数据寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x24。 .. list-table:: 表 8.11: FLT_YWDATA格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - wdata - 31:0 - WO - 0x0 - 写数据。对该寄存器执行写访问时,写数据将被传输到由写指针指示的地址偏移;指针地址在每次写访问后自动递增。 FLT_MACC 配置寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x2C。 .. list-table:: 表 8.12: FLT_CFG格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - rm - 2:0 - R/W - 0x0 - 舍入模式 | 定点:3'b000 向下;3'b001 最近偶数;3'b010 最近向上;3'b011 奇数;其他:保留 | 浮点:3'b000 最近且偶数;3'b001 到零;3'b010 向下;3'b011 向上;3'b100 最近且最大幅度;3'b101 最近且奇数;其他:保留 * - Reserved - 3 - / - 0x0 - / * - fm - 5:4 - R/W - 0x0 - 数据格式 - 2'b00: Q7 - 2'b01: Q15 - 2'b10: Q31 - 2'b11: 保留 * - Reserved - 31:6 - / - 0x0 - / FLT_MACC 版本寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x30。 .. list-table:: 表 8.13: FLT_MACC_VER格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - version - 31:0 - RO - 0x10002 - flt_macc版本