8点流水线型FFT的VerilogHDL实现_第1页
8点流水线型FFT的VerilogHDL实现_第2页
8点流水线型FFT的VerilogHDL实现_第3页
8点流水线型FFT的VerilogHDL实现_第4页
8点流水线型FFT的VerilogHDL实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、8点流水线型FFT勺Verilog H实现梁志明wwwwww存阶 运715:0W3W2A图3 8点FF算法图(二)系统设计16:017:031:0控剧农決华南理工大学calaokX(4)疋4(一)算法介绍 采用图中的结构, 序输出。xo(O)x o(7)为输入数据,位宽为16位;输出数据的位宽为 32位,倒X(7X(5)xO 15 :0f命1叫 运f器SZ图4系统总框图1系统总框图如图4所示,总共包括一下几个模块:1. 。对应三阶运算,共采用三个运算子模块: 第一阶运算模块:对应蝶形算子只有W0( W0= 1),第二阶运算模块:对应蝶形算子有W0、W2 (W2=- j),第三阶运算模块:对应蝶

2、形算子有W、W、W、W。2控制模块的作用是 控制每个阶段的操 作针对各阶运算, 第一阶控制模块; 第二阶控制模块; 第三阶控制模块2、各个运算模块分析。 1第一阶运算模块:模块功能:完成FF第一阶蝶形运算。模块设计:此时蝶形算子只有 W0,故蝶形运算结果为 C- A+ B, D= A- B因此,只需要对输入 数据做加减法即可。考虑资源复用,这里定义一个16位的|加法器和减法器,上。2第二阶运算模块模块功能:完成FF第二阶蝶形运算。模块设计:第二阶运算有蝶形算子 W、W2。对于W蝶形运算结果为 O A+ jB, D= A-jB,因 此,I|对于W0算子,这里定义了一个 17位有符号数加法器和减对

3、于W2算子,对于运算结果的实部,可;针对虚部,对于结果C,只需将B扩展成18位,对于结果 D只用取B的补码,计算过程流程如下图。第三阶运算模块模块功能:完成3.模块设计:第三阶运算模块:对应蝶形算子有 W、W、W、W3。采用设计要求中提示的通用蝶形运算方法:Rc= Rab Rb*+(lb-Rb)sinIc= la+ Ib*+(Ib-Rb)s in,这个是蝶形运算的 通用公式Rd= Ra-Rb*cosaddsi n+(lb-Rb)s in Id= la-lb*cossubsin+(IbRb)其中,coadSir=cos(n p/N)+sin(2 p/N)cosubin=cos(np/N)- si

4、n(n p/N)sin=sin(2 p/N)这里,N= &根据上述公式,在进行一次蝶形运算时,只需首先确定coaddsijcossubsinin然后计算出(Ib-Rb)sirRb*cosadSslb*cossubs最后将结果木*炉BP”.|1*甘柜d抽虬&Ml * 压*MR喝込p 团4特1耐 yng樹謂 AwriMihlt -* 片冏p* Aftfiiiktw lb -* JtetHbbqk FW 呼.HiMllufckMJ- *Ut /Irsffi/cA W如5B-* AaM llfa f / * HK IIWmIbiIE鼻圧I_*.Jritw綱:陆S-*.0-*Is-*图7数据输入(1)

5、输入数据是两组连续8个的串行数据:A=1 2 3 4 4 3 2 1;B=-5 -5 5 5 -5 -5 5 5; H数据在系统时钟的上升沿被采集。2、最后蝶形算子运算波形/betMU/lmijpAetMi/ImJJd 胸 M/lhuieAvfMl/lffljIcjRoui! 擲M/Imj杞2 卅科楠/I nul比Rout AfliSH/lfflulcjJcult(1)蝶形算子运算公式为:R 二R+R ?cab这里P的取值有飞 1,2,3图8最后蝶形算子运算波形/cos(2p/N)+sim(p/N5? +(I-R)sin(2 p/N)b1=1 +I ?cos(2 p/N)-sin/N)? (I

6、cab+ b-R)sin(2 p/N)R =R R ?cos(2 p/N)+sin(2/N? +(I-R)sin(2 p/h)aI =I ?cos(np/N)-sin/N? (I)sin(n p/N)3输出信号波形wmsa波形上的输入信际大小的有符d- b+ b-Rab输入信号对应:lmul_Ra-Ra卡4 工 rt 1 *4 r r 曰lmul_la-la输入a和b输出是cImul_Rb-Rb和dImul_Ib-Ib图9输出信号波形输出结果最后经过了排序,。输出数据为经过位数扩展后的数据,(1)当输入数据为 A=1 2 3 4 4时2 1MATLA运算的数据为:20.0000-5.8284

7、- 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 -5 5 5 -5时,5JATLA运算的数据为:00-20.0000 +20.0000i000-20.0000 -20.0000i0硬件运算结果为:000i000-10240-10240i(四)源程序(1) add16.vmodule add16(a,b,out);in put15:0 a一两个数相加所以output16:0 o

8、urr-I 要扩展一位数15,a15,b15:0;15:0;or b1)out=a1+b1;reg16:0 out;这里的目的是什么 呢?好像就是避免 溢出进位造成结果 不正确?end en dmodule(2) sub16.vmodule sub16(a,b,out);in put15:0 a,b;output16:0 out;reg16:0 out;wire16:0 a仁a15,a15:0; wire16:0 b仁b15,b15:0;always (a1 or b1) beginout=a1-b1;end en dmodule(3) add17.vmodule add17(a,b,out)

9、;in put16:0 a,b;output17:0 out;reg17:0 out;wire17:0 a仁a16,a16:0;wire17:0 b仁b16,b16:0;always (a1 or b1)beginout=a1+b1;end en dmodule(4) sub17.vmodule sub17(a,b,out);in put16:0 a,b;output17:0 out;reg17:0 out;wire17:0 a仁a16,a16:0; wire17:0 b仁b16,b16:0;always (a1 or b1) beginout=a1-b1;enden dmodule(5) b

10、ddw2_17.v module addw2_17(a,b,Rout,lout); in put16:0 a,b;output17:0 Rout,Iout; reg17:0 Rout,Iout;wire17:0 a仁a16,a16:0;wire17:0 b仁b16,b16:0;always (a1 or b1) beginRout=a1;Iout=18b0-b1;end en dmodule(6) subw2_17.vmodule subw2_17(a,b,Rout,lout); in put16:0 a,b;output17:0 Rout,Iout;reg17:0 Rout,Iout;wir

11、e17:0 a仁a16,a16:0;wire17:0 b仁b16,b16:0;always (a1 or b1) beginRout=a1;Iout=b1;end en dmodule(7) Imul.vmodule Imul(p,Ra_i n,Ia_i n,Rb_i n,Ib_i n,Rc_out,lc_out, Rd_out,Id_out );in put1:0 p;?好像是可以取值为o, 1, 2 3input17:0 Ra_in,la_in,Rb_in,lb_in;output31:0 Rc_out,lc_out; reg31:0 Rc_out,lc_out;output31:0 Rd

12、_out,ld_out;reg31:0 Rd_out,ld_out;wire18:0 Rb_in仁Rb_in17,Rb_in17:0; wire18:0 lb_i n1=lb_i n17,lb_i n17:0;endwire18:0 IR=Ib_i n1-Rb_i n1;wire29:0 R_si n;mult19_11 mult19_11(.dataa(IR),.datab(s in), .result(R_si n);wire28:0 R_cosaddsi n;mult18_11 mult18_11A(.dataa(Rb_i n), .datab(cosadds in), .result(

13、R_cosadds in);reg30:0 R_Ra;always (Ra_i n)beginif(Ra_i n17=1b1)beginR_Ra=4hf,Ra_i n17:0+18b1,9b0+27b1;endelsebeginR_Ra=4b0,Ra_in17:0,9b0;endendwire30:0 R_cosaddsin1=R_cosaddsin28,R_cosaddsin28,R_cosaddsin28:0;reg30:0 RRc;always (R_Ra or R_cosaddsin1)beginRRc=R_Ra+R_cosaddsin1;endwire31:0 R_sin1=R_si

14、n29,R_sin29,R_sin29:0;wire31:0 RRc1=RRc30,RRc30:0;always (R_sin1 or RRc1)beginRc_out=R_sin1+RRc1;end/*wire28:0 R_cossubsin;mult18_11 mult18_11B(.dataa(Ib_in),.datab(cossubsin),.result(R_cossubsin);reg30:0 R_Ia;always (Ia_in)beginif(Ia_in17=1b1)beginR_Ia=4hf,Ia_in17:0+18b1,9b0+27b1;endelsebeginR_Ia=4

15、b0,Ia_in17:0,9b0;endendwire30:0 R_cossubsin1=R_cossubsin28,R_cossubsin28,R_cossubsin28:0;reg30:0 RIc;always (R_Ia or R_cossubsin1)beginRlc=R_la+R_cossubsi n1;endwire31:0 Rlc仁Rlc30,Rlc30:0;always (R_si n1 or Rlc1)beginIc_out=R_si n1+Rlc1;end*reg30:0 RRd;always (R_Ra or R_cosaddsi n1)beginRRd=R_Ra-R_c

16、osaddsi n1;endwire31:0 RRd仁RRd30,RRd30:0;always (R_si n1 or RRd1)beginRd_out=RRd1-R_si n1;end*reg30:0 Rld;always (R_Ia or R_cossubs in1)beginRId=R_Ia-R_cossubsi n1;endwire31:0 Rld 仁Rld30,Rld30:0;always (R_si n1 or Rld1)beginId_out=RId1-R_si n1;end en dmodule(8) F _ moduleFFT(clk,rst_n, data_i n, dat

17、a_ in _ready, data_out_R, data_out_I, data_out_ready );/* input clk,rst_n;input15:0 data_in;input data_in_ready;output31:0 data_out_R,data_out_I; output data_out_ready;reg31:0 data_out_R,data_out_I;reg working;reg data_out_ready_reg;wire working_flag=working | data_in_ready;wire data_out_ready=data_

18、out_ready_reg;/Data collect Process* reg2:0 collect_cnt;always (posedge clk or negedge rst_n) if(!rst_n) begincollect_cnt=3d0;endelse if(working_flag=1b0)begin collect_cnt=3d0;endelsebegin collect_cnt=collect_cnt+3b1;endreg15:0 x0_reg0;reg15:0 x0_reg1;reg15:0 x0_reg2;reg15:0 x0_reg3;reg15:0 x0_regn;

19、always (posedge clk or negedge rst_n)if(!rst_n)beginx0_reg0=16b0;x0_reg1=16b0;x0_reg2=16b0;x0_reg3=16b0;x0_regn=16b0;endelse if(working_flag=1b1)begincase(collect_cnt)3d0:x0_reg0=data_in;3d1:x0_reg1=data_in;3d2:x0_reg2=data_in;3d3:x0_reg3=data_in;default:x0_regn=data_in;endcaseend/*/Level 1reg16:0 x

20、1_reg0;reg16:0 x1_reg1;reg16:0 x1_reg2;reg16:0 x1_reg3;reg16:0 x1_reg4;reg16:0 x1_reg5;reg16:0 x1_reg6;reg16:0 x1_reg7;reg15:0 x0add_a,x0add_b;wire16:0 x0add_out;add16 add16(.a(x0add_a),.b(x0add_b),.out(x0add_out);reg15:0 x0sub_a,x0sub_b;wire16:0 x0sub_out;sub16 sub16(.a(x0sub_a),.b(x0sub_b),.out(x0

21、sub_out);always (collect_cnt or x0_reg0 or x0_reg1 or x0_reg2 or x0_reg3 or x0_regn) begincase(collect_cnt)3d5:beginx0add_a=x0_reg0;x0add_b=x0_regn;x0sub_a=x0_reg0;x0sub_b=x0_regn;end3d6:beginx0add_a=x0_reg1;x0add_b=x0_regn;x0sub_a=x0_reg1; x0sub_b=x0_regn;end3d7:begin x0add_a=x0_reg2; x0add_b=x0_re

22、gn; x0sub_a=x0_reg2; x0sub_b=x0_regn;end3d0:begin x0add_a=x0_reg3; x0add_b=x0_regn; x0sub_a=x0_reg3; x0sub_b=x0_regn;enddefault:begin x0add_a=16b0; x0add_b=16b0; x0sub_a=16b0; x0sub_b=16b0; x0add_a=16b0; x0add_b=16b0; x0sub_a=16b0; x0sub_b=16b0;endendcaseendalways (posedge clk or negedge rst_n) if(!

23、rst_n)beginx1_reg0=17b0;x1_reg1=17b0;x1_reg2=17b0;x1_reg3=17b0;x1_reg4=17b0;x1_reg5=17b0;x1_reg6=17b0;x1_reg7=17b0;endelse begin case(collect_cnt) 3d5:beginx1_reg0=x0add_out;x1_reg4=x0sub_out;end3d6:beginx1_reg1=x0add_out;x1_reg5=x0sub_out;end3d7:beginx1_reg2=x0add_out;x1_reg6=x0sub_out;end3d0:begin

24、x1_reg3=x0add_out;x1_reg7=x0sub_out;enddefault:;endcaseend/*/Level 2reg17:0 x2_reg0;reg17:0 x2_reg1;reg17:0 x2_reg2;reg17:0 x2_reg3;reg17:0 x2_reg4_R,x2_reg4_I;reg17:0 x2_reg5_R,x2_reg5_I;reg17:0 x2_reg6_R,x2_reg6_I;reg17:0 x2_reg7_R,x2_reg7_I;reg16:0 x1add_a,x1add_b;wire17:0 x1add_out;add17 add17(.

25、a(x1add_a),.b(x1add_b),.out(x1add_out);reg16:0 x1sub_a,x1sub_b;wire17:0 x1sub_out;sub17 sub17(.a(x1sub_a),.b(x1sub_b),.out(x1sub_out);reg16:0 x1addw2_a,x1addw2_b;wire17:0 x1addw2_Rout,x1addw2_Iout;addw2_17addw2_17(.a(x1addw2_a),.b(x1addw2_b),.Rout(x1addw2_Rout),.Iout(x1addw2_Iout);reg16:0 x1subw2_a,

26、x1subw2_b;wire17:0 x1subw2_Rout,x1subw2_Iout;subw2_17 subw2_17(.a(x1subw2_a),.b(x1subw2_b),.Rout(x1subw2_Rout),.Iout(x1subw2_Iout);always (collect_ocrnxt1_rego0r x1_rego1rx1_rego2r x1_rego3rx1_rego4r x1_rego5r x1_reg6 or x1_reg7)begin case(collect_cnt) 3d0:beginx1add_a=x1_reg0;x1add_b=x1_reg2;x1sub_

27、a=x1_reg0;x1sub_b=x1_reg2;x1addw2_a=17b0;x1addw2_b=17b0;x1subw2_a=17b0;x1subw2_b=17b0;end3d1:begin x1addw2_a=x1_reg4; x1addw2_b=x1_reg6; x1subw2_a=x1_reg4; x1subw2_b=x1_reg6;x1add_a=17b0;x1add_b=17b0;x1sub_a=17b0;x1sub_b=17b0;end3d2:begin x1add_a=x1_reg1; x1add_b=x1_reg3; x1sub_a=x1_reg1; x1sub_b=x1

28、_reg3;x1addw2_a=17b0;x1addw2_b=17b0;x1subw2_a=17b0;x1subw2_b=17b0;end3d3:begin x1addw2_a=x1_reg5; x1addw2_b=x1_reg7; x1subw2_a=x1_reg5; x1subw2_b=x1_reg7;x1add_a=17b0; x1add_b=17b0; x1sub_a=17b0; x1sub_b=17b0;enddefault:beginx1add_a=17b0; x1add_b=17b0; x1sub_a=17b0; x1sub_b=17b0; x1addw2_a=17b0; x1a

29、ddw2_b=17b0; x1subw2_a=17b0; x1subw2_b=17b0;endendcaseendalways (posedge clk or negedge rst_n) if(!rst_n) beginx2_reg0=18b0;x2_reg1=18b0;x2_reg2=18b0;x2_reg3=18b0;x2_reg4_R=18b0;x2_reg5_R=18b0;x2_reg6_R=18b0;x2_reg7_R=18b0;x2_reg4_I=18b0;x2_reg5_I=18b0;x2_reg6_I=18b0;x2_reg7_I=18b0;endelsebegincase(

30、collect_cnt)3d0:begin x2_reg0=x1add_out; x2_reg2=x1sub_out;end3d1:beginx2_reg4_R=x1addw2_Rout;x2_reg4_I=x1addw2_Iout;x2_reg6_R=x1subw2_Rout;x2_reg6_I=x1subw2_Iout;end3d2:beginx2_reg1=x1add_out;x2_reg3=x1sub_out;end3d3:beginx2_reg5_R=x1addw2_Rout;x2_reg5_I=x1addw2_Iout;x2_reg7_R=x1subw2_Rout;x2_reg7_

31、I=x1subw2_Iout;enddefault:;endcaseend/*/Level 3reg1:0 Imul_p;reg17:0 Imul_Ra,Imul_Ia,Imul_Rb,Imul_Ib;wire31:0 Imulc_Rout,Imulc_Iout;wire31:0 Imuld_Rout,Imuld_Iout;Imul Imul(.p(Imul_p),.Ra_in(Imul_Ra),.Ia_in(Imul_Ia),.Rb_in(Imul_Rb),.Ib_in(Imul_Ib),.Rc_out(Imulc_Rout),.Ic_out(Imulc_Iout),.Rd_out(Imul

32、d_Rout),.Id_out(Imuld_Iout);always (collect_cnt or x2_reg0 or x2_reg1 or x2_reg2 or x2_reg3or x2_reg4_R or x2_reg4_I or x2_reg5_R or x2_reg5_Ior x2_reg6_R or x2_reg6_I or x2_reg7_R or x2_reg7_I) begincase(collect_cnt)3d4:begin/7Imul_Ra=x2_reg0;Imul_Ia=18b0;Imul_Rb=x2_reg1;Imul_Ib=18b0;Imul_p=2d0;end

33、3d5:begin/4Imul_Ra=x2_reg2;Imul_Ia=18b0;Imul_Rb=x2_reg3;Imul_Ib=18b0;Imul_p=2d2;end3d6:begin/6Imul_Ra=x2_reg4_R;Imul_Ia=x2_reg4_I;Imul_Rb=x2_reg5_R;Imul_Ib=x2_reg5_I;Imul_p=2d1;end3d7:begin/5Imul_Ra=x2_reg6_R;Imul_Ia=x2_reg6_I;Imul_Rb=x2_reg7_R;Imul_Ib=x2_reg7_I;Imul_p=2d3;enddefault:beginImul_Ra=18

34、b0;Imul_Ia=18b0;Imul_Rb=18b0;Imul_Ib=18b0;Imul_p=2d0;endendcaseendreg31:0 out_reg0_R,out_reg0_I;reg31:0 out_reg1_R,out_reg1_I;reg31:0 out_reg2_R,out_reg2_I;reg31:0 out_reg3_R,out_reg3_I;reg31:0 out_reg4_R,out_reg4_I;reg31:0 out_reg5_R,out_reg5_I;reg31:0 out_reg6_R,out_reg6_I;reg31:0 out_reg7_R,out_r

35、eg7_I; always (posedge clk or negedge rst_n)if(!rst_n)beginout_reg0_R=32b0;out_reg0_I=32b0;out_reg1_R=32b0;out_reg1_I=32b0;out_reg2_R=32b0;out_reg2_I=32b0;out_reg3_R=32b0;out_reg3_I=32b0;out_reg4_R=32b0;out_reg4_I=32b0;out_reg5_R=32b0;out_reg5_I=32b0;out_reg6_R=32b0;out_reg6_I=32b0;out_reg7_R=32b0;o

36、ut_reg7_I=32b0;endelse begincase(collect_cnt)3d4:begin/0out_reg0_R=Imulc_Rout;out_reg0_I=Imulc_Iout;out_reg4_R=Imuld_Rout;out_reg4_I=Imuld_Iout;end3d5:begin/4out_reg2_R=Imulc_Rout;out_reg2_I=Imulc_Iout;out_reg6_R=Imuld_Rout;out_reg6_I=Imuld_Iout;end3d6:begin/2out_reg1_R=Imulc_Rout; out_reg1_I=Imulc_

37、Iout; out_reg5_R=Imuld_Rout; out_reg5_I=Imuld_Iout;end3d7:begin/6out_reg3_R=Imulc_Rout; out_reg3_I=Imulc_Iout; out_reg7_R=Imuld_Rout; out_reg7_I=Imuld_Iout;enddefault; endcase endalways (posedge clk or negedge rst_n) if(!rst_n)begindata_out_R=32b0; data_out_I=32b0;end else begincase(collect_cnt) 3d6

38、:begin/4 data_out_R=out_reg0_R; data_out_I=out_reg0_I;end 3d7:begin/2 data_out_R=out_reg1_R; data_out_I=out_reg1_I;end 3d0:begin/6 data_out_R=out_reg2_R; data_out_I=out_reg2_I;end 3d1:begin/1 data_out_R=out_reg3_R; data_out_I=out_reg3_I;end 3d2:begin/5 data_out_R=out_reg4_R; data_out_I=out_reg4_I;en

39、d 3d3:begin/3 data_out_R=out_reg5_R; data_out_I=out_reg5_I;end 3d4:begin/7 data_out_R=out_reg6_R; data_out_I=out_reg6_I;end3d5:begin/0 data_out_R=out_reg7_R; data_out_I=out_reg7_I;endendcaseend/* reg3:0 idle_cnt;reg enflag;always (posedge clk or negedge rst_n) if(!rst_n) beginidle_cnt=4d0;working=1b

40、0;endelsebeginif(data_in_ready=1b1)begin working=1b1; if(collect_cnt=3d7) idle_cnt=4d13;else idle_cnt=4d12-1b0,collect_cnt;endelsebegin if(idle_cnt=4d0) working=1b0;else idle_cnt=idle_cnt-4d1;endendalways (posedge clk or negedge rst_n) if(!rst_n) begindata_out_ready_reg=1b0; enflag=1b0;endelsebegini

41、f(enflag=1b0)beginif(collect_cnt=3d6)enflag=1b1;endelsebeginif(collect_cnt=3d6)data_out_ready_reg=1b1;end if(working_flag=1b0)data_out_ready_reg=1b0;end endmodule三、开3次方电路设计(一)题目设计要求设计一个同步电路,该电路输出IS=X, EN为使能端,Don指示运算结束。输入 X的范围是0-255其中X=0-64出现的概率较大,精度要求1%o,其它数值精度要求 1%自行决定IS的位数。CLKISX (7: : 0)ENDONERST图10运算模块方框图(二)方案设计首先根据精度确定输出数据 IS的位数。最大的精度要求为1%0,即1/1000。从而可以得知,输出二进制数据的小数位数至少要求为10位。而根据最大输出数据 255,整数部分的位数最大为3位。即输出数据IS的位数可以定为13位。其格式如下:12- 1090整数小数用硬件算法直接计算开 3次方的硬件开销太大,而且实现算法困难,因此把开方运算转 换成为乘方运算进行处理。在这里采用计数逼近方法进行运算,即把设计的满足输出精度要 求的数据进行不断的加 1自增(计算时把数据当作整数进行),然后对该数进行求3次乘方,把得到的3次乘方值与输入值比较,比较相等后输出

温馨提示

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

评论

0/150

提交评论