【 FPGA 】16点并行DIT FFT的实现
目录
整体架构介绍
旋转因子介绍
代码文件结构
重点难点易错点
整体架构介绍
16点并行FFT分为4级蝶形运算,每一级蝶形运算有一个基本的蝶形单元:
如下是16点DIT FFT的数据流图:
可见,第0级蝶形运算的输入的顺序是:
x(0)、x(8)、x(4)、x(12)、x(2)、x(10)、x(6)、x(14)、x(1)、x(9)、x(5)、x(13)、x(3)、x(11)、x(7)、x(15);
只有这样排列输入,才能得到最终顺序的输出:
x(0)、x(1)、x(2)、x(3)、x(4)、x(5)、x(6)、x(7)、x(8)、x(9)、x(10)、x(11)、x(12)、x(13)、x(14)、x(15);
旋转因子介绍
蝶形因子通用的表示为:,从DIT FFT的数据流图可以看出,第0级蝶形运算的旋转因子为;第1级蝶形运算的旋转因子为:,;第2级蝶形运算的蝶形因子为:,,,;第3级蝶形运算的蝶形因子为:,,,,,,,。
那么这些蝶形因子在Verilog中如何表示呢?
,这样的话:
;
;
;
;
;
;
;
.
如此:
第0级蝶形因子:
;
第1级蝶形因子:
;
;
第2级蝶形因子:
;
;
;
;
第3级蝶形因子:
;
;
;
;
;
;
;
;
在Verilog设计中,蝶形因子肯定要使用parameter来定义,定义成参数,如何去做呢?
FPGA擅长进行定点数的运算,所以,我们要想办法将上述蝶形因子进行扩大,例如扩大512倍,得到:
第0级蝶形因子:
;
第1级蝶形因子:
;
;
第2级蝶形因子:
;
;
;
;
第3级蝶形因子:
;
;
;
;
;
;
;
;
蝶形因子虽然扩大了,但是后面运算还需要注意了,保证同时扩大,同时缩小,得到最终正确结果。
代码文件结构
我们对这个16点并行FFT算法进行描述的时候,采用的结构是从层层例化,从该算法的最顶层fft16,到4级蝶形运算,以及每级蝶形运算包含的8个蝶形单元,在到蝶形单元里面的复数乘法,加法器,减法器等等。从顶层开始描述到最底层,到达最底层,其实只用到了一个复数乘法器,一个加法器,一个减法器。蝶形因此采用参数的方式进行传递。
我的程序结构:
蝶形单元用的是IP核:
仿真文件结构:
仿真源统一命名,test_要测试的module;
仿真结果结构:
对输入输出建立分组,分组观察每一级输入输出信号,确保输入输出连贯,不要中间某一级输入输出异常,以及前一级与后一级输出输入不对应的错误。
具体要看某一级信号:
重点难点易错点
下面总结的都是个人遇到的问题,不代表你会如此。
重点:是对于蝶形因子的处理,以及代码风格的处理,争取不在顶层多写一行代码,通过层层例化,让代码结构一目了然,易于升级与维护。
难点:在与对每一级结果的位数的处理,每一级的结果如何进行截位,输出位宽设计为多少能够满足要求等等。
另一个难点永远都在于代码的调试,debug耗时耗力,进度跟不上的压力等等。
易错点:
易错点在于仿真时候如何给第一级蝶形运算输入数据,注意第一级蝶形运算的数据并不是顺序排列,而是有一定的规律。
仿真的结果如何判断呢?
可以借助Matlab,例如:
>> a = real(fft([0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0]))
>> b = imag(fft([0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0]))
输入是16点数据,输出是怎么样的呢?
输出呈现出余弦波形的规律,可以定性的进行比较。
心里有个大概。
【 FPGA 】16点并行DIT FFT的实现相关推荐
- FIR数字滤波器的FPGA实现(三)-并行FIR滤波器设计
(三)FIR数字滤波器的FPGA实现-并行FIR滤波器设计 文章目录 (三)FIR数字滤波器的FPGA实现-并行FIR滤波器设计 0 并行FIR滤波器基本原理 1 基于直接型结构的全并行 FIR 滤波 ...
- FPGA进行多路并行插值滤波(多相滤波)的实现原理
多相滤波器的基本概念是把FIR滤波器分割成若干较小的单元,然后组合这些单元的结果.首先,让我们考虑一个基于常规8抽头FIR滤波器的抽取子系统的符号表示,如图11所示(为了使用这些例子,我们假设抽取因子 ...
- ArduinoMEGA2560驱动AD7606模块 八路同步采样AD (16位并行数据传输)
1.AD7606模块 淘宝购买的AD7606模块,如下图所示.该模块网上找了很久都没有找到例程.干脆自己写一个. 根据该模块厂家提供的pdf使用说明,可以看到需要将R18电阻拆除,R23焊接1K电阻才 ...
- FPGA series # 基于SDx的fft函数加速
最近比较丧,也不知道是担心未来还是担心这样的自己 SDx建工程,new->SDx project,展开,src右键->import(或者在文件夹内添加相应的.c文件). main.c: # ...
- FPGA 16位除法器
quartusii 中"/"是可以综合的,不过特别耗费资源.这时候在运算速度要求不是很高的前提下,自行实现除法器就是很有意义的事情了. 此除法器完成一次运算需要耗费18个时钟周期. ...
- 16位并行加载寄存器设计
- 频谱仪的更改ip_【正点原子FPGA连载】第五十一章 基于FFT IP核的音频频谱仪-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...
本帖最后由 正点原子 于 2020-10-24 15:19 编辑 203429z6c3os33t8albi33.png (66.36 KB) 2019-7-28 15:14 上传 第五十一章 基于FF ...
- 读论文之《基于 FPGA 的并行全比较排序算法》
为什么介绍这种排序算法:最近在独立编写霍夫曼编码的verilog HDL设计程序,其中用到了排序模块,对一组数据进行排序,苦寻几天,最终找到了这个全新的适合硬件实现的排序算法,分享与此,以空间换时间的 ...
- 基于FPGA的并行计算技术
1 微处理器与FPGA 微处理器普遍采用冯·诺依曼结构,即存储程序型计算机结构,主要包括存储器和运算器2个子系统.其从存储器读取数据和指令到运算器,运算结果储存到存储器,然后进行下一次读取-运算- ...
最新文章
- 制定OKR的两种方式,你知道吗?
- 深入理解卷II ---ICS源代码下载
- 前端笔记-前端优化简要大总结
- Visual Studio 2017为Android APK包签名
- node sqlite 插入数据_使用 Sequelize 操作 Sqlite3 数据库
- 配置Hyper-V Server 资源计量
- CodeForces - 1453D Checkpoints(概率+构造)
- 单位载质量能量消耗量_这样运动减肥效果最好!附:运动能量消耗表
- HDU 3966-Aragorn's Story 树链剖分+树状数组
- android studio 手动安装gradle,Android Studio 如何安装Gradle?
- Vue笔记(六)——Vue组件通信Vuex
- 【C语言】在有序数组中插入一个数,保证它依然有序
- mkhd中的matrix
- Driver 初始化顺序
- 转【es中数据节点和主机】
- 给出汉字‘你’、‘我’、‘他’在Unicode表中的位置
- 串口服务器的作用是什么?
- 写空到linux文件系统,谢烟客---------Linux之文件系统及其命令
- 通过西联快汇收取Google Adsense收入的详细步骤
- 惠普微型计算机w7系统,惠普笔记本电脑一键重装系统win7
热门文章
- PHP-Ajax跨域解决方案
- SEO系列二:何为用户体验?如何做好用户体验?
- 网络营销之微微博营销
- css设置元素继承父元素宽度_CSS设置超链接A标签宽度和高度
- get post put delete 区别_GET 和 POST 的区别?
- silverlight 打开html_Silverlight与HTML集成方法
- java无法获取套接字_无法从套接字获取更多数据
- String SringBuffer StringBuilder区别
- 计算机自动连续工作的基础是存储程序原理,计算机的存储程序工作原理是什么...
- 服务器修改网卡,美国服务器CentOS 6.x修改网卡名称的方法