0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Vivado中FFT IP核的使用教程

Hack电子 来源:Hack电子 2024-11-06 09:51 次阅读

本文介绍了Vidado中FFT IP核的使用,具体内容为:调用IP核>>配置界面介绍>>IP核端口介绍>>MATLAB生成测试数据>>测试verilogHDL>>TestBench仿真>>结果验证>>FFT运算。

1、调用IP核

该IP核对应手册pg109_xfft.pdf,首先按照图片找到IP核:

e718a622-90a1-11ef-a511-92fbcf53809c.png

e74bfa9a-90a1-11ef-a511-92fbcf53809c.png

2、配置界面介绍

本小节主要介绍Fast Fourier Transform9.1这个IP核配置界面的一些选项:

第1页:Configuration

e76f59b8-90a1-11ef-a511-92fbcf53809c.png

图1

表1 Configuration界面介绍

e7a8e7dc-90a1-11ef-a511-92fbcf53809c.jpg

e7d2a1ee-90a1-11ef-a511-92fbcf53809c.jpg

第2页:Implementation

e80efa40-90a1-11ef-a511-92fbcf53809c.png

图2

表2 Implementation界面介绍

e8318f1a-90a1-11ef-a511-92fbcf53809c.jpg

e861dc38-90a1-11ef-a511-92fbcf53809c.jpg

e892b5ce-90a1-11ef-a511-92fbcf53809c.jpg

第3页:Detailed Implementation

e8cffb8c-90a1-11ef-a511-92fbcf53809c.png

图3

表3 Detailed Implementation

e901231a-90a1-11ef-a511-92fbcf53809c.jpg

e92e8dfa-90a1-11ef-a511-92fbcf53809c.jpg

3、IP核端口配置

根据上述配置界面的介绍,下面以64点IFFT为例子,总结了使用IP核时所需的端口配置,如表4所示,需要注意的是表4中没有涉及的部分按照IP核的默认配置即可:

表4 64点IFFT运算IP核的设置表汇总

e94a155c-90a1-11ef-a511-92fbcf53809c.jpg

e97f8692-90a1-11ef-a511-92fbcf53809c.jpg

配置完成之后IP核的端口图如下:

e9ae0918-90a1-11ef-a511-92fbcf53809c.png

图4 64点IFFT核端口图

按照下面图找到例化原语:

e9dcb204-90a1-11ef-a511-92fbcf53809c.png

图5

打开.veo后缀的文件找到例化原语:

ea134b5c-90a1-11ef-a511-92fbcf53809c.png

图6

对例化语句的介绍见表5,其中L表示IFFT/FFT的点数。

表5 例化原语介绍

ea54ed5a-90a1-11ef-a511-92fbcf53809c.jpg

ea8be472-90a1-11ef-a511-92fbcf53809c.jpg

eac688c0-90a1-11ef-a511-92fbcf53809c.jpg

需要说明的是,需要配置的端口有,1)aclk;2)aclken;3)s_axis_config_tdata ;4)s_axis_config_tvalid ;5)s_axis_config_tready;6)s_axis_data_tdata;7)s_axis_data_tvalid;8)s_axis_data_tready;9)m_axis_data_tdata;10)m_axis_data_tuser;11)m_axis_data_tready;12)m_axis_data_tlast

4、MATLAB生成测试数据

本次测试只需要使用TestBench验证即可,需要生成.txt后缀的文件,产生IFFT核的输入数据,主要程序为:

