FFT

简介

芯来快速傅里叶变换(FFT)是一类用于离散傅里叶变换(DFT)数字计算的高效算法。在信号处理过程中,可以收集和分析信号的时域和频域信息。

主要特性

FFT 的主要特性如下:

  • 支持变换点大小 n = 2^m,其中 m = 4 ~ 12。

  • 支持 16 位和 32 位定点数据格式。

  • 支持总线最大传输宽度 64 位。

  • 支持基 2 按时间抽取(DIT)和按频率抽取(DIF)的 FFT、IFFT 算法。

  • 支持蝶形运算后的舍入和截断饱和,以防止溢出。

  • 支持三种类型的输入数据数组:虚部和实部交替(IRIR)、先实部后虚部(RnIn)、仅实部(R_R)、实部和虚部分离(RR,II)。

  • 支持单端口本地 SRAM 缓存,并且总线可以独立访问 SRAM 功能。

  • 支持加速外部功能,如缩放、复数乘法、实数乘法、偏移等,类似于计算单元,具体需看硬件是否配置了此功能。

功能描述

FFT 模块框图

FFT 模块框图

图 3.1: FFT 模块框图

FFT IP 可以实现基于基 2 时域和频域抽取的 FFT 和 IFFT,可以与 SoC 总线上的其他 IP 结合使用,也可以部分加速其他涉及乘法单元的功能。支持多组本地 SRAM 乒乓缓存,并且总线可以独立访问 SRAM 功能。其硬件架构框图如图 3.1 所示。

该 IP 可以支持 16 点到 4096 点的 FFT 和 IFFT,具体工作模式可以通过 SoC 总线配置寄存器控制单元完成。工作模式配置完成后,开启 IP 使能信号。当流控模块发送 TX 请求时,数据流通过 SoC 总线传输,并在排列和预处理后存储在 SRAM 中。数据传输的大小与点数的配置有关。数据准备就绪后,蝶形单元开始进行乒乓读写操作。操作完成会触发完成标志信号,流控模块发送 RX 请求,并通过 SoC 总线将计算结果传输到目标地址。

如果当前寄存器配置保持不变,FFT 流控模块可以继续发送 TX 请求以启动下一次 FFT 操作。否则,需要重新配置。

FFT 配置使用

示例

以下示例展示了 FFT IP 的详细配置。

表 3.1: FFT 参数

参数

值

FFT 点数

16 点数

定点数据格式

32位

计算模式

时域 FFT

输入模式

RIRI

输入数据缩放使能与否

使能

输入数据舍入使能与否

使能

表 3.2: 配置寄存器

寄存器

位域

值

FFT_CTRL

FFT_POINT

4’b1000

FFT_CTRL

FFT_CAL_MODE

2’b00

FFT_CTRL

FFT_ENABLE

1’b1

FFT_CTRL

FFT_INPUT_MODE

2’b00

FFT_CTRL

FFT_DATA_FORM

1’b0

FFT_CTRL

FFT_SCAL_EN

1’b1

FFT_CTRL

FFT_ROUND_EN

1’b1

BUS_SRC_ADDR

BUS_SRC_ADDR

32’h30000000

BUS_DES_ADDR

BUS_DES_ADDR

32’hC0000000

在这种情况下,可以实现基于基 2 时域的 32 位 FFT。步骤如下:

  • 步骤 1:通过总线配置 FFT 计算工作模式寄存器,包括 FFT 使能、点数、数据模式、计算模式等。

  • 步骤 2:在步骤 1 完成后,使能 FFT 配置完成标志,用于旋转因子和 FFT 操作数据传输。

  • 步骤 3:流控模块发送读数据请求,数据流通过 SoC 总线传输,并在排列和预处理后存储在 SRAM 中,这可以与步骤 2 的同时进行。

  • 步骤 4:首先传输旋转因子,完成后拉高 tf_done 信号,然后传输操作数据。这可以在步骤 2 完成后进行。

  • 步骤 5:拉高 FFT 启动信号,蝶形单元开始进行乒乓读写操作。操作完成会触发 FFT 计算完成标志信号 alu_done,这可以在步骤 4 完成后进行。

  • 步骤 6:流控模块发送写请求,并通过 SoC 总线传输计算结果,这可以在步骤 5 完成后进行。

  • 步骤 7:FFT 整个操作完成后,拉高 FFT_done 信号。如果配置保持不变,FFT 可以启动下一次计算。

中断

FFT 有两组中断信号,一组是总线传输的读中断错误和写中断错误;另一组是 FFT 内部中断类型,分为 fft 计算工作中、计算结束标志和旋转因子传输结束标志。

表 4.1: FFT 中断请求

中断事件

事件标志

使能控制位

ICB 总线读错误

fft_bus_rd_err_intr

fft_bus_rd_err_intr_mask

ICB 总线写错误

fft_bus_wr_err_intr

fft_bus_wr_err_intr_mask

FFT 完成

fft_done_intr

fft_done_intr_mask

FFT 工作中

fft_work_intr

fft_work_intr_mask

旋转因子完成

fft_tf_done_intr

fft_tf_done_intr_mask

寄存器

FFT 寄存器

FFT 中的寄存器及其对应偏移量如 FFT 中寄存器的偏移地址如下表所示:

表 5.1: FFT 中寄存器的偏移地址

偏移

寄存器名称

功能描述

0x0

FFT_CTRL

FFT 计算模式配置

0x4

FFT_INT_CTRL

FFT ICB 总线中断配置

0x8

FFT_INT_STATUS

FFT ICB 总线中断状态

0x14

BUS_SRC_ADDR

ICB 总线源地址

0x18

