【FFT MegaCore的设计与仿真分析案例7000字】_第1页
【FFT MegaCore的设计与仿真分析案例7000字】_第2页
【FFT MegaCore的设计与仿真分析案例7000字】_第3页
【FFT MegaCore的设计与仿真分析案例7000字】_第4页
【FFT MegaCore的设计与仿真分析案例7000字】_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FFTMegaCore的设计与仿真分析案例目录TOC\o"1-3"\h\u25256FFTMegaCore的设计与仿真分析案例 [6],在ModelSim中进行功能仿真以及时序仿真,得到该处理器模块的输入输出时序波形及输出该模块的快速傅里叶变换结果。通过Matlab软件编写数据处理与分析脚本文件,计算FFT的理论值,对FFTMegaCore处理器的快速傅里叶变换和快速傅里叶逆变换输出结果进行格式换算以及顺序调整,并与理论值对比,进行准确性分析。构造FFTMegaCore模块在进行仿真之前,需要先完成FFTMegaCore处理器模块的创建与配置。FFTMegaCore模块结构如图5-1所示。图5-1FFTMegaCore模块结构框图构造FFTMegaCore模块主要分为三步,分别为参数设置、架构配置、实施选项配置。第一步设置有关快速傅里叶变换基本参数和器件选择。本章中共需要构造9种不同配置的模块进行1024点FFT运算,均以CycloneIVGX为目标器件。在Streaming、BufferedBurst和Burst模式中,输入数据和旋转因子的精度均选为16位,在VariableStreaming模式下输入、输出数据选用单精度浮点数表示,设置界面如图5-2所示。图5-2参数设置界面第二步需要对FFTMegaCore处理器的架构进行选择,本章所有模块均采用四输出的引擎结构,单个引擎输出。当数据流模式选为VariableStreaming时,还需要设置输入顺序和输出顺序选择、变换方向和数据表示方式,本文所研究的相应模块输入顺序为NaturalOrder,输出顺序为Digit-ReverseOrder,数据采用单精度浮点数表示。其他模式下则无法进行选择,默认为NaturalOrder,默认输入格式为16位带符号补码数据,默认输出数据采用块浮点数表示。VariableStreaming模式下架构配置界面如图5-3所示。图5-3架构配置界面第三步实施选项配置是对FFTMegaCore处理器所占用的FPGA内部资源进行调整,将根据第4小节中对比分析的需要进行正确配置,第3小节和第5小节则不对默认配置进行改动。设置界面如图5-4所示。图5-4实施选项配置界面FFTMegaCore处理器时序分析对FFTMegaCore处理器进行控制,除了正确设置相应参数外,还需要严格满足不同模式下的符合Avalon总线标准的Avalon-ST接口所要求的输入信号时序关系。本研究利用ModelSim对FFTMegaCore进行功能仿真,得到时序波形后,对该款处理器在不同模式和配置下的输入、输出时序进行详细的分析。在Streaming模式下,输入数据配合时序控制信号,能够使FFTMegaCore处理器接收连续多帧、长度固定的数据输入并连续地进行变换,不断输出变换后的数据和相关指示信号。在该模式下,即使数据帧之间不连续,只要正确控制时序信号,FFTMegaCore处理器也能够正常运行,输出正确的变换结果。首先对Streaming模式下单帧数据输入的情况进行时序分析,FFT变换点数设置为1024点,编写Testbench激励文件对FFTMegaCore进行功能仿真测试。Testbench内部分VerilogHDL描述如下:always@(posedgeclk)beginif(!reset_n)cnt<=13'd0;elseif(!$feof(fp))begincnt<=cnt+1'b1;r<=$fscanf(fp,"%d\n",sink_real);endelsebegincnt<=cnt+1'b1;$fclose(fp);endend//控制信号时序assignsink_valid=(cnt>0)&(cnt<1025);assignsink_sop=(cnt==1);assignsink_eop=(cnt==1024);如图5-5(a)所示,FFTMegaCore处理器需要持续两个时钟周期以上的低电平有效、异步复位信号reset_n对其进行重置,使其做好接收数据的准备。因为该模式下可以连续接收数据,Testbench激励文件中将sink_ready信号设置为高电平信号,表示数据随时可被接收。在复位信号reset_n恢复位高电平后的第一个时钟上升沿到来时,根据Avalon-ST协议,数据源将sink_sop信号和sink_valid信号同时由低电平向高电平转换,意味着此时数据开始输入到处理器;下一个时钟上升点到达时,sink_sop信号复位,即sink_sop信号只需在第一个数据输入时(输入数据帧的帧头处)保持高电平即可,持续一个时钟周期。如图5-5(b)所示,在数据帧的帧尾,即最后一个数据开始输入时(输入数据帧的帧尾处),sink_eop信号保持高电平,持续一个时钟周期后复位;sink_eop信号复位的同时,sink_valid信号也复位由高电平变为低电平,意味着此时数据输入完毕。由图5-5(c)可以看出,sink_valid在整个信号输入过程中(1024个时钟周期)都需保持在高电平状态。(a)输入数据帧头(b)输入数据帧尾(c)数据输入过程的整体时序图图5-5Streaming模式下单帧数据输入情况下的时序图除了需要满足Avalon总线协议的输入控制信号外,FFTMegaCore处理器在输出变换结果数据source_real、source_imag和source_exp外,还会相应地输出同样满足Avalon总线协议的数据输出指示信号。如图5-6所示,与输入控制信号相似,FFTMegaCore开始输出数据时(输出数据帧的帧头),source_sop信号和source_valid信号都被同时拉到高电平,以指示数据开始输出;一个时钟周期后source_sop信号复位到低电平;开始输出最后一个数据时(输出数据帧的帧尾),source_eop信号被拉到高电平;在数据输出完成时,source_eop与source_valid同时复位回低电平,以指示数据输出结束。(a)输出数据帧头(b)输出数据帧尾(c)数据输出过程的整体时序图图5-6Streaming模式下单帧数据输出情况下的时序图 同样在Streaming模式下,还能够在数据帧之间不连续的情况下,接收多帧数据输入并进行变换。本次仿真所设置的FFT变换点数仍为1024点,将Testbench激励文件中控制信号部分及数据读取的VerilogHDL描述进行修改,使其在满足Avalon总线协议的情况下进行数据输入,Testbench激励文件框架如图所示。与单帧情况下的时序控制有所不同,修改的VerilogHDL部分描述如下:if

