精华内容
下载资源
问答
  • FFT_XILINX实现

    2018-03-26 21:24:47
    使用Xilinx FPGA实现4096点的FFT变换,变换效果良好。
  • xilinx FFT核手册

    2019-03-15 16:35:43
    The Xilinx® LogiCORE™ IP Fast Fourier Transform (FFT) core implements the Cooley-Tukey FFT algorithm, a computationally efficient method for calculating the Discrete Fourier Transform (DFT).
  • Xilinx FFT IP核的使用

    2021-10-20 11:22:35
    说明:通过对比Matlab实践来运用Xilinx FFT IP核实现复数的FFT。 代码下载:Xilinx FFT IP核 Verilog代码实现 工程下载:FFT工程 文章目录一、Fast Fourier Transform IP核介绍二、FFT IP核的使用1、1KHz采样率、...

    说明:通过对比Matlab实践来运用Xilinx FFT IP核实现复数的FFT。
    代码下载:Xilinx FFT IP核 Verilog代码实现
    工程下载:FFT工程

    直通☛ 200页+ FPGA/IC秋招面试笔试题


    一、Fast Fourier Transform IP核介绍

    主要包括配置接口、时域数据输入接口、时钟复位接口、频域数据输出接口、状态接口。

    展开全文
  • Xilinx FFT IP核

    2018-05-13 23:42:50
    Vivado Xilinx FFT 快速傅里叶变换IP核文档 详细介绍FFT9.0 IP核灾Vivado环境下的配置和使用 全英文 做通信实现相关的可以仔细读一读
  • Xilinx FPGA FFT 应用笔记

    万次阅读 多人点赞 2015-08-31 18:26:22
    1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样...

    这个是2012年写的,现在给放上来了,其实百度文库也有。

    系统工作环境:

        芯片为:xilinxSpartan 6

        软件:ise 12.2

        IP coreFFT版本:7.1  

    目标:完成对放大板的标定


    一、标定的过程简单介绍:

    放大板包含3级程控放大器的放大电路、4个可选择的高频滤波器、1个50Hz的工频滤波器,放大板主要是针对低频信号,放大频率范围:0-20KHz,

    标定示意图:


             ◎offset 调节:控制放大板的输入接地,将放大器的放大倍数设置为1000倍,测试AD 的输出电压是否为0V,如果不是,则说明放大器内部有直流偏置,通过调节DA的offset输出电压,使得放大板在输入为0v时,输出也为0v。

              ◎直流标定:直流标定挺简单的,让DA输出固定的电位,设置放大器的倍数,看看输出是否与理论值一致。

    例:输入为0.1mv,放大倍数为1000倍,检查输出是否为:0.1V ,目的主要是为了检查放大板对直流的响应。


              ◎交流标定:交流标定比较复杂,为了测量放大板对交流信号的响应,主要体现在放大器对信号的相频与幅频特性。


              ◎具体的做法:FPGA控制DA产生一个正弦波,再通过AD采集放大后的数据,并对其做FFT(快速傅里叶变换),计算出信号的相位与幅度,与输入的波形对比,检测放大板的对交流信号的响应。

         例:①输入f=1Hz,A=10mv,Phase = 0°的正弦波,测量输出的

    信号的A、Phase、f。

                  ②输入f=2Hz,A=10mv,Phase = 0°的正弦波,测量输出的

     信号的A、Phase、f

            ③输入f =3Hz……

    ………

    ⑩输入f =2000Hz……

    其实简单点,就是一个频谱分析仪,求放大板的频谱图,看看放大器对交流信号有没有产生频移与幅度的衰减。

    二、FGPA的工作

    ◎控制放大器,简单的IO应用

    ◎驱动ADS1274

    ◎驱动AD5664r

    ◎在内部生成一个DDS(直接数字频率合成器),输出频率、相位可调的正弦波。

    ◎对AD采集的数据进行FFT的转换。

    三、DFT(离散傅里叶变换)的理解

    3.1傅里叶变换的基础知识

    其实,大学的时候几乎每个童鞋都学过傅里叶变换,应该算是必修的课程,但是当时我也就为考试,背背公式,不知道大家是什么心情,但是没有想过有一天居然真的用到了,表示很无力啊。

      在网上找了一下资料,也看了一些书。把一些感觉好的东西记录一下,加上自己的一些理解。

    傅立叶是一位法国数学家和物理学家的名字,英语原名是:Jean Baptiste Joseph Fourier(1768-1830)Fourier对热传递很感兴趣,于1807年在法国科学学会上发表了一篇论文,运用正弦曲线来描述温度分布,论文里有个在当时具有争议性的决断:任何连续周期信号可以由一组适当的正弦曲线组合而成。

    举个的例子理解下

    在数学上,关于一个信号最基本的问题在于如何将它表示和描述出来。按照上面所说的办法,把一个信号理解成一个定义在时间或空间上的函数是一种自然而然的表示方式,但是它对理解这一信号的内容来说常常不够。例如一段声音,如果单纯按照定义在时间上的函数来表示,它画出来是这个样子的:



    这通常被称为波形图。毫无疑问,它包含了关于这段声音的全部信息。但是同样毫无疑问的是,这些信息几乎没法从上面这个「函数」中直接看出来,事实上,它只不过是巴赫的小提琴无伴奏 Partita No.3 的序曲开头几个小节。下面是巴赫的手稿,从某种意义上说来,它也构成了对上面那段声音的一个「描述」:


    这两种描述之间的关系是怎样的呢?第一种描述刻划的是具体的信号数值,第二种描述刻划的是声音的高低(即声音震动的频率)。人们直到十九世纪才渐渐意识到,在这两种描述之间,事实上存在着一种对偶的关系,而这一点并不显然。 

    根据原信号的不同类型,我们可以把傅立叶变换分为四种类别:

      四种不同信号的变换结果:


    摘自《数字信号处理》 王世一

    。提问数字信号处理只能处理离散的信号,所以在以上的4种情况中,只有第4种是可行的,但是同时也参生了一个问题,就是信号必须是周期的,但是在实际的数据中,不一定都是周期的啊,这个怎么办呢!以下是在《Digitalsignal processing》(一个老外写的特别好的书)的图,看完图后应该就能明白了。


    就是把有限长的信号进行复制,让其变成一个周期信号进行处理。

    说到这,上一下离散傅里叶级数的公式:


    上面是DFT的公式,至于怎么来的,我也尝试过搞明白,但是一头雾水,大致的情况是:

    (连续周期信号的傅里叶变换)

        通过对连续的周期的信号的公式进行抽样处理,然后推到出来的,推的过程就很复杂了,也不太好理解。

    3.2这样理解DFT的公式(不知道对不对??)

    当我看到离散傅里叶级数的公式:


    我的第一个感觉就是,他代表的是什么意思啊,凭什么这个公式就是对的啊,怎么样理解这个公式呢。

    ⑴先说说公式各项:

    ◎x[i]:表示待处理的离散数据序列,其中i的范围为{0,N-1}   

    :Re是Real的缩写,表示实部(复数), 表示离散的频率序列, 表示周期信号,K的范围为{0,N-1}

    :cos函数

    ⑵公式的意义任何连续周期信号可以由一组适当的正弦曲线组合而成

    把连续改成离散的:任何离散周期信号可以由一组适当的离散正弦曲线组合而成。

    为什么可以算就是对的呢???

    在网上看到了这样一段话,感觉挺好的:

        傅立叶变换是一个数学上极为精美的对象:

    Ø  它是完全可逆的,任何能量有限的时域或空域信号都存在唯一的频域表达,反之亦然;它完全不损伤信号的内在结构;

    Ø  任何两个信号之间有多少相关程度(即内积);它们的频域表达之间也一定有同样多的相关程度;

    Ø  它不改变信号之间的关联性:一组信号收敛到一个特定的极限,它们的频域表达也一定收敛到那个极限函数的频域表达。

    那怎么计算相关性呢,在网上看见了一个很不错的例子:

    http://blog.csdn.net/v_JULY_v/article/details/6196862

    以下是他举的例子

    利用第一种方法、信号的相关性(correlation)可以从噪声背景中检测出已知的信号,我们也可以利用这个方法检测信号波中是否含有某个频率的信号波:把一个待检测信号波乘以另一个信号波,得到一个新的信号波,再把这个新的信号波所有的点进行相加,从相加的结果就可以判断出这两个信号的相似程度。如下图:


    上面a和 b两个图是待检测信号波,图a很明显可以看出是个3个周期的正弦信号波,图b的信号波则看不出是否含有正弦或余弦信号,图c和d都是个3个周期的正弦信号波,图e和f分别是a、b两图跟c、d两图相乘后的结果,图e所有点的平均值是0.5,说明信号a含有振幅为1的正弦信号c,但图f所有点的平均值是0,则说明信号b不含有信号d。这个就是通过信号相关性来检测是否含有某个信号的方法。

    通过上面的例子,可以进一步确定:任何两个信号之间有多少相关程度(即内积),它们的频域表达之间也一定有同样多的相关程度。

    再来个实际的例子:

    这个是圈圈写的,在此引用:

    一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。

    采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。

    假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加.n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。

    假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

    好了,说了半天,看着公式也晕,下面圈圈以一个实际的信号来做说明。假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:

    S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)

    式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。

     

    图1 FFT结果
    从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看:
    1点: 512+0i
    2点: -2.6195E-14 - 1.4162E-13i
    3点: -2.8586E-14 - 1.1898E-13i

    50点:-6.2076E-13 - 2.1713E-12i
    51点:332.55 - 192i
    52点:-1.6707E-12 - 1.5241E-12i

    75点:-2.2199E-13 -1.0076E-12i
    76点:3.4315E-12 + 192i
    77点:-3.0263E-14 +7.5609E-13i
        很明显,1点、51点、76点的值都比较大,它附近的点值都很小,可以认为是0,即在那些频率点上的信号幅度为0。接着,我们来计算各点的幅度值。分别计算这三个点的模值,结果如下:
    1点: 512
    51点:384
    76点:192
       按照公式,可以计算出直流分量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。

    附上自己对DFT的理解:

    。假设采样率为N,输入点的个数也为N,

    。根据奈奎斯特定理,DFT能分解出来的最高频率为:NHz,

    。分辨率为:1Hz,

    DFT的意义就是将:0Hz,1Hz,2Hz……N/2Hz的信号与输入的离散序列做内积,求每一个频率与输入的离散序列的相关程度。相关程度越大,表示这个频率的信号在组成输入序列的所有频率信号中占有的比重越大,他的幅值也越大。(不知道对不对??)

    3.3  FFT与DFT

    快速傅氏变换(FFT)是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。

    设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要 次运算。当N=1024点甚至更多的时候,需要 =1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成 。继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要 次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。

    四、用FPGA做FFT的仿真

    芯片为:xilinxSpartan 6

    软件:ise 12.2

    IP core FFT版本:7.1  

    在做FFT之前,读了一下IP core FFT的数据手册,他的输出端口比较简单,但是也有一些疑惑的地方。

    ISE 提供了FFT/IFFT 的IP Core,可以完成实数、复数信号的FFT 以及IFFT 运算。FFT 的

    IP Core 提供三种结构,分别为:

    (1)            流水线,Streaming I/O 结构:允许连续的数据处理;

    (2)基4,Burst I/O 结构:提供数据导入/导出阶段和处理阶段。此结构拥有较小的结构,但转换时间较长;

    (3)基2,Burst I/O 结构:使用最少的逻辑资源,同Radix-4 相同,提供两阶段的过程。

    其配置界面有3 页,第一页如图5-57所示,主要用于配置实现结构;第二页配置数据位宽以及数据处理操作;第三页配置数据缓存空间。在实际硬件操作中,模块的执行速度是很重要的参数,所以本文分析第一种结构,即流水线Streaming I/O结构,以进行连续的数据处理。在进行当前帧的N 点数据时,可加载下一帧的N 点数据,同时输出前一帧的N点数据。此结构由多个基2的蝶形处理单元构成,每个单元都有自己的存储单元来存储输入和中间处理的数据。FFT 的计算单元具有丰富的控制信号,其详细说明见下文。

    XN_RE、XN_IM :输入操作数,分别为实部和虚部,以2 的补码输入。在使用时应当确定其位宽。

    START:FFT 开始信号,高有效。当此信号变高时,开始输入数据,随后直接进行FFT 转换操作和数据输出。一个START 脉冲,允许对一帧进行FFT 转换。如果每N 个时钟有一个START 脉冲或者START 始终为高,,则都可以连续进行FFT 。如果在最初的START 前,还没有NFFT_WE ,FWD_INV_WE,SCALE_SCH_WE信号,则START 变高后就使用这些信号的默认值。由于此IP Core 支持非连续的数据流,因此在任何时间输入START,即可开始数据的加载。当加载N 个数据结束后,就开始FFT 转换运算。

    UNLOAD:对于Burst I/O 结构,此信号将开始输出处理的结果。对于流水线结构和比特逆序输出的情况,此端口不是必要的。

    NFFT :此端口只对实时可配置应用时有用。

    NFFT_WE :此端口是NFFT 端口的使能信号。

    FWD_INV :用以指示IP Core 为FFT 还是IFFT,其等于1 时IP Core 进行FFT 运算,否则进行IFFT 运算。至于采用哪种转换运算是可以逐帧变化的。这一端口给FFT 的使用提供了很大的方便。

    FWD_INV_WE :作为FWD_INV 端口的使能信号。

    SCALE_SCH:(1) 在IP Core 设计时,如果选择在计算过程中进行中间数据的缩减,那么此信号才可起作用;(2) 输入的位宽等于2*ceil(NFFT/2),其中NFFT = log2(point size)。(3) 流水线结构中,将每个基2 的蝶形处理单元视为一个阶段,每个阶段进行一次数据的缩减,缩减的比例以此输入中对应阶段的两比特表示。(4)每阶段的两比特数可以是3,2,1 或0 :它们表示了数据所需要移动的比特数。

    SCALE_SCH_WE :作为SCALE_SCH 的使能信号。

    SCLR :可选端口。

    Reset :重置信号端口。Reset=1 时,所有工作都停止且初始化。但内部的帧缓存保留其内容。

    CE :可选端口。

    CLK :输入时钟。

    XK_RE,XK_IM :输出数据总线,以2 的补码输出。SCALE_SCH_WE 有效时,输出位宽等于输入;否则,输出位宽= 输入位宽+NFFT+1。

    XN_INDEX :位宽等于log2(point size),输入数据的下标。

    XK_INDEX :位宽等于log2(point size),输出数据的下标。

    RFD :数据有效信号,高有效,在加载数据时为高电平。

    BUSY :IP Core 工作状态的指示信号,在计算FFT 转换时为高电平。

    DV :数据有效指示信号,当输出端口存在有效数据时变高。

    EDONE :高有效。在DONE 信号变高的前一个时钟变为高电平。

    DONE :高有效。在FFT 完成后变高,且只存在一个时钟。在DONE 变高后,IP Core 开始输出计算结果。

    BLK_EXP :当使用Burst I/O 结构时可用,若选择流水线,则此端口无效

    OVFLO :算法溢出指示。在数据输出时,如每帧有溢出,此信号变高。在每帧开始处,此信号重置。

    总体说这个核功能很强大,用的时候最重要的就是注意start 信号要早于输入信号4个周期,但是实际应用中并不需要4个周期就已经开始加载数据了,可以这样做:START 一直开,认为第一次加载数据是初始化,即从第二次开始正式工作,从而简化了设计。

    Xilinx FFT IP核V7.1支持三种算法类型:全精度无压缩、块浮点型和定点压缩(压缩比由用户自定义)。

    对于全精度无压缩结构,数据通道内任意一位有意义的整数都将被保留,在运算过程中产生的小数部分都被截断或者取整。此种结构,对于定点算法,经过多级乘法操作以后,数据位宽将加倍递增,其输出位宽为(输入位宽+log2(数据转换长度)+1)bits。

    对于块浮点型,对于一帧数据里面的任何一数据点有相同的压缩比,这个压缩比值由块指数(Block Exponent)作为输出值显示,而且只有在FFT IP核检测到将会产生数据溢出的时候,才会进行压缩运算。

    本文所采用的是定点压缩结构。该结构相对于全精度无压缩结构,能够大大减少FPGA内部资源Xtreme DSP Slices和块RAM的使用,而相对于块浮点型,可灵活调节压缩比。定点压缩结构的压缩比例表(Scale_SCH)完全由用户自定义得到。压缩比例是按照1、2、4或者8对每一阶进行压缩,即对应于分别向右移位0、1、2或者3。如果压缩不充分,则蝶形输出结果会超出其动态范围,引起数据溢出。对于Burst I/O结构,Scale_SCH的表示方法:对于每一阶的压缩比都由指定的一个2bits的数表示,零阶的2bits数为最低位,具体形式为[N4,N3,N2,N1,N0],每一个2bits数分别对应着相应阶数的压缩比。例:对于基4结构,数据转换长度N=1024,Scale_SCH=[0110 00 1110]则表示对阶0右移位2,对阶1右移位3,对阶2右移位0,对阶3右移位2,对阶4右移位1。经验总结(可以防止产生数据溢出):对于1024点的基4,Burst I/O结构,Scale_SCH=[10 10 10 10 11];而对于1024点的基2结构,Scale_SCH=[01 01 01 01 01 01 01 01 0110]。对于流水线,Streaming I/O结构,把临近的一对基2阶组在一起,即阶0和阶1为组0,阶2和阶3为组1,等等。Scale_SCH的表示方法:对于每一组的压缩比都由指定的一个2bits的数表示,零组的2bits数为最低位,具体形式为[N4,N3,N2,N1,N0],每一个2bits数分别对应着相应组的压缩比,表示同组内的两个基2阶有相同的压缩比。例:数据长度N=1024,Scale_SCH=[10 10 00 01 11]表示对组0(阶0和阶1)右移位3,对组1(阶2和阶3)右移位1,对组2(阶4和阶5)没有移位,对组3(阶6和阶7)右移位2,对组4(阶8和阶9)右移位2。若变换长度N不是4的幂次方的时候,最后一组只包含一个基2阶,只能用00或者01表示。经验总结(可以防止产生数据溢出):N=512时,Scale_SCH=[01 10 10 10 11];N=1024时,Scale_SCH=[1010 10 10 11]。压缩比例Scale_SCH的位宽,对于流水线,Streaming I/O结构和基4,Burst I/O结构,为2*ceil(0.5*log2(N));对于基2,Burst I/O结构和基2Lite Burst I/O结构,为2* log2(N),其中N为转换数据长度。

    在仿真过程中遇到的问题:

    1.  数据的输入:datasheet上写的是“two’s complement”,我看了许多的翻译,多是翻译为2的补码的形式,我就想2的补码的形式是什么形式,后来百度后才知道two’s complement就是补码的意思,而不是2的补码。

    2.  还是输入的问题,数据输入分为实部和虚部,但是AD输出的信号为实数信号,怎么将实数转换成复数输入,网上有个哥们提出了相同的问题。

    有的人回答:将实数做正交转换,但是怎么转换呢????

    还有的回答是:实部与虚部都输入AD的输出值,说FFT的速度会加快,没有验证过。

    我的理解应该:实部为AD的输出值,虚部为0,验证正确。

    3.  设置Scale_SCH时,不确定设置多大数值时,可以将ovflo引脚引出,看看仿真的时候会不会溢出。

    4.  数据的输入要在rfd为高时,才有效。

     

     

    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

    FFT的设置:

    Transform length:16

    R-2,Burest IO

    datawidth 16, Phase factor16.

    scaled,

    convergentrounding,

    naturalorder without cycle prefix insertion.

    memoryblock ram,

    complexmultiplier- 3 multiplier structure,

    butterflyarithmetic ,

    useCLB logic

    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

    仿真的程序:

    `timescale1ns / 1ps

    //Company:

    //Engineer:calm_yi

    //

    //Create Date:   09:47:47 04/24/2012

    //Design Name:   fft

    //Module Name:  C:/Users/PC/Desktop/FFT/fft/fftt.v

    //Project Name:  fft

    //Target Device: 

    //Tool versions: 

    //Description:

    //

    //Verilog Test Fixture created by ISE for module: fft

    //

    //Dependencies:

    //

    //Revision:

    //Revision 0.01 - File Created

    //Additional Comments:

    //

    modulefftt;

     

        // Inputs

        reg start;

        regfwd_inv;

        regclk;

        regscale_sch_we;

        regfwd_inv_we;

        reg [7:0] scale_sch;

        wirerfd;

        wire [3:0] xn_index;

        reg [15:0] xn_re;

        reg [15:0] xn_im;

     

        // Outputs

        wire done;

        wire busy;

        wireedone;

        wireovflo;

        wire dv;

        wire [3:0] xk_index;

        wire [15:0] xk_im;

        wire [15:0] xk_re;

       

        // Instantiate the Unit Under Test (UUT)

        fftuut (

               .rfd(rfd),

               .start(start),

               .fwd_inv(fwd_inv),

               .dv(dv),

               .done(done),

               .clk(clk),

               .busy(busy),

               .scale_sch_we(scale_sch_we),

               .fwd_inv_we(fwd_inv_we),

               .edone(edone),

               .ovflo(ovflo),

               .xn_re(xn_re),

               .xk_im(xk_im),

               .xn_index(xn_index),

               .scale_sch(scale_sch),

               .xk_re(xk_re),

               .xn_im(xn_im),

               .xk_index(xk_index)

        );

     

        initial begin

               // Initialize Inputs

               start = 1;

               fwd_inv = 1;

               clk = 0;

               scale_sch_we =1;

               scale_sch = 8'b01010101;

               fwd_inv_we = 1;

               xn_re = 0;           

               xn_im = 0;

    num= 0;

               // Wait 100 ns for global reset tofinish

               #100;   

        end

    always

        begin

          #10 clk<= 1;

               #10clk<= 0;

        end

    reg[3:0]num;

    always@(posedgeclk)

    begin

        if(rfd)

        begin

               num<= num + 1'b1;

               case(num)

                      4'd0: xn_re<= 10000;

                                           4'd1:xn_re<= 10000;

                                           4'd2:xn_re<= 10000;

                                           4'd3:xn_re<= 10000;

                                           4'd4:xn_re<= 10000;

                                           4'd5:xn_re<= 10000;

                                           4'd6:xn_re<= 10000;

                                           4'd7:xn_re<= 0;

                                           4'd8:xn_re<= 0;

                                           4'd9:xn_re<= 0;

                                           4'd10:xn_re<= 0;

                                           4'd11:xn_re<= 0;

                                           4'd12:xn_re<= 0;

                                           4'd13:xn_re<= 0;

                                           4'd14:xn_re<= 0;

                                           4'd15: xn_re<=10000;

                                    default: ;

                             endcase

        end

    end

    endmodule

    仿真的时序图

    ◎输入为16个点:

    。实数部分:10000、10000、10000、10000、10000、10000、10000、10000、

                  0、  0、     0、    0、    0、    0、    0、    0、

    。虚实部分:0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0

    其实就是一个幅值为10000,占空比为50%的方波在rfd为高电平时输入:

      

    FFT输出的数据

    dv为高电平时输出转换的数据:

    Num

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    Re

    5000

    625

    0

    625

    0

    625

    0

    625

    0

    625

    0

    625

    0

    625

    0

    625

    Im

    0

    -3142

    0

    -936

    0

    -418

    0

    -124

    0

    124

    0

    418

    0

    936

    0

    3142

    为了验证仿真的结果,用matlab做了一下相同的十六个点的仿真,结果如下:


     

    在结果中,我们发现,matlab做出来的结果都是FPGA仿真的结果的两倍,为什么,(待解决)

    但是可以看出,应该是仿真结果是对的,因为0Hz时,也就是直流分量FPGA的仿真结果为5000,而matlab的为10000,所以应该是matlab的结果不知道那出了问题!

    ◎下面是做的第二个仿真,FFT的点数为64,其他的参数与上面的一样。

    。压缩比例:scale_sch =12'b000000010101;

    。输入的数据采样率为:64Hz/s

    。采样时间为:1s

    。采样的函数为:

    输入的数据就是对P的采样后的64个数据。


    。输入的细节:


    。FFT后输出的数据:




    在图中,可以看到:22Hz、5Hz、18Hz时的幅值是非常高的。证明包含的频率分量是对的,但是幅值是不对的,可能跟压缩比例有关系。

    以下是改变压缩比例后的结果:

    压缩比例:scale_sch= 12'b010101010101;


    两者之间有什么关系,需要进一步验证。

     

     

    以下是matlab的输出结果


     

     

     

                        

                                                                                                      yi

                                                                                                      EMEQGroup

                                                                                                      2012.04.27


    展开全文
  • xilinx FFT

    2018-09-14 11:21:26
    基于xilinx公司提供的FFT核,编写了硬件测试代码,经测试所得结果与计算结果一致
  • 采用c语言编写的二维傅里叶变换,对想要采用硬件Fpga实现的同学有一定的参考价值,目前在xilinx开发板上实现sdk处理fft2,效果还不错
  • 自己阅读XILINX FFT IP核整理的中文文档 快速傅里叶变换v9.0 IP核指南 ——Vivado设计套件 介绍:Xilinx FFT IP核是一种计算DFT的有效方式。 特点:•前向变换(FFT)和反向变换(IFFT)在复数空间,并且可以在...
  • Xilinx FFT ip核的使用

    2020-07-14 19:29:33
    配置通道 Field Name Width Padded Description NFFT 5 Yes 传输点的长度,就是FFT变换的实际长度,其值:N= 2n2n2n2n2n 2^n2n2n2n(2NFFT​) No 简单点说,就是设置缩放倍数,比如 SCALE_SCH = [01 10 00 11 10]就...

    概述

    该ip可以实现N= 2 m 2 m 2 m 2m2m 2^m 2m2m2m2m点的DFT或者IDFT,(m=3~16).

    • 输入数据精度 bx= 8 – 34
    • 相位因子精度 bw= 8 – 34
    • 输入的数据类型:
      1. 未缩放(全精度)的定点数
      2. 缩放的定点数
      3. 块浮点数
    • 可以在运行时配置变换点数
    • 有四种运算架构可供选择
      1. Pipelined Streaming I/O
      2. Radix-4 Burst I/O
      3. Radix-2 Burst I/O
      4. Radix-2 Lite Burst I/O

    主要端口描述

    name描述备注
    s_axis_dataAXI总线输入
    s_axis_config_tdata配置接口配置正反变换,变换长度,缩放倍数等信息
    aclk时钟
    s_axis_config_tdataAXI总线输出

    相关标志信号

    name描述备注
    event_frame_started新帧当P核开始处理一个新帧
    event_tlast_unexpected断帧数据未满一帧而 s_axis_data_tlast却置高
    event_tlast_missing错帧数据满一帧而 s_axis_data_tlast却保持低电平
    event_fft_overflow溢出计算结果溢出,在使用缩放定点和单精度浮点时才会出现,仅当溢出是有效选项时才出现。
    event_data_in_channel_haltIP核需要数据而输入端口不能够提供数据
    event_data_out_channel_haltIP核要输出数据但是输出缓冲区已满,只出现在非实时模式。
    event_status_channel_haltIP核写状态寄存器但无法写入,只出现在非实时模式。

    详细信息请查看官方数据手册。

    配置通道

    填充格式

    Field NameWidthPaddedDescription
    NFFT5Yes传输点的长度,就是FFT变换的实际长度,其值:N= 2 n 2 n 2 n 2n2n 2^n 2n2n2n(2NFFT)No简单点说,就是设置缩放倍数,比如 SCALE_SCH = [01 10 00 11 10]就表示右移了(1+2+0+3+2)位,也就是缩小了256倍,那么计算的结果就要扩大256倍

    那么在使用时,位宽的多少,是否填充,填充多少,这些都需要我们自己去计算吗?当然不用,Vivado IDE可以自动计算。就以NFFT为例,当我们勾选run time configurable时,我们可以看到s_axis_config_tdata 的位宽发生了变化,而且,具体的某一位代表什么也可以从中看出。

    在这里插入图片描述
    在这里插入图片描述

    具体使用

    Configuration Tab

    在这里插入图片描述Channels:选择一个通道
    Transform Length:选择1024,注意这个是最大长度,只果勾选了run time configurable,配置长度才可变。
    Implementation Options:运算的架构,其资源与数据吞吐量如下图所示
    在这里插入图片描述

    Implementation Tab

    在这里插入图片描述Data Format:选择Fixed Point,选择其它选项会发现资源使用暴增。

    在这里插入图片描述
    Scaling Options :缩放选项,选择Scaled,同样有其它选项,但是资源使用量会暴增

    因此,要合理权衡资源、运算速度、精度,选择合适的选项,如果资源太多用不完,当我没说。
    Precision Options: 输入数据位宽和相位因子位宽。相位因子具体干什么用,我也不太清楚,看了下手册,好像和噪声有关,这里保持默认16bit即可,至于输入位宽,这里是指实部和虚部的位宽,实际上输入应是32bit。可以看到,高16位是虚部,低16位是实部。输出数据同理。
    在这里插入图片描述
    Control Signals: 选择复位信号,至少保持两个周期。
    Output Ordering:输出时自然序列还是倒序。
    其它保持默认选项,都不勾选,如果有需要使用的,可以查阅官方手册。因为这些配置已经可以进行正常的运算了。

    Detailed Implementation Tab

    在这里插入图片描述
    这里主要选择资源的使用类型,比如是否使用BRAN,是否使用乘法器,用多少什么的,同样,权衡资源与速度,保持默认即可。
    最后看一下Latency,这个与你计算的点数,实际时钟屏率,选择资源类型有关,所以这个Latency仅供参考。
    在这里插入图片描述

    仿真测试

    在生成IP核以后,将其导出,然后进行仿真验证,在这里我选用ModelSim,个人建议不要选择Vivado自带的仿真,个人感觉有卡又慢又难用。然后还需要Matlab生成波形和验证结果。什么?没有Matlab,那你搞什么FFT,赶快去装一个。有了Matlab,我们可以更方便的进行仿真。

    初始化部分代码
    首先,需要初始化CONFIG_tdata,其一共有16个bit(为什么是16bit,去IP核配置界面自己看)这里,我们选用正变换,所以最低一个bit为1,然后10个bit是缩放因子,2个一组,选择缩放32倍,剩下的用0填充。所以结果因该是这样:

    assign S_AXIS_CONFIG_tdata = 16'b0000_0_01_01_01_01_01_1;
    

    M_AXIS_DATA_tready这个一直拉高即可,详情请看AXI协议。

    assign M_AXIS_DATA_tready = 1'b1;
    

    定义变换的最大点数:

     parameter MAX_SIZE=16'd1024 - 1;
    

    然后我们需要1024个数据,这1024个数据采用Matlab生成,然后ModelSim读取。

    reg[15:0]  memory[MAX_SIZE:0];//测试波形数据存储空间
    initial   $readmemh("./sin_bit.txt",memory);//读取原始波形数据读到memory中
    

    我们还需要将FFT的输出数据导出,然后由Matlab分析查看结果。

     integer handle1;
     initial
     	begin//sequence block    
         handle1 = $fopen("fsave.txt");       
         #5000;  
         @(negedge M_AXIS_DATA_tvalid);//等待数据输出完毕
         #5000;
         $fclose(handle1);
         $stop;
       end
       always @(posedge aclk)
       begin
       	if(M_AXIS_DATA_tvalid)        
       		$fwrite(handle1,"%d  %d \n",M_AXIS_DATA_tdata[31:16],M_AXIS_DATA_tdata[15:0]);        
       end
    

    剩下的就是控制传输数据。

     always @(posedge aclk)
       begin
           if(all_en)
               begin
               cnt <= cnt + 1'b1;
               if(cnt == 0)     
               begin     
                   S_AXIS_CONFIG_tvalid  <=1;    
               end
               else if(cnt == 3)
                   S_AXIS_CONFIG_tvalid  <= 0;
               else if(cnt == 5)
               begin    
                   S_AXIS_DATA_tvalid <= 1;
                   index = 0;
               end        
               else if(cnt == MAX_SIZE + 5)
               begin        
                   S_AXIS_DATA_tlast <= 1'b1;                            
               end
               else if(cnt == MAX_SIZE + 6)
               begin
                   S_AXIS_DATA_tvalid <= 1'b0;
                   S_AXIS_DATA_tlast <= 1'b0;
               end
               if(S_AXIS_DATA_tlast)
       			index <= 'd0;
       		else if(S_AXIS_DATA_tvalid)
                   index <= index +1;
           end
       end 
    

    确认代码无误后,开始仿真,仿真主要看一下有没有错误发生,如果有,检查一下错误的原因,没有错误接下来就用Matlab处理数据。
    在这里插入图片描述
    先用Matlab生成测试的波形:

    F1=1000000;     F2=500000;     F3=1500000;    %信号的频率
    Fs= F1*4;%采样频率
    A1=135;         A2=296;        A3=502;        %振幅
    P1=50;          P2=-60;        P3=110;        %信号初始相位
    ADC = 400;                                    %直流分量
    N=1024;%采样点数为N
    WIDTH = 12;%信号位宽
    t=0:1/Fs:(N-1)/Fs;%采样时刻
    s= ADC+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180)+A3*cos(2*pi*F3*t+pi*P3/180);%生成信号
    plot(s);%绘制图形
    title('原始波形');
    figure
    
     
    • 由于采样点数过高,这个图估计连它亲娘都不认识,所以还是看函数吧。
      我们将生成的波形文件放到ModelSim中仿真,完成后,再将生成的波形文件和Matlab的FFT结果对比,这里需要注意的是,我们在IP核中,设置了放缩,所以在Matlab中需要将 IP核的结果乘以32.
      在这里插入图片描述
      然后以下是Matlab和IP核的结果对比,将计算得到的数据分别转成了 幅度-频率图相位-频率图。可以发现,两者之间误差很小。
      在这里插入图片描述 在这里插入图片描述

      参考资料

      官方手册
      Xilinx FFT IP v9.0 使用
      VIVADO FFT核的实现
      基于MATLAB的FFT分析
      matlab关于fft的应用(一)
      [数字信号处理]Matlab做fft时点数N怎么选取

                                      </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/QQ286615275/article/details/90450727&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
                  <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                                  </div>
      
    展开全文
  • IP核手册,需要的自行下载吧。这个手册详细解释了FFT的使用方法,非常详细。
  • Xilinx FFT IP v9.0 使用

    万次阅读 热门讨论 2016-04-19 14:18:12
    该ip用于实现点FFT的变换, 实现的数学类型包括: A) 定点全精度 B) 定点缩减位宽 C) 块浮点 每一级蝶型运算后舍入或者取整。对于N点运算,FFT还是逆FFT,scaling策略以及循环前缀的长度是运行时可配置的,可随...

    该ip用于实现N=2**m(m=3~16)点FFT的变换,

    实现的数学类型包括:

    A)      定点全精度

    B)      定点缩减位宽

    C)      块浮点

    每一级蝶型运算后舍入或者取整。对于N点运算,FFT还是逆FFT,scaling策略以及循环前缀的长度是运行时可配置的,可随帧改变,改变变换点数会复位FFT ip核。

     有四种可选择的FFT的实现架构:

    1)  PipelinedStreaming I/O

    2)  Radix-4Burst I/O

    3)  Radix-2Burst I/O

    4) Radix-2 Lite Burst I/O

    FFTip核使用基二和基四分解法计算离散傅里叶变换,对于Burst I/O architectures采用时域抽取法实现,对于Pipelined Streaming I/Oarchitecture.使用频域抽取法。当使用基四计算时,其蝶型算法的级数是log 4 (N),每一级包括N/4的基四蝶型运算。对于点数不是4的指数情况,则需要一个额外的基二来组合数据。类似的基二实现法需要log 2 (N)级蝶型运算。对于scaling方法,其每一级的scaling因子由s_axis_config_tdata来配置。Ip核的端口如下:

    输入输出方向在上图中已经很明显了,下面描述端口作用

    Aclk输入时钟,上升沿有效

    Aclken :使用有效信号,高使能

    Aresetn:同步复位信号,低电平有效(至少保持aclk两个时钟周期)

    s_axis_config_tdata:包括配置信息,CP_LEN, FWD/INV, NFFT,SCALE_SCH.

    上面信号所有s开始的表示的是axi信号的slave端,m是master端。各信号作用参考《Fast Fourier Transform v9.0 LogiCORE IP Product Guide》

    以8点FFT示意,configure

    implementtation


    summary


    由于xilinx自带的testbench是VHDL的,这里给出自己写的verilog版本的testbench。

    `timescale 1ns / 1ps
    //
    // Company: 
    // Engineer: shichaog
    // 
    // Create Date: 04/13/2016 08:35:42 PM
    // Design Name: 
    // Module Name: TB_fft256
    // Project Name: 
    // Target Devices: 
    // Tool Versions: 
    // Description: 
    // 
    // Dependencies: 
    // 
    // Revision:
    // Revision 0.01 - File Created
    // Additional Comments:
    // 
    //
    module TB_fft256;
    	// Inputs
    	reg aclk;
    	reg s_axis_config_tvalid;
    	reg s_axis_data_tvalid;
    	reg s_axis_data_tlast;
    	reg m_axis_data_tready;
    	reg [15:0] s_axis_config_tdata;
    	reg [95: 0] s_axis_data_tdata;
    
    	// Outputs
    	wire s_axis_config_tready;
    	wire s_axis_data_tready;
    	wire m_axis_data_tvalid;
    	wire m_axis_data_tlast;
    	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;
    	wire [95 : 0] m_axis_data_tdata;
    	
    	reg[23:0] mem0_re[0:7];
    	reg[23:0] mem1_re[0:7];
        reg[23:0] mem2_re[0:7];
    	initial $readmemh("/home/gsc/FPGA_exercise/bf_verilog/stimulus0_24bit.dat",mem0_re);
    	initial $readmemh("/home/gsc/FPGA_exercise/bf_verilog/stimulus1_24bit.dat",mem1_re);
    	initial $readmemh("/home/gsc/FPGA_exercise/bf_verilog/stimulus2_24bit.dat",mem2_re);
    	
    	reg[7:0]   op_sample= 0;
    	reg        op_sample_first = 1;
    	reg[7:0]   ip_frame=0;
    	reg[7:0]   op_frame=0;
    	
    	integer i;
    	
    	// generate clk
        always #5 aclk =! aclk;
    	
    	// Instantiate the Unit Under Test (UUT)
    xfft_256 uut (
          .aclk(aclk),                                                // input wire aclk
          .s_axis_config_tdata(s_axis_config_tdata),                  // 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 [95 : 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 [95 : 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
        );
        
    	initial begin
    		// Initialize Inputs
    		aclk = 0;
    		s_axis_config_tvalid = 0;
    		s_axis_config_tdata = 0;
    		s_axis_data_tvalid = 0;
    		s_axis_data_tdata = 0;
    		s_axis_data_tlast = 0;
    		m_axis_data_tready = 0;
    		
    		// Wait 100 ns for global reset to finish
    		#150;
    		m_axis_data_tready = 1;
    		s_axis_config_tvalid = 1;
    		//s_axis_config_tdata = 16'b0101100101011011; // FFT desired (and not IFFT
    		s_axis_config_tdata = 16'b0000000000000111; // FFT desired (and not IFFT
    		
    		//s_axis_data_tlast = 1;
    		s_axis_data_tdata = 96'h000000;	
    		s_axis_data_tvalid = 0;
    	
    		
    		begin
    		  for(i=0;i<8;i=i+1)
    		      begin
                    #10
                    s_axis_data_tvalid <= 1;
                    s_axis_data_tdata <= {{24'h000000},mem1_re[i],{24'h000000},mem0_re[i]};
    		        $display("mem_a[%d] = %h", i, mem0_re[i]);
    //		        if(i== 256)
    //		            s_axis_data_tlast <= 1;
    //		        else
    //		            s_axis_data_tlast <= 0;
                    end
    	    
    	    end
    		#10;
    		s_axis_data_tdata = 96'h000000;	
            s_axis_data_tvalid = 0;
    		#1000 $finish;  
    		//$stop
    		
    	end
    endmodule
    stimulus0_24bit.dat文件内容如下:

    000000
    000001
    000002
    000003
    000004
    000005
    000006
    000007
    stimulus1_24bit.dat文件内容随便,这里是两个通道的FFT计算。仿真波形图如下:



    MATLAB计算所得的FFT结果如下:


    将FFT结果的放大后得到如下图:

    MATLAB计算的结果是28,而fpga仿真结果是00000e,-4则是fffffe,这是因为设置了scaling因子,且scaling因子是2,即28/2=14。

    关于hls的实现见:

    http://blog.csdn.net/shichaog/article/details/50811449

    展开全文
  • 前言——两个FFT IP核的区分 在Vivado的IP中搜索FFT,会显示出FFT和LTE FFT,如下图所示。FFT就是我们一般使用的FFT IP核,而LTE FFT是什?它和FFT有什么区别?什么时候使用它?为消除这些疑问,下面简单介绍下LTE ...
  • XILINX FFT IP核的基本使用

    千次阅读 2019-08-10 13:18:32
    vivado中FFT IP核的基本使用 最近用vivado仿真时需要用到FFT IPCore,调通程序的过程中也遇到一些麻烦,在此将一些问题进行总结,希望可以帮到有需要的人。 - 配置阶段 在IP Catalog中搜索FFT,然后双击即可进入配置...
  • 这是vivado里面付费LTE-FFT IP核的技术文档,在xilinx官网上只能下载到此IP核的简略文档,此版本是详细文档,望有购买需求或者使用需求的开发人员能看到文档之后进一步对此IP核有多了解。
  • 本文介绍了一种基于Xilinx IP核的FFT算法的设计与实现方法。在分析FFT算法模块图的基础上,以Xilinx Spartan-3A DSP系列FPGA为平台,通过调用FFT IP核,验证FFT算法在中低端FPGA中的可行性和可靠性。
  • 如上图所示,xilinx hls的fft ip核不仅可以计算固定长度的FFT变换,还可以在运行时动态配置fft变换长度,但其可配置的长度仅限于小于等于最大长度的所有可能的2的幂,即若该fft ip可支持的最大长度为32,那么配置...
  • Xilinx vivado FFT IP核v9.0官方手册 pg109
  • 第一步:确定好进行FFT处理的点数,例如256点FFT处理 第二步:确定Scale_SCH的位宽,这里需要分解为两步,首先确定NFFT,就是2的NFFT幂次方(2^NFFT)=256,这里为8;其次,确定位宽,分为基2与其他,前者位宽=2NFFT...
  • Xilinx_FFT_Guide_liuqi.zip

    2020-05-04 18:33:26
    xillinx FFT9.1应用实例+仿真文件,软件版本为vivado 2018.3,带有仿真文件和仿真数据
  • 1 xilinx FFT IP介绍Xilinx快速傅立叶变换(FFT IP)内核实现了Cooley-Tukey FFT算法,这是一种计算有效的方法,用于计算离散傅立叶变换(DFT)。1)...
  • FFT的分析和XILINX fft核的介绍

    千次阅读 2015-03-30 23:59:05
    fft输入输出解析。 输入:fft要求输入一个复数,但一般可以只输入实数。输出:输出一个复数,其模为信号强度。相位为波形相位。设: 采样频率FS 转换长度N 则: 分辨率为FS/N。 ‘量程’为-FS/2~FS/2 提高...
  • Xilinx_LTE_FFT_V2.0

    2018-12-07 20:01:14
    根据官网申请的lte_fft V2.0的IP,管网就给了简单介绍,本数据手册给予了全面的介绍
  • Xilinx FFT IP核 调试经验

    千次阅读 多人点赞 2018-11-20 10:21:23
    23333,这两天做FBMC FPGA的实现 入了XilinxFFT IP的坑,在此把遇到的痛苦经历记录下来,如有和我情况一样的拿走不谢。 话不多说,直接上经历。 1.FFT IP核无法进行8/16/32点的配置,意味着最少从64点起步。我...
  • Vivado Xilinx FFT IP核v9.0 使用详解(附仿真实例)

    千次阅读 多人点赞 2021-01-16 00:34:16
    Vivado Xilinx FFT IP核v9.0 使用详解(附仿真实例) 前几天我导让我研究研究在FPGA上做FFT,作为一个迈进FPGA大门的小白,摸索之旅相当艰难~,现把学习FFT IP核的过程记录下来,为各位同胞提供参考。 一 傅里叶变换...
  • 1、使用用ISE14.7+Modelsim10.5联合仿真,工程内含TestBench...2、FFT IP CORE采用Radix-2 Burst I/O结构,数据长度为8,unscaled模式; 3、FFT输入数据可在TestBench文件中通过时序输入,也可通过TEXTIO读取数据文件。
  • Xilinx FFT IP v9.1的使用学习

    千次阅读 2019-05-23 14:17:03
    文章目录 概述 主要端口描述 相关标志信号 ...Xilinx FFT IP v9.0 使用 VIVADO FFT核的实现 基于MATLAB的FFT分析 matlab关于fft的应用(一) [数字信号处理]Matlab做fft时点数N怎么选取
  • Xilinx vivado FFT IP v9.0 详解

    万次阅读 多人点赞 2018-08-16 15:36:29
    Xilinx FFT IP v9.0 在线设置变换长度详解 IP介绍 FFT IP核支持三种数据类型: 1. 定点全精度 1. 定点缩减位宽 1. 块浮点 有四种可选择的FFT运算方式: 1. PipelinedStreaming I/O 1. Radix-4Burst I/O 1...
  • 1024点FFT快速傅立叶变换 16位数据输入输出 带DMA功能 xilinx_VHDL代码 快速 , 资料

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 773
精华内容 309
关键字:

fftxilinx