FPGA基础学习(1) -- FFT IP核(Quartus)
为了突出重点,仅对I/O数据流为steaming的情况作简要说明,以便快速上手,有关FFT ip核模型及每种设置详细介绍请参考官方手册FFT MegaCore Function User Guide。
1 配置
在FFT Megacore Function中选择“parameterize”,弹出对话框。
“Parameters”栏中,选择器件、转换数据的长度、数据精度已经旋转因子的精度。注意旋转因子精度必须小于等于数据精度。

“Architecture”栏中,有FFT引擎选择,在I/O数据流选择Streanming(流水线)的时候,引擎默认为1个四输出引擎。
img
“Implementation Options”栏中,Structure中选择乘法器和加法器组合,有4 Mults/2 Adders和3 Mults/5 Adders两种,本例选择前者。Implement Multiplier in代表实现FFT的逻辑资源分配形式,有DSP Blocks/Logic cells、DSP Blocks ONLY和Logic Cells ONLY三种,Logic cells顾名思义就是消耗FPGA的逻辑资源,而DSP Blocks则将一部分逻辑资源用Embedded Multiplier 9-bit elements表示。本例选择DSP Blocks/Logic cells混合模式。全局时钟和存储器选择采用默认方式。

FFT Megacore Function中“step 2”为跟仿真有关的选项,根据需求选择即可。

“step 3”生成IP核。注意,在生成IP核的过程中,进度条可能会卡主不动,可能是破解的问题(版本13.1)。遇到该问题时,多试几次,或者改动设计参数,可能会顺利生成。
2 信号
生成的FFT IP核,其端口列表如下,相关的详细说明可以在官方手册中查到:
端口说明
| 端口 | 端口类型 | 说明 |
|---|---|---|
| Inverse | / | 改变FFT变换方向,置1时为FFI的你变换。 |
| Sink_valid | I | 拉高表示通知FFT即将有N个数据输入 |
| Sink_sop | I | 输入数据起始标记脉冲(维持一个时钟的高电平),与第一个数据同步 |
| Sink_eop | I | 输入数据结束标记脉冲(维持一个时钟的高电平),与最后一个数据同步 |
| Sink_real | I | 输入数据的实部 |
| Sink_imag | I | 输入数据的虚部 |
| sink_error | I | 指示数据流的错误信息:00——没有错误;01——丢失SOP;10——丢失EOP;11——多余的EOP; |
| sink_ready | O | FFT模块准备就绪,可以接收数据 |
| source_ready | I | 表明downstream模块(理解为FFT的后续接收数据模块)可以接收数据 |
| source_error | O | 表明upstream模块或者FFT模块出了问题,错误信息提示与sink_error一样 |
| source_sop | O | 输出数据起始标记 |
| source_eop | O | 输出数据结束标记 |
| source_valid | O | 置高,准备输出结果 |
| source_exp | O | 结果数据缩放因子:这个指数位的意思打个比方说吧,比如它是3,就是说这时输出的虚部和实部的数值要除以2的3次方,如果是10,就要除以2的10次方,如果对结果精度要求不高的话,可以直接截去相应的长度,比如指数是3,实部输出101101110111,那么此刻实际的值应该为101101110.111;取整就是101101110 |
| source_real | O | 变换后输出数据的实部 |
| source_imag | O | 变换后输出数据的虚部 |
3 仿真结果


sink_ready由FFT模块发出,代表其准备就绪。复位至少数个周期。当复位失效,FFT准备就绪后,sink_ready被置高。将Sink_valid拉高,通知FFT准备接收发来的数据。Sink_sop代表流水线输入数据的开始,在Sink_sop拉高的同时,第一个数据已经发送。

当一帧的数据(FFT处理的点数)输出完成后,将sink_eop拉高,代表一帧数据的结束,注意最后一个数据在sink_eop拉高的同时传输。注意:如果多帧数据连续输入,为了简化程序设计,将两帧数据中间放置一个时钟的周期的间隔,此时必须将Sink_valid拉低一个时钟周期,否则FFT的sourse_error会报01的错误,即缺少数据开始标志Sink_sop。当然,在程序设计上让Sink_sop和sink_eop首尾相连,则不需要拉低一个周期的Sink_valid。

