Vivado中的FFT IP核使用(含代码)

这篇具有很好参考价值的文章主要介绍了Vivado中的FFT IP核使用(含代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1、调用IP核

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

Vivado中的FFT IP核使用(含代码)
Vivado中的FFT IP核使用(含代码)

2、配置界面介绍

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

第1页:Configuration
Vivado中的FFT IP核使用(含代码)

图1

表1 Configuration界面介绍

Configuration

Number of Channels

变换通道,可以选择多通道,实现多帧数据同时进行FFT运算

Transform Length

FFT变换长度,如果选择了最下面的‘run time configurable transform length’,则该参数是FFT变化的最大长度,一般不选

Architecture

Configuration

Target Clock

Frequency(MHz)

配置系统时钟

Target Data

Throughput(MSPS)

数据吞吐量

Architecture

Choice

Automatically Select

自动选择所需要的,FFT变化架构

Pipelined,

Streaming I/O

流水线结构,处理速度最快,但消耗资源多(只要将数据组成长序列输入,核就会按照FFT点数连续输出变换结果)

Radix-4, Burst I/O

基4 I/O突发结构

Radix-2, Burst I/O

基2 I/O突发结构

Radix-2 lite, Burst I/O

基2 lite I/O突发结构

Run Time Configuration Transform Length

该选项可以在FFT变换中通过设置s_axis_config_tdata中

NFFT字段的长度来改变FFT变化的长度

第2页:Implementation
Vivado中的FFT IP核使用(含代码)

图2

表2 Implementation界面介绍

Implementation

Data Format

Fixed Point

定点全精度

Floating Point

定点缩减位宽

Scaling Options

Block Floating Point

不管输入的格式如何,FFT变化内部都采用浮点,会根据每一级的数据情况自动缩放。 这个模式的输入输出位宽一致,便于调用

Scaled

在s_axis_config_data中会有相应的字段配置缩放因子.每一级别包含2个stage ,2个bit 表示一级缩放,一般0-3可选,如果log(NFFT)不是2的倍数,则最高一级的缩放只能在0-1之间选取

Unscaled

不用担心变化过程中会出现溢出,但是输入是32bit的话,输出是64bit

Rounding Modes

Convergent

Rounding

采用四舍五入输出数据(会使用更多的位宽来实现,增加转换速度和使用资源)

Trancation

采用截位输出数据

Precision Options

Input Data Width

输入数据的位宽

Phase Factor Width

输入数据相位因子宽度

Control Signals

ACLKEN

时钟使能

ARESETn(active low)

复位信号

Output Ordering Options

输出位序选项

Output Ordering

Bit/Digit Reversed

Order

逆序输出

Natural Order

顺序输出

Optional Output Fields

XK_INDEX

勾选表示给出输出索引

OVFLO

变换中溢出的指示信号

Throttle Sheme

Non Real Time

输出不遵循真实时间

Real Time

输出遵循真实时间

第3页:Detailed Implementation
Vivado中的FFT IP核使用(含代码)

图3

表3 Detailed Implementation

Detailed Implementation

Memory Options

存储器选项

Data

Block RAM

突发I/O架构:块RAM或分布式RAM均可用于数据和相位因子存储;

流水线流I/O:数据部分存储在块RAM部分存储在分布式RAM上,因此这两项都无法配置

Distributed RAM

Phase Factors

Block RAM

Distributed RAM

Number of stages using Block RAM

for Data and Phase Factors

选择块RAM的级数,

一般用不到默认即可

Reorder Buffer

Block RAM

流水线模式可选则配置,一般默认即可

Distributed RAM

Optimize Block RAM Count Using Hybrid

Memories

一种优化存储的方式,一般不用

Optimize Options

优化选项

Complex Multipliers

Use 3-multiplier structure

使用更多的DSP切片优化运算

Use 4-multiplier structure

比“3-multiplier”运算更快,

使用资源更多

Use CLB Logic

一般用在性能要求较低的设计中

Butterfly Arithmetic

Use CLB Logic

切片逻辑构造蝶形运算

Use XtremeDsp Slices

使用DSP切片的蝶形运算,强制使用DSP切片内部的加/减法器

3、IP核端口配置

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

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

Configuration

Number of Channels

1

Transform Length

64

Architecture

Configuration

Target Clock Frequency(MHz)

50

Target Data Throughput(MSPS)

50

Target

Pipelined, Streaming I/O

Implementation

Data Format

Fixed Point

Scaling Options

Scaled

Rounding Modes

Truncation

Precision Options

Input Data Width

16

Phase Factor Width

16

Control Signals

ACLKEN

勾选

Output Ordering Options

Output Ordering

Natural Order

Optional Output Fields

XK_INDEX

Throttle Sheme

Non Real Time

Detailed Implementation

该界面配置全部默认

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

Vivado中的FFT IP核使用(含代码)

图4 64点IFFT核端口图

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

Vivado中的FFT IP核使用(含代码)

图5

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

Vivado中的FFT IP核使用(含代码)

图6

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

表5 例化原语介绍

端口名称

IN/OUT

勾选

aclk

IN

系统时钟

aclken

IN

时钟使能

s_axis_config_tdata

IN

控制输入模式,进行fft/ifft以及衰减因子的设置,FWD_INV = 1做 fft,FWD_INV = 0做ifft

s_axis_config_tvalid

IN

拉高两个时钟周期之后,将端口s_axis_data_tvalid和s_axis_data_tready拉高

s_axis_config_tready

OUT

s_axis_config_tvalid拉高两个时钟周期后,该口给1输出;若干个时钟周期后,自动归零

s_axis_data_tdata

IN

将数据输入进行FFT运算结果

s_axis_data_tvalid

IN

当s_axis_data_tready高电平后,将s_axis_data_tvalid拉高L个周期,输入L个数据进行fft;L是FFT的点数

s_axis_data_tready

OUT

aresetn拉高两个时钟周期后,该口给1输出;此时ip核初始化完成,可进行数据输入

s_axis_data_tlast

IN

数据输入完毕后拉高,停止数据输入

m_axis_data_tdata

OUT

高位为虚部,低位为实部

m_axis_data_tuser

OUT

输出fft的地址值,输出值*fs/L为对应频点

m_axis_data_tvalid

OUT

当ifft结果输出时拉高,输出L个点的数据后拉低

m_axis_data_tready

IN

需保持高电平,保证FFT单元处在计算模式,并且能够输出结算结果

m_axis_data_tlast

OUT

当fft结果输出到最后一个结果时拉高,

紧接着下一个时钟就拉低

event_frame_started

OUT

当出现新的计算时给出

event_tlast_unexpected

OUT

当数据输入完毕而s_axis_data_tlast,没有拉高时给出

event_tlast_missing

OUT

但数据输入完毕之前s_axis_data_tlast,就拉高时给出

event_status_channel_halt

OUT

当核不能将数据正常输出给状态通道时给出

event_data_in_channel_halt

OUT

但核当前请求数据而数据没输入时给出

event_data_out_channel_halt

OUT

当核不能将数据正常输出给数据通道时给出

需要说明的是,需要配置的端口有,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点的IFFT  16QAM
clear
close all
clc
rng default  %产生固定数值的随机数据
%% 基于符号算法的目标距离和速度探测
%% 定义基本参数
Ns=1;                                                   %符号数
Nc=64;                                                  %子载波数
M=16;                                                   %调制方式
bit_num=log2(M);                                        %一个码组中的码元个数
bit=randi([0 1],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([16 11]);
    echo1_imag=quantizer([16 11]);
    fid_echo=fopen('C:\Users\15865\Desktop\FFT_IP_core_64point\IFFT_IP_core_64point_exam.txt','wt');
    for j=1:Ns
        echo2_real=num2bin(echo1_real,echo_real(:,j));
        echo2_imag=num2bin(echo1_imag,echo_imag(:,j));
        for i=1:Nc
            imag_real_echo=[echo2_imag(i,:),echo2_real(i,:)];
            fwrite(fid_echo,imag_real_echo);
            fprintf(fid_echo,'\n');
        end
    end
fclose(fid_echo);

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

5、测试verilog HDL

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

`timescale 1ns / 1ps
module IFFT_introduction(
        input        clk,
        input        rst_n,
        input        ifft_valid,
        input [31:0] data_in,
//        input        last,
        
        output        s_config_tready,
        output [31:0] m_data_tdata,
        output        s_data_tready,
        output [7:0]  m_data_tuser,
        output        m_data_tvalid,
        output        m_data_tlast
    );
 FFT_IP_core_64point ifft_u0(
  .aclk(clk),                                      // input wire aclk
  .aclken(rst_n),                                  // input wire aclken
  .s_axis_config_tdata(8'd0),                      // input wire [7 : 0] s_axis_config_tdata
  .s_axis_config_tvalid(1'b1),                     // input wire s_axis_config_tvalid
  .s_axis_config_tready(s_config_tready),          // output wire s_axis_config_tready
  .s_axis_data_tdata(data_in),                     // input wire [31 : 0] s_axis_data_tdata
  .s_axis_data_tvalid(ifft_valid),                 // input wire s_axis_data_tvalid
  .s_axis_data_tready(s_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_data_tdata),                // output wire [31 : 0] m_axis_data_tdata
  .m_axis_data_tuser(m_data_tuser),                // output wire [7 : 0] m_axis_data_tuser
  .m_axis_data_tvalid(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(m_data_tlast)                 // output wire m_axis_data_tlast
);

  
  wire [15:0] ifft_64point_out_RE,ifft_64point_out_IM;
//  assign RE={{4{m_data_tdata[15]}},m_data_tdata[15:4]};//IFFT归一化处理,除Nfft
//  assign IM={{4{m_data_tdata[39]}},m_data_tdata[39:28]};
  assign ifft_64point_out_IM=m_data_tdata[31:16]; //虚部
  assign ifft_64point_out_RE=m_data_tdata[15:0];  //实部 
  
endmodule

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

6、TestBench仿真

主要程序如下:

`timescale 1ns / 1ps
module ifft_tb();
reg        clk;             //系统时钟
reg        rst_n;           //复位信号,低有效
reg        ifft_valid;      //数据有效位,指示输入数据有效
reg [31:0] data_in;         //输入数据
 
wire s_config_tready;       
wire [31:0] m_data_tdata;   
wire s_data_tready;         
wire [7:0] m_data_tuser;    
wire m_data_tvalid;         
wire m_data_tlast;

IFFT_introduction u0(    //例化.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];
initial begin       //$readmemb Vivado内置函数调用.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 #10 clk<=~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 输出结果如下图:

Vivado中的FFT IP核使用(含代码)

图10

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

表6数据验证

MATLAB

序号

Modelsim

序号

0.0791+0.791i

1

0.0788+0.0788i

1

0.1504-0.1122i

2

0.1503-0.1122i

2

-0.0336+0.2315i

3

-0.0337+0.2314i

3

-0.1444-0.0422i

31

-0.1444-0.0422i

31

-0.1533+0.1128i

32

-0.1553+0.1128i

32

-0.0395+0.0791i

33

-0.0395+0.0790i

33

0.0992-0.1690i

62

0.0992-0.1689i

62

-0.1036+0.0314i

63

-0.1036+0.0314i

63

-0.1168-0.1773i

64

-0.1167-0.1773i

64

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

Vivado中的FFT IP核使用(含代码)

图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即可,其他无需变动。

参考:

https://blog.csdn.net/duanchangrenhit/article/details/109639454 文章来源地址https://www.toymoban.com/news/detail-412300.html

到了这里,关于Vivado中的FFT IP核使用(含代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vivado时序约束TCL命令——获取引脚(get_pins)在FPGA设计中起着重要作用。本文将为大家详细介绍get_pins命令的语法和使用方法。

    Vivado时序约束TCL命令——获取引脚(get_pins)在FPGA设计中起着重要作用。本文将为大家详细介绍get_pins命令的语法和使用方法。 get_pins命令用于获取指定对象(Object)的引脚(Pin)列表。我们可以使用get_pins来获取具有特定命名约定的引脚(如CLOCK、RESET等),并通过对这些引

    2024年02月05日
    浏览(47)
  • VIVADO中FFT核的使用(FPGA计算FFT和IFFT)

             关于这方面的内容,有些文章已经写的很好很详细了。不过我在使用的过程中,还是踩了一些坑,我在这里详细的介绍了IP核每一个设置的作用,然后写了个fft计算和ifft计算的环路的测试程序。应该可以帮大家学会使用fft的同时,也对它有个较为全面的理解。

    2024年01月18日
    浏览(37)
  • Vivado cordic IP核rotate和translate使用详解(附有代码)

    Vivado cordic IP核rotate和translate使用详解(附有代码) 目录 前言 一、cordic简介 二、使用cordic IP核需要知道的预备知识 1.数据端口 2.Q Numbers Format 3.Vector Translation 4.Vector Rotation 三、IP核配置说明 1.translate 2.Rotate 四、Translate仿真 1.顶层代码 2.仿真代码 五、Rotate仿真 1.顶层代码 2.仿真代

    2023年04月27日
    浏览(34)
  • Vivado中的IP核——GPIO详解

    资料ID:PG144 文档查找软件:DocNav,在安装vivado时可以选择一并安装 Vivado中的GPIO模块框图如下。 下表展示了AXI GPIO的寄存器和相对于基地址的地址偏移值。 这些寄存器是否可用取决于一些配置参数的值。若某个寄存器是不可用的,一个写信号对该寄存器没有效果;当尝试读

    2024年02月08日
    浏览(36)
  • Vivado中的IP核——uartlite详解

    如果想要使用uartlite这个模块,则需要其驱动程序,这些驱动程序中包含对寄存器的直接操作。赛灵思在BSP中提供了uartlite的驱动函数,但是感觉不好用,所以本文详细介绍uartlite的寄存器空间,以便于可以自己编写相应的驱动函数。 资料ID:PG142 文档查找软件:DocNav,在安装

    2024年02月04日
    浏览(31)
  • Xilinx 的FFT IP核使用方法(配置为FFT 、IFFT两种模式)

    Configuration 配置通道数和FFT长度 时钟频率以及数据吞吐速率 FFT的结构选择 Srteaming , 可以对数据进行流水处理 Radix-4 , 基4的迭代算法,使用资源比流水线结构多,但是转换时间长 Radix-2, Radix-2 lite 都为基2的迭代算法,Radix-2 lite的资源占用更少,但是转换时间也更长。 Run Time

    2024年02月04日
    浏览(39)
  • 在quartus中使用FFT IP核最全教程(从入门到放弃)

      首先需要把需要的器材准备好,我使用的是quartus18.0,并且要使用IP核被破解的版本,不然无法使用其中的FFT和NCO,一定要注意,quartus对于版本非常敏感,一定要严格对应好版本 1、带IP的quartus18.0 2、modelsim,这个modelsim不能使用自己下载的modelsim,要去官网下载,对应版本的

    2024年02月14日
    浏览(36)
  • 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)

    目录 一、电路功能描述 二、方案设计 1. 总体设计方案 2. 对原理框图或程序流程图做出简单解释 3. 各模块介绍 3.1 音频驱动模块 3.2 LED显示模块 3.3 数码管显示模块 3.4 矩阵键盘模块 3.5 PS2机械键盘模块 3.6 时钟分频模块 3.7 曲谱生成模块 三、总结 数码管和LED显示模块 矩阵键盘

    2024年02月06日
    浏览(51)
  • vivado 使用IP Integrator源

    使用IP Integrator源 在Vivado Design Suite中,您可以在RTL中添加和管理IP子系统块设计(.bd)项目或设计。使用Vivado IP集成程序,您可以创建IP子系统块设计。IP集成程序使您能够通过实例化和将Vivado IP目录中的多个IP核互连。可以交互创建设计通过Vivado IDE中的IP integrator画布或通过

    2024年01月18日
    浏览(35)
  • Vivado CANFD IP 使用笔记

    1. IP设置:  接口说明:         APB接口用于配置IP内部寄存器、控制CAN报文收发;         can_clk:默认给40Mhz;         can_clk_x2:与can_clk同源,默认给80MHz;         apb_clk:系统时钟; 波特率计算:         80MHz / 2 / ((1+BRP)*((1+(1+TESG1)+(1+TESG2))); 寄存器表:         基地

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包