您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 8点流水线型FFT的Verilog_HDL实现
8点流水线型FFT的VerilogHDL实现梁志明华南理工大学calaok@sohu.com(一)算法介绍采用图中的结构,x0(0)~x0(7)为输入数据,位宽为16位;输出数据的位宽为32位,倒序输出。图38点FFT算法图(二)系统设计图4系统总框图1、系统总框图如图4所示,总共包括一下几个模块:1.运算模块。对应三阶运算,共采用三个运算子模块:第一阶运算模块:对应蝶形算子只有W0(W0=1),第二阶运算模块:对应蝶形算子有W0、W2(W2=-j),第三阶运算模块:对应蝶形算子有W0、W1、W2、W3。2.控制模块针对各阶运算,控制模块也可分为三个子模快:第一阶控制模块;第二阶控制模块;第三阶控制模块。2、各个运算模块分析。1.第一阶运算模块:模块功能:完成FFT第一阶蝶形运算。模块设计:此时蝶形算子只有W0,故蝶形运算结果为C=A+B,D=A-B。因此,只需要对输入数据做加减法即可。考虑资源复用,这里定义一个16位的有符号数加法器和减法器,每次运算直接调用即可。2.第二阶运算模块模块功能:完成FFT第二阶蝶形运算。模块设计:第二阶运算有蝶形算子W0、W2。对于W2蝶形运算结果为C=A+jB,D=A-jB,因此,只需另运算结果实部为A,虚部为+/-B即可。对于W0算子,这里定义了一个17位有符号数加法器和减法器处理。对于W2算子,对于运算结果的实部,只需将A扩展成18位即可;针对虚部,对于结果C,只需将B扩展成18位,对于结果D只用取B的补码,计算过程流程如下图。图6第二阶运算模块3.第三阶运算模块模块功能:完成FFT第三阶蝶形运算。模块设计:第三阶运算模块:对应蝶形算子有W0、W1、W2、W3。采用设计要求中提示的通用蝶形运算方法:Rc=Ra+Rb*cosaddsin+(Ib-Rb)sinIc=Ia+Ib*cossubsin+(Ib-Rb)sinRd=Ra-[Rb*cosaddsin+(Ib-Rb)sin]Id=Ia-[Ib*cossubsin+(Ib-Rb)sin]其中,)/2sin()/2cos(sincosNpNpaddππ+=)/2sin()/2cos(sincosNpNpsubππ−=)/2sin(sinNpπ=;这里,N=8。根据上述公式,在进行一次蝶形运算时,只需首先确定cosaddsin,cossubsin,sin,然后计算出(Ib-Rb)sin,Rb*cosaddsin,Ib*cossubsin,最后将结果相加减即可。(三)仿真结果分析1、数据输入图7数据输入(1)输入数据是两组连续8个的串行数据:A=[12344321];B=[-5-555-5-555];数据在系统时钟的上升沿被采集。2、最后蝶形算子运算波形图8最后蝶形算子运算波形(1)蝶形算子运算公式为:cabbbR=R+Rcos(2πp/N)+sin(2πp/N)+(I-R)sin(2πp/N)⎡⎤⎢⎥⎣⎦bcabb+-RI=I+Icos(2πp/N)-sin(2πp/N)(I)sin(2πp/N)⎡⎤⎢⎥⎣⎦{}adbbb-R=RRcos(2πp/N)+sin(2πp/N)+(I-R)sin(2πp/N)⎡⎤⎢⎥⎣⎦{}badbb-+-RI=IIcos(2πp/N)-sin(2πp/N)(I)sin(2πp/N)⎡⎤⎢⎥⎣⎦输入信号对应:Imul_Ra-RaImul_Ia-IaImul_Rb-RbImul_Ib-IbImulc_Rout-RcImulc_Iout-IcImuld_Rout-RdImuld_Iout-Id波形上的输入信号为实际大小的有符号数,由于在运算过程中进行了扩展,输出信号是实际公式计算值的512倍。3、输出信号波形图9输出信号波形输出结果最后经过了排序,在输出数据有效信号高电平时系统时钟的下降沿稳定。输出数据为经过位数扩展后的数据,为实际运算数值的512倍。(1)当输入数据为A=[12344321]时,MATLAB运算的数据为:20.0000-5.8284-2.4142i0-0.1716-0.4142i0-0.1716+0.4142i0-5.8284+2.4142i硬件运算的结果为:10240-2984-1236i0-88-212i0-88+212i0-2984+1236i(2)当输入数据为B=[-5-555-5-555]时,MATLAB运算的数据为:00-20.0000+20.0000i000-20.0000-20.0000i0硬件运算结果为:00-10240+10240i000-10240-10240i0(四)源程序(1)add16.vmoduleadd16(a,b,out);input[15:0]a,b;output[16:0]out;reg[16:0]out;wire[16:0]a1={a[15],a[15:0]};wire[16:0]b1={b[15],b[15:0]};always@(a1orb1)beginout=a1+b1;endendmodule(2)sub16.vmodulesub16(a,b,out);input[15:0]a,b;output[16:0]out;reg[16:0]out;wire[16:0]a1={a[15],a[15:0]};wire[16:0]b1={b[15],b[15:0]};always@(a1orb1)beginout=a1-b1;endendmodule(3)add17.vmoduleadd17(a,b,out);input[16:0]a,b;output[17:0]out;reg[17:0]out;wire[17:0]a1={a[16],a[16:0]};wire[17:0]b1={b[16],b[16:0]};always@(a1orb1)beginout=a1+b1;endendmodule(4)sub17.vmodulesub17(a,b,out);input[16:0]a,b;output[17:0]out;reg[17:0]out;wire[17:0]a1={a[16],a[16:0]};wire[17:0]b1={b[16],b[16:0]};always@(a1orb1)beginout=a1-b1;endendmodule(5)addw2_17.vmoduleaddw2_17(a,b,Rout,Iout);input[16:0]a,b;output[17:0]Rout,Iout;reg[17:0]Rout,Iout;wire[17:0]a1={a[16],a[16:0]};wire[17:0]b1={b[16],b[16:0]};always@(a1orb1)beginRout=a1;Iout=18'b0-b1;endendmodule(6)subw2_17.vmodulesubw2_17(a,b,Rout,Iout);input[16:0]a,b;output[17:0]Rout,Iout;reg[17:0]Rout,Iout;wire[17:0]a1={a[16],a[16:0]};wire[17:0]b1={b[16],b[16:0]};always@(a1orb1)beginRout=a1;Iout=b1;endendmodule(7)Imul.vmoduleImul(p,Ra_in,Ia_in,Rb_in,Ib_in,Rc_out,Ic_out,Rd_out,Id_out);input[1:0]p;input[17:0]Ra_in,Ia_in,Rb_in,Ib_in;output[31:0]Rc_out,Ic_out;reg[31:0]Rc_out,Ic_out;output[31:0]Rd_out,Id_out;reg[31:0]Rd_out,Id_out;wire[18:0]Rb_in1={Rb_in[17],Rb_in[17:0]};wire[18:0]Ib_in1={Ib_in[17],Ib_in[17:0]};reg[10:0]cosaddsin,cossubsin,sin;always@(p)begincase(p)2'd0:begincosaddsin=11'd512;cossubsin=11'd512;sin=11'd0;end2'd1:begincosaddsin=11'd724;cossubsin=11'd0;sin=11'd362;end2'd2:begincosaddsin=11'd512;cossubsin=11'h600;sin=11'd512;end2'd3:begincosaddsin=11'd0;cossubsin=11'h52c;sin=11'd362;endendcaseendwire[18:0]IR=Ib_in1-Rb_in1;wire[29:0]R_sin;mult19_11mult19_11(.dataa(IR),.datab(sin),.result(R_sin));wire[28:0]R_cosaddsin;mult18_11mult18_11A(.dataa(Rb_in),.datab(cosaddsin),.result(R_cosaddsin));reg[30:0]R_Ra;always@(Ra_in)beginif(Ra_in[17]==1'b1)beginR_Ra={4'hf,~{~Ra_in[17:0]+18'b1,9'b0}+27'b1};endelsebeginR_Ra={4'b0,Ra_in[17:0],9'b0};endendwire[30:0]R_cosaddsin1={R_cosaddsin[28],R_cosaddsin[28],R_cosaddsin[28:0]};reg[30:0]RRc;always@(R_RaorR_cosaddsin1)beginRRc=R_Ra+R_cosaddsin1;endwire[31:0]R_sin1={R_sin[29],R_sin[29],R_sin[29:0]};wire[31:0]RRc1={RRc[30],RRc[30:0]};always@(R_sin1orRRc1)beginRc_out=R_sin1+RRc1;end//***********************************************************wire[28:0]R_cossubsin;mult18_11mult18_11B(.dataa(Ib_in),.datab(cossubsin),.result(R_cossubsin));reg[30:0]R_Ia;always@(Ia_in)beginif(Ia_in[17]==1'b1)beginR_Ia={4'hf,~{~Ia_in[17:0]+18'b1,9'b0}+27'b1};endelsebeginR_Ia={4'b0,Ia_in[17:0],9'b0};endendwire[30:0]R_cossubsin1={R_cossubsin[28],R_cossubsin[28],R_cossubsin[28:0]};reg[30:0]RIc;always@(R_IaorR_cossubsin1)beginRIc=R_Ia+R_cossubsin1;endwire[31:0]RIc1={RIc[30],RIc[30:0]};always@(R_sin1orRIc1)beginIc_out=R_sin1+RIc1;end//******************************************************************************************//******************************************************************************************reg[30:0]RRd;always@(R_RaorR_cosa
本文标题:8点流水线型FFT的Verilog_HDL实现
链接地址:https://www.777doc.com/doc-4968542 .html