(!sink_valid)sink_real

<=

16'd0; //不输入数据else

$fscanf(fp,

"%d\n",

sink_real);

//输入数据//控制信号时序assign

sink_valid

=

((cnt>0)&(cnt<1025))

|

((cnt>1050)&(cnt<2075));assign

sink_sop

=

(cnt==1)

|

(cnt==1051);assign

sink_eop

=

(cnt==1024)

|

(cnt==2074); 通过图5-7可以看到,在正确的控制信号时序下,即使输入的两个1024点16bit数据帧之间在时间上不连续,FFTMegaCore处理器依然能够正确进行快速傅里叶变换,并输出对应频域数据及控制信号。信号源输入到FFTMegaCore处理器的控制信号时序及FFTMegaCore输出的控制信号时序仍满足Avalon总线协议要求。图5-7Streaming模式下非连续2帧数据输入情况下FFT全过程的时序图VariableStreaming模式与Streaming模式相类似,都支持连续数据帧的输入及输出,在数据帧的帧头与数据帧的帧尾处,控制信号时序要求也与Streaming模式基本相同。除了Streaming模式下支持的功能之外,VariableStreaming模式还能够进行不连续的数据帧的快速傅里叶变换。在输入数据帧暂时停止输入时,只需要将sink_valid信号同时拉低,FFTMegaCore处理器便能够暂时停止工作,且如果此时有数据正在输出,输出的数据帧也将暂时停止输出,直至sink_valid信号再次恢复高电平,FFTMegaCore处理器才恢复工作,继续进行之前暂停的数据帧输入和输出,且不会影响最终的变换结果。输入完整的两帧1024点的数据输入,使两个输入帧之间不连续,且第二帧输入数据的内部也存在不连续的情况。Testbench激励文件中时序控制部分VerilogHDL描述如下:assign

