精华内容
下载资源
问答
  • 最近在忙着仿真FFT IP核,正好在使用FFT IP核的过程中要接触到...FFT IP核的设置这里做最简单设置,打开Vivado,点开IP Catalog,找到FFT IP核。设置界面如下:Configuration 设置设置参数意义如下:Numbers o...

    a96b36451e7ff714fa9bffbecb5bdddf.png

    最近在忙着仿真FFT IP核,正好在使用FFT IP核的过程中要接触到AXI4-Stream协议。就在这里合并一起讲了吧。本文涉及FFT IP核的控制,AXI4-Stream协议,FFT的部分基础知识。

    FFT IP核的设置

    这里做最简单的设置,打开Vivado,点开IP Catalog,找到FFT IP核。设置界面如下:
    b637503d48ccb849d46aebb877a55de7.pngConfiguration 设置
    设置的参数意义如下:
    • Numbers of Channels: 通道数,FFT IP核可以设置多个数据通道,进行多路FFT操作
    • Transform Length: 传输的数据长度,就是FFT中的点数,决定输出的频谱分辨率
    • Architecture Configuration:如果Architecture Choice选择Automatically Select,IP核会根据你填的时钟频率和数据吞吐量选择适合的架构
    a59fcc874002abacf797d153281035ca.pngImplementation
    设置的参数意义如下:
    • Data Format: 数据格式,定点数或浮点数,浮点数不能使用多个通道同时进行FFT操作
    • Scaling Options: 对输出的数据进行等比例缩小,如果选Scaled,则在控制IP核时需要设置缩小比例,详情见: 资料1
    • Input Data Width:输入数据位宽,这里只用输入I,Q一路的位宽,不需要输入组合起来的位宽
    • Phase Factor Width:因为进行FFT 操作涉及乘加操作,肯定会有精度损失,这里可以设置一个合适的值平衡精度和面积的要求。
    • 控制信号:时钟使能跟复位信号,复位信号拉低最少要保持两个时钟周期。
    • Output Ordering: Natural Order输出的频谱数据还要做fftshift,这个跟fft算法流程有关系
    • Optional Output Fields: 输出的索引信号和overflow信号,勾选后这些信息会跟频谱数据一起输出
    1f8605f63de8057bec10617ca7a3e846.pngDetail Implementation
    直接默认跳过。IP核生成后可以看到有很多信号,这些信号代表的意义又是怎么样的。可以在IP核设置界面的左侧Implementation Detail看到下图内容
    a265433bfb7a212ed68ca8312c66bc92.png
    从图中可以看出:
    • Output Data Width: 输出数据的位宽,当然也是I,Q一路信号的位宽
    • S_AXIS_DATA_TDATA: 这是把时域信号往FFT IP核传输的数据通道,通过图中可以看到,57:32传输Q路信号,25:0传输I路信号。
    b51144cd2e19c2a9bc88c844c20526c9.png
    • S_AXIS_CONFIG_TDATA:  这是对FFT IP核设置参数内容;图中很明显告知,16:1传输SCALE_SCH信号,这个信号决定输出的数据等比例缩小多少倍,具体参数设置可以看: 资料1的内容;0位传输的控制信号,为1时IP核做FFT运算,为0时做IFFT运算。
    • M_AXIS_DATA_TDATA: 这是FFT输出的频谱数据,从图中可以看到,57:32对应的是虚部数据,25:0对应的是实部数据。
    acd994c8bce9af0f7e52d4f3a458ec0f.png
    • M_AXIS_DATA_TUSER: 这个信号根据图中可知,传输的是输出频谱的索引,有一定的作用。这里输出的具体内容根据上述的FFT IP核设置决定
    1e35f395554c774d4c4e621b466e3727.png大概的运算时间
    这些信号其实都是AXI4-Stream的相关信号

    AXI4-Stream协议

    (PCIE学习应用教程)2.AXI4-Lite协议简明学习笔记 介绍了AXI4-Lite内容,AXI4-Stream也遵循了TVALID,TREADY的握手机制,全局信号内容等内容,这部分内容可以回顾之前的文章。除了AXI4-Lite的信号,AXI4-Stream还增加了以下信号:
    • TKEEP:指示信号,指明当前数据数据类型,发送数据方控制该信号;为低电平表明对应字节数据是空字节,可以移除;与TSTRB一同发挥作用,两个信号都是可选非必需信号当去掉TKEEP信号,TKEEP视作全高电平当去掉TSTRB信号,TSTRB的值等同TKEEP两个信号都被选择后作用如下图:
      3af32a125b62646931e0840c815eebc3.png
    • TLAST:指示信号,指明当前是最后一次数据传输,发送数据方控制该信号;只有在最后一次数据传输时该信号会拉高一次,信号一直拉高表明数据都是独立的而不是来自同一个数据包,可选非必需信号;发送方(Master)不要求一定要支持该信号接受方(Slave)的该信号固定为低电平
    • TID: 指示信号,指明当前数据流的ID,标明不同的数据流,发送数据方控制该信号,可选非必需信号,内容见TLAST;
    • TDEST:指示信号,提供数据流的路由信息,发送数据方控制该信号,可选非必需信号,内容见TLAST;
    • TUSER:可以自定义的数据信息,发送方跟接收方协商好,数据内容根据双方协商确定,起传输辅助信息内容,发送数据方控制该信号,并且跟随发送方的数据流一同发送,双方的TUSER数据位宽确定规则如下:MIN(MAX[TUSER bits per byte of masters], MAX[TUSER bits per byte of slaves])
    • TREADY,TDATA也是可选非必需信号;去掉TREADY信号,TREADY视作为高电平;去掉TDATA,TSTRB也被视作去掉
    而在FFT IP核中,一共出现了下列信号:
    • s_axis_data: FFT IP核的时域数据输入通道,这个传输过程中,FFT IP核作为接收方(Slave)
    • s_axis_config: FFT IP核的配置数据输入通道,这个传输过程中,FFT IP核作为接收方(Slave)
    • m_axis_data: FFT IP核的频谱数据输出通道,这个传输过程中,FFT IP核作为发送方(Master)
    而且,s_axis_config只使用了TDATA,TREADY,TVALID; s_axis_data使用了TDATA,TREADY,TVALID, TLAST; m_axis_data使用TDATA,TREADY,TVALID, TLAST, TUSER;相对来说控制并不复杂;FFT IP核的控制流程如下:
    1. 配置好s_axis_config_tdata, s_axis_config_tready跟s_axis_config_tvalid握手(都为高)后,配置数据传入;
    2. 等待s_axis_data_tready和s_axis_data_tvalid拉高,通过s_axis_data_tdata传入数据至FFT IP核,等到最后一次数据传输,同时拉高s_axis_data_tlast;
    3. 等待m_axis_data_tvalid和m_axis_data_tready拉高,接收m_axis_data_tdata的数据,m_axis_data_tuser的数据是频谱数据的索引,根据这个索引可以知道当前频谱数据的位置;等到m_axis_data_tlast拉高,数据传输结束。
    最终结果图:
    7818b904438da7b2a777af5b5fd6d5d0.png
    4e313513e9dddb018a1580dbb3b1a3e2.png
    参考资料:
    1. PG109-xfft.pdf
    2. IHI0051A_amba4_axi4_stream_v1_0_protocol_spec.pdf
    欢迎点赞留言,一起探讨这令人头秃的电子关注公众号回复112获取本文所用的参考资料
    (探讨滤波器)3.自适应滤波-LMS算法的FPGA实现使用VCS观察Verilog二维数组仿真值的方法(探讨滤波器)2.手把手用Verilog实现FIR滤波器,非IP核
    展开全文
  • VivadoFFT IP核的使用

    千次阅读 热门讨论 2020-05-03 17:42:37
    FFT(快速傅里叶变换)作为数字信号处理核心算法具有重要研究价值,可应用于傅里叶变换所能涉及任何领域,如图像处理、音频编码、频谱分析、雷达信号脉冲压缩等数字信号处理领域。FFT的鲜明特征之一是计算离散...

    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 Reversed 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_tuser,
    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 @(posedge  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
      else 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
         else begin
           fft_s_data_tvalid=1'b1;
           count<=count+1;
    	   fft_s_data_tlast<=1'b0;
    	   fft_s_data_tdata<=tdata_i;
         end
      end
      else 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
        .aresetn(rst_n),                                           // input wire aresetn
        .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_tuser(fft_m_data_tuser),                      // output wire [7 : 0] m_axis_data_tuser
        .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_tuser;
    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:/Users/radar/Desktop/Science/FPGA/FFT/y1.txt",dataI);
    #100
    rst_n=1;
    end
    
    always #5  clk=~clk;
    reg[7:0]  count=0;
    
    always @(posedge  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
    	 else 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
         else 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_tuser(fft_m_data_tuser),
    .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 @(posedge 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 @(posedge clk) begin
      fft_abs<=$signed(dati_out)* $signed(dati_out)+ $signed(datq_out)* $signed(datq_out);
    end
    
    endmodule
    
    

    testbench中输入的时域波形数据是我们通过matlab生成的,在matlab中我们仿真的是采样率为2kHz情况下,频率分别为50Hz和200Hz的两正弦波叠加后的信号。

    N=128;
    n=1:N;
    f0=50;
    f1=200;
    fs=2e3;
    y=sin(2*pi*f0.*n/fs)+2*sin(2*pi*f1.*n/fs);
    figure;
    plot(y);
    Y=fft(y);
    figure;
    plot(abs(Y));
    y1=y';
    q=quantizer([16 12]);
    y2=num2bin(q,y1);
    fid1=fopen('C:/Users/radar/Desktop/y1.txt','wt');
    for i=1:N
        fwrite(fid1,y2(i,:));
        fprintf(fid1,'\n');
    end
    fclose(fid1);
    

    利用modelsim进行功能仿真时我们将仿真时长设置为20us。为了直观验证fft是否正确,可将输入的时域数据的实部和做完fft后信号功率值的数据格式均设置为anolog(模拟),如下图,可以看到fft后的功率谱为两根独立的谱线,分别代表50Hz和200Hz两个频率点,和matlab仿真结果一致。
    在这里插入图片描述
    在这里插入图片描述
    对于该IP核更复杂的应用,大家可以阅读Xilinx官方提供的文档,根据自己的实际需要进行设计。

    4.拓展

    在一些FFT点数较大或多FFT计算的实时性要求较高的场合,直接计算FFT往往无法满足工程实际的要求,这时需要将数据分段做FFT,即我们所说的2D-FFT(基于二维矩阵的FFT),这方面的知识可参考我的另一篇博客https://blog.csdn.net/qq_43622265/article/details/105904570

    展开全文
  • 自己阅读XILINX FFT IP核整理中文文档 快速傅里叶变换v9.0 IP核指南 ——Vivado设计套件 介绍:Xilinx FFT IP核是一种计算DFT有效方式。 特点:•前向变换(FFT)和反向变换(IFFT)在复数空间,并且可以在...
  • 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在...首先咱们来了解一下vivado的IP核IP核(IP Core):Vivado中有很多IP核可以直接使用,例如数学运算(乘法器、除法器、浮点运...
    229a3ccd78a4f45a11a499f9c91c274a.gif大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

    今天给大侠带来Vivado调用IP核详细操作步骤,手把手教学,请往下看。话不多说,上货。

    dcb35f078c893b334e8c103946886467.png首先咱们来了解一下vivado的IP核,IP核(IP Core):Vivado中有很多IP核可以直接使用,例如数学运算(乘法器、除法器、浮点运算器等)、信号处理(FFT、DFT、DDS等)。IP核类似编程中的函数库(例如C语言中的printf()函数),可以直接调用,非常方便,大大加快了开发速度。5e39d9c42c3e752230039c85cc86a182.png

    使用Verilog调用IP核

    c257e0a94b3e486ce449d6c1c7ce110b.png21724287833642c74630ca22dcec56ef.png一、添加IP核1. 点击Flow Navigator中的IP Catalog。2da87836e15cebd9b67088d9a5ec77b2.png2. 选择Math Functions下的Multiplier,即乘法器,并双击。4c21bd028a57fb5475b39b172dd5e8b9.png 3. 将弹出IP核的参数设置对话框。点击左上角的Documentation,可以打开这个IP核的使用手册查阅。这里直接设置输入信号A和B均为4位无符号型数据,其他均为默认值,点击OK。f3e7b7c61ada05f6a3a7507bd8b0b077.png 4. 稍后弹出的窗口,点击Generate。82a406e701b8a1064c62779a3fca3241.pnga7b0bc6850e5e5ef92bad57bf84eb82b.png二、调用IP核1. 选择IP Sources,展开并选择mult_gen_0 - Instantiation Template - mult_gen_0.veo,可以打开实例化模板文件。如图,这段代码就是使用Verilog调用这个IP核的示例代码。e6d4a400e96c684b9d0e39d2e817dbd6.png 2. 将示例代码复制到demo.v文件中,并进行修改,最终如下。代码中声明了无符号型的4位变量a和b,分别赋初值7、8,作为乘数使用;无符号型的8位变量p,用于保存计算结果。clk为Testbench编写的周期20ns的时钟信号;mult_gen_0 mul(...)语句实例化了mult_gen_0类型的模块对象mul,并将clk、a、b、p作为参数传入。17df5a01baa6b746c5f5868c272ed850.pnga7b0bc6850e5e5ef92bad57bf84eb82b.png三、行为仿真验证以demo为顶层模块,启动行为仿真,即可输出波形。设置a、b、p显示为无符号十进制(右击选择Radix - Unsigned Decimal)。如图,可以看到a=7, b=8,第一个时钟上升沿后p = a * b = 56。3402aa756b5bfe2e2ecff1dcdb1a0f91.pnga3fdf94bc60c402bf3dbebd8f8ccf433.png

    框图(Block Design)中调用IP核

    e72221195ceaf00ccaded72dcb5c73f3.pnga38b20b5eb58972c12a71454e1ef172e.png这里举一个简单的例子,通过调用乘法器IP核,产生一个能计算平方的新模块。d197de3388c7bad248ac0f9f2f98f8b8.png一、创建框图设计文件1. 选择Flow Navigator中的Create Block Design,创建一个框图设计文件。f3c82ad7c86c0724c348cd295b4395c4.png2. 输入文件名并点击OK。006d9bce42c4e07c93d7c0991b5c91dc.pnge502fb38c38d8d3b294a6fb990681c96.png二、添加IP核1. 在框图空白处右击,选择Add IP。89e60b72bc8d064cbb0c1b2d6c90d081.png2. 可以直接搜索需要的IP核,双击确认。10158d88ff7e175ec52e60649d2d6971.png3. IP核即可被添加进来,可以用导线将其与其他器件连接。20aa3a2103dd049361594c5508747780.png4. 双击这个IP核符号,可以打开参数设置对话框。点击左上方的Documentation可以查看IP核的手册。这里将输入的A、B均设置为4为无符号型,其他为默认值,点击OK确认。 275537ff96f5a2c96c5b911000330c05.pnge502fb38c38d8d3b294a6fb990681c96.png三、绘制电路1. 右击Diagram窗口空白处,选择Create Port。cfeced028f770516b4db14f9dde136aa.png2. 弹出窗口中,设置端口a为4位输入信号,并点击OK。01620f3c50097a556faa077a9f6814e2.png3. 将a与A、B都连接起来。b8da4d9559e1d39488375956565cba21.png4. 同样的方法,添加一个8位输出端口p,与P连接。f2d35fe4e7c0de929993c15f11c15636.png5. 再添加一个clk时钟输入端口,与CLK连接。ecebf6b9e51ddb7e2aa3db19ba80e668.png6. 最终结果如图。51dcddf1d83ad32a8278b011d1c92ee0.pnge502fb38c38d8d3b294a6fb990681c96.png

    四、仿真测试

    1. 右击框图设计文件design_1,选择Create HDL Wrapper。

    a892be83d7b1ee91a364b8b6ee62a7b4.png2. 选择第二项并点击OK。a0351897a0c04d4d4632edc7af80a9c2.png3. 打开生成的design_1_wrapper.v文件如图,红框中的代码用来调用前面画好的Block Design模块。1a623d1d78ff1da3a681dc96208e505f.png4. 在design_1_wrapper.v文件中,添加Testbench代码即可进行行为仿真。修改代码如下,给输入信号a赋初值为8,clk连接到Testbench生成的时钟信号c上。ff9f5668b96d119fdfe446fe347a8ced.png 5. 在Simulation Sources文件夹下,设置design_1_wrapper.v为行为仿真的顶层文件(右击,选择Set as Top)。e088f319a4b18d490abc76fb9f0e5744.png启动行为仿真,最终输出的波形如下。可以看到,在clk的第一个上升沿后,就有 p = a*a = 64,即实现了平方运算。END后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!907129d2bde26132c967e6f8c7947046.png精彩推荐Verilog HDL 语法学习笔记VHDL语法学习笔记:一文掌握VHDL语法Vivado 2017.2 安装教程(含多版本各类安装包)叁芯智能科技 FPGA开发板,热销中!ecb26a7e4418bc837326c4a103cd4ae4.gif

    e81501e14f50780c1a098ef2f52159d6.png

    FPGA技术江湖广发江湖帖

    无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。

    FPGA技术江湖微信交流群

    3a3cd0a2c5dd4f0fd4453605d2d27387.png

    加群主微信,备注职业+方向+名字进群

    FPGA技术江湖QQ交流群

    e1d904b3699703d28e66457c9edd320a.png

    备注地区+职业+方向+名字进群

    f45d54fbf9bf2579683dea21b705a3e2.png

    展开全文
  • VivadoFFT9.1 IP核的使用(1)

    千次阅读 2020-06-29 17:25:24
    3、xilinx FFT IP的仿真测试 4、参考: 1、xilinx FFT IP介绍 1)正向和反向复数FFT,运行时间可配置。 2)变换大小N = 2m,m = 3 – 16 3)数据采样精度bx = 8 – 34 4)相位系数精度bw = 8 – 34 5)算术类型: ...

    目录

    1、xilinx FFT IP介绍

    2、FFT IP接口介绍

    3、xilinx FFT IP的仿真测试

    4、修改

    5、参考:


    1、xilinx FFT IP介绍

    1)正向和反向复数FFT,运行时间可配置。

    2)变换大小N = 2m,m = 3 – 16

    3)数据采样精度bx = 8 – 34

    4)相位系数精度bw = 8 – 34

    5)算术类型:

    • 无标度(全精度)定点
    • 定标定点
    • 浮点数

    6)定点或浮点接口

    7)蝴蝶后舍入或截断

    8)Block RAM或分布式RAM,用于数据和相位因子存储

    9)可选的运行时可配置转换点大小

    10)可扩展的定点核心的运行时可配置扩展时间表

    11)位/数字反转或自然输出顺序

    12)用于数字通信系统的可选循环前缀插入

    13)四种架构在内核大小和转换时间之间进行权衡

    14)位精确的C模型和用于系统建模的MEX功能可供下载

    15)有四种运算架构可供选择

    • Pipelined Streaming I/O
    • Radix-4 Burst I/O
    • Radix-2 Burst I/O
    • Radix-2 Lite Burst I/O

    2、FFT IP接口介绍

     

     

    1)AXI4-Stream 介绍

    AXI4-Stream接口带来了标准化,并增强了Xilinx IP LogiCORE解决方案的互操作性。除了诸如aclk,acclken和aresetn之类的常规控制信号以及事件信号之外,到内核的所有输入和输出都通过AXI4-Stream通道进行传输。通道始终由TVALID和TDATA以及必填字段和可选字段(如TREADY,TUSER和TLAST)组成。TVALID和TREADY一起执行握手以传输消息,其中有效负载为TDATA,TUSER和TLAST。内核对包含在TDATA字段中的操作数进行运算,并将结果输出到输出通道的TDATA字段中。

     

     

    上图显示了在AXI4-Stream通道中的数据传输。TVALID由通道的源(主)端驱动,而TREADY由接收器(从属)驱动。TVALID指示有效负载字段(TDATA,TUSER和TLAST)中的值有效。TREADY表示从机已准备好接收数据。当一个周期中的TVALID和TREADY均为TRUE时,将发生传输。主机和从机分别为下一次传输分别设置TVALID和TREADY。

    2)s_axis_config_tdata接口介绍

    s_axis_config_tdata接口携带配置信息CP_LEN,FWD / INV,NFFT和SCALE_SCH。

    NFFT(变换的点大小):NFFT可以是最大变换的大小或任何较小的点大小。例如,1024点FFT可以计算点大小1024、512、256等。NFFT的值为log2(点大小)。该字段仅在运行时可配置的转换点大小时出现。

    CP_LEN(循环前缀长度):从转换结束起,在输出整个转换之前,最初作为循环前缀输出的样本数。CP_LEN可以是小于点大小的从零到一的任何数字。该字段仅在循环前缀插入时出现。

    FWD_INV:指示是执行前向FFT变换还是逆向FFT变换(IFFT)。当FWD_INV = 1时,将计算前向变换。如果FWD_INV = 0,则计算逆变换。

    SCALE_SCH伸缩时间表:对于突发I / O架构,伸缩时间表由每个阶段的两位指定,第一阶段的伸缩由两个LSB给出。缩放比例可以指定为3、2、1或0,代表要移位的位数。N = 1024,Radix-4 Burst I / O的示例缩放计划是[1 0 2 3 2](从最后阶段到第一阶段排序)。对于N = 128,Radix-2 Burst I / O或Radix-2 Lite Burst I / O,一个可能的扩展时间表是[1 1 1 1 0 1 2](从最后阶段到第一阶段排序)。对于流水线I / O架构,从两个LSB开始,每两对Radix-2级用两位指定扩展时间表。例如,N = 256的缩放时间表可以是[2 2 2 3]。当N不是4的幂时,最后一级的最大位增长为一位。例如,对于N = 512,[0 2 2 2 2]或[1 2 2 2 2]是有效的缩放时间表,但是[2 2 2 2 2]无效。对于此变换长度,SCALE_SCH的两个MSB只能为00或01。此字段仅可用于缩放算法(非缩放,块浮点或单精度浮点)。

    s_axis_config_tdata接口格式:

    1.(可选)NFFT加填充

    2.(可选)CP_LEN加填充

    3.前转/后转

    4.(可选)SCALE_SCH

     

    举例:

    内核具有可配置的转换大小,最大大小为128点,具有循环前缀插入和3个FFT通道。内核需要配置为执行8点变换,并在通道0和1上执行逆变换,并在通道2上执行前向变换。需要4点循环前缀。这些字段采用表中的值。

     

    这给出了19位的向量长度。由于所有AXI通道必须与字节边界对齐,因此需要5个填充位,从而s_axis_config_tdata的长度为24位。

     

    3)相关标志信号

     

    3、xilinx FFT IP的仿真测试

     FFT的长度选择8点,x输入序列为x=[1,2,3,4,5,6,7,8];

    Matlab验证:

    x = [1,2,3,4,5,6,7,8];y =fft(x,8);realy=real(y);imagy=imag(y);

    Y的实部输出为realy=[36,-4,-4,-4,-4,-4,-4,-4];

    Y的虚部输出为imagy=[0,9.6569,4,1.6569,0,-1.6569,-4,-9.6569];

    FPGA仿真验证:

    1)IP的设置

    注意:此处应该设置为顺序输出;

    注意:IP核配置结束,端口位宽以及具体分配可以在这里看出!

    2)仿真顶层

    `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 [7 : 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=8'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=8'b0000_0001;
          s_axis_config_tvalid=1'b1;
          #10;
          s_axis_config_tdata=8'b0000_0000;
          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       
              );
    endmodules

    仿真结果:

    4、修改

    可以看出,3中调用FFT核计算结果与Matlab计算结果实部相同,虚部出现不一致;出现问题的原因是数据传输的时候(输入和输出),实部虚部的顺序搞反了,修改以后输出与Matlab一致;

    这里只附上修改后运行结果:

    可以看出,结果正确。

    5、参考:

    FPGA开源工作室

     

     

    展开全文
  • Vivado中FFT9.1 IP核的使用(1)中已经介绍了最简单的FFT操作方式:即固定变换长度,仅仅控制少量控制信号: s_axis_config_tdata // input,配置数据 s_axis_config_tvalid // input,配置数据有效信号 s_axis_...
  • 线性调频信号FFT与之前8点、32点FFTIP核的使用方面并没有什么不同;唯一需要注意就是仿真中线性调频信号如何产生,如何读取到vivado,以及数据位宽。此处以Matlab生成数据,导入到Vivado进行处理,并不代表...
  • Vivado Xilinx FFT IP核v9.0 使用详解(附仿真实例) 前几天我导让我研究研究在FPGA上做FFT,作为一个迈进FPGA大门小白,摸索之旅相当艰难~,现把学习FFT IP核的过程记录下来,为各位同胞提供参考。 一 傅里叶变换...
  • VivadoFFT9.1 IP核的使用(3)——线性调频信号FFT的基础上,对SCALE_SCH进行测试 1、SCALE_SCH介绍 SCALE_SCH对FFT过程缩放进行设置: SCALE_SCH对FFT变换各阶段缩放进行设置,长度与FFT方式和变换...
  • 点击IP Catalog查找到vivado的fft IP核Fast Fourier Transform,双击进入配置界面。 界面介绍,主要分为两大块,左边区域为IP核整体信息介绍部分,右边为详细配置部分。按照自己需求进行配置后可查看左边生成的IP...
  • vivado FFT IP核中文翻译版本,是有道翻译版本。Fast Fourier Transform v9.1
  • zynq系统 本文基于XilinxZYNQ平台,实现ARM系统如何调用底层FFT IP核实现相应算法。ZYNQ平台内部包括两部分,即PL和PS。PL为FPGA逻辑部分,PS为双核ARM9 。FPGA与ARM9之间通信采用高性能AXI总线,PS为PL提供...
  • IP核手册,需要自行下载吧。这个手册详细解释了FFT的使用方法,非常详细。
  • 本文基于XilinxZYNQ7020平台,实现ARM系统如何调用底层FFT IP核实现相应算法。ZYNQ平台内部包括两部分,即PL和PS。PL为FPGA逻辑部分,PS为双核ARM9 。FPGA与ARM9之间通信采用高性能AXI总线,PS为PL提供系统...
  • Vivado FFT IP核实现

    2019-09-26 16:05:36
    VIVADO中建立一个FFT核,只要依下图步骤就可以开始配置一个FFT核: 需要配置参数有三个标签页,需要一一配置 第一个标签页里主要配置通道数,点数,时钟,吞吐量,结构,以及是否可以运行时配置,需要注意是...
  • Xilinx FPGA FFT IP核完整的Vivado工程,用于实现FFT算法,可直接进行波形仿真,测试过没问题,另外还包含matlab仿真文件,时序波形仿真结果和matlab结果一致。
  • 调用Vivado的FFT IP核对输入信号进行频谱分析,含testbench与仿真,仿真结果优秀;具体说明可参考本人博客。CSDN博客搜索:FPGADesigner
  • Chisel实践——利用CORDIC算法计算平方根一、介绍在本专栏之前文章中: 用Chisel快速搭建FFT流水线电路 Chisel实践——短时傅里叶变换模块实现与测试 Chisel实践——利用CORDIC算法计算对数函数 已经介绍了如何...
  • 此资源为VIVADO的工程文件,语言使用的是VHDL语言,其中包括FFT IP核的使用,ROM的IP核使用,时钟IP核的使用。实现了8定点的FFT功能。
  • VIVADO FFT IP核配置以及端口说明

    千次阅读 2020-04-27 16:37:37
    (以下内容均是在学习了别人博客后,自己小结出来) 原文链接1:https://blog.csdn.net/FPGADesigner/article/details/80694673 ...#FFT IP核配置说明 第一个选项是同时进行几路数据流并行。 第二个选项是变换...
  • 特权同学玩转Zynq连载48——[ex67] Vivado FFT和IFFT IP核应用实例 ...下面我们就Matlab和FPGA两个工具双管齐下,比对Vivado的FFT IP核生成的数据。 2 Matlab产生测试数据,绘制cos时域和频域波形 使用project...
  • DDS信号发生器(技术:直接数字频率合成技术)生成一个固定频率正交信号; 实例化FFT IP核,分别作为FFT、IFFT交换; 将信号发生器信号输入到FFT,再将FFT信号输出到IFFT中。
  • Xilinx公司在Vivado开发工具中提供了FFT/IFFT IP核,供开发人员很方便调用和使用,因此,本文主要对VivadoXilinx FFT/IFFT IP核使用流程展开详细介绍。 1、FFT/IFFT IP核的创建 在使用FFT/IFFT IP核之前...
  • [vivado][IP核]FFT

    千次阅读 2018-07-05 09:35:36
    刘东华的IP核详解:1、2、3、 
  • vivado fft/ifft 核的使用

    千次阅读 2019-05-28 17:00:43
    *在同时做fft核ifft时候,尽量选择同一个ip核进行多次例化使用,通过assign s_axis_config_tdata=1/0设置fft或ifft模式 首先为FFT/IFFT核设置,第一个页面Number of Channels表示输入通道个数,Transform ...
  • 初试Vivado2014.4的FFT IP核

    千次阅读 2017-04-21 23:02:13
    本文参考shichaog专栏:http://blog.csdn.net/shichaog/article/details/51189711# ...按上文配置IP核,即使使用Vivado自身TestBench也会有相同问题。 改变思路,使用其他配置。一通道8点流水线结构。设置如下:

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

ip核vivado的fft