FLT_MACC

简介

滤波器数学加速器可执行有限脉冲响应(FIR)和无限脉冲响应(IIR)滤波。该单元允许将频繁或耗时的滤波运算从 CPU 卸载,从而让处理器专注于其他任务。在许多情况下,相比纯软件实现,它能显著加速此类计算,进而加速对时序要求严格的任务。

该单元内置一块用于输入与输出数据的本地存储器,可通过寄存器接口进行访问。

主要特性

FLT_MACC 的主要特性包括:
  • 支持 q7、q15、q31 数据类型

  • 支持 FIR 和 IIR(直接形式 1)函数,最大抽头数 1023

  • 可在本地存储器中定义至多 3 个数据缓冲区区域(两个输入,一个输出),由可编程基地址指针与配套大小寄存器指定

  • 输入与输出缓冲区可配置为循环缓冲区,系数缓冲区为固定缓冲区

  • 支持向量函数:点积、卷积、相关

  • ICB 从机接口

  • DMA 读写请求与应答通道

  • 本地存储器支持由 SoC 中的其他主机访问

功能描述

FLT_MACC 单元执行定点的乘法与累加(MAC)。

FLT_MACC 的框图如图 6.1 所示。

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中寄存器和相应的偏移量如下表所示。

表 8.1: FLT_MACC中寄存器的偏移地址

偏移量

寄存器名

功能描述

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。

表 8.2: FLT_X1BUF_CFG格式

字段

位

访问

复位值

描述

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。

表 8.3: FLT_X2BUF_CFG格式

字段

位

访问

复位值

描述

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。

表 8.4: FLT_YBUF_CFG格式

字段

位

访问

复位值

描述

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。

表 8.5: FLT_PARAM0格式

字段

位

访问

复位值

描述

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。

表 8.6: FLT_PARAM1格式

字段

位

访问

复位值

描述

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。

表 8.7: FLT_CR格式

字段

位

访问

复位值

描述

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。

表 8.8: FLT_SR格式

字段

位

访问

复位值

描述

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。

表 8.9: FLT_XWDATA格式

字段

位

访问

复位值

描述

wdata

31:0

WO

0x0

写数据。对该寄存器执行写访问时,写数据将被传输到由写指针指示的地址偏移;指针地址在每次写访问后自动递增。

FLT_MACC 读数据寄存器

地址偏移:0x20。

表 8.10: FLT_RDATA格式

字段

位

访问

复位值

描述

rdata

31:0

RO

0x0

读数据。对该寄存器执行读访问时,读数据为由写指针指示地址偏移处的 Y 输出缓冲区内容;指针地址在每次读访问后自动递增。

FLT_MACC Y 缓冲区写数据寄存器

地址偏移:0x24。

表 8.11: FLT_YWDATA格式

字段

位

访问

复位值

描述

wdata

31:0

WO

0x0

写数据。对该寄存器执行写访问时,写数据将被传输到由写指针指示的地址偏移;指针地址在每次写访问后自动递增。

FLT_MACC 配置寄存器

地址偏移:0x2C。

表 8.12: FLT_CFG格式

字段

位

访问

复位值

描述

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。

表 8.13: FLT_MACC_VER格式

字段

位

访问

复位值

描述

version

31:0

RO

0x10002

flt_macc版本