.. _soc_ip_fft: FFT ############## .. toctree:: :maxdepth: 2 :caption: 目录: .. contents:: 目录 :depth: 3 简介 -------- 芯来快速傅里叶变换(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 模块框图 ~~~~~~~~~~~~~~~~~ .. figure:: /assets/images/fft_block.png :alt: FFT 模块框图 :align: center 图 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 的详细配置。 .. list-table:: 表 3.1: FFT 参数 :header-rows: 1 :widths: auto * - 参数 - 值 * - FFT 点数 - 16 点数 * - 定点数据格式 - 32位 * - 计算模式 - 时域 FFT * - 输入模式 - RIRI * - 输入数据缩放使能与否 - 使能 * - 输入数据舍入使能与否 - 使能 .. list-table:: 表 3.2: 配置寄存器 :header-rows: 1 :widths: auto * - 寄存器 - 位域 - 值 * - 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 计算工作中、计算结束标志和旋转因子传输结束标志。 .. list-table:: 表 4.1: FFT 中断请求 :header-rows: 1 :widths: auto * - 中断事件 - 事件标志 - 使能控制位 * - 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 中寄存器的偏移地址如下表所示: .. list-table:: 表 5.1: FFT 中寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移 - 寄存器名称 - 功能描述 * - 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 .. list-table:: 表 5.2: FFT_CTRL 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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 .. list-table:: 表 5.3: FFT_INT_CTRL 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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 .. list-table:: 表 5.4: FFT_INT_STATUS 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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 .. list-table:: 表 5.5: BUS_SRC_ADDR 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - BUS_SRC_ADDR - 31:0 - 读/写 - 0x0 - 总线传输源数据块的低基地址 ICB 总线目的地址寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x18 .. list-table:: 表 5.6: BUS_DES_ADDR 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - BUS_DES_ADDR - 31:0 - 读/写 - 0x0 - 总线传输目的数据块的低基地址 FFT 配置完成状态寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x1C .. list-table:: 表 5.7: FFT_CFG_DONE 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - FFT_CFG_DONE - 0 - 读/写 - 0x0 - FFT 配置操作完成控制 * - 保留 - 31:1 - / - 0x0 - / BUS_SRC_IMAGE_ADDR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x24 .. list-table:: 表 5.8: BUS_SRC_IMAGE_ADDR 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - BUS_SRC_IMAGE_ADDR - 31:0 - 读/写 - 0x0 - 总线传输源图像数据块的低基地址 FFT SRAM 选择控制寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x30 .. list-table:: 表 5.9: FFT_SRAM_SEL 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - FFT_SRAM_SEL - 0 - 读/写 - 0x0 - FFT 内部 SRAM 选择控制 - 1'b0: 选择旋转因子传输到 SRAM - 1'b1: 选择原始数据传输到 SRAM * - 保留 - 31:1 - / - 0x0 - / FFT IP 版本寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x80 .. list-table:: 表 5.10: FFT IP_VER 的寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - FFT IP_VER - 31:0 - 只读 - 0x0001_0002 - - 32 位版本号: - [31:24] 保留 - [23:16] 主版本号 - [15:8] 次版本号 - [7:0] 补丁版本号