基于FPGA的FFT算法实现

2023-11-12

项目简述

前面的一篇博客我们已经讲解了FFT算法的发展历程,至于FFT的原理感兴趣的同学可以查阅书本数字信号处理,书本上面的知识特别详细,这里我也就不多说了。接下来我们将利用FPGA实现FFT算法,我们本次实验会利用IP核来实现,但是后面的文章会讲解verilog实现FFT过程。

本次实验所用到的软硬件环境如下:
1、VIVADO2019.1软件环境
2、Modelsim10.7c仿真环境

FFT IP的定制及详解

我们找到FFT的IP核如下:
在这里插入图片描述
在这里插入图片描述
1、这里我们选择1路信号的FFT变换。
2、FFT变换的点数,我们这里是1024点与前面MATLAB中的设置保持一致。
3、模块的参考时钟频率我们选择100MHz。
4、选择实现FFT的算法,我们使用基2算法
在这里插入图片描述
1、我们这里的数据格式选择成定点数即可。
2、缩放比例我们选择成块浮点数,这里是指将FFT每层的运算进行一定缩放,使得最后的结果大小适当。
3、这里选择数据的缩放直接选择截断数据。
4、输入数据的位宽,我们这里选择成16位。
5、相位因子的位宽,这与FFT内部相频的精度有关,这里我们选择默认即可。
6、FFT输出有两种顺序,也就是自然顺序和位反转顺序,我们一般选择自然顺序方便我们之后的处理。
在这里插入图片描述
1、数据我们使用块RAM。
2、相位我们也使用块RAM
3、复数乘法我们使用4乘法器结构
4、乘法使用DSP内部的专用乘法器,效果好一点。
这里我们还要注意IP定制界面的下面信息:
在这里插入图片描述
在这里插入图片描述
从上面的信息中我们可以看到,输入输出数据的高16位代表复数的虚数位,低16位代表复数的实数位。
S_AXIS_CONFIG输入为1代表傅里叶正变换,0代表傅里叶逆变换。

Block Design设计

我们本次实验将继续上次的实验进行讲解。在上一章的block design中加入相应的FFT的IP核,如下:
在这里插入图片描述
上面的设计我们严格遵循了AXI-stream的数据协议,当然因为该项目简单AXI中的ready信号一直为高,可以简化设计。同时注意,上面有我们自定义的IP核,代码如下:
fft_last模块:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : nnzhang1996@foxmail.com
// Website      : 
// Module Name  : fft_last.v
// Create Time  : 2020-04-04 22:18:25
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

module fft_last(
    input                       sclk            ,
    input                       rst_n           ,
    input                       axi_tvalid      ,
    input                       axi_tready      ,
    output  reg                 axi_tlast           
);
 
//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================/
reg                     [10:0]  cnt             ;

