实验3.docx

上传人:b****5 文档编号:30707304 上传时间:2023-08-19 格式:DOCX 页数:32 大小:746.94KB
下载 相关 举报
实验3.docx_第1页
第1页 / 共32页
实验3.docx_第2页
第2页 / 共32页
实验3.docx_第3页
第3页 / 共32页
实验3.docx_第4页
第4页 / 共32页
实验3.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

实验3.docx

《实验3.docx》由会员分享,可在线阅读,更多相关《实验3.docx(32页珍藏版)》请在冰豆网上搜索。

实验3.docx

实验3

信息与通信工程学院

信号与信息处理综合实验报告

(FPGA部分)

 

班级:

姓名:

学号:

序号:

实验三用FPGA实现快速傅里叶变换

一、实验目的

(1)掌握XilinxISE中IPCore的使用方法;

(2)初步掌握Xilinx公司的FFTIPCore的使用方法;

(3)比较DSP和FPGA实现FFT的异同。

二、实验内容

(1)按实验指导书所给出的步骤,用XilinxIPCore实现256点的FFT并进行仿真和测试。

(2)将所给出的例子改写为512点的IFFT并进行仿真和测试。

三、程序基本信息

(一)、程序模块描述:

本次实验里涉及了三个程序,第一个是原始程序,另外两个是对原始程序作简单修改后的功能拓展,基本是类似的。

以下只对原始程序作较为详细的说明,而功能拓展只简单说明修改的情况。

本次实验主要通过FPGAIPCore实现。

所谓IPCore就是预先设计好、经过严格测试和优化后的电路功能模块。

它犹如一个黑盒子,用户只需要配置好其相关接口并在顶层文件中将其实例化即可,但是它本质上也是一个ISE工程文件,存储在设计工程的ipcore_dir目录下,由于其代码本身过于复杂且本次实验中基本不涉及,因此下面不作介绍。

本次实验全部采用以下两种IP核:

FastFourierTransform(FFT)和BlockMemoryGenerator。

1、256点FFT(StreamingI/O):

(1)源程序(IPCore):

FFT核

核名:

fft256;

架构:

StreamingI/O(流水线);

其它参数:

工作频率100MHz,定点格式,输入数据位宽和相位因子位宽均为16比特,需要缩放,向下截取,顺序输出,添加同步复位sclr控制管脚,输入数据延迟3时钟周期等。

调用该IPCore的控制信号将在介绍顶层文件时说明。

存储器核

全称:

BlockMemoryGenerator,可直译为块存储器生成器,可以生成任意大小的存储器阵列并可以针对速度或功率对其进行优化。

本次实验使用它来生成存储器阵列,用于存储输入数据。

由于输入数据(复数)的实部和虚部使用两个几乎完全相同的IP核,因此主要介绍实部使用的核,虚部使用的核若采用不同参数会在括号里注明。

核名:

input_rom_I(input_rom_Q);

存储器类型:

单口ROM;

读取数据位宽:

16位;

读取数据深度(个数):

1024;

使用的初始化文件:

input_I.coe(input_Q.coe),存储了1024个16位数,表示输入数据的实部(虚部);

使用使能管脚。

(2)顶层文件(fft_top.v)及控制文件(fft_ctrl.v):

重要的组成部分,对于工程的正确运行是必需的,其中顶层文件完成控制信号的声明,部分信号(主要为恒定信号)的赋值,接受来自控制文件的信号,利用信号实例化和调用所有IP核的任务,而控制信号则主要根据系统时钟及相关触发条件对控制信号及相关参数进行赋值,并将其结果返回给顶层文件。

这两个文件的主要工作都是对相关控制信号进行处理,下面介绍这些控制信号及它们在相关文件中是如何被处理的,通过这些基本就可了解这两个文件的内容。

a.输入(控制)信号:

这里都是IP核的输入信号,需要在顶层文件或控制文件中对其初始化或赋值。

FFT核控制(输入)信号:

XN_RE和XN_IM:

输入操作数,分别代表实部和虚部,位宽为16位,表明实部和虚部都是16位。

顶层文件中还包含32位的XN和XK信号也用来表示操作数,高16位表示实部,低16位表示虚部;

START:

FFT开始信号,高有效,表明开始输入数据。

控制文件中在一开始把它置为1,但对于StreamingI/O结构而言,任何时候置1都可以开始数据的加载;

FWD_INV:

指示IPCore是FFT还是IFFT,顶层文件中把它置1表明是FFT运算;

FWD_INV_WE:

FWD_INV端口的使能信号,由于这里自始至终都是进行FFT运算,因此顶层文件中把它置0表明FWD_INV信号不再变化;

