您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北邮信号与信息综合处理实验二
信号与信息综合处理实验报告学院:信息与通信工程学院班级:姓名:学号:实验二用FPGA实现FFT1.实验目的1)掌握XilinxISE中IPCore的使用方法;2)初步掌握Xilinx公司的FFTIPCore的使用方法;3)比较DSP和FPGA实现FFT的异同。2.实验内容1)按实验指导书所给出的步骤,用XilinxIPCore实现256点的FFT并进行仿真和测试;2)将所给出的例子改写为512点的IFFT并进行仿真和测试;3)将FFT点数改为1024,重新进行仿真和测试;4)将FFTIPcore改为Radix-4BurstI/O架构,重新完成仿真和测试。3.实验原理3.1.XilinxFFTIPcore使用说明在Xilinx公司的IPCore中,提供两不同的架构:BurstI/O架构和StreamingI/O流水线架构。所谓的BurstI/O是指数据的输入和输出都是突发的,即输入输出是一段一段的而不是连续的;所谓的StreamingI/O流水线架构则是指输入数据和输出数据都是以一定的频率连续不断地进行的。BurstI/O架构下,采用的是时间抽取(DIT)方法,而在StreamingI/O流水线架构下采用的是频率抽取(DIF)方法。当采用基4分解时,N点FFT共需log4(N)级,每一级包含N/4个基4的蝶形图,如果点数N不是4的幂次,则还需要另外一个基2的级。如果采用基2的分解,则共有log2(N)级,每一级包含N/2个基2蝶形。IFFT通过将对应的FFT的相位因子取共轭实现。本实验以StreamingI/O流水线架构为例学习XilinxFFTIPcore的使用方法。StreamingI/O流水线架构示意图如下图所示。这种架构将多个基2的蝶形处理单元排成流水线形式以提供连续的数据处理,每个处理单元有它自己的存储单元用于存储输入和中间数据。数据数据可以连续输入到流水线的前级,经过一段计算时延,从输出端连续输出一个数据块的数据。当然,这种架构也允许在数据块之间添加一段时间的间隔。在scaledfixed-point模式下,数据在每进行一对基2级之后都会进行一次移位,移位次数可以事先根据输入数据范围确定。除了这种模式外,IPcore还提供一种块浮点模式用于改善性能。输出数据可以以比特逆序输出,也可以自然序输出,当采用自然序输出时,需要用到额外的存储资源。与streamingI/O架构不同,BurstI/O以一组蝶形计算单元完成所有运算,其中基4的BurstI/O架构示意图如下图所示。在这种架构下,输入数据分为4块存储到RAM中,每计算一次蝶形运算,计算结果仍然存储到这4块RAM中,直至最后输出。在这种架构下,数据不能连续输入,整个IPcore的工作状态分为数据输入、处理和输出等不同的状态。显然,这种架构占用资源量明显少于StreamingI/O结构,但是处理数据的吞吐量有限。在不同的配置下,IPcore对外的接口有一些差别,下面仅对在本实验中将要用到的部分端口的功能做以下说明:端口名位宽方向描述Xn_re可配输入输入数据实部,与xn_index对应Xn_im可配输入输入数据虚部start1输入启动控制信号,拉高则FFT开始加载数据,可一直置高,此时由IPcore的状态控制加载Fwd_inv1输入1表示FFT,0表示IFFTScale_sch在不同模式下位宽不同,在StreamingI/O模式下,输入各级移位次数Sclr1输入同步复位信号Clk1输入工作时钟Xk_re可配,scaled模式下同Xn_re输入输入数据实部,与xn_index对应Xk_im同上输入输入数据虚部Xn_index与点数有关输出Xn所对应的序号Xk_index与点数有关输出Xk所对应的序号RFD1输出加载数据阶段为高Dv1输出输出数据时为高4.实验步骤4.1.256点FFT变换1)新建工程;2)新建FFTIPcore。命名为fft256,在IP列表中选择Digitalsignal-processing-transforms-FFTs,选择7.1版本,点击Next,然后点击finish;3)在按以下截图下设置参数,然后点击下一步;4)在第2个页面上按下图设置,其含义分别为:定点格式;输入数据位宽16比特,相位因子16比特、Scaling选项选择scaled,截取模式选择truncation、添加同步复位sclr控制管脚、输出自然顺序,输入数据时序3clockcycleoffset选项。点击Next,进入第3页面5)第3页面上,选择NumberofStagesusingblockram为3,点击Generate生成IPcore;6)新建blockRAMIPcore,取名为imput_rom_I;7)在第2页面上选择单口ROM,其他选项保持不变;8)第3页面设置如下图,注意选择useENApin选项;9)第4页面上,选择下图中所示的两个寄存器选项;10)选择压缩包中的input_I.coe作为该ROM的初始化文件;其他选项保持默认值,点击Generate;11)再按照上述步骤生成一个ROM,选择压缩包中的input_Q.coe文件作为初始化文件;12)将压缩包中的fft_top.v,fft_ctrl.v添加到工程中;13)为fft_top.v编写测试文件,可参阅压缩包中的test_fft.v,注意理解程序中文件输出部分的功能;14)对该设计进行功能仿真,记录仿真波形,并分析StreamingI/O架构下256点FFT的计算时延;15)使用Chipcope对该设计进行在板测试,观察xn_index、xn_im、xn_re、xk_im、xk_re、xk_index的相对时序关系,触发条件可以xk_index、out_block_index或rd_block_index、xn_index取某一具体数值开始触发采数操作;16)去掉cdc文件,在布局布线报告中找到DeviceUtilizationSummary部分,观察FFT部分的资源占用情况;17)比较DSP实现FFT与FPGA实现FFT的异同。4.2.1024点FFT变换将上述点数设置改为1024点,其余相同,重新完成上述流程。4.3.BurstI/O架构下1024点FFT变换将FFTIPcore改为Radix-4BurstI/O架构,重新完成上述过程(注意,此时需要uload信号,直接在ctrl模块里置1即可),并对streamingI/O方式的时延、吞吐量以及资源占用情况进行比较。5.关键代码5.1.Streaming架构下256点FFTinputrst1,outputrfd,outputdv,output[15:0]output_re,output[15:0]output_im,output[1:0]out_block_index);wirerst;assignrst=~rst1;wirestart;//FFT开始信号高有效:START为高表示开始加载数据并计算变换(BurstI/Oarchitectures).wirefwd_inv;//FFT/IFFT指示信号1:FFT,0:IFFTwiredone;//完成指示,只有一个cycle宽度的高电平,表示处理完成wirebusy;//忙指示,该信号为高表示FFT变换计算完毕wirescale_sch_we;//SCALE_SCH写使能wirefwd_inv_we;//fwd_inv写使能wireedone;//将完成,在done之前一个周期给出高电平wire[31:0]xn;//输入数据,高位为实部wire[7:0]xn_index;//xn序号wire[7:0]scale_sch;//各个stage的定标调整值wire[31:0]xk;//输出数据,高位为实部wire[7:0]xk_index;//输出数据序号wirerd_en;//从ROM中读取数据的使能信号wirewr_en;//往RAM里写数据的使能信号wire[9:0]rd_addr;//ROM中读取数据的地址信号wiresclr;//FFT核同步复位信号wire[1:0]rd_block_index;//ROM中存4个块,表示块序号assignfwd_inv_we=1'b0;//不允许修改FFT和IFFT指示assignscale_sch_we=1'b0;//不允许修改scale_schassignfwd_inv=1'b1;//FFTassignscale_sch=8'b10_10_10_10;assignrd_addr={rd_block_index,xn_index};assignoutput_re=xk[31:16];assignoutput_im=xk[15:0];//fft控制fft_ctrlctrl_inst(.clk(clk),.reset(rst),.rd_en(rd_en),.wr_en(wr_en),.done(done),.edone(edone),.rd_block_index(rd_block_index),.out_block_index(out_block_index),.start(start),.rfd(rfd),.dv(dv),.sclr(sclr),.xn_index(xn_index),.xk_index(xk_index));fft256fft_inst(.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),.xn_re(xn[31:16]),.xn_im(xn[15:0]),.xn_index(xn_index),.scale_sch(scale_sch),.xk_re(xk[31:16]),.xk_im(xk[15:0]),.xk_index(xk_index),.sclr(sclr));input_rom_Irom_inst_I(.clka(clk),.ena(rd_en),.addra(rd_addr),.douta(xn[31:16]));input_rom_Qrom_inst_Q(.clka(clk),.ena(rd_en),.addra(rd_addr),.douta(xn[15:0]));Endmodule5.2.Streaming架构下1024点FFTtimescale1ns/1psmodulefft_top(inputclk,inputrst1,outputdv,outputrfd,output[15:0]output_re,output[15:0]output_im,output[2:0]out_block_index);wirerst;assignrst=~rst1;wirestart;//FFT开始信号高有效:START为高表示开始加载数据并计算变换(BurstI/Oarchitectures).wirefwd_inv;//FFT/IFFT指示信号1:FFT,0:IFFTwiredone;//完成指示,只有一个cycle宽度的高电平,表示处理完成wirebusy;//忙指示,该信号为高表示FFT变换计算完毕wirescale_sch_we;//SCALE_SCH写使能wirefwd_inv_we;//fwd_inv写使能wireedone;//将完成,在done之前一个周期给出高电平wire[31:0]xn;//输入数据,高位为实部wire[9:0]xn_index;//xn序号wire[9:0]scale_sch;//各个stage的定标调整值wire[31:0]xk;//输出数据,高位为实部wire[9:0]xk_index;//输出数据序号wirerd_en;//从ROM中读取数据的使能信号wirewr_en;//往RAM里写数据的使能信号wire[9:0]rd_add
本文标题:北邮信号与信息综合处理实验二
链接地址:https://www.777doc.com/doc-2582740 .html