Vivado中FFTIP核的使用

更新时间:2023-06-04 07:01:07 阅读: 评论:0

Vivado中FFTIP核的使⽤
FFT(快速傅⾥叶变换)作为数字信号处理的核⼼算法具有重要的研究价值,可应⽤于傅⾥叶变换所能涉及的任何领域,如图像处理、⾳频编码、频谱分析、雷达信号脉冲压缩等数字信号处理领域。FFT的鲜明特征之⼀是计算离散傅⾥叶变换(DFT)的⾼效算法,把计算N点DFT的乘法运算量从N2次降低到N/2*log2N次。⽽采⽤FPGA实现FFT的缘由在于:FPGA具有并⾏处理、流⽔线处理、易编程、⽚上资源丰富等⽅⾯特点,⽤于实现⾼速、⼤点数的FFT优势明显。
本设计使⽤的软件编程环境是Xilinx公司的Vivado 2018.3,笔者将从FFT IP核的创建,模块⽂件的编写,波形仿真等⽅⾯来具体讲解FFT 在Xilinx FPGA上的实现。
1.FFT IP核的创建
(1)在Vivado软件主界⾯,打开IP Catalog,在搜索框内输⼊FFT,然后找到Digital Signal Processing->Transforms->FFTs⽬录下的Fast Fourier Transform,双击进⼊配置界⾯。
(2)进⼊到配置界⾯,左边是IP核的接⼝图、实现的⼀些细节信息和FFT的延迟,右边是Configuration、Implementation和Detailed Implementation三个标签卡。
Vivado的FFT IP核⽀持多通道输⼊(Number of Channels)和实时更改FFT的点数(Run Time Configurable Transform Length)。Configuration标签下可设置FFT的点数(Transform Length)和⼯作时钟(Target Clock Frequency),以及选择⼀种FFT结构。FFT 的结构包括流⽔线Streaming、基
4 Burst、基2 Burst和轻量级基2 Burst,它们的计算速度和消耗的资源依次减少,可根据⼯程实际进⾏选择。
最遥远的地方成语
Implementation标签卡下可设置FFT的数据格式为定点Fixed Point或浮点Float Point;输出截位⽅式选择:不截位(Unscaled),截位(Scaled),块浮点(Block Floating Point);设置输⼊数据的位宽和相位因⼦位宽。还有⼀些可选的附加信号,如时钟使能(ACLKEN),复位信号(ARESETn,低有效)等。“Output Ordering”⽤以选择FFT计算结果以⾃然顺序(Nature Order)或位倒序(Bit/Digit Reverd Order)输出。
Detailed Implementation⾥可设置优化⽅式、存储的类型。存储类型分为两种:Block RAM(块RAM)和Distributed RAM(分布式RAM);优化⽅式可选择资源最优或者速度最优。
(3)配置完成后,可在Latency下看到计算fft所需的时间,可以以此衡量设计是否满⾜实时处理的要求。如不满⾜,可选择性能更好的FFT结构或选择可以提⾼运算速度的优化选项
2.模块⽂件的编写
IP核⼯作必须要满⾜⼀定的时序要求,所以需要将数据按照⼀定时序送⼊IP核。IP核交互是⽤AXI-Stream接⼝,关于AXI-Stream接⼝的时序可⾃⾏查⼀些相关资料,这⾥不做详细介绍。简⾔之,AXI-Stream接⼝分为主机(master)和从机(slave),主机为发起端,从机为响应端,只有ready信号和valid信号同时为⾼时数据才能被有效写⼊或读出。举个例⼦,主机检测从机发出的ready信号,当为⾼时将valid 信号拉⾼即可从从机读出或向从机写⼊数据。
module fft_test(
input clk,
input rst_n,
input  tvalid_i,
input  [31:0] tdata_i,
//input  fft_s_data_tlast,
output fft_s_config_tready,
output          fft_s_data_tready,
output [47:0] fft_m_data_tdata,
如何管理一个团队和员工output          fft_m_data_tvalid,
output          fft_m_data_tlast,
output [7:0]    fft_m_data_tur,
output          fft_event_frame_started,
output          fft_event_tlast_unexpected,
output          fft_event_tlast_missing,
output          fft_event_status_channel_halt,
output          fft_event_data_in_channel_halt,
output          fft_event_data_out_channel_halt
)
;
reg  fft_s_data_tvalid=1'b0;
reg  [31:0] fft_s_data_tdata=32'd0;
reg  fft_s_data_tlast=1'b0;
reg[7:0]  count=8'd0;
always @(podge  clk)  begin
if(!rst_n) begin
fft_s_data_tvalid<=1'b0;
fft_s_data_tdata<=32'd0;
fft_s_data_tlast<=1'b0;
count<=8'd0;
end
el if(tvalid_i && fft_s_data_tready) begin
if(count==127)begin
fft_s_data_tvalid<=1'b1;
fft_s_data_tlast<=1'b1;
fft_s_data_tdata<=tdata_i;
count<=0;
财务制度end
el begin
fft_s_data_tvalid=1'b1;
count<=count+1;
fft_s_data_tlast<=1'b0;
fft_s_data_tdata<=tdata_i;
end
end
el begin
fft_s_data_tvalid<=1'b0;
fft_s_data_tlast<=1'b0;
fft_s_data_tdata<=fft_s_data_tdata;
end
end
xfft_0 u_fft(
.
aclk(clk),// input wire aclk
.aretn(rst_n),// input wire aretn
.aretn(rst_n),// input wire aretn
.s_axis_config_tdata(8'd1),// input wire [7 : 0] s_axis_config_tdata
.s_axis_config_tvalid(1'b1),// input wire s_axis_config_tvalid
.s_axis_config_tready(fft_s_config_tready),// output wire s_axis_config_tready
.s_axis_data_tdata(fft_s_data_tdata),// input wire [31 : 0] s_axis_data_tdata
.s_axis_data_tvalid(fft_s_data_tvalid),// input wire s_axis_data_tvalid
踢踢球.s_axis_data_tready(fft_s_data_tready),// output wire s_axis_data_tready
.s_axis_data_tlast(fft_s_data_tlast),// input wire s_axis_data_tlast
.m_axis_data_tdata(fft_m_data_tdata),// output wire [47 : 0] m_axis_data_tdata
.
m_axis_data_tur(fft_m_data_tur),// output wire [7 : 0] m_axis_data_tur
.m_axis_data_tvalid(fft_m_data_tvalid),// output wire m_axis_data_tvalid
.m_axis_data_tready(1'b1),// input wire m_axis_data_tready
.m_axis_data_tlast(fft_m_data_tlast),// output wire m_axis_data_tlast
.event_frame_started(fft_event_frame_started),// output wire event_frame_started
.event_tlast_unexpected(fft_event_tlast_unexpected),// output wire event_tlast_unexpected
.event_tlast_missing(fft_event_tlast_missing),// output wire event_tlast_missing工作学习计划
.event_status_channel_halt(fft_event_status_channel_halt),// output wire event_status_channel_halt
.event_data_in_channel_halt(fft_event_data_in_channel_halt),// output wire event_data_in_channel_halt
.event_data_out_channel_halt(fft_event_data_out_channel_halt)// output wire event_data_out_channel_halt
);
endmodule
3.功能仿真
模块编写完成后,需要通过功能仿真来验证我们设计逻辑的正确性。进⾏仿真之前,我们需要编写仿真测试⽂件(testbench)。module testbench;
reg  clk;
reg  rst_n;
reg [15:0] dati_in;
reg [15:0] datq_in;
reg [23:0]  dati_out;
reg [23:0]  datq_out;
reg [15:0]  dataI [127:0];
reg [47:0]  fft_abs;
reg  fft_s_data_tvalid;
wire  [31:0] fft_s_data_tdata;
//reg  fft_s_data_tlast;
wire fft_s_config_tready;
wire          fft_s_data_tready;
wire [47:0] fft_m_data_tdata;
wire          fft_m_data_tvalid;
wire          fft_m_data_tlast;
wire [7:0]    fft_m_data_tur;
wire          fft_event_frame_started;
wire          fft_event_tlast_unexpected;
wire          fft_event_tlast_missing;
wire          fft_event_status_channel_halt;
wire          fft_event_data_in_channel_halt;
wire          fft_event_data_out_channel_halt;
initial  begin
clk=1;
rst_n=0;
//fft_s_data_tlast=1'b0;
fft_s_data_tvalid=1'b0;
dati_in=0;
datq_in=0;人无我
dati_out=0;
datq_out=0;
fft_abs=0;
$readmemb("C:/Urs/radar/Desktop/Science/FPGA/",dataI);
#100
rst_n=1;
end
always #5  clk=~clk;
reg[7:0]  count=0;
always @(podge  clk)  begin
if(fft_s_data_tready) begin
if(count==128) begin
fft_s_data_tvalid=1'b0;
//fft_s_data_tlast=1'b0;
#10000
count=0;
end
el if(count==127)begin
dati_in<= dataI[count];
datq_in<=16'd0;
fft_s_data_tvalid<=1'b1;
/
/fft_s_data_tlast<=1'b1;
count<=count+1;
end
el begin
dati_in<= dataI[count];
datq_in<=16'd0;
fft_s_data_tvalid=1'b1;
count<=count+1;
//fft_s_data_tlast<=1'b0;
end
end
end
assign fft_s_data_tdata ={datq_in,dati_in};
fft_test u_fft_test(
带星的网名
.clk(clk),
.rst_n(rst_n),
.tvalid_i(fft_s_data_tvalid),
.tdata_i(fft_s_data_tdata),
//.fft_s_data_tlast(fft_s_data_tlast),
.fft_s_config_tready(fft_s_config_tready),
.fft_s_data_tready(fft_s_data_tready),
.fft_m_data_tdata(fft_m_data_tdata),
.
fft_m_data_tvalid(fft_m_data_tvalid),
.fft_m_data_tlast(fft_m_data_tlast),
.fft_m_data_tur(fft_m_data_tur),
.fft_event_frame_started(fft_event_frame_started),
.fft_event_tlast_unexpected(fft_event_tlast_unexpected),
.fft_event_tlast_missing(fft_event_tlast_missing),
.fft_event_status_channel_halt(fft_event_status_channel_halt),
.fft_event_data_in_channel_halt(fft_event_data_in_channel_halt),
.fft_event_data_out_channel_halt(fft_event_data_out_channel_halt)
);
always @(podge clk) begin
if(fft_m_data_tvalid) begin
dati_out<=fft_m_data_tdata[23:0];
datq_out<=fft_m_data_tdata[47:24];
足球的英语怎么读end
end
always @(podge clk) begin
fft_abs<=$signed(dati_out)* $signed(dati_out)+ $signed(datq_out)* $signed(datq_out);

本文发布于:2023-06-04 07:01:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/857186.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:选择   信号   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图