Vivado FFT IP核使用

1. 今日摸鱼任务

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 学习Vivado FFT IP核的使用 |
| Vivado_FFT IP核 使用详解_vivado fft ip核-CSDN博客 这篇写的很详细啦 简单做一点笔记进行记录 |

2. FFT IP核

xfft_0 ff (
  .aclk(aclk),                                                // input wire aclk
  .aresetn(aresetn),                                          // input wire aresetn
  .s_axis_config_tdata(s_axis_config_tdata),                  // input wire [23 : 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_tuser(m_axis_data_tuser),                      // output wire [7 : 0] m_axis_data_tuser
  .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
  .event_frame_started(event_frame_started),                  // output wire event_frame_started
  .event_tlast_unexpected(event_tlast_unexpected),            // output wire event_tlast_unexpected
  .event_tlast_missing(event_tlast_missing),                  // output wire event_tlast_missing
  .event_status_channel_halt(event_status_channel_halt),      // output wire event_status_channel_halt
  .event_data_in_channel_halt(event_data_in_channel_halt),    // output wire event_data_in_channel_halt
  .event_data_out_channel_halt(event_data_out_channel_halt)  // output wire event_data_out_channel_halt
);

看起来有这么多端口,貌似很麻烦捏:

AXI4-Stream这里重点是TVALID和TREADY:分清输入输出的主、从

3. matlab 程序

clc;clear;close all;
fs = 1e4;f1 = 5e2;
N = 1024;
t = 0:1/fs:(N-1)/fs;
x = sin(2*pi*f1*t)  ;
x = mapminmax(x).* (2^15-1);
fid = fopen('fft_test_signal.txt', 'wt');
for i = 1:N
    if (x(i) >= 0)
        fprintf(fid, '%s\n', dec2bin(x(i),16));
    else 
        fprintf(fid, '%s\n', dec2bin(2^16 + x(i), 16));
    end
end
fclose(fid);
y = fft(x(1:1024)) / 2^12;%缩放倍数在s_axis_config_tdata处
y_re = real(y);
y_im = imag(y);
figure(1);
subplot(3,1,1);plot(0:N-1,x);title('x = sin(2*pi*500*t)  fs = 10kHz');
subplot(3,1,2);plot(0:N-1,y_re);title('y re');
subplot(3,1,3);plot(0:N-1,y_im);title('y im');

4. FFT 配置与验证

`timescale 1ns / 1ns
module fft_tb(    );

    reg aclk;
    reg aresetn;
    reg [23:0] s_axis_config_tdata;
    reg s_axis_config_tvalid;
    
    reg [31:0] s_axis_data_tdata;
    reg s_axis_data_tvalid;
    reg s_axis_data_tlast;
    reg m_axis_data_tready;
    
    wire [31:0] m_axis_data_tdata;
    wire [9:0] m_axis_data_tuser;
    wire m_axis_data_tlast;
    wire m_axis_data_tvalid;
    
    wire s_axis_config_tready;
    wire s_axis_data_tready;
    wire event_frame_started;
    wire event_tlast_unexpectedl;
    wire event_tlast_unexpected;
    wire event_tlast_missing;
    wire event_status_channel_halt;
    wire event_data_in_channel_halt;
    wire event_data_out_channel_halt;
    
    
    reg [15:0] data_in[0:1024-1];
    integer i;
    
    wire [15:0] Xk_Re, Xk_Im;
    assign Xk_Re = m_axis_data_tdata[31:16];
    assign Xk_Im = ~m_axis_data_tdata[15:0]+1'b1;//取反

    initial aclk = 1'b1;
    always#10aclk = ~aclk ;
    
     initial
        begin
          $readmemb("E:/vivado/fft/fft_test_signal.txt", data_in);
          aresetn = 1'b0;
          s_axis_config_tdata = {7'b000_0000, 16'b_01_01_10_01_10_10_01_10, 1'b1};
         //s缩放倍数 1+1+2+1+2+2+1+2=12  2的12次幂对应matlab
          s_axis_config_tvalid = 1'b1;
          
            i = 0;
            s_axis_data_tdata = 32'd0;
            s_axis_data_tlast = 1'b0;
            m_axis_data_tready = 1'b1;
            # 40;
            
          aresetn = 1'b1;  
          forever 
          begin
            @(negedge aclk) 
            if(s_axis_data_tready == 1'b1) 
            begin
                s_axis_data_tvalid = 1'b1;
                s_axis_data_tdata = {data_in[i], 16'd0};
                    if(i == 1024-1) i = 0;
                    else i = i+1;
            end
            else 
                s_axis_data_tvalid = 1'b0;      
         end
           
          $stop;  
       end
        
        
    xfft_0 ff (
      .aclk(aclk),                                                // input wire aclk
      .aresetn(aresetn),                                          // input wire aresetn
      .s_axis_config_tdata(s_axis_config_tdata),                  // input wire [23 : 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_tuser(m_axis_data_tuser),                      // output wire [9: 0] m_axis_data_tuser
      .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
      .event_frame_started(event_frame_started),                  // output wire event_frame_started
      .event_tlast_unexpected(event_tlast_unexpected),            // output wire event_tlast_unexpected
      .event_tlast_missing(event_tlast_missing),                  // output wire event_tlast_missing
      .event_status_channel_halt(event_status_channel_halt),      // output wire event_status_channel_halt
      .event_data_in_channel_halt(event_data_in_channel_halt),    // output wire event_data_in_channel_halt
      .event_data_out_channel_halt(event_data_out_channel_halt)  // output wire event_data_out_channel_halt
    );



endmodule

这个取补码可以正数变负数、负数变正数(这个小问题下周推导一下)

对于有符号数,右键Radix--> Signed Decimal

对于模拟波形显示,可以右键--> Waveform Style --> Analog Settings

//下班下班

相关推荐
专业ATE提供商2 小时前
加速科技精彩亮相中国国际半导体博览会IC China 2024
科技·fpga开发
stm 学习ing6 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
北城笑笑16 小时前
FPGA 14 ,硬件开发板分类详解,FPGA开发板与普通开发板烧录的区别
fpga开发·fpga
2202_7544215417 小时前
一个计算频率的模块
驱动开发·fpga开发
小灰灰的FPGA18 小时前
低速接口项目之串口Uart开发(七)——如何在FPGA项目中实现自适应波特率串口功能
fpga开发
fei_sun2 天前
【Verilog】第一章作业
fpga开发·verilog
深圳市雷龙发展有限公司longsto2 天前
基于FPGA(现场可编程门阵列)的SD NAND图片显示系统是一个复杂的项目,它涉及硬件设计、FPGA编程、SD卡接口、NAND闪存控制以及图像显示等多个方面
fpga开发
9527华安2 天前
FPGA实现PCIE3.0视频采集转10G万兆UDP网络输出,基于XDMA+GTH架构,提供工程源码和技术支持
网络·fpga开发·udp·音视频·xdma·pcie3.0·万兆网
able陈2 天前
为什么verilog中递归函数需要定义为automatic?
fpga开发
fei_sun2 天前
【Verilog】第二章作业
fpga开发·verilog