SCALE_SCH:

若选择在数据处理中进行缩放则需要此信号,流水线结构中,将每个基2的蝶形处理单元视为一个阶段,每个阶段进行一次数据的缩减,缩减的比例以此输入中对应阶段的两比特表示;

SCALE_SCH_WE:

SCALE_SCH的使能信号,这里同样置0表示SCALE_SCH不再变化;

SCLR:

FFT核同步复位信号,高有效,控制文件中置其为0表明不需要复位;

CLK:

输入时钟信号,实验中由FPGA板产生;

XK_RE及XK_IM:

输出的数据(补码形式),两个信号分别代表实部和虚部,实验中采用了缩放,因此这两个信号位宽和输入数据是相同的,都是16,输出的数据将存储在XK中;

XN_INDEX:

输入数据的下标,位宽等于以2为底FFT点数的对数,对于256点FFT而言是8位;

XK_INDEX:

输出数据的下标,位宽与XN_INDEX相同;

存储器核控制(输入)信号:

本次实验中仅使用了端口A,下面的信号都是针对它的。

CLKA:

端口A使用的时钟信号,这里和CLK是相同的;

ENA:

端口A的使能信号,启用相关读写和复位操作,这里直接使用顶层文件中的RD_EN(读使能)信号;

ADDRA:

该信号把相关地址赋给A端口以用于读写操作,这里直接使用顶层文件中的RD_ADDR信号(10位);

b.输出(状态)信号:

这些都是IP核的输出信号以表明工作状态,顶层文件和控制文件不需要对它们进行修改,但在调用IP核时仍需要声明它们,在仿真时通过观察这些信号的状态可以获得很多有用信息。

RFD(Readyfordata):

FFT核输出信号,当其为高时表明FFT核正在加载数据,当其由低变高时表明FFT核已经转备好接收数据;

BUSY:

FFT核输出信号,当其为高时表明FFT正在计算中;

DV:

FFT核输出信号,当其为高时表明当前输出端口存在有效数据;

EDONE:

FFT核输出信号,即将完成,在DONE之前一个周期给出高电平;

DONE:

FFT核输出信号,当其为高时表明FFT已经计算完成,但高电平只持续一个时钟周期;

DOUTA:

存储器核输出信号,返回读操作中得到的数据,这里它用来返回从input_i.coe或input_q.coe文件中的数据,因此位宽为16,返回的数据存储在XN中;

c.其它信号:

这里的信号和IP核无关,仅用在控制文件和顶层文件中,用于传递参数或显示相关状态,其中XN和XK信号前面已有描述,这里不再重复。

RESET:

控制文件信号,在顶层文件中为RST,来源为FPGA板,当其为高电平时,块序号清零(下面会介绍),注意FFT核也有一个控制信号RESET,但是和这里介绍的无关,顶层文件实例化FFT核时没有使用RESET信号;

RD_EN:

从ROM中读取数据的使能信号,这里直接使用FFT核的RFD信号,即:

一旦FFT核已经准备好或正在接收数据,就读取新数据;

WR_EN:

往RAM里写数据的使能信号,这里直接使用FFT核的DV信号,即:

一旦FFT核开始输出有效数据,就开始写入这些数据;

RD_ADDR:

读取数据的地址,10位(表示1024个数),在这里由2位块序号和8位输入数据序号组成,见下面的相关说明;

RD_BLOCK_INDEX:

表示数据块的序号,读操作用,2位,可表示4个ROM块,由于输入数据有1024个,而输入序号XN_INDEX和XK_INDEX都是8位,最多表示256个数,因此需要4个ROM块来管理所有输入数据,每个块存储256个数,控制文件中,当数据序号达到255(即已有256个数据)时,该信号加一表明开始启用下一个ROM块,块序号(2位)和输入序号(8位)共同组成RD_ADDR信号指示数据地址;

OUT_BLOCK_INDEX:

表示数据块的序号,写操作用,2位,和RD_BLOCK_INDEX性质相同;

OUTPUT_RE:

输出数据的实部,16位,直接使用XK的高16位;

OUTPUT_IM:

输出数据的虚部,16位,直接使用XK的低16位;

(3)测试文件(test_fft.v):

该文件对于工程的正常运行不是必需的,它仅用在Modelsim仿真中,也是通过相关信号的处理来构建仿真环境,以下简要介绍它的工作流程(其中所有信号都将送给顶层文件)。

打开(或创建)文件output_data.txt,对应的语句语句为“fp=$fopen("output_data.txt")”;