sink_valid

=

((cnt>0)&(cnt<1025))

|

((cnt>1500)&(cnt<2000))

|

{(cnt>2200)&(cnt<2726)};

assignsink_sop

=

(cnt==1)

|

(cnt==1501);

assignsink_eop

=

(cnt==1024)

|

(cnt==2724);

通过图5-8可以看到,在第二个数据帧输入时,在第499个数据输入完成后,将sink_valid信号设置为低电平,但sink_eop信号保持低电平并不拉高,说明此处并非数据帧的结尾处,因而此时数据只是暂时停止输入;数据暂时停止输入期间,输出有效指示信号source_valid也随sink_valid信号变为了低电平,但source_eop信号并未在前一时钟周期内保持一个时钟周期的高电平,而输出数据source_real和source_imag在这期间内保持不变,可以看出此时数据帧并非结束输出,而只是暂时停止输出。在输入有效信号sink_valid数据恢复为高电平后,输出有效指示信号source_valid也恢复高电平,FFTMegaCore处理器在该信号恢复之后,继续输出数据,并在若干个时钟周期后完成该数据帧的输出,输出完成时source_eop信号变为高电平且保持一个时钟周期,指示该数据帧结束。图5-8VariableStreaming模式下2帧数据输入时IFFT全过程的时序图在BufferedBurst模式和Burst模式中,为了节省存储器资源,FFTMegaCore降低了数据的吞吐率,使用FIFO存储器接收输入数据。因为使用了FIFO存储器载入数据,存储器满载后会将sink_ready信号拉低,不接收新的数据,直至FIFO存储器能接纳新数据后再重新拉高sink_ready信号的电平,继续接收新的数据。简而言之,这两种模式为了节省存储器资源而无法接收连续的数据帧进行变换,连续输入的数据帧需要出现相应的中断才能使数据有效输入到FFTMegaCore处理器中。本文以BufferedBurst模式为例,分析BufferedBurst以及Burst模式下的数据输入与输出时序。如图5-9所示,在输入和输出数据帧的帧头及帧尾处,指示信号sink_sop、sink_eop、source_sop和source_eop与其他模式并无区别,但sink_ready信号明显影响了整个数据输入过程。通过图5-5(a)可以看到,第二帧数据开始输入时,sink_sop信号出现一个时钟周期的高电平,sink_valid信号也持续保持高电平;在7个时钟周期后,因为FIFO存储器满载,sink_ready信号变为低电平,此时FFTMegaCore处理器不能再接收数据,即使sink_valid信号仍保持高电平,但此时数据已经暂停输入。等到FIFO存储器能够继续接收新的数据时,sink_ready信号重新变为高电平,数据也开始继续输入。值得注意的是,如图5-5(b)所示,在第四帧数据帧尾处,当sink_valid信号无效时,即使数据满载,sink_ready信号也不会发出指示,因为在满足Avalon总线协议的情况下,此时不可能有数据输入,因而也无需指示数据满载。(a)第二帧输入数据帧头(b)整体时序图图5-9BufferedBurst模式下4帧数据输入情况下的时序图FFTMegaCore处理器资源占用与性能分析本节将采用控制变量的方式,对不同配置下的FFTMegaCore处理器资源占用情况以及性能进行对比分析,以针对不同需求提供合适的FFTMegaCore处理器的参数、架构、实施选项的配置。本小节中,FFTMegaCore处理器将进行变换长度1024点的快速傅里叶变换,以CycloneIVGX系列FPGA器件作为目标器件。首先研究最常用的Streaming模式下,设置不同复数乘法实现方式的资源占用情况以及性能分析,数据输入精度和旋转因子精度都设置为16bit,且不选择在存储器中实现部分逻辑功能,输出引擎为四输出模式。资源占用情况如表5-1所示,变换所需时间为开始输入到结束输出所用时钟周期数。对比不同实现方式下的资源占用情况可知,同时利用DSP块和逻辑单元进行复数乘法时,乘法部分运算会更多地分配给DSP块进行,而选择用逻辑单元实现乘法时,将耗用过多资源。虽然实现方式不同,但从输入到输出所需要的时钟周期是一致的,这意味用户可以根据系统中其他模块的需要,对FFTMegaCore处理器占用的资源进行灵活调整,找到最佳匹配方案。表5-1Streaming模式下不同复数实现方式的资源占用情况和变换所需时间复数乘法的实现方式LEs(单位:个)MemoryBits(单位:bit)DSPBlock9-bitelements(单位:个)单帧变换所需时钟周期数结构利用资源3Mults/5AddersDSPBlocks/LogicCells55521556481831323Mults/5AddersLogicCells10076155648031323Mults/5AddersDSPBlocks53361556481831324Mults/2AddersDSPBlocks/LogicCells49521556482431324Mults/2AddersLogicCells13022155648031324Mults/2AddersDSPBlocks5096155648243132对Streaming、BufferedBurst和Burst三种模式下进行1024点FFT运算的资源耗用情况进行对比,所有模式统一选用四输出引擎,不进行DSP资源优化及不选择在存储器中实现部分逻辑功能,复数乘法实现方式采用3个乘法器加5个加法器的结构,只利用逻辑单元实现,不占用DSP块的资源。资源占用情况如表5-2所示,单帧变换所需时间为开始输入到结束输出所用时钟周期数。可以看到三种模式下Burst的资源占用量最少,存储器占用位数甚至不及前两种模式的一半,因此该模式下输入、输出数据吞吐量极低,在进行多帧变换时需要耗费大量的时间。Streaming模式支持连续的数据输入和输出,虽然耗费资源较多,但进行大量数据帧的FFT处理时,该模式在速度上有着明显优势。表5-2不同模式下的资源占用情况和变换所需时间选用模式LEs(单位:个)MemoryBits(单位:bit)单帧变换所需时钟周期数双帧变换所需时钟周期数Streaming1007615564831324156BufferedBurst932112288031584449Burst89285734431586310FFTMegaCore处理器FFT/IFFT变换的准确性分析本节将使用ModelSim软件编写Testbench激励文件,对FFTMegaCore处理器进行功能仿真,使其对正弦信号进行快速傅里叶变换以及快速傅里叶逆变换,并将数据输出后利用Matlab软件绘制波形,与理论波形进行初步对比,以验证变换的正确性。本节还将进一步以随机信号作为输入,在Streaming模式下和VariableStreaming模式下进行快速傅里叶变换以及快速傅里叶逆变换,对块浮点数输出情况下和单精度浮点数输出情况下的输出数据和Matlab计算所得理论值进行对比与分析,以验证FFTMegaCore处理器不同输出格式下快速傅里叶变换运算的准确性。正弦信号的仿真测试利用Matlab分别生成正弦信号,格式化为16bit带符号整数形式后,输入到FFTMegaCore进行处理。FFTMegaCore设置为Streaming模式,输出数据以块浮点数表示。整个仿真流程如下:编写Testbench调用FFTMegaCore处理器对输入的数据进行FFT运算,将运算结果输出到fft_out.dat文件中,再次调用FFTMegaCore处理器对变换后的频域数据进行IFFT运算,恢复为时域数据,输出到ifft_out.dat文件中。对FFTMegaCore处理器进行功能仿真系统结构如图5-10所示。图5-10正弦信号仿真测试系统框图 由于FFTMegaCore处理器输出结果以块浮点数表示,即输出数据为缩放后的数值及其缩放因子,需对变换结果进行处理后才能得到正确的输出数值,根据用户手册给出的换算公式得到如下Matlab代码:%