在数个时钟周期之后,FFT模块开始输出转换完成的数据。与输入相似,当完成时,FFT模块会拉高转换完成信号source_valid和输出起始标志信号source_sop,与此同时,第一个数据输出。

当一帧数据转换完成后,FFT模块会将source_eop拉高,同时输出最后一个转换完成的数据。
FPGA基础学习(1) -- FFT IP核(Quartus)的更多相关文章
- FPGA基础学习(2) -- FIFO IP核(Quartus)
ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...
- Quartus FFT IP核简介
为了突出重点,仅对I/O数据流为steaming的情况作简要说明,以便快速上手,有关FFT ip核模型及每种设置详细介绍请参考官方手册FFT MegaCore Function User Guide. ...
- 从Xilinx FFT IP核到OFDM
笔者在校的科研任务,需要用FPGA搭建OFDM通信系统,而OFDM的核心即是IFFT和FFT运算,因此本文通过Xilinx FFT IP核的使用总结给大家开个头,详细内容可查看官方文档PG109.关于 ...
- 实测—fft IP核使用(包括ifft的配置使用)
Vivado xilinx fft9.0 使用笔记: ****注 仿真实测1024点的转换需要经过1148个时钟周期才能得到转换结果: 模块配置信号含义请参考pg109文档手册(写的贼烂会看晕),不详 ...
- FFT IP核调用与仿真之SCALE压缩因子设置
关于FFT IP核的配置,网上有很多相关的资料可以参考,但是唯独涉及到scaled压缩因子设置这个参数,资料却非常匮乏,这是个什么参数,应该整么设置,设置后对结果输出会有什么影响,整样才能知道它设置的 ...
- FFT IP核调用与仿真之FFT数学分析
对于FFT这个IP核,我其实对它真的是又爱又恨,因为它真的耗费了我太多时间,但是随着研究的深入,遇到的问题一点点给消化解决,终于不用带着问题睡觉了,哈哈,有时候真的挺佩服自己的,遇到不懂的,不了解的, ...
- Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用
根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封 ...
- Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成
打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设 ...
- FPGA基础学习(8) --内部结构之存储单元
目录 1. 基本结构 2. BRAM与DRAM的比较 3. BRAM的特点 4. Block Memory的使用 4.1 配置为RAM或ROM 4.2. 配置为FIFO 参考文献: 上一篇中提到了SL ...
随机推荐
- 在ACCESS中LIKE的用法
Access里like的通配符用法是这样: “?”表示任何单一字符: “*”表示零个或多个字符: “#”表示任何一个数字 所以应该是: select * from databa ...
- iOS多线程各种安全锁介绍 - 线程同步
一.atomic介绍 github对应Demo:https://github.com/Master-fd/LockDemo 在iOS中,@property 新增属性时,可以增加atomic选项,ato ...
- DAY19-Pillow制作验证码
PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修 ...
- Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方案
Eclipse Maven 开发一个 jee 项目时,编译时遇到以下错误:Description Resource Path Location TypeDynamic Web Module 3.0 r ...
- linux 创建docker基础镜像
通过Dockerfile创建镜像时,一般都是基于 Docker Hub 提供的官方镜像.以下分别介绍在ubuntu16和centos7 两个系统上创建个人私有基础镜像的方法. 一.ubuntu16创 ...
- java中sleep和join和yield和wait和notify的区别
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- Java界面设计
---------------siwuxie095 Java SE(Java Standard Edition) 即 Java 标准版, 一般也 ...
- Tensorflow递归神经网络学习练习
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #载入数据集mnist = inpu ...
- 面试题:3年工作经验 已看1 有用 memcache和redis有什么区别
此内容偏中高级,适合有三年经验者. 1. java中wait和sleep有什么区别?多线程条件下如何保证数据安全? 答:最大区别是等待时wait会释放锁(乐观锁),而sleep会一直持有锁 ...
- Struts第三天
OgnlValueStack贯穿整个 Action 的生命周期. 它是ContextMap中的一部分,里面的结构是一个List,是我们可以快速访问数据一个容器.它的封装是由struts2框架完成的. ...