FPGA学习-FFT变换-解决频率低信号进行FFT运算的取点问题

FPGA学习-FFT变换-解决频率低信号进行FFT运算的取点问题

  • 前言
  • 一、FFT输入
  • 二、FFT配置
  • 波形分析


前言

  首次接触FFT变换是在OFDM中,QAM后的实部信号与虚部信号需要进行FFT转化,将频域信号转化为时域信号,最终通过DA接口转化为模拟信号。当时对于FFT的理解比较浅,对离散傅里叶的变化了解也少之又少。
  通过结合MTALAB进行了FFT变化操作,了解了直流分量以及FFT的基本计算。后期在vivado中调用fft的ip核遇到了很多问题。踩过的坑一一写在下面,希望能给路过的各位提供一点点价值:
  1.fft ip核的配置,端口含义
  config相关数据的配置、ifft、fft对应0和1。
  输入端口不要产生高阻态,也就是说reg相关变量要有初始值,否则ip核不能运行起来。
2.fft点数问题
  对信号作fft变换,取点最好大于2-3个周期,为了保障fft变换的可靠性。后来遇到一个问题,由于信号频率太低,因此信号一个周期的点数很多,所以我想取够周期数就导致fft的ip核的点数配置很高。后来通过控制vilad,定点抽样信号,大大降低了fft 的配置点数。
3.fft与FIFO的配合
  fft计算有时候会限制时间,因此信号需要先提速,fft本身也需要提速,因此可以通过FIFO转换。

一、FFT输入

调用ROM ip核8*256生成sin信号,频率为30k 系统clk 50mhz 该信号作为后面FFT的数据输入

`timescale 1ns / 1psmodule DDS(input clk,input rst_n,output wire [7:0] douta);
//50000000/256=195312     根据clk增加地址 就产生195k的正弦波
//产生30k的正弦波  30000/195312=0.1536   0.1536*2^22=644,245
parameter Fre_I = 32'd644245;//8*256 rom
wire [7:0] addra;
reg [29:0] addrI;
always @(posedge clk or negedge rst_n) beginif(!rst_n)beginaddrI<=30'd0;endelse beginaddrI<=addrI+Fre_I;endendassign addra =addrI[29:22];blk_mem_gen_0 u_sin (.clka(clk),    // input wire clka.addra(addra),  // input wire [7 : 0] addra.douta(douta)  // output wire [7 : 0] douta
);
endmodule

二、FFT配置

FFT的ip核配置以及FIFO的配置,FFT点512

`timescale 1ns / 1ps
module FFT(input clk,input rst_n,input [7:0] signal,output reg [7:0] signal_ddc);reg [7:0] count;    
reg [9:0] ddc_count;wire [7:0] signal_fifo;
//wire [8:0] rd_data_count;
//wire [8:0] wr_data_count;
wire [8:0] rd_data_count1;
wire [8:0] wr_data_count1;
//reg wr_en;
//reg rd_en; 
//wire full;
//wire empty;reg rd_en1; 
wire full1;
wire empty1;
wire [15:0] fft_fifo;wire               s_axis_config_tvalid = 1;
wire               s_axis_config_tready ;
reg  signed [15:0] s_axis_data_tdata;
wire               s_axis_data_tready ;
reg                s_axis_data_tvalid;
reg               s_axis_data_tlast;
wire               m_axis_data_tvalid;
wire               m_axis_data_tready = 1;
wire               m_axis_data_tlast=0;
wire signed [15:0] m_axis_data_tdata;
wire        [15:0] m_axis_data_tuser;
wire            event_frame_started;
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;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincount<=8'd0;    end else if(count<8'd10)begincount<=count+1;endelse begincount<=3'd0;endend
always @(posedge clk or negedge rst_n)beginif(!rst_n)begins_axis_data_tlast<=1'd0;    end else if(ddc_count=='d512 && count==8'd10)begins_axis_data_tlast<=1'b1;endelse begins_axis_data_tlast<=1'b0;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginddc_count<=8'd0;signal_ddc<=8'd0; s_axis_data_tvalid<=1'b0;
//        wr_en<=1'b0;   s_axis_data_tdata<=16'd0;end else if(count==8'd10 && ddc_count<512)beginsignal_ddc<=signal;
//        wr_en<=1'b1;s_axis_data_tvalid<=1'b1;ddc_count<=ddc_count+1;s_axis_data_tdata<={8'd0,signal};endelse if(count==8'd10 && ddc_count==512)beginddc_count<=8'd0;endelse begin
//        wr_en<=1'b0;  s_axis_data_tvalid<=1'b0;signal_ddc<=signal_ddc;s_axis_data_tdata<=s_axis_data_tdata;endend
//always @(posedge clk or negedge rst_n)begin
//    if(!rst_n)begin
//        rd_en<=1'd0;   
//    end 
//    else if(wr_data_count==9'd511)begin
//        rd_en<=1'b1;
//    end
//    else if(rd_data_count==9'd1)begin
//        rd_en<=1'd0;
//    end
//end//fifo_generator_0 u_fifo(
//  .wr_clk(clk),                // input wire wr_clk
//  .rd_clk(clk),                // input wire rd_clk
//  .din(signal_ddc),                      // input wire [7 : 0] din
//  .wr_en(wr_en),                  // input wire wr_en
//  .rd_en(rd_en),                  // input wire rd_en
//  .dout(signal_fifo),                    // output wire [7 : 0] dout
//  .full(full),                    // output wire full
//  .empty(empty),                  // output wire empty
//  .rd_data_count(rd_data_count),  // output wire [8 : 0] rd_data_count
//  .wr_data_count(wr_data_count)  // output wire [8 : 0] wr_data_count
//);xfft_0 u_fft (.aclk(clk),                                                // input wire aclk.s_axis_config_tdata(16'd0),                  // input wire [15 : 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 [15 : 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_tuser(m_axis_data_tuser),                      // output wire [15 : 0] m_axis_data_tuser.m_axis_data_tdata(m_axis_data_tdata),                      // output wire [15 : 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.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
);always @(posedge clk or negedge rst_n)beginif(!rst_n)beginrd_en1<=1'd0;   end else if(rd_data_count1==10'd511)beginrd_en1<=1'b1;endelse if(rd_data_count1==9'd1)beginrd_en1<=1'd0;end
endfifo_generator_1 u_fft1 (.wr_clk(clk),                // input wire wr_clk.rd_clk(clk),                // input wire rd_clk.din(m_axis_data_tdata),                      // input wire [15 : 0] din.wr_en(m_axis_data_tvalid),                  // input wire wr_en.rd_en(rd_en1),                  // input wire rd_en.dout(fft_fifo),                    // output wire [15 : 0] dout.full(full1),                    // output wire full.empty(empty1),                  // output wire empty.rd_data_count(rd_data_count1),  // output wire [9 : 0] rd_data_count.wr_data_count(wr_data_count1)  // output wire [9 : 0] wr_data_count
);endmodule