对Megacore输出的数据进行处理%

Megacore处理器对信号源进行FFT后的频域数据F_RE

=

F_REAL

./

(2

.^

F_EXP);F_IM

=

F_IMAG

./

(2

.^

F_EXP);%

Megacore处理器对

F_REAL+j*F_IMAG

进行IFFT后的时域数据i_re

=

i_real

./

(2

.^

i_exp

.*

N);i_im

=

i_imag

./

(2

.^

i_exp

.*

N);%

Megacore处理器对信号源进行FFT再恢复的时域数据y1_re

=

i_real

./

(2

.^

(i_exp

+

F_EXP)

.*

N);y1_im

=

i_imag

./

(2

.^

(i_exp

+

F_EXP)

.*

N); 根据图5-11对FFTMegaCore的FFT运算结果进行初步分析,可以看到,FFTMegaCore处理器的FFT运算得到的频域数据中,实部数据与Matlab计算得到的理论值存在明显差异,但误差值的数量级极小,最大误差值仅为4.65661287×10-10,在精度要求不高的情况下对变换结果影响甚微,甚至可以忽略不计;虚部数据波形也与理论值基本一致,存在一定误差,最大误差值为451.387845,而虚部数据最大值接近2×107,因此误差值也并不会对结果产生过大的影响。(a)频域实部对比图(b)频域虚部对比图图5-11FFTMegaCore进行FFT运算的结果与FFT理论值的对比图进一步摘取虚部数据中存在误差的部分数据进行对比分析,数据精确到小数点后五位,数据如表5-3所示。可以看到,在理论数值较大的位置,FFTMegaCore处理器据相对误差仅为0.00269%,对整个输出结果的影响十分微小,而在理论数较小的位置,FFTMegaCore处理器结果出现了十分明显的偏差,相对误差值接近100%。这是因为在Streaming模式下,处理器输出结果由块浮点数表示,当输出数据较大时,所有数据将按统一尺度缩放,在二进制数表示时即舍弃低位数据,所以较小的数据将被舍去,再次按放大后数据也不能被恢复,导致了误差的出现。表5-3虚部数据误差及相对误差变换点数MegaCore结果Matlab理论值虚部误差虚部相对误差X(65)-16777216.00000-16776764.61216-451.387850.00269%X(193)0.0000073.20825-73.2082599.99863%X(321)0.00000157.23774-157.2377499.99936%X(449)0.0000023.41733-23.4173399.99573%X(577)0.00000-23.4173323.4173399.99573%X(705)0.00000-157.23774157.2377499.99936%X(833)0.00000-73.2082573.2082599.99863%X(961)16777216.0000016776764.61216451.387850.00269%(注:数据为0时相对误差数据计算公式用极小值修正)接下来对FFTMegaCore处理器的IFFT运算结果进行分析,因为是实信号,所以忽略虚部数据分析。由图5-12所示,处理器的输出结果波形与Matlab运算得到的理论值波形基本一致,实部数据最大误差仅为0.04646,均方根误差为0.02079,说明即使输出结果整体较小,FFTMegaCore处理器用块浮点数表示也能得到较为精确的输出结果。图5-12FFTMegaCore进行IFFT运算的结果与FFT理论值的对比图利用FFTMegaCore处理器对原始时域信号进行FFT后,再进行IFFT恢复为时域信号,如图5-13所示,恢复后信号与原始信号波形一致,未有明显误差。利用Matlab对数据进行分析得知,信号经过FFTMegacore变换再恢复后时域实部最大误差值仅为191,时域实部最大相对误差0.63093%,且误差值周期性重复,说明误差是恢复时部分频域数据缺失导致,但对最终结果影响很小。图5-13FFTMegaCore进行FFT、IFFT运算的结果与原始信号的实部对比图结合上述分析可知,FFTMegaCore处理器能够正确进行FFT/IFFT运算,且波形不会出现明显异常。在Streaming模式下由块浮点数表示输出数据时,无论数据整体数值较大或较小,都不会影响变换的整体准确度。但由于块浮点数存储时的缩放特性,会导致部分相对较小的数据丢失,影响部分点的准确性,但对数据整体影响仍可忽略。随机信号的仿真测试本小节将分别对FFTMegaCore处理器进行在Streaming模式下以块浮点数输出和在VariableStreaming模式下以单精度浮点数输出这两种情况进行功能仿真,对比不同输出格式下变换准确性。进行功能仿真测试的系统结构如图5-14所示。图5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论