BUS_DES_ADDR

ICB 总线目的地址

0x1C

FFT_CFG_DONE

FFT 配置完成状态

0x24

BUS_SRC_IMAGE_ADDR

ICB 总线源图像地址

0x30

FFT_SRAM_SEL

FFT SRAM 选择控制寄存器

0x80

FFT_IP_VER

FFT 版本寄存器

FFT_CTRL 寄存器

地址偏移:0x0

表 5.2: FFT_CTRL 的寄存器格式

字段

位

访问

复位值

描述

FFT_POINT

3:0

读/写

0x0

FFT 操作长度点数配置
  • 4’d0: 4096 点操作

  • 4’d1: 2048 点操作

  • 4’d2: 1024 点操作

  • 4’d3: 512 点操作

  • 4’d4: 256 点操作

  • 4’d5: 128 点操作

  • 4’d6: 64 点操作

  • 4’d7: 32 点操作

  • 4’d8: 16 点操作

FFT_CAL_MODE

5:4

读/写

0x0

时域和频域操作模式选择
  • 2’d0: 时域 FFT

  • 2’d1: 频域 IFFT

  • 2’d2: 频域 FFT

  • 2’d3: 时域 IFFT

FFT_ENABLE

6

读/写

0x0

FFT 操作使能
  • 1’b0: 禁用

  • 1’b1: 使能

FFT_INPUT_MODE

8:7

读/写

0x0

FFT 输入数据排列方式
  • 2’d0: 按 RIRI 方法输入

  • 2’d1: 按 RnIn 方法输入

  • 2’d2: 仅输入实部,虚部默认为 0

  • 2’d3: 先输入实部,后输入虚部

FFT_DATA_FORM

9

读/写

0x0

FFT 计算数据位宽选择
  • 1’b0: 32 位数据计算

  • 1’b1: 16 位数据计算

FFT_SCAL_EN

10

读/写

0x1

FFT 数据输入缩放使能控制
  • 1’b0: 禁用

  • 1’b1: 使能

FFT_ROUND_EN

11

读/写

0x1

FFT 数据舍入使能控制
  • 1’b0: 禁用

  • 1’b1: 使能

FFT_SHIFT_DFS

12

读/写

0x1

FFT 数据移位使能控制
  • 1’b0: 禁用

  • 1’b1: 使能

保留

31:13

/

0x0

/

FFT ICB 总线中断配置寄存器

地址偏移:0x4

表 5.3: FFT_INT_CTRL 的寄存器格式

字段

位

访问

复位值

描述

BUS_WR_ERR_INTR_MASK

0

读/写

0x0

ICB 总线写错误中断掩码

BUS_WR_ERR_INTR_MASK

1

读/写

0x0

ICB 总线读错误中断掩码

FFT_DONE_INTR_MASK

2

读/写

0x0

FFT 完成中断掩码

FFT_WORK_INTR_MASK

3

读/写

0x0

FFT 工作中中断掩码

TF_DONE_INTR_MASK

4

读/写

0x0

旋转因子完成中断掩码

保留

31:5

/

0x0

/

FFT ICB 总线中断状态寄存器

地址偏移:0x8

表 5.4: FFT_INT_STATUS 的寄存器格式

字段

位

访问

复位值

描述

BUS_WR_ERR_INTR

0

写0清除

0x0

ICB 总线写错误中断

BUS_RD_ERR_INTR

1

写0清除

0x0

ICB 总线读错误中断

FFT_DONE_INTR

2

写0清除

0x0

FFT 完成中断

FFT_WORK_INTR

3

写0清除

0x0

FFT 工作中中断

TF_DONE_INTR

4

写0清除

0x0

旋转因子完成中断

保留

31:5

/

0x0

/

ICB 总线源地址寄存器

地址偏移:0x14

表 5.5: BUS_SRC_ADDR 的寄存器格式

字段

位

访问

复位值

描述

BUS_SRC_ADDR

31:0

读/写

0x0

总线传输源数据块的低基地址

ICB 总线目的地址寄存器

地址偏移:0x18

表 5.6: BUS_DES_ADDR 的寄存器格式

字段

位

访问

复位值

描述

BUS_DES_ADDR

31:0

读/写

0x0

总线传输目的数据块的低基地址

FFT 配置完成状态寄存器

地址偏移:0x1C

表 5.7: FFT_CFG_DONE 的寄存器格式

字段

位

访问

复位值

描述

FFT_CFG_DONE

0

读/写

0x0

FFT 配置操作完成控制

保留

31:1

/

0x0

/

BUS_SRC_IMAGE_ADDR

地址偏移:0x24

表 5.8: BUS_SRC_IMAGE_ADDR 的寄存器格式

字段

位

访问

复位值

描述

BUS_SRC_IMAGE_ADDR

31:0

读/写

0x0

总线传输源图像数据块的低基地址

FFT SRAM 选择控制寄存器

地址偏移:0x30

表 5.9: FFT_SRAM_SEL 的寄存器格式

字段

位

访问

复位值

描述

FFT_SRAM_SEL

0

读/写

0x0

FFT 内部 SRAM 选择控制
  • 1’b0: 选择旋转因子传输到 SRAM

  • 1’b1: 选择原始数据传输到 SRAM

保留

31:1

/

0x0

/

FFT IP 版本寄存器

地址偏移:0x80

表 5.10: FFT IP_VER 的寄存器格式

字段

位

访问

复位值

描述

FFT IP_VER

31:0

只读

0x0001_0002

  • 32 位版本号:

  • [31:24] 保留

  • [23:16] 主版本号

  • [15:8] 次版本号

  • [7:0] 补丁版本号