开始置写使能(WF_en)信号为高,计数器(counter)为0;

产生周期为10ns时钟信号CLK,并向顶层文件中输出,作为系统时钟;

在每一个时钟的上升沿,若FFT核输出的DV为高电平(表明数据有效),则向文件output_data.txt中写入输出的有效数据,数据源自顶层文件的OUTPUT_RE和OUTPUT_IM,将被转换成十进制,写入文件的语句为“$fdisplay(fp,"%d%d",output_re,output_im)”,写入数据的形式为无符号十进制数,同时计数器值加1;

若计数器值变为1023,即已写入了1024个数,则置写使能信号为低,停止写入。

以上流程结束后,在Modelsim中显示波形的同时,工程目录下将多出一个output_data.txt文件,存储了一次FFT运算的结果。

若延长仿真时间,则FFT核还会输出相同的数据,但它们将不会被写入文件中。

2、1024点FFT(StreamingI/O):

这是源程序的功能拓展,基本内容和源程序是相同的,以下只说明需要修改的地方。

在FFT核设置的第一页,把点数改成1024,其它设置无需改动,改完后需要重新生成IP核;

XN_INDEX和XK_INDEX位宽是以2为底FFT点数的对数,因此对于1024点数FFT来说应从8位改成10位;

SCALE_SCH信号的位宽为

,其中NFFT为FFT点数,因此对于1024点FFT来说应改为10位,这里按照XILINX官方说明文件(见下面截图)的内容将其改为1010101010;

