vivado FFT ip核全解析。 不想了解原理,可以直接跳到创建IP核 概述 IP核可以做2的m幂次个点,其中m=3-16.输入数据为复数。 该IP核有三个FFT通道。 FTT有三个算数选项: • Full-precision unscaled arithmetic(全精度不缩放算术) • Scaled fixed-point,(根据用户规定缩放定点) • Block floating-point (run time adjusted scaling)(块浮点) 有四种架构: •Pipelined Streaming I/O 流水线 •Radix-4 Burst I/O, 基数-4 突发I/O •Radix-2 Burst I/O 基数-2 突发I/O •Radix-2 Lite Burst I/O. 基数-2精简突发I/O 端口
aclken 可选端口,高电平时钟有效,IP核工作 aresetn 可选端口,低电平有效,但至少需要两个时钟周期的低电平。重置IP核,包括下表的配置都将重置成下表所示
且aresetn优先级高于aclken event_frame_started block处理新的一帧时,它持续一个时钟的有效电平,可以用来技术处理的帧数 event_tlast_missing 当s_axis_data_tlast在传送数据帧最后位为低时,该信号持续一个时钟的有效电平,其表示帧数据与block设置的点数N不匹配。该信号计算后才能被得知因此可能会比输入信号的tlast指示位延后好多周期。 event_tlast_unexpected 当s_axis_data_tlast不是在传送数据帧最后位为高时,该信号持续一个时钟的有效电平,其表示帧数据与block设置的点数N不匹配。该信号计算后才能被得知因此可能会比输入信号的tlast指示位延后好多周期。 event_fft_overflow 输出数据溢出时,该信号持续一个时钟的有效电平,只有在是用缩放或单精度浮点I/O时使用,其他配置不使用。 event_data_in_channel_halt 需要来自数据输入通道的数据而没有可用数据的每个周期中有效 •在实时模式下,block将继续处理帧,即使它已不可恢复地损坏。 •在非实时模式下,block只有在数据被写入数据输入通道时且数据帧没有损毁时才会将该信号停止。 在这两种模式下,端口保持有效,直到数据输入通道中的数据可用为止。 event_data_out_channel_halt 通道中缓存区已满时但输出端口想要输出数据时,该端口有效。 event_status_channel_halt 通道中缓存区已满时但状态端口想要输出数据时,该端口有效。非实时模式下可用 基础时序
TVALID是上行发出,TREADY是下行发出 所有的TDATA和TUSER向量都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 配置端口 •s_axis_config_tdata:配置数据包含CP_LEN,FWD/INV,NFFT,SCALE_SCH NFFT(可选):最大的FFT点数,NFFT=log2(点大小),例如block配置为最大1024点,则这里可以配置1024,512,256.其NFFT对应也可求出
CP_LEN(可选):在输出整个变换之前,作为循环前缀输出的样本数。长度小于FFT点数。取输出的一部分固定在转换的开始。 循环前缀插入只有在输出排序为自然顺序时才可用 当使用循环前缀插入时,循环前缀的长度可以逐帧设置,而不中断帧处理。 例如,当N = 1024时,循环前缀长度可以为0到1023个样本,CP_LEN值为00时产生一个由输出数据的最后150个样本组成的循环前缀。 FWD/INV:执行正向FFT变换还是IFFT变换,为1则FFT,0则IFFT SCALE_SCH(可选):对于Burst I/O架构,缩放为每个阶段指定两位,第一阶段的缩放由两个lsb给出。缩放可以指定为3、2、1或0,这表示要移位的位数。N =1024的缩放计划实例,基数-4突发I/O为[1 0 2 3 2](从最后阶段到第一阶段排序)。对于N =128,2-burstI/O或2-轻burstI/O,一个可能的比例计划是[1 1 1 1 0 1 2](从最后到第一阶段排序)。 当FFT核心配置为处理浮点数据时,不需要缩放计划(忽略SCALE_SCH)。对浮点数据在内部处理规范化和缩放。 所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。
block需要配置为进行8点变换,在信道0和1上执行逆变换,在信道2上执行正向变换。需要一个4点循环前缀。核心选择CP_LEN字段的顶部NFFT位(不包括填充)来确定循环前缀长度。要获得一个循环前缀长度为4,NFFT为3,字段必须设置为64 如下图
•s_axis_config_tvalid:配置数据有效 •s_axis_config_tready:可以接收配置数据 输入TDATA配置 •s_axis_data_tdata(输入):包括实部与虚部
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 数据固定在通道0,通道1和2的输入可选。
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 例如,输入通道0:Re = 0010 1101 1001 IM = 0011 1110 0110。输入通道1:Re = 0111 0000 0000 IM = 0000 0000 0000。由于位宽都不是8的倍数,所以需要填充位
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 •s_axis_data_tvalid(输入):输入数据有效使能 •s_axis_data_tlast(输入):数据帧最后一位有效 •s_axis_data_tready(输出):准备好接收数据的使能 输出TDATA配置 数据输出通道包含变换的实结果和虚结果,并在TDATA上进行。此外,TUSER还携带了与TDATA上的样本数据相关的每个样本的状态信息。 •m_axis_data_tdata(输出):包含实部与虚部 位宽有三种: 1.选择scaled arithmetic(缩放算法)和block floating-point arithmetic(块浮点算法),输出位宽等于输入位宽。 2.选择unscaled arithmetic(无缩放)输出位宽=输入位宽+log2(最大fft点数)+1 3.选择single precision floating-point(单浮点精度),输出位宽=32 与输入端一样,数据固定在通道0,通道1和2的输入可选。
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 同输入端
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 •m_axis_data_tuser(输出,数据状态的配置):(可选)实部与虚部的额外信息 其中包含字段有: XK_INDEX(可选):位宽:log2(最大fft点数),输出数据索引 在自然顺序输出的情况下,XK_INDEX从0增加到(FFT点数)-1。当使用位反转输出时,XK_INDEX覆盖了相同范围的数字,但以位(或数字)反转的方式。
8点FFT 另外如果加入循环前缀,记住去除循环前缀,即XK_INDEX是从(FFT点数-循环前缀)长到(FFT点数)-1 循环前缀插入只能与自然顺序连用。 BLK_EXP(可选):8位宽,块索引每个通道均有,仅在使用 block floating-point时有 OVFLO(可选):帧中有溢出则为高,每个通道均有,仅在使用scaled arithmetic 或single precision floating-point I/O 时有,
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 例如:俩通道,128点数,0通道在第三个输出数据有溢出
例如:已配置为有两个FFT数据通道,块指数,但没有XK_INDEX。通道0的输出样本的块指数为4,而通道1的输出样本的块指数为31。
•m_axis_data_tvalid(输出):输出数据有效 •m_axis_data_tlast(输出):输出数据最后一位 •m_axis_data_tready(输入):下行表示可以接收输出的数据 状态通道配置(通道状态的显示) 请注意,该核心不能配置为同时具有BLK_EXP和OVFLO。 在帧开始时发送BLK_EXP状态信息,在帧结束时发送OVFLO状态信息。 •m_axis_status_tdata(输出):携带状态数据 BLK_EXP或OVFLO BLK_EXP(可选):位宽5,仅在使用 block floating-point时有,所应用的缩放量。每个通道都包含 OVFLO(可选):据帧中任何值溢出时OVFLO高,仅在使用scaled arithmetic 或single precision floating-point I/O 时有,每个通道都包含
所有的数据都是8位的倍数。如果不是8的倍数,block会自动填充无用位使位宽到8的倍数。 实例:4个FFT数据通道和溢出。当前帧包含通道2和通道3中的溢出。 •m_axis_status_tvalid(输出):提供状态数据有效 •m_axis_status_tready(输入):下行准备好接收数据使能
算数选项(理解浅显,仅作参考) • Full-precision unscaled arithmetic(全精度不缩放算术) 将保留所有重要的整数位。数据路径的宽度增加,以适应通过蝴蝶的比特增长。由乘法产生的分数位的增长在乘法之后被截断(或四舍五入)。 输出的宽度=输入宽度+log2(变换长度)+1 • Scaled fixed-point,(根据用户规定缩放定点) 当使用缩放时,缩放范围被规范为在每个阶段中除以1、2、4或8倍 • Block floating-point (run time adjusted scaling)(块浮点) 使用块浮点,每个阶段都应用合适的缩放来保持数据在范围内,缩放由块指数决定。 结构设置 所有四种架构都可以配置为使用三种定点算法方法(未缩放、缩放或块浮点)之一的固定点接口,也可以使用浮点接口。 比特和数据的翻转 每个体系结构都提供了输出数据的自然顺序或反向顺序的选择,数据按自然顺序输入。 FFT算法在处理过程中对样本进行重新排序,使自然顺序的数据输入以反向顺序输出。核心可以选择按自然顺序输出数据。然而,这就给每个体系结构带来了成本。 对于Burst I/O体系结构,这将造成时间损失,因为卸载数据不能与加载下一帧的输入数据同时进行,因此需要单独的卸载和加载阶段。在Pipelined Streaming I/O体系结构中,它需要额外的RAM存储来执行重新排序。 在Radix-2 Burst I/O、Radix-2 Lite Burst I/O和Pipelined Streaming I/O中,通过取数据点的二进制索引,并反转数字的顺序,计算位反向顺序很简单。因此,0000,0001,0010,0011,0100,…(0,1,2,3,4,…)变成0000,1000,0100、0100、1100、0010,…(0、8、4、12、2,…) 在Radiu-4BurstI/O架构中,反转适用于数字,因此称为数字反转。基数-4中的一个数字是两位。因此,0000,0001,0010,0011,0100,…(0,1,2,3,4,…)变成0000,0100,1000、1100,0001,…(0、4、8、12、1,…),因为数字对被反转。 • Pipelined Streaming I/O : 允许连续的数据处理,由几个Radix-2组成 连续流数据并不意味着来自block的AXI4-流等待状态可以被忽略。在某些情况下,block可能必须插入等待状态来暂停传入的样本数据。 在 scaled fixed-point模式下,每对Radix-2阶段后对数据进行缩放。 block floating-point 模式可能比缩放模式使用更多的资源,因为它必须保持额外的精度位,在不影响性能的情况下进行动态缩放。因此,如果输入数据被很好地理解,不太可能表现出大的振幅波动,那么使用缩放算法(具有适当的缩放计划以在已知的最坏情况下避免溢出)就足够了,可以节省资源。 输入数据按自然顺序输入。输出数据可以是位倒序,也可以是自然顺序。当选择自然顺序输出数据时,将利用额外的内存资源。
支持8-65536点,可以选用 block RAM和分布式RAM • Radix-4 Burst I/O : 使用基数4蝴蝶处理引擎迭代的方法,分开加载和处理数据,数据的I/O和处理并不是同时进行的。它的规模比Pipelined Streaming I/O的解决方案更小,但转换时间更长。
并且支持点大小从64到65536。可以选择BLOCk RAM中或分布式RAM(后者大小小于或等于1024) 输出样本按位反转顺序排列时,可以同时加载和卸载数据。 • Radix-2 Burst I/O : 使用与Radix-4 Burst I/O相同迭代方法,但蝴蝶算法更小,其资源比Radix-4 Burst I/O小,但转换时间更长。
支持8-65536点 输出样本按位反转顺序排列时,可以同时加载和卸载数据。 • Radix-2 Lite Burst I/O: 轻量化Radix-2 Burst I/O
支持8-65536点 输出样本按位反转顺序排列时,可以同时加载和卸载数据。 Burst I/O架构的缩放结构 可以使用在配置通道中的适当SCALE_SCH字段对连续的阶段进行调整。对于Radiz-4、Burst I/O和Radiz-2架构,使用SCALE_SCH字段的值作为位对[…N4、N3、N2、N1、N0],每对表示对应阶段的缩放值。阶段从阶段0开始计算,作为两个lsb。基数4有log4(点大小)阶段,基数2有log2(点大小)阶段。在每个阶段中,数据可以偏移0、1、2或3位,它们对应的SCALE_SCH值分别为00、01、10和11。 例如,对于基数4,当N = 1024,[01 10 00 11 10]表示阶段0右转移2,阶段1转移3,阶段2没有变化,阶段3转移2,阶段4转移1(log4(1024)=5,5个阶段)。这个缩放总共有8位,因此缩放因子为1/256,没有避免溢出,例如SCALE_SCH = [10 10 10 10 11]完全避免了基数-4,BurstI/O架构中的溢出 Pipelined Streaming I/O结构的缩放结构 对于流水线流I/O架构,将每一对相邻的Radia-2阶段视为一个组。也就是说,组0包含阶段0和1,组1包含阶段2和3,以此类推。SCALE_SCH字段的值也被用作位对[…N4、N3、N2、N1、N0]。 每对表示两个阶段对应组的缩放值。组从组0开始作为两个lsb进行计算。在每一组中,数据可以偏移0、1、2或3位,这对应于SCALE_SCH值分别为00、01、10和11。 例如,当N = 1024,[10 10 00 01 11]转化为第0组(第0和第1阶段),第1组1(第2和第3阶段),第组3(第4和第5阶段),第2组3(第6和第7阶段),以及第组4第2(第8和第9阶段)。 保守的计划SCALE_SCH = [10 10 10 10 11]完全避免了管道流I/O体系结构中的溢出。 当点大小不是4的幂时,最后一组只包含一个阶段,最后一组的最大位增长为1位。因此,缩放计划的两个msb只能为00或01。N = 512的保守缩放计划是SCALE_SCH = [01 10 10 10 11]。(缩放因子1/1024,解决缩放) 转换状态概述 Fixed-Point Data 溢出 只有在使用缩放算法时,“数据输出”和“状态”通道中的“溢出(OVFLO)”字段才可用。 如果数据帧中的任何点溢出,数据输出时OVFLO被置高。 对于多通道,每个通道都有一个单独的OVFLO字段。当核心中发生溢出时,数据被包装而不是饱和,导致转换后的数据对大多数应用程序无法使用。 Floating-Point Data 溢出 溢出字段用于表示FFT处理浮点数据时的指数溢出。 根据数据符号,溢出的输出样本被设置为±∞。 当输出上存在NaN值时,溢出不会有效。 当输入数据帧包含NaN或±∞样本时,NaN值只出现在FFT输出处。 Block Exponent 块指数包含在“数据输出”和“状态”通道中的BLK_EXP字段(仅与块浮点选项一起使用)。 对于多通道核心,每个通道都有一个单独的BLK_EXP字段。 字段中出现的值表示在转换过程中数据被缩放的比特总数。 例如,如果BLK_EXP的值为00101 = 5,这意味着相关的输出数据(XK_RE,XK_IM)被缩放为5位(向右移5位),或者换句话说,被除以32,以充分利用输出数据路径的可用动态范围而不溢出 因为块缩放是基于每个处理阶段最大值执行的,因此每个阶段的BLK_EXP可能存在不同 时序控制 TVALID由上行组件驱动,有要传输的数据时有效,而TREADY则由下行组件驱动,以显示它已经准备好接受数据。 当TVALID和TREADY都为高时,就会发生传输。
8点FFT 图中的点A显示了没有数据传输的时钟周期,因为上行或下行服务器都没有准备好。 点B显示了两个时钟周期,其中数据没有传输,因为上行没有任何数据要传输。这被称为主等待状态。 点C显示了一个时钟周期,其中没有数据被传输,因为下行还没有准备好接受数据。这被称为从等待。 主等待状态和从等待状态可以扩展到任意数量的时钟周期。 前面的描述仅适用于将block配置为使用非实时模式时。 实时模式下的情况有所不同,实时模式用于创建一个更小、更快的设计,但代价是加载和输出数据的灵活性。当核心配置为使用实时模式时,会发生以下情况: 1.数据输出通道(m_axis_data_tready)上的TREADY信号被删除 2.状态通道(m_axis_status_tready)上的TREADY信号将被删除 3.当帧开始加载时,数据输入通道上的TVALID信号将被忽略
实时,8点FFT 在点A处,上行已经向数据输入通道发送了一个样本。然后,block在等待FFT处理核心开始转换时插入一个等待状态。这在这里显示为一个周期,但在某些情况下可能会更长。 在点B处,上行使用TVALID插入两个等待态。但是,block忽略了它们,并使用以前的数据(D3)来处理缺失的数据。处理后的帧很可能会被损坏。 在点C,上行开始提供帧的最后一个样本(D7和更晚的D8),但核心已经开始处理帧并插入一个等待状态。主控件和核心件现在已经不同步了。当核心完成对帧的处理并准备好处理新帧时,它将D7视为新帧的第一个符号,并开始使用另外8个样本。 *一般不选用实时,因为大多上行与下行数据同步无法完全满足要求 Pipelined Streaming I/O (无循环前缀)时序
注意,加载的帧与该帧的处理数据之间存在延迟。这个延迟取决于在Vivado IDE中选择的用来参数化block的选项。但是处理过的帧是连续的。 Pipelined Streaming I/O (有循环前缀)时序 如果使用循环前缀插入,则从block中输出样本比加载的样本更多。因此,核心不能连续地输出数据帧,必须在输入数据的每一帧之间插入一个循环前缀长度时钟周期的间隙,以适应输出循环前缀所需的额外时钟周期 这是由数据输入通道上的TREADY信号来表示的。当使能为低,允许核心时间输出循环前缀。
Burst I/O 结构时序 Burst I/O架构不允许与上述架构相同程度的帧重叠。当使用自然有序输出时,必须在核心开始加载下一个帧之前处理和卸载前一个帧。 当使用位反转输出时,核心只在加载新帧时卸载数据。这意味着第N+1帧的加载与第N帧的卸载重叠(并实际上导致)。但是,如果上游在准备开始卸载帧时没有向核心提供数据,核心将自动刷新帧。如果发生这种情况,加载和卸载阶段就不会重叠。
有序输出 上游主服务器将帧A的所有数据加载到FFT的数据输入通道中。由于FFT正在加载这些数据来处理它,因此通道中的缓冲区永远不会填充。可以看到外部的s_axis_data_tready走低。数据输入通道仍然处于从等待状态,FFT不能接收来自上游主服务器的数据,直到点B。
位反转 由于上游主服务器总是提供数据,帧的输出可能会重叠
配置FFT 配置数据应用于特定帧的过程取决于核心的当前状态: 1.在通电之后或在空闲时间之后对第一帧应用配置 2.将该配置应用于一组帧序列中的下一组帧 在空闲时应用一个新的配置 如果核心是空闲的(即它没有加载、处理或卸载任何帧),它将等待帧数据或配置数据来决定下一步要采取什么操作。如果核心控制模块看到了新的帧数据,而没有看到新的配置信息,那么核心就会开始使用现有的配置来处理一个帧。如果配置信息在帧数据之前被看到,或者与帧数据在相同的时钟边缘上,则该配置被应用于该帧。 为了确保在处理帧之前应用配置数据,应该将配置信息写入配置通道至少提前输入数据帧一个时钟周期。如果不这样做,可能会导致使用以前的配置选项来处理帧。 在使用流框架时应用一个新的配置 当上游主服务器处于活动状态并向核心发送帧数据时,很难使用先前的技术来与特定帧同步配置数据,因为新帧的数据可能已经加载到数据输入通道中。将配置同步到帧的推荐方法是使用event_frame_started信号。 更改配置以改变变换时间 有两种情况下,更改配置可能会暂时降低BLOCK吞吐量: 1. Pipelined Streaming FFT在处理帧时,但NFFT改变 2.具有位反转输出的Burst I/O核心正在处理一个帧,主机及时提供帧数据,以避免核心自动刷新帧,然后变换大小(NFFT)。 这一切都是由核心自动处理的,允许您随时发送配置信息。但是,吞吐量会下降,直到通道被完全刷新为止。只有在要更改转换大小时,才会发生此行为。应用所有其他配置选项就无需等待核心管道为空 创建IP核
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/69137.html