波形分析

在这里插入图片描述
通过控制count控制s_axis_data_tvalid,完成对信号的采样。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(免费送源码)计算机毕业设计原创定制:Java+SSM+JSP+Ajax+MySQLSSM国外鞋服代购平台

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;鞋服代购平台当然也不例外。代购平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用…

NCL笔记:[读取特殊符号变量]

ncl无法读取变量参数中含有特殊符号的&#xff0c;例如PM2.5. 如下操作&#xff1a; pm25_file "CHAP_PM2.5_D1K_20211208_V4.nc"b addfile(pm25_file, "r")v new(1,string)v (/"PM2.5"/)pm25 b->$v$就可以了

conda、pip同时安装包引起混乱问题剖析

一句话总结&#xff1a; 安装版本不一致时会有两个.dist-info文件夹&#xff08;举例&#xff1a;scapy-2.6.1.dist-info和scapy-2.4.3.dist-info&#xff09;&#xff0c;conda list和pip list依靠这两个文件夹进行包的识别&#xff08;疑似pip list识别老版本&#xff0c;co…

类和对象--中--运算符重载、日期类实现(重要)

1.运算符重载 2.1作用&#xff1a; 为了让C的新类型&#xff1a;类。也可以进行内置类型的运算符操作。所以就有了运算符重载。 2.2定义&#xff1a; 运算符重载是具有特殊名字的函数&#xff0c;他的名字是由operator和后⾯要定义的运算符共同构成。和其 他函数⼀样&#…

Linux基本指令【Linux系统】

