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 模块框图
图 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 的详细配置。
参数 |
值 |
|---|---|
FFT 点数 |
16 点数 |
定点数据格式 |
32位 |
计算模式 |
时域 FFT |
输入模式 |
RIRI |
输入数据缩放使能与否 |
使能 |
输入数据舍入使能与否 |
使能 |
寄存器 |
位域 |
值 |
|---|---|---|
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 计算工作中、计算结束标志和旋转因子传输结束标志。
中断事件 |
事件标志 |
使能控制位 |
|---|---|---|
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 中寄存器的偏移地址如下表所示:
偏移 |
寄存器名称 |
功能描述 |
|---|---|---|
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
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
FFT_POINT |
3:0 |
读/写 |
0x0 |
|
FFT_CAL_MODE |
5:4 |
读/写 |
0x0 |
|
FFT_ENABLE |
6 |
读/写 |
0x0 |
|
FFT_INPUT_MODE |
8:7 |
读/写 |
0x0 |
|
FFT_DATA_FORM |
9 |
读/写 |
0x0 |
|
FFT_SCAL_EN |
10 |
读/写 |
0x1 |
|
FFT_ROUND_EN |
11 |
读/写 |
0x1 |
|
FFT_SHIFT_DFS |
12 |
读/写 |
0x1 |
|
保留 |
31:13 |
/ |
0x0 |
/ |
FFT ICB 总线中断配置寄存器
地址偏移:0x4
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
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
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
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
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
BUS_SRC_ADDR |
31:0 |
读/写 |
0x0 |
总线传输源数据块的低基地址 |
ICB 总线目的地址寄存器
地址偏移:0x18
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
BUS_DES_ADDR |
31:0 |
读/写 |
0x0 |
总线传输目的数据块的低基地址 |
FFT 配置完成状态寄存器
地址偏移:0x1C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
FFT_CFG_DONE |
0 |
读/写 |
0x0 |
FFT 配置操作完成控制 |
保留 |
31:1 |
/ |
0x0 |
/ |
BUS_SRC_IMAGE_ADDR
地址偏移:0x24
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
BUS_SRC_IMAGE_ADDR |
31:0 |
读/写 |
0x0 |
总线传输源图像数据块的低基地址 |
FFT SRAM 选择控制寄存器
地址偏移:0x30
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
FFT_SRAM_SEL |
0 |
读/写 |
0x0 |
|
保留 |
31:1 |
/ |
0x0 |
/ |
FFT IP 版本寄存器
地址偏移:0x80
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
FFT IP_VER |
31:0 |
只读 |
0x0001_0002 |
|