(对于SCALE_SCH的取值,XILINX官方文件也给出了其它方案,下面给出另一个截图,这段叙述给出了SCALE_SCH的意义所在,即每两个比特对应输入中某阶段即每个蝶形运算的压缩比例。

按照这段内容的说法,若将SCALE_SCH改成1010101011可以完全避免数据溢出的情况,但是由于时间所限我没有进行测试。

对于上面的256点FFT而言,由于XN_INDEX和XK_INDEX都是8位,最多表示256个数,而输入的却有1024个,因此前面需要添加两位块序号,使用4块ROM进行管理,而对于1024点FFT来说,XN_INDEX和XK_INDEX都是10位,不需要使用块序号进行管理,也就是说RD_BLOCK_INDEX和OUT_BLOCK_INDEX已经没有存在的意义,需要去掉或者屏蔽掉它们,按照以下方法即可实现:

把语句“assignrd_addr={rd_block_index,xn_index}”改成“assignrd_addr=xn_index”(必要步骤),然后删掉RD_BLOCK_INDEX和OUT_BLOCK_INDEX的声明语句和调用语句(不是必要的步骤)。

3、256点FFT(Radix-4,BurstI/O)

这是源程序的功能拓展,基本内容和源程序是相同的,以下只说明需要修改的地方。

在FFT核设置的第一页,把类型改成“Radix-4,BurstI/O”,其它设置无需改动,改完后需要重新生成IP核;

添加UNLOAD信号(实验指导书上把它错打成了“uload”),它仅用在BurstI/O结构的FFT核中,表示将开始输出处理的结果,添加的具体方法如下:

在顶层文件实例化FFT核模块和控制文件模块加入语句“.unload(unload),”;

控制文件中加入语句“assignunload=1;”,模块声明(modulefft_ctrl)部分加入“outputunload,”,表明该信号的值将从控制文件传递到顶层文件中。

以上功能拓展,若要进行Chipscope在板调试,还要对CDC文件和UCF文件进行修改,但我这次只进行了Modelsim的仿真,因此无法给出CDC文件和UCF文件的修改方案。

四、功能测试记录

1、256点FFT(StreamingI/O):

(1)Modelsim仿真波形分析

(以下Modelsim仿真图中,为便于观察波形和计算时延,添加了RFD信号和RD_BLOCK_INDEX信号)

以下是全过程仿真波形,可以看到整个仿真结果大致可分为4个阶段:

第一阶段,模拟实际系统的初始化,除了打开或创建用于写入结果的文件output_data.txt外不进行任何操作;

第二阶段,系统开始工作,开始会有一个短暂的重置时间(RST信号为0),这时清空块序号OUT_BLOCK_INDEX和RD_BLOCK_INDEX,这段时间里RFD信号也变为高表示FFT核已经准备好接收数据,重置过后正式开始FFT计算,这段时间虽然系统暂时不会有任何输出,但从RD_BLOCK_INDEX的变化上可以看出数据已经开始加载,每加载256个输入数值该信号会加1;

第三阶段,开始输出有效数据,DV信号变为高,此时OUTPUT_RE和OUTPUT_IM开始输出计算结果,由于WF_en信号为高电平,结果也被写入文件中,为确保只写入一次计算结果计数器COUNTER也将开始工作,这段时间里,每输出256个数据,OUT_BLOCK_INDEX信号都将加1;

第四阶段,一次FFT结果已经全部写入文件,计数器值变为1023,此时置WF_en为0停止写入,计算器也清零停止工作,但是数据的加载没有结束,FFT还将重复输出前面的结果,DV信号仍为高电平,以后无论怎样延长仿真时间,都将停留在这个阶段,即只输出FFT结果但不写入文件的阶段。

以下是开始输出数据阶段的仿真图的放大版,以及仿真完成后output_data.txt的内容,默认为按2进制显示,将其改为按无符号数显示时,可以看到输出的结果已经写入到文件中,且写入形式为无符号数。

若将输出的信号改为有符号数,则与老师给的output.txt文件内容对应,当然,这里只是改变了显示的形式,实际处理和写入时仍按照无符号数进行。

计算时延:

这段时间严格来说应该是从数据开始输入(加载)到第一个有效数据输出这段时间,即RFD信号变为高到DV信号变为高这段时间,根据下页的两个截图可以判定,时延大致为6095000-105100=5989900ps即大约

s。

(2)Chipscope测试波形分析

以下先介绍我的Chipscope内核定义文件是如何设置的。

TriggerParameters选项卡里,TriggerPorts设为1,TriggerWidth设为20,即1个触发源,里面包含20个触发信号,触发信号至少应为10个,另外更好的设置方案是设置2个触发源,每个触发源设置10个信号,具体下面会说明;

CaptureParameters选项卡里,去掉DataSameAsTrigger选项,设置DataWidth为113,即113个数据信号;

NetConnections选项卡里,按下设置信号连接:

ClockSignals里设置时钟源为[fft_top]模块下的clk_BUFGP;

TriggerSignals里设置触发源为[fft_top]模块下的ctrl_inst/out_block_index(2位),ctrl_inst/rd_block_index(2位),xk_index(8位)和xn_index(8位),共20个触发信号(更好的设置方案是设置两个触发源,一个触发源包含out_block_index和xk_index共10位信号,另一个包含rd_block_index和xn_index共10位信号,最小的设置方案是至少设置以上任何一个触发源,否则采集的数据会不正确);

DataSignals共包含113个信号,分别是[fft_top]下的output_re(16位)、output_im(16位)、xn_index(8位)和xk_index(8位),fft_inst下的xn_re(16位)、xn_im(16位)、xk_re(16位)、xk_im(16位)和dv信号(1位)。

必须要说明的是,设置如此多的信号只是为了获取更多的信息,但这样也会耗费更多的处理时间,实际上可以精简一些信号。

下面先给出不设置触发条件情况下的一次采集波形的截图,简单说明图中包含的内容。

图中上半部分是设置触发的窗口,此时没有设置任何触发条件,因此所有制都是X表示不定值,这时任何数据都会采集并显示,下面是采集到的波形,共有9个信号,前两个信号表示实际输出的数值(在Modelsim中它们要写入文件),第四第五个信号表示FFT核输出的结果,在数据有效信号dv(第三个)为1时它和output是相同的,第六第七个信号则表示当前输入的数据,第八个信号是输出数据的序号,第九个信号则是输入数据的信号,这些信号的名称和前面介绍的大致相同。

要获得图中的显示结果,需把所有数值按无符号数显示,另外若output信号展开后序号从高到低,需要反转这个显示顺序,改成序号从低到高。

如果运行正确的话,output信号输出的数据在output_data.txt可以查找到,若output信号是按有符号数显示的,则数据可以在output.txt中可以查找到,和Modelsim仿真类似,说明了Chipscope仿真和Modelsim仿真获得的计算结果是相同的,这里不再给出对应的截图。

要说明的是,Chipscope仿真不产生结果文件,欲比较结果需要事先执行Modelsim仿真。

为计算时延,需要确定第一个输出值和第一个输入值之间的时间差,在上面的波形中,可以查找xk_index为0的时隙,此时由对应的xn_index即可确定时延。

其中一个比较方便的办法是设置触发条件,设置后,Chipscope只会从满足触发条件的时刻开始抓取数据。

设置方法:

触发窗口中,置xk_index为0000000,而后再次抓取数据就获得下面的波形。

由该图可以看到,输出序号为0的时候,输入序号已达87,即输入了87个数以后才开始输出结果,所以时延就是连续加载87个数据的时间。

以下给出其他触发条件的截图。

设置触发条件为rd_block_index==10:

设置触发条件为out_block_index==10:

(以上两个截图都是理想情况,即输入序号和输出序号至少有一个为0,因为设置的触发条件是启用新的ROM块来存储另外256个数据,但是偶尔抓取到的数据不是这种情况,具体原因未知)

这里的判定条件都是“==”,即从满足的时刻开始抓取数据,当然也有其它的判定条件,但由于时间原因没有进行测试。

2、1024点FFT(StreamingI/O):

所有功能拓展都只进行了Modelsim功能仿真。

该图的大致波形和256点FFT是相同的,这里不再分析,用相同的方法计算时延,得到结果为21485000ps即大约

s,比256点FFT长了不少。

1024点的FFT输出结果和256点FFT差别较大,这里不再给出结果截图。

3、256点FFT(Radix-4,BurstI/O):

仿真截图如下:

在DV数据有效信号为1前就输出了四组数据,这种现象是正常的。

在BurstI/O架构下,输入数据分为4块存储到RAM中,每计算一次蝶形运算,计算结果仍然存储到这4块RAM中,直至最后输出。

在这种架构下,数据不能连续输入,整个IPcore的工作状态分为数据输入、处理和输出等不同的状态。

整个仿真中,包含了4次把计算出的临时数据存储到RAM又读出的过程,才会出现这种情况。

虽然输出了四组数据,但FFT核判定这些数据都不是有效的,DV信号保持为0,因此它们也不会被写入文件中。

如果延长仿真时间,这种现象会一再出现。

同样可以获得计算时延约为5954000ps,和原程序差不多。

一般来说,采用基4算法速度应该快于基2算法,这里计算时间没有大幅缩短的原因是采用了BurstI/O结构,不能处理连续数据,处理时间较长。

下面是仿真后输出的结果和原程序(StreamingI/O架构)的结果比较,可以看到还是有一定差别的。

 

五、调试过程中的主要问题及难点

1、ModelSim仿真波形中,FFT输出一直为0,没有有效数据。

仿真时间过短,在这段时间里不能输出有效的结果,需要延长仿真时间。

2、加入UCF文件后,无法调用Chipscope,删除后Chipscope调试却又出现其它错误(见问题3)。

测试文件(test_fft.v)被错误地用成了顶层文件,在Implementation视图中显示成下图的样子。

开始在做实验的时候图省事,直接把这个文件通过“AddSource”加入进来,由于它和顶层文件的拓展名相同,且里面包含顶层文件的调用,结果ISE把它当成了新的顶层文件。

事实上它只是一个测试文件,只包含Modelsim仿真所需要的信号,因此UCF文件中的很多信号与之不对应,产生了这个错误。

解决方法有两个:

(1)仅仅删除这个文件,这样就可以执行Chipscope,但会导致Modelsim仿真出错;

(2)删除文件后,重新新建一个测试文件(VerilogTextFixture),并用test_fft.v文件覆盖它。

3、使用Chipscope测试时,开始抓取数据后却长时间无波形出现。

正常情况下,波形应该立即出现。

出现这种情况的原因比较多,以下逐一分析:

(1)Chipscope仿真使用的时钟信号和FPGA板子的信号不对应,此时往往会有如下提示:

“Waitingforcoretobearmed,sloworstoppedclock”。

有两个原因可能导致这个问题:

A.如问题2中所述,测试文件被当成了顶层文件,与此同时UCF文件也是不存在的,这样导致时钟信号没有绑定到板子上,当然Chipscope找不到时钟信号,虽然测试文件自身包含一个时钟信号,但是Chipscope根本不会使用它;

B.CDC文件中,CLK信号设置错误。

正确的设置是[fft_top]模块下的clk_BUFGP。

(2)触发条件设置不对。

xk_index、out_block_index和rd_block_index、xn_index最好分开设置,因为它们一个对应输出一个对应输入,而输出序号和输入序号又是不同步的,如果设置不好(如xk_index和xn_index设置成相同的),那么Chipscope就永远抓取不到符合条件的波形。

4、Chipscope显示的结果不正确。

这个问题有两种表现方式:

(1)显示的数据和Modelsim仿真的不同,这一般不是运行的问题,而是显示的问题,在output信号中比较常见。

为显示正确结果,需要确保:

A.信号序号的顺序应该是从上往下由低到高,如output_re_0到output_re_15,如果不正确,右键单击相应信号选择反转;

B.显示数字的形式应与Modelsim的一致,推荐都按无符号数“UnsignedDecimal”显示,因为它也是output_data.txt的显示形式。

(2)若在按照

(1)中的说明操作后,显示的数据还是和Model

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1