//========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
always @(posedge sclk or negedge rst_n)
    if(rst_n == 1'b0)
        axi_tlast           <=          1'b0;       
    else if(cnt == 1023 && axi_tready == 1'b1 && axi_tlast == 1'b1)
        axi_tlast           <=          1'b1;
    else
        axi_tlast           <=          1'b0;

always @(posedge sclk or negedge rst_n)
    if(rst_n == 1'b0)
        cnt                 <=          11'd0;
    else if(cnt == 1023 && axi_tready == 1'b1 && axi_tlast == 1'b1)
        cnt                 <=          11'd0;
    else if(axi_tready == 1'b1 && axi_tlast == 1'b1) 
        cnt                 <=          cnt + 1'b1;
    else
        cnt                 <=          cnt;
        
endmodule

split模块:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : nnzhang1996@foxmail.com
// Website      : 
// Module Name  : split.v
// Create Time  : 2020-04-04 22:48:43
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

module split(
    input               [31:0]  d_in        ,
    output  wire        [15:0]  d_out1      ,
    output  wire        [15:0]  d_out2      
);
 
//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================/

 
//========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/

assign      {d_out2,d_out1}         =           d_in;

endmodule

仿真结果

我们对上面的工程进行仿真,仿真结果如下:
在这里插入图片描述
从上面的仿真你图形可以验证我们实验的正确性。

总结

创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。(txt文件、图片文件在群中)对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于FPGA的FFT算法实现 的相关文章

  • Ubuntu16.04主机安装基于ZYNQ的QT交叉编译库

    Ubuntu16 04主机尝试安装基于ZYNQ的QT交叉编译库 前言 基于vivado2016 4 SDK的交叉编译环境 主机Linux上安装vivado2016 4版本 qtcreator上添加基于ZYNQ的交叉编译工具 基本环境 参考资
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • 【Xilinx】SynchronousInterruptHandler错误排查笔记

    SynchronousInterruptHandler错误排查笔记 一 ArmV8的异常处理 二 64位lscript ld的修改 三 asm vectors S的修改 四 SynchronousInterruptHandler函数解析 五
  • 采用Vivado 配置xilinx GTX的SATA设计

    从Vivado开始 配置GTX的时候 多了一个SATA协议支持 但有些小地方还需要自己另外设置 整理了一下 分享给大家 首先打开Transceivers wizard 打开页签 线速率和参考时钟选择 在协议里面选择SATA2或者SATA3
  • xilinx xdma PCIe中断bug

    xilinx xdma PCIe中断存在bug bug1 此中断虽然是msi或者msx中断 但是不中断cpu bug2 此中断不是边沿中断 而是电平中断 在驱动层需要不断地轮训查询中断事件 bug3 此中断持续时间必须长 而且在收到中断应答
  • verilog 基本语法 {}大括号的使用

    的基本使用是两个 一个是拼接 一个是复制 下面列举了几种常见用法 基本用法 表示拼接 第一位 第二位 表示复制 4 a 等同于 a a a a 所以 13 1 b1 就表示将13个1拼接起来 即13 b1111111111111 拼接语法详
  • Lattice Diamond安装

    1 下载 到Lattice官网 http www latticesemi com 注册一个lattice的账号后就可以去下载Diamond 登陆后如下图 根据自己系统情况选择对应的版本 我用的是32位win8 Diamond软件安装包和La
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • FPGA_MIG驱动DDR3

    FPGA MIG驱动DDR3 说明 FPGA zynq 7z100 DDR3 MT41K256M16TW 107 内存大小为512MB 数据接口为16bit 环境 Vivado2018 2 IP核 Memory Interface Gene
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 可以购买哪些 FPGA(现场可编程门阵列)在家中进行实验? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 什么是 FPGA 在哪里可以买到 它们要花多少钱 您需要什么样的系统来试验它们 如何对它们进行编程 如果这是正确的术语 您能否使用普通 M

随机推荐

  • uniapp history打包 解决公众号支付的问题

    微信公众号支付的时候 会在商户平台中配置支付目录 如 http www xxx com mypro 上面的路径是支付的url 页面地址 但是我们使用 uniapp 或者vue 的时候 默认的是 router 的 mode 是 hash 模式
  • [转载]使用@value注解注入properties配置信息

    首先 value需要参数 这里参数可以是两种形式 Value configProperties t1 msgname 或者 Value t1 msgname 其次 下面我们来看看如何使用这两形式 在配置上有什么区别 1 Value conf
  • Centos 服务器禁止 IP访问/ IP黑名单

    本文结合上文的一起使用体验更佳 Centos实时网络带宽占用查看工具iftop 一 iptables 防火墙 yum install iptables services 2 安装 iptables 防火墙 systemctl enable
  • IDEA控制台中文乱码解决

    关于IDEA中文乱码的解决方法 如下 1 打开idea安装目录 选择 打开文件 末尾添加 Dfile encoding UTF 8 2 打开IntelliJ IDEA gt File gt Setting gt Editor gt File
  • js获取当前时间和倒计时

    一 当前时间 获取当前时间显示年月日 时分秒 function newDate var date new Date var Y date getFullYear var M date getMonth 1 lt 10 0 date getM
  • RAID介绍及RAID5配置实例

    一 RAID磁盘阵列介绍 1 1RAID磁盘阵列介绍 RAID是Redundant Array of Independent Disks的缩写 中文简称为独立冗余磁盘阵列 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组 逻辑硬盘 从
  • python制作网络社交图

    python制作网络社交图 制作说明 python语言是可以制作网络社交图的 在制作之前需要先导入python内部的一个库 import networkx as nx 该库是一个用python语言开发的图论与复杂网络建模工具 内置了常用的图
  • Redis-关于RDB的几点顿悟-COW(Copy On Write)

    文章目录 摘要 问题概述 问题解决 使用Copy On Write 写时复制 详细 解答 Copy On Write 机制 Linux中CopyOnWrite实现原理 CopyOnWrite的好处 Redis中的CopyOnWrite 摘要
  • Linux(Centos6.5)下如何解压.zip和.rar文件

    Windows下常见的压缩文件类型是 zip和 rar 在Linux下如何压缩和解压缩呢 1 zip linux下提供了zip和unzip命令 zip是压缩 unzip是解压缩 举例如下 zip myFile zip jpg 将所有jpg文
  • Linux--权限管理

    学习目标 1 Linux权限管理 1 1 用户分类 2 用户类型和访问权限 2 1 理解什么是权限 3 文件类型和权限操作 3 1 修改权限 3 2 关于root 3 3 更改文件拥有者 3 4 修改组权限 3 5 目录权限 3 5 1 粘
  • 基于jsp的学生网上报名系统

    学生网上报名系统分为五大模块 信息查询模块 信息修改模块 信息录入模块和导出印模块以及信息发布模块 其中信息录入模块是进行信息的添加 存储和删除 是系统运行的基础 信息查询模块是学生通过自己的姓名和学号登陆系统 进入报名界面时由系统按照预先
  • 【JS基础】一些个人积累的原生JS编码设计思想,和大家一起开拓下思维

    文章目录 前言 对象配置 链式调用 队列调用 并发执行 条件判断优化 给数据做封装 尝试先写JS再写界面 前言 以下都是我个人遇到的前端JS原生编码设计上的一些案例记录 希望能帮助新手开拓写代码的思想 并且能够结合自己的想法应用在实际的项目
  • 为什么要使用npm

    文章转载自 https zhuanlan zhihu com p 24357770 网上的 npm 教程主要都在讲怎么安装 配置和使用 npm 却不告诉新人 为什么要使用 npm 今天我就来讲讲这个话题 本文目标读者是 不太了解 npm 的
  • 【项目功能模块】SpringBoot+vue实现登录手机验证码

    SpringBoot vue实现登录需要手机验证码 要在Spring Boot和Vue中实现登录需要手机验证码功能 你需要进行以下步骤 后端 Spring Boot 实现 添加相关依赖 在pom xml文件中添加以下依赖
  • KVM添加文件夹存储

    创建基于文件夹的存储池 1 定义一个存储池 virsh pool define as kvm images dir kvm images 2 查看创建的存储池信息 virsh pool list all 3 建立基于文件夹的存储池 virs
  • OPENGL学习(二)OPENGL渲染管线

    Vertex processor 对顶点进行预处理 原始点都是三维的 最终我们看到的点都是二维的 这个映射过程和点的实际位置 和我们从哪个视角去看都有关系 需要通过一系列矩阵调整点的坐标 另外 还需要确定点的颜色 这个和点到镜头的距离和光照
  • 前端与后端通信最简单的三个方式

    在HTML和Java后端之间进行通信通常是通过使用服务器端的技术来实现的 以下是一些常用的方法 使用表单提交 在HTML中 可以使用表单元素来收集用户输入的数据 当用户提交表单时 可以使用POST或GET方法将数据发送到Java后端 在Ja
  • R语言 判别分析:线性判别、K最邻近、有权重的K最邻近、朴素贝叶斯

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 class包 提供Knn 函数 kknn包 提供kknn 函数及miete数据集 房租信息 kknn函数 实现有权重的K最近邻 knn函数 实现K最近邻算法 klaR包 提供Navi
  • Spring Boot 实现Mybatis多数据源

    文章目录 Spring Boot 多数据源 1 背景 2 定义数据源 2 1 定义动态数据源 2 3 定义自定义数据源 3 配置数据库链接 4 编写数据源切面 Spring Boot 多数据源 1 背景 项目日产生的数据量比较大 所以规定每
  • 基于FPGA的FFT算法实现

    基于FPGA的FFT算法实现 项目简述 FFT IP的定制及详解 Block Design设计 仿真结果 总结 项目简述 前面的一篇博客我们已经讲解了FFT算法的发展历程 至于FFT的原理感兴趣的同学可以查阅书本数字信号处理 书本上面的知识