%%该.m文件用来生成介绍IFFT核的数据,具体为64点的IFFT16QAM
clear
closeall
clc
rngdefault%产生固定数值的随机数据
%%基于符号算法的目标距离和速度探测
%%定义基本参数
Ns=1;%符号数
Nc=64;%子载波数
M=16;%调制方式
bit_num=log2(M);%一个码组中的码元个数
bit=randi([01],Nc*Ns*bit_num,1);%产生比特
norm=1/sqrt(10);%16qam归一化因子
%%16qam
bit_convert=(reshape(bit,bit_num,length(bit)/bit_num))';%二进制数据流按照调制的方式分成不同码元
data_2_to_10=bi2de(bit_convert,'left-msb');%将每四位数据转换为十进制数
maxtix=reshape(data_2_to_10,Nc,Ns);
bit_mo=norm*qammod(data_2_to_10,M);
a_nm=reshape(bit_mo,Nc,Ns);
%%发送端IFFT调制
IFFT_OUT=ifft(a_nm,64);
%%数据保存为.txt文件
echo_real=real(a_nm);
echo_imag=imag(a_nm);
echo1_real=quantizer([1611]);
echo1_imag=quantizer([1611]);
fid_echo=fopen('C:Users15865DesktopFFT_IP_core_64pointIFFT_IP_core_64point_exam.txt','wt');
forj=1:Ns
echo2_real=num2bin(echo1_real,echo_real(:,j));
echo2_imag=num2bin(echo1_imag,echo_imag(:,j));
fori=1:Nc
imag_real_echo=[echo2_imag(i,:),echo2_real(i,:)];
fwrite(fid_echo,imag_real_echo);
fprintf(fid_echo,'
');
end
end
fclose(fid_echo);

图中程序功能是生成了一段包含64个复数数据的数组,并将每个复数数据用16表示实部16位表示虚部共生成32位二进制数,最后将这组数据保存为.txt后缀文件。

5、测试verilog HDL

根据前文的配置编写一个简单的测试.v文件测试64点数据的IFFT运行结果,主要程序如下:

`timescale1ns/1ps
moduleIFFT_introduction(
inputclk,
inputrst_n,
inputifft_valid,
input[31:0]data_in,
//inputlast,

outputs_config_tready,
output[31:0]m_data_tdata,
outputs_data_tready,
output[7:0]m_data_tuser,
outputm_data_tvalid,
outputm_data_tlast
);
FFT_IP_core_64pointifft_u0(
.aclk(clk),//inputwireaclk
.aclken(rst_n),//inputwireaclken
.s_axis_config_tdata(8'd0),//inputwire[7:0]s_axis_config_tdata
.s_axis_config_tvalid(1'b1),//inputwires_axis_config_tvalid
.s_axis_config_tready(s_config_tready),//outputwires_axis_config_tready
.s_axis_data_tdata(data_in),//inputwire[31:0]s_axis_data_tdata
.s_axis_data_tvalid(ifft_valid),//inputwires_axis_data_tvalid
.s_axis_data_tready(s_data_tready),//outputwires_axis_data_tready
//.s_axis_data_tlast(s_axis_data_tlast),//inputwires_axis_data_tlast
.m_axis_data_tdata(m_data_tdata),//outputwire[31:0]m_axis_data_tdata
.m_axis_data_tuser(m_data_tuser),//outputwire[7:0]m_axis_data_tuser
.m_axis_data_tvalid(m_data_tvalid),//outputwirem_axis_data_tvalid
.m_axis_data_tready(1'b1),//inputwirem_axis_data_tready
.m_axis_data_tlast(m_data_tlast)//outputwirem_axis_data_tlast
);


wire[15:0]ifft_64point_out_RE,ifft_64point_out_IM;
//assignRE={{4{m_data_tdata[15]}},m_data_tdata[15:4]};//IFFT归一化处理,除Nfft
//assignIM={{4{m_data_tdata[39]}},m_data_tdata[39:28]};
assignifft_64point_out_IM=m_data_tdata[31:16];//虚部
assignifft_64point_out_RE=m_data_tdata[15:0];//实部

endmodule

这段程序调用了FFT IP核的例化原语,并将部分接口作为函数的输入和输出,方便TestBench调用。

6、TestBench仿真

主要程序如下:

`timescale1ns/1ps
moduleifft_tb();
regclk;//系统时钟
regrst_n;//复位信号,低有效
regifft_valid;//数据有效位,指示输入数据有效
reg[31:0]data_in;//输入数据

wires_config_tready;
wire[31:0]m_data_tdata;
wires_data_tready;
wire[7:0]m_data_tuser;
wirem_data_tvalid;
wirem_data_tlast;

IFFT_introductionu0(//例化.v文件
.clk(clk),
.rst_n(rst_n),
.ifft_valid(ifft_valid),
.data_in(data_in),
.s_config_tready(s_config_tready),
.m_data_tdata(m_data_tdata),
.s_data_tready(s_data_tready),
.m_data_tuser(m_data_tuser),
.m_data_tvalid(m_data_tvalid),
.m_data_tlast(m_data_tlast)
);
reg[31:0]mem[63:0];
initialbegin//$readmembVivado内置函数调用.txt文件
$readmemb("C:/Users/15865/Desktop/FFT_IP_core_64point/IFFT_IP_core_64point_exam.txt",mem);
clk=0;
rst_n=0;
#1000;
rst_n=1;
#10_000;
$stop;
end
always#10clk<=~clk;    //50MHz
reg [6:0] count;        
//计数
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) 
        count<='d0;
    else if(count<='d63)
        count<=count+1'b1;
    else
        count<='dz;
end
// 产生信号和数据
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        ifft_valid<='d0;
        data_in<='d0;
    end
    else if(count>='d0&&count<='d63) begin
            ifft_valid<=1;
            data_in<=mem[count];
    end
    else begin
            ifft_valid<=1'b0;
            data_in<='d0;
    end
end
endmodule

7、Modelsim结果与MATLAB输出结果验证

本节将验证Modelsim和MATLAB输出结果的一致性,并简单介绍Modelsim输出结果向MATLAB数据的转换。

Modelsim 输出结果如下图:

eae14a5c-90a1-11ef-a511-92fbcf53809c.png

图10

由于数据有64个而这里验证前三个中间三个和后三个的方式验证Modelsim数据和MATLAB数据正确性:

表6数据验证

eb31ff60-90a1-11ef-a511-92fbcf53809c.jpg

需要注意的是,Modelsim输出的结果并不是小数,而是忽略了小数点的整数,要想获得和MATLAB类似的浮点数,需要我们将输出结果变换,这里以Modelsim输出的最后一个数为例(即表6中序号64),可见图11。

eb640690-90a1-11ef-a511-92fbcf53809c.png

图11

对于该结果需要我们将输出结果除以2^(a+ b),a为用以表示小数的位宽数,本文中为11,b为FFT点数的2次幂幂值,本文为6,因此对于每一个Modelsim的输出结果都需要除以2^17,这里实部-15302/2^17=-0.1167,虚部-23234/2^17=-0.1773。

从表6中数据可以看出,IFFT 核执行的运算和MATLAB的运算结果十分接近,验证成功。

8、FFT运算

与IFFT运算类似,配置不用更改只需将第5小节程序中,s_axis_config_tdata端口配置改为8’d1即可,其他无需变动。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FFT
    FFT
    +关注

    关注

    15

    文章

    433

    浏览量

    59246
  • 仿真
    +关注

    关注

    50

    文章

    4017

    浏览量

    133323
  • 端口
    +关注

    关注

    4

    文章

    944

    浏览量

    31977
  • IP核
    +关注

    关注

    4

    文章

    326

    浏览量

    49371
  • Vivado
    +关注

    关注

    19

    文章

    804

    浏览量

    66208

原文标题:Vivado中的FFT IP核使用

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    quartusII FFT ip

    在quartusII,应用fft ip时,variable streaming 模式下的bit-reverse(位翻转)是什么意思?烦劳详细帮助新手解释一下,不甚感激
    发表于 01-09 10:55

    基于FPGA的FFT和IFFT IP应用实例

    16bit,定点signed(1.15),即最高位符号位,15位小数。同时,绘制出matlabcos时域和频域的波形如下。 3 Vivado添加配置FFT
    发表于 08-10 14:30

    玩转Zynq连载48——[ex67] Vivado FFT和IFFT IP应用实例

    cos时域和频域的波形如下。 3 Vivado添加配置FFT IPVivado
    发表于 01-07 09:33

    Vivadoxilinx_courdic IP怎么使用

    Vivadoxilinx_courdic IP(求exp指数函数)使用
    发表于 03-03 07:35

    vivado有哪几种常用IP?如何去调用它们

    运算器等)、信号处理(FFT、DFT、DDS等)。IP类似编程的函数库(例如C语言中的printf()函数),可以直接调用,非常方便,大大加快了开发速度。今天介绍的是
    发表于 07-29 06:07

    Vivado生成IP

    vivado生成ip后缺少一大片文件,之前是可以用的,中途卸载过Modelsim,用vivado打开过ISE工程,因为工程很多
    发表于 04-24 23:42

    Xilinx Vivado的使用详细介绍(3):使用IP

    IPIP Core) Vivado中有很多IP核可以直接使用,例如数学运算(乘法器、除法器、浮点运算器等)、信号处理(
    发表于 02-08 13:08 2121次阅读
    Xilinx <b class='flag-5'>Vivado</b>的使用详细介绍(3):使用<b class='flag-5'>IP</b><b class='flag-5'>核</b>

    了解VivadoIP的原理与应用

    IPIP Core) Vivado中有很多IP核可以直接使用,例如数学运算(乘法器、除法器、浮点运算器等)、信号处理(
    发表于 11-15 11:19 9064次阅读

    vivado调用IP详细介绍

    数学运算(乘法器、除法器、浮点运算器等)、信号处理(FFT、DFT、DDS等)。IP类似编程的函数库(例如C语言中的printf()函数),可以直接调用,非常方便,大大加快了开发速
    的头像 发表于 05-28 11:42 3.7w次阅读

    关于Vivado三种常用IP的调用详细解析

    vivadoIPIPIP Core):Vivado
    的头像 发表于 04-27 15:45 2.4w次阅读
    关于<b class='flag-5'>Vivado</b>三种常用<b class='flag-5'>IP</b><b class='flag-5'>核</b>的调用详细解析

    如何进行FFT IP配置和设计

    以Xilinx Vivado设计套件中提供的FFT IP为例,简要说明如何进行FFT IP配置和设计。
    的头像 发表于 07-22 10:21 2346次阅读

    VCS独立仿真Vivado IP的问题补充

    在仿真Vivado IP时分两种情况,分为未使用SECURE IP和使用了SECURE IP
    的头像 发表于 06-06 14:45 1648次阅读
    VCS独立仿真<b class='flag-5'>Vivado</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>的问题补充

    一边学习控制FFT IP,一边学习AXI4-Stream协议

    这里做最简单的设置,打开Vivado,点开IP Catalog,找到FFT IP
    的头像 发表于 06-19 14:38 1627次阅读
    一边学习控制<b class='flag-5'>FFT</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>,一边学习AXI4-Stream协议

    如何在Vivado配置FIFO IP

    Vivado IP提供了强大的FIFO生成器,可以通过图形化配置快速生成FIFO IP
    的头像 发表于 08-07 15:36 3922次阅读
    如何在<b class='flag-5'>Vivado</b><b class='flag-5'>中</b>配置FIFO <b class='flag-5'>IP</b><b class='flag-5'>核</b>

    Vivado IPShared Logic选项配置

    在给Vivado的一些IP进行配置的时候,发现有Shared Logic这一项,这里以Tri Mode Ethernet MAC IP
    的头像 发表于 09-06 17:05 1442次阅读
    <b class='flag-5'>Vivado</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>Shared Logic选项配置