首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FPGA开发之调用FFT IP核

FPGA开发之调用FFT IP核

有三种FFT:
(1) 流水线,Streaming I/O 结构 :允许连续的数据处理 ;
(2) 基 4,Burst I/O 结构:提供数据导入/导出阶段和处理阶段。此结构拥有较小的结构,但转换时间较长;
(3) 基 2,Burst I/O 结构:使用最少的逻辑资源,同 Radix-4 相同,提供两阶段的过程。

第一种结构,即流水线 Streaming I/O结构,以进行连续的数据处理。在进行当前帧的N点数据时,可加载下一帧的N点数据,同时输出前一帧的N点数据。此结构由多个基 2 的蝶形处理单元构成,每个单元都有自己的存储单元来存储输入和中间处理的数据,
其结构如图 5-58 所示。


FFT 的计算单元具有丰富的控制信号,其详细说明见下文。
XN_RE、XN_IM :输入操作数,分别为实部和虚部,以 2 的补码输入。在使用时应当确定其位宽。
START :FFT 开始信号,高有效。当此信号变高时,开始输入数据,随后直接进行 FFT 转换操作和数据输出。一个 START 脉冲,允许对一帧进行 FFT 转换。如果每 N 个时钟有一个 START 脉冲或者 START 始终为高,,则都可以连续进行 FFT。如果在最初的 START 前,还没有 NFFT_WE,FWD_INV_WE,SCALE_SCH_WE信号,则 START 变高后就使用这些信号的默认值。由于此 IP Core 支持非连续的数据流,因此在任何时间输入START,即可开始数据的加载。当加载 N 个数据结束后,就开始 FFT 转换运算。
UNLOAD :对于 Burst I/O 结构,此信号将开始输出处理的结果。对于流水线结构和比特逆序输出的情况,此端口不是必要的。
NFFT :此端口只对实时可配置应用时有用。
NFFT_WE :此端口是 NFFT 端口的使能信号。
FWD_INV :用以指示 IP Core 为 FFT 还是 IFFT,其等于 1 时 IP Core 进行 FFT 运算,否则进行 IFFT 运算。至于采用哪种转换运算是可以逐帧变化的。这一端口给 FFT 的使用提供了很大的方便。
FWD_INV_WE :作为 FWD_INV 端口的使能信号。
SCALE_SCH:(1) 在 IP Core 设计时,如果选择在计算过程中进行中间数据的缩减,那么此信号才可起作用;(2) 输入的位宽等于 2*ceil(NFFT/2),其中 NFFT = log2(point size)。(3) 流水线结构中,将每个基 2 的蝶形处理单元视为一个阶段,每个阶段进行一次数据的缩减,缩减的比例以此输入中对应阶段的两比特表示。(4) 每阶段的两比特数可以是 3,2,1 或 0 :它们表示了数据所需要移动的比特数。
SCALE_SCH_WE :作为 SCALE_SCH 的使能信号。
SCLR :可选端口。
Reset :重置信号端口。Reset=1 时,所有工作都停止且初始化。但内部的帧缓存保留其内容。
CE :可选端口。
CLK :输入时钟。
XK_RE,XK_IM :输出数据总线,以 2 的补码输出。SCALE_SCH_WE 有效时,输出位宽等于输入 ;否则,输出位宽 = 输入位宽 +NFFT+1。
XN_INDEX :位宽等于 log2(point size),输入数据的下标。

XK_INDEX :位宽等于 log2(point size),输出数据的下标。
RFD :数据有效信号,高有效,在加载数据时为高电平。
BUSY :IP Core 工作状态的指示信号,在计算 FFT 转换时为高电平。
DV :数据有效指示信号,当输出端口存在有效数据时变高。
EDONE :高有效。在 DONE 信号变高的前一个时钟变为高电平。
DONE :高有效。在 FFT 完成后变高,且只存在一个时钟。在 DONE 变高后,IP Core 开始输出计算结果。
BLK_EXP :当使用 Burst I/O 结构时可用,若选择流水线,则此端口无效
OVFLO :算法溢出指示。在数据输出时,如每帧有溢出,此信号变高。在每帧开始处,此信号重置。
例 5.7.1 使用 IP Core 实例化一个 16 点、位宽为 16 位的 FFT 模块。
IP Core 直接生成的乘法器的 Verilog 模块接口为 :
module fft16(sclr, fwd_inv_we, rfd, start, fwd_inv, dv, scale_sch_we, done, clk, busy, edone, scale_sch, xn_re, xk_im, xn_index, xk_re, xn_im, xk_index);
input sclr , fwd_inv_we, start, fwd_inv, scale_sch_we, clk;
input [3 : 0] scale_sch;
input [15 : 0] xn_re;
output rfd, dv, done, busy, edone;
output [15 : 0] xk_im;
output [3 : 0] xn_index;
output [15 : 0] xk_re;
input [15 : 0] xn_im;
output [3 : 0] xk_index;
……
endmodule

在使用时,直接调用 multiply 模块即可,如
module fft16(sclr, fwd_inv_we, rfd, start, fwd_inv, dv, scale_sch_we, done, clk, busy, edone, scale_sch, xn_re, xk_im, xn_index, xk_re, xn_im, xk_index);
input sclr , fwd_inv_we, start, fwd_inv, scale_sch_we, clk;
input [3 : 0] scale_sch;
input [15 : 0] xn_re;
output rfd, dv, done, busy, edone;
output [15 : 0] xk_im;
output [3 : 0] xn_index;
output [15 : 0] xk_re;
input [15 : 0] xn_im;
output [3 : 0] xk_index;
fft fft1( // 调用 FFT 的 IPCore
.sclr(sclr), .fwd_inv_we(fwd_inv_we), .rfd(rfd), .start(start), .fwd_inv(fwd_inv),
.dv(dv), .scale_sch_we(scale_sch_we), .done(done), .clk(clk), .busy(busy),
.edone(edone), .scale_sch(scale_sch), .xn_re(xn_re), .xk_im(xk_im),
.xn_index(xn_index), .xk_re(xk_re), .xn_im(xn_im), .xk_index(xk_index));
endmodule
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表