文章目录 lspwdcdtouchmkdirrmdirrmmancpmvcatlessheadtailfindwhichwhereisaliasgrepzip和unzipunameexitshutdown ls 显示指定[指定方式 &#xff1a;ls空格路径]路径中非隐藏的文件 使用语法&#xff1a; ls [选项] [⽬录或⽂件] ls的常用选项 -a列出目录下的所有文件,包…

[开源]3K+ star!微软Office的平替工具,跨平台,超赞!

大家好&#xff0c;我是JavaCodexPro&#xff01; 数字化的当下&#xff0c;高效的办公工具是提升工作效率的关键&#xff0c;然而大家想到的一定是 Microsoft Office 办公软件&#xff0c;然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…

Django实现智能问答助手-数据库方式读取问题和答案

扩展 增加问答数据库&#xff0c;通过 Django Admin 添加问题和答案。实现更复杂的问答逻辑&#xff0c;比如使用自然语言处理&#xff08;NLP&#xff09;库。使用前端框架&#xff08;如 Bootstrap&#xff09;增强用户界面 1.注册模型到 Django Admin&#xff08;admin.py…

Spring-02-springmvc

2. 什么是SpringMVC 2.1. 概述 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架。 为什么要学习SpringMVC呢? Spring MVC的特点&#xff1a; 轻量级&#xff0c;简单易学高效 , 基于请求响应的MVC框架与Spring兼容性好&#xff0c;无缝…

【数据结构】【线性表】一文讲完队列(附C语言源码)

队列 队列的基本概念基本术语基本操作 队列的顺序实现顺序队列结构体的创建顺序队列的初始化顺序队列入队顺序队列出队顺序队列存在的问题分析循环队列代码汇总 队列的链式实现链式队列的创建链式队列初始化-不带头结点链式队列入队-不带头节点链式队列出队-不带头结点带头结点…

手机文件可以打印出来吗

在数字化时代&#xff0c;手机已成为我们日常生活和工作中不可或缺的一部分。很多时候&#xff0c;我们需要将手机上的文件打印出来&#xff0c;无论是学习资料、工作报告还是生活文档。那么&#xff0c;手机上的文件真的可以打印出来吗&#xff1f;答案是肯定的。 直接前往打…

《Spring Boot:快速构建应用的利器》

一、Spring Boot 的崛起与优势 &#xff08;四&#xff09;丰富的生态支持 Spring Boot 拥有强大的生态系统&#xff0c;这是它在 Java 开发领域中占据重要地位的关键因素之一。 Spring Cloud 是 Spring Boot 生态中的重要组成部分&#xff0c;它为构建分布式系统的微服务架构…

爬虫实战:采集知乎XXX话题数据

目录 反爬虫的本意和其带来的挑战目标实战开发准备代码开发发现问题1. 发现问题[01]2. 发现问题[02] 解决问题1. 解决问题[01]2. 解决问题[02] 最终结果 结语 反爬虫的本意和其带来的挑战 在这个数字化时代社交媒体已经成为人们表达观点的重要渠道&#xff0c;对企业来说&…

微信小程序2-地图显示和地图标记

一、index修改页面&#xff0c;让页面能够显示地图和一个添加标记的按钮。 index.wxml <scroll-view class"scrollarea" scroll-y type"list"><view class"index_container"><map id"map" style"width: 100%; h…

Qt入门1——认识Qt的几个常用头文件和常用函数

1.头文件 ① #include <QPushButton>——“按钮”头文件&#xff1b; ② #include <QLabel>——“标签”头文件&#xff1b; ③ #include <QFont>——“字体”头文件&#xff1b; ④#include <QDebug>——输出相关信息&#xff1b; 2. 常用函数/类的基…

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案

AR眼镜的设计与制造成本主要受到芯片、显示屏和光学方案的影响&#xff0c;因此选择合适的芯片至关重要。一款优秀的芯片平台能够有效提升设备性能&#xff0c;并解决多种技术挑战。例如&#xff0c;采用联发科八核2.0GHz处理器&#xff0c;结合12nm制程工艺&#xff0c;这种低…

第二十一周机器学习笔记:动手深度学习之——数据操作、数据预处理

第二十周周报 摘要Abstract一、动手深度学习1. 数据操作1.1 数据基本操作1.2 数据运算1.2.1 广播机制 1.3 索引和切片 2. 数据预处理 二、复习RNN与LSTM1. Recurrent Neural Network&#xff08;RNN&#xff0c;循环神经网络&#xff09;1.1 词汇vector的编码方式1.2 RNN的变形…

ThinkPad t61p 作SMB服务器,打印服务器,pc ,android ,ipad利用此服务器互传文件

1.在t61p上安装win7 2,配置好smb 服务 3.再安装好打印驱动程序 4.pc与win7利用系统的网络互相发现,映射为硬盘使用。 5.android&#xff0c;ipad安装ES文件浏览器访问win7 共享文件夹&#xff0c;互传文件。 6.android手机安装FE文件浏览器&#xff0c;可以利用花生壳外网…

【深度学习之二】正则化函数(weight decay, dropout, label smoothing, and etc)详解,以及不同的函数适用的场景

在深度学习中正则化函数的重要性不言而喻&#xff0c;今天主要总结一些当前常用的一些正则化函数 在深度学习中&#xff0c;正则化&#xff08;Regularization&#xff09;是一种防止模型过拟合的技术。过拟合指的是模型在训练数据上表现很好&#xff0c;但在未见过的测试数据…