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

//下班下班

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775454.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS+CSS+HTML项目-中国国家图书馆

页面做的不多,CSS效果请看哔哩哔哩

每天五分钟深度学习框架pytorch:tensor向量的统计函数的运算

本文重点 给定一个向量,我们如何才能获取到这个向量中重要的那部分呢?比如均值,最大值等等,我们可以使用pytorch中已经封装好的方法来完成这些任务。 常用的统计方法 L1范式 L1范式就是将向量中所有元素的绝对值相加求和,以上是对a、b、c三个向量求L1范式,都是8 L2范数…

NFT Insider #137:Polygon链上NFT销售额破7800万美元,TheSandbox通过创作者挑战推动社区参与

引言:NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜…

UML2.0-系统架构师(二十四)

1、(重点)系统()在规定时间内和规定条件下能有效实现规定功能的能力。它不仅取决于规定的使用条件等因素,还与设计技术有关。 A可靠性 B可用性 C可测试性 D可理解性 解析: 可靠性:规定时间…

Linux 内核 GPIO 用户空间接口

文章目录 Linux 内核 GPIO 接口旧版本方式:sysfs 接口新版本方式:chardev 接口 gpiod 库及其命令行gpiod 库的命令行gpiod 库函数的应用 GPIO(General Purpose Input/Output,通用输入/输出接口),是微控制器…

Linux 端口

什么是虚拟端口 计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序,确保程序之间进行沟通。 IP地址相当于小区地址,在小区内可以有许多用户(程序)&…

AI绘画Stable Diffusion 双重曝光-神秘意境和难以言喻的视觉体验,SD提示词轻松搞定

大家好,我是画画的小强 今天给大家介绍AIGC绘图提示语使用常见摄影手法:双重曝光。双重曝光摄影效果是一种摄影爱好所热衷的常见摄影手法之一。通过双重曝光摄影手法,能够为图同摄影图像引入神秘的意境感和一种难以言喻的视觉体验&#xff0…

android应用的持续构建CI(二)-- jenkins集成

一、背景 接着上一篇文章,本文我们将使用jenkins把所有的流程串起来。 略去了对android应用的加固流程,重点是jenkins的job该如何配置。 二、配置jenkins job 0、新建job 选择一个自由风格的软件项目 1、参数赋值 你可以增加许多参数,这…

Windows环境使用SpringBoot整合Minio平替OSS

目录 配置Minio环境 一、下载minio.exe mc.exe 二、设置用户名和密码 用管理员模式打开cmd 三、启动Minio服务器 四、访问WebUI给的地址 SpringBoot整合Minio 一、配置依赖,application.yml 二、代码部分 FileVO MinioConfig MinioUploadService MinioController 三…

c++习题05-斐波那契数列

目录 一,问题 二,思路 三,代码 一,问题 二,思路 根据题目,可以自己列出斐波那契数列(前四个)如下: 通过列出来的值,可以发现,前两个都是1&…

如何优化圆柱晶振32.768KHz的外壳接地?

圆柱晶振32.768KHz在电子设备中扮演着重要的角色,其精确的时钟信号对于许多应用至关重要。为了确保晶振的稳定性和准确性,外壳接地是一个关键步骤。 一、外壳接地的目的 外壳接地的主要目的是为了防止信号干扰。当晶振的外壳接地后,它相当于…

联合概率密度函数

目录 1. 什么是概率密度由联合概率密度求概率参考链接 1. 什么是概率密度 概率密度到底在表达什么? 外卖在20-40分钟内送达的概率 随机变量落在[20,40]之间的概率。下图中,对总面积做规范化处理,令总面积1, f ( x ) f(x) f(x)则成…

创建本地仓库

一、新建挂载目录 二、将挂载本地镜像挂载到目录 三、配置yum仓库 一、新建挂载目录 mkdir /BenDiCangKu 二、将挂载本地镜像挂载到目录 1、先连接本地光盘 2、挂载光盘 mount /dev/sr0 /BenDiCangKu 3、查看挂载 由此可见挂载成功 三、配置yum仓库 1、新建yum仓库文件…

Zabbix6.4安装教程

目录 前言 主要功能 常见应用场景 一. 环境准备 二. 部署安装 三. Web页面安装 前言 Zabbix是一个开源的企业级监控解决方案,用于监控各种网络设备、服务器、应用程序和云资源。它能够提供全面的监控、告警和数据分析功能,帮助管理员及时发现和解决…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc(识别pdf中图片)4. Deepdoc(识别pdf中文字)5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)

下面是一些git的常用命令和基本操作,可以当做平常的笔记查询,用于学习!!! 文章目录 前言 一、git 二、git常用命令 总结 前言 下面是一些git的常用命令和基本操作,可以当做平常的笔记查询,用于…

UE4_材质基础_切线空间与法线贴图

学习笔记,不喜勿喷,侵权立删,祝愿大家生活越来越好! 一、切线空间 在《OpenGL基础11:空间》中提到了观察空间、裁剪空间、世界空间等。切线空间和它们一样,都属于坐标空间 上面就是一个…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(二)增加基本的发起人审批与多用户多实例

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、AssigneeNode 增加approvalText public abstract class AssigneeNode extends Node {// 审批对象private AssigneeTypeEnum assigneeType;// 表单内人员private String formUser;// 表…

【智能制造-10】样条曲线、贝塞尔曲线、B样条

什么是样条? 样条是通过一组指定点集而生成平滑曲线的柔性带。 什么是B样条? B样条就相当于一个函数,这个函数在系数不同时就可以变化成各种曲线的形状。 B样条的优势? 保留了Bezier曲线的优势可局部修改,调整某一…

专题三:Spring源码中新建module

前面我们构建好了Spring源码,接下来肯定迫不及待来调试啦,来一起看看大名鼎鼎ApplicationContext 新建模块 1、基础步骤 1.1 自定义模块名称如:spring-self 1.2 选择构建工具因为spring使用的是gradle,所以这边需要我们切换默认…