Vivado中FFT9.1 IP核的使用(1)中已经介绍了最简单的FFT操作方式:即固定变换长度,仅仅控制少量控制信号:
s_axis_config_tdata // input,配置数据
s_axis_config_tvalid // input,配置数据有效信号
s_axis_data_tdata // input ,输入数据
s_axis_data_tvalid // input ,输入数据有效信号
s_axis_data_tlast // input ,输入数据结束信号
在此基础上,这一部分对在线变换长度进行测试:
配置FFT核时应注意,选定在线更改点数选项
如下:
其余配置不变,配置结束查看配置情况:
可以看出,此时变换长度最小为8,最大为设置的32点;意味着变换长度在8-16-32之间可以在线设置。
s_axis_config_tdata长度也改变了,考虑到PAD扩展,一共24位,各位对应的配置项如上图Implementation details所示;
32点变换测试:
主要应修改s_axis_config_tdata的配置,由Implementation details可以看出s_axis_config_tdata的配置情况:
s_axis_config_tdata[4:0] 为 NFFT,32点时NFFT=00101
s_axis_config_tdata[7:5] 为 PAD补零,PAD=000
s_axis_config_tdata[8:8] 为 FWD_INV_0(通道0正反FFT变换选择),正变换时FWD_INV_0=1
s_axis_config_tdata[18:9] 为 SCALE_SCH_0(通道0缩放策略选择),取SCALE_SCH_0=0000000000(不缩放)
s_axis_config_tdata[24:19] 为 PAD补零,PAD=000000
综上,配置数据为:s_axis_config_tdata = 000000_0000000000_1_000_00101。
测试文件:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
module fft_tsb(
);
reg aclk;
reg [23 : 0] s_axis_config_tdata;
reg s_axis_config_tvalid;
wire s_axis_config_tready;
wire [31 : 0] s_axis_data_tdata;
reg s_axis_data_tvalid;
wire s_axis_data_tready;
reg s_axis_data_tlast;
wire [31 : 0] m_axis_data_tdata;
wire m_axis_data_tvalid;
reg m_axis_data_tready;
wire m_axis_data_tlast;
reg [15:0] real_data;
reg [15:0] imag_data;
wire [15:0] real_dataout;
wire [15:0] imag_dataout;
reg [9:0] cnt;
assign s_axis_data_tdata={real_data,imag_data};
assign real_dataout = m_axis_data_tdata[31:16];
assign imag_dataout = m_axis_data_tdata[15:0];
initial begin
aclk = 0;
s_axis_config_tdata=24'b0;
s_axis_config_tvalid=1'b0;
s_axis_data_tvalid=1'b0;
s_axis_data_tlast=1'b0;
real_data=16'd0;
imag_data=16'd0;
cnt = 0;
m_axis_data_tready=1'b1;
#1000;
s_axis_config_tdata=24'b00000000_00000001_000_00101;
// s_axis_config_tdata=24'b00000000_00000001_000_00011;
s_axis_config_tvalid=1'b1;
#10;
s_axis_config_tdata=24'b00000000_00000000_000_00000;
s_axis_config_tvalid=1'b0;
#1000;
repeat(32)begin
s_axis_data_tvalid=1'b1;
real_data=real_data+16'd1;
cnt=cnt+1;
if(cnt==32) s_axis_data_tlast=1'b1;
#10;
end
s_axis_data_tvalid=1'b0;
s_axis_data_tlast=1'b0;
real_data=16'd0;
#1000;
$stop;
end
always #(5) aclk= ~aclk;
xfft_0 Uxfft(
.aclk(aclk), // input wire aclk
.s_axis_config_tdata(s_axis_config_tdata), // input wire [7 : 0] s_axis_config_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tready(s_axis_config_tready), // output wire s_axis_config_tready
.s_axis_data_tdata(s_axis_data_tdata), // input wire [31 : 0] s_axis_data_tdata
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tlast(s_axis_data_tlast), // input wire s_axis_data_tlast
.m_axis_data_tdata(m_axis_data_tdata), // output wire [31 : 0] m_axis_data_tdata
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tready(m_axis_data_tready), // input wire m_axis_data_tready
.m_axis_data_tlast(m_axis_data_tlast) // output wire m_axis_data_tlast
);
endmodule
仿真结果:
8点变换测试:
主要应修改s_axis_config_tdata的配置,由Implementation details可以看出s_axis_config_tdata的配置情况:
s_axis_config_tdata[4:0] 为 NFFT,8点时NFFT=00011
s_axis_config_tdata[7:5] 为 PAD补零,PAD=000
s_axis_config_tdata[8:8] 为 FWD_INV_0(通道0正反FFT变换选择),正变换时FWD_INV_0=1
s_axis_config_tdata[18:9] 为 SCALE_SCH_0(通道0缩放策略选择),取SCALE_SCH_0=0000000000(不缩放)
s_axis_config_tdata[24:19] 为 PAD补零,PAD=000000
综上,配置数据为:s_axis_config_tdata = 000000_0000000000_1_000_00011。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/06/28 21:17:52
// Design Name:
// Module Name: fft_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module fft_tsb(
);
reg aclk;
reg [23 : 0] s_axis_config_tdata;
reg s_axis_config_tvalid;
wire s_axis_config_tready;
wire [31 : 0] s_axis_data_tdata;
reg s_axis_data_tvalid;
wire s_axis_data_tready;
reg s_axis_data_tlast;
wire [31 : 0] m_axis_data_tdata;
wire m_axis_data_tvalid;
reg m_axis_data_tready;
wire m_axis_data_tlast;
reg [15:0] real_data;
reg [15:0] imag_data;
wire [15:0] real_dataout;
wire [15:0] imag_dataout;
reg [9:0] cnt;
assign s_axis_data_tdata={real_data,imag_data};
assign real_dataout = m_axis_data_tdata[31:16];
assign imag_dataout = m_axis_data_tdata[15:0];
initial begin
aclk = 0;
s_axis_config_tdata=24'b0;
s_axis_config_tvalid=1'b0;
s_axis_data_tvalid=1'b0;
s_axis_data_tlast=1'b0;
real_data=16'd0;
imag_data=16'd0;
cnt = 0;
m_axis_data_tready=1'b1;
#1000;
// s_axis_config_tdata=24'b00000000_00000001_000_00101;
s_axis_config_tdata=24'b00000000_00000001_000_00011;
s_axis_config_tvalid=1'b1;
#10;
s_axis_config_tdata=24'b00000000_00000000_000_00000;
s_axis_config_tvalid=1'b0;
#1000;
repeat(8)begin
s_axis_data_tvalid=1'b1;
real_data=real_data+16'd1;
cnt=cnt+1;
if(cnt==8) s_axis_data_tlast=1'b1;
#10;
end
s_axis_data_tvalid=1'b0;
s_axis_data_tlast=1'b0;
real_data=16'd0;
#1000;
$stop;
end
always #(5) aclk= ~aclk;
xfft_0 Uxfft(
.aclk(aclk), // input wire aclk
.s_axis_config_tdata(s_axis_config_tdata), // input wire [7 : 0] s_axis_config_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tready(s_axis_config_tready), // output wire s_axis_config_tready
.s_axis_data_tdata(s_axis_data_tdata), // input wire [31 : 0] s_axis_data_tdata
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tlast(s_axis_data_tlast), // input wire s_axis_data_tlast
.m_axis_data_tdata(m_axis_data_tdata), // output wire [31 : 0] m_axis_data_tdata
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tready(m_axis_data_tready), // input wire m_axis_data_tready
.m_axis_data_tlast(m_axis_data_tlast) // output wire m_axis_data_tlast
);
endmodule
仿真结果:
错误测试:
可以看出,上述两次实验IP核按照配置点数正确执行; 现将点数配置为8点FFT,但是输入数据实际为32位(输入32个数据以后s_axis_data_tlast才置数);
可以看出,此时出现非法s_axis_data_tlast标志;