FFT硬件加速器.docx

上传人:b****6 文档编号:8193580 上传时间:2023-01-29 格式:DOCX 页数:20 大小:138.81KB
下载 相关 举报
FFT硬件加速器.docx_第1页
第1页 / 共20页
FFT硬件加速器.docx_第2页
第2页 / 共20页
FFT硬件加速器.docx_第3页
第3页 / 共20页
FFT硬件加速器.docx_第4页
第4页 / 共20页
FFT硬件加速器.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

FFT硬件加速器.docx

《FFT硬件加速器.docx》由会员分享,可在线阅读,更多相关《FFT硬件加速器.docx(20页珍藏版)》请在冰豆网上搜索。

FFT硬件加速器.docx

FFT硬件加速器

1K点FFT的硬件加速器实现

Version0.6

修改历史

版本

[时间

内容

0.1

2018.03.22

初稿

0.2

2018.03.28

修改地址计算图,1k点计算时间

0.3

2018.03.30

修改2维FFT算法,增加大点数的二维算法时间

0.4

2018.03.31

增加3维FFT算法和计算的时间,256点ram的计算

0.5

2018.04.02

增加512点ram时的计算,整理文档。

0.6

2018.04.06

增加混合基旋转因子计算图,修改各个计算时间公式,增加面积估算

0.7

2018.04.08

增加2k点计算时间

0.8

2018.04.30

修改2维计算时间,和旋转因子load/store时间

1K点FFT的硬件加速器实现了1K点的快速FFT计算,采用单级结构,使用1个基4蝶形计算单元就能实现基4或基2的FFT计算。

1硬件结构:

图1FFT硬件加速器结构

1.LD_RAM

2.RAM1

载入1K点计算数据,输入到基4计算单元。

分为4个bank,分别保存0-255,256-511,512-755,756-1023的数据。

3.RAM2

保存基4计算单元蝶形计算的结果。

也分为和RAM1一样的4个bank。

在FFT计算的偶数级时,RAM2会输入数据给基4计算单元,而RAM1保存计算后的数据。

当载入数据,计算,或保存数据时,LD_RAM,RAM1,RAM2的功能可以互换。

4.RAM3

载入旋转因子,并和数据一起进入基4计算单元进行计算。

分为4个bank,分别储存

Wb,Wc,Wd,即一次基4蝶形计算的3个旋转因子储存在3个bank里,使得可以同时输出给基4计算单元。

或者保存中间计算的旋转因子,计算混合基计算或者二维计算时的中间结果。

这4个ram,都是1kx64bits=8KB容量。

数据在RAM中的存储方式是每行256bits,即每行存储4点数据。

5.地址计算单元

输入数据地址计算和输出数据地址计算单元得到相应的数据地址。

对于基4DIT-FFT计算,每次输入的数据是反序的,输出的数据是顺序的。

其中反序的计算是:

把1024顺序分为5位的4进制数,每一位由一个计数器实现,反序即使根据顺序,这5个计数器的反序组合决定输入地址。

地址的计算参数为:

计算级数L,每级的蝶形计算距离Dis,当前计算蝶形所在的组

为第N组,一共M组,当前蝶形所在组的位置是第S个蝶形。

其中Dis=4A(L-1>。

旋转因子的计算也是根据当前蝶形的位置,载入旋转因子。

地址的计算:

第一级:

数据在RAM1中存储方式:

0-255,256-511,512-767,768-1023分别储存在4个bank中。

第一级基4FFT的采样间隔为1,所以计算的4点应该为0-1-2-3,4-5-6-7,8-9-10-11…..。

则但是根据DIT-FFT的原理,应该为反序输入,正序的计数器顺序为15-14-13-12-

11,则反序的计数器顺序为I1-I2-I3-I4-I5,这里I1的计数相当于bank的ID,其他计数器的

计数顺序不变,I2累加->I3累加->I4累加->I5累加。

0-1-2-3这4个数的反序地址正好分别在4个bank中。

每次计算点数的bank偏移地址

为I2*64+I3*16+I4*4+I5。

计算的4个数按照原位计算的地址保存,即按照正序的计数器顺序保存。

这里计算的时候要考虑到ram内存储的格式为0,1,2,3即相邻的四个点组成了一个

256bits的数据。

因为第二级的采样间隔为4,则数据计算完毕的原位保存顺序为0-1-2-3作为一个

256bits到bankl,4-5-6-7到bank2,8-9-10-11到bank3,12-13-14-15到bank4,依次类推。

这样下一级也可以每次从4个bank中取得4个计算点。

第一级的旋转因子数目为3个,即每个基4计算的旋转因子相同。

第二级:

数据的输入顺序为0-4-8-12,不用反序。

当计算4次,即计算完0-15后,偏移地址加

1,计算下一个16点数据。

数据计算后的输出顺序为0-4-8-12作为一个256bits存入bank1,16-20-24-28存入

bank2.

第二级的旋转因子数目为12个。

第三级:

数据的输入顺序为0-16-32-48,不用反序。

当计算1次,偏移地址加1,计算下一个4点数据1-17-33-49。

当计算4次后,偏移地址-4,回到最早的地址。

当计算16次,即0-63点计算完成后。

偏移地址加1.

数据计算后的输出顺序为0-16-32-48作为一个256bits存入bank1,16-20-24-28存入

bank2.

第三级的旋转因子数目为48个。

其他各级地址关系见图2。

这里最后一级的计算输入是0-256-512-768,保存的时候也

分别保存到4个bank中,即原来的地址,以保持数据的顺序。

最后输出的顺序即是0-

1023,顺序输出。

反序

正序

RAM1

I5

I4

I3

I2

I1

[9:

8][7:

6][5:

4][3:

2][1:

0]

原采样顺序

间隔为0

I1

I2

I3

I4

I5

[9:

8][7:

6][5:

4][3:

2][1:

0]

反序后的采样顺序

RAM2

0-1-2-3

0-1-2-3

16-17-18-19

255

0-1-2-3

0-256-512-768

256-511

4-5-6-7

64-320-576-832

512-767

8-9-10-11

128-384-640-896

经过基4FFT计算,保存为原采样顺序(原址计算),0-1-2-3保存到bank1,

4-5-6-7到

bank2

4-5-6-7

8-9-10-11

 

768-1023

12-13-14-15

每次从4个bank里各输出1个数据,

数据偏移量为

12*64+13*16+14*4+15

图1第一级计算的地址关系

 

RAM1

RAM2RAM1RAM2

RAM1RAM2

0-1-2-3

0-1-2-3

16-17-18-19

0-4-8-12

1-5-9-13

0-16-32-48

255

64-68-72-76

256-511

4-5-6-7

16-20-24-28

64-80-96-112

512-767

8-9-10-11

32-26-40-44

128-144-160

176

768-1023

12-13-14-15

48-52-56-60

192-208-224

240

0-64-128-192

0-1-2-3

255

256-320-384-

448

256-511

512-576-640-

704

512-767

768-832-896-

960

768-1023

图2每级计算ram内数据保存顺序

6•基4计算单元

基4计算单元完成一个完整的4点基4蝶形计算,根据地址单元生成的地址顺序,载入数据,进行基4的蝶形计算。

以下是基4计算公式和基4计算单元的结构。

A=a1+a2j

A'=A+CWc+(BWb+DWd)B'=A-CWc-j(BWb-DWd)C'=A+CWc-(BWb+DWd)D,=A-CWc+j(BWb-DWd)

B=b1+b2jbwmZwZ-b2^2)

fbw2=(b2wb1+b1Wb2)

-A-CWc:

I2=a1-cw1

Q2=a2-cw2

C=c1+c2j

D=d1+d2j

Wb=Wb1+Wb2j_

Wc=Wc1+Wc2j_

Wd=Wd1+Wd2j一

A+CWc+(BWb+DWd)=(I1+I3)+j(Q1+Q3)_

A-CWc-j(BWb-DWd)

=(I2+Q4)+j(Q2-I4)

A,

cw1=(c1wc1-c2Wc2)

cw2=(c2wc1+c1Wc2)

dw1=(d1wd1七2Wd2)dw2=(d2wd1+d1Wd2)

C*Wc=cw1+jcw2

BWb+DWd

I3=bw1+dw1

Q3=bw2+dw2

A+CWc-(BWb+DWd)=(I1-I3)+j(Q1-Q3)

D*Wd=BWb-DWd

dw1+jdw2►I4=bw1-dw1A-CWc+j(BWb-DWd)

Q4=bw2-dw2=(I2-Q4)+j(Q2+14)

图3基4蝶形计算公式

 

A

B'

C'

D'

 

图4基4计算单元

图3中一共有6个乘加单元和16个实数加,这里一共需要6个四元乘加单元和16个实数加法器,其中6个乘加单元指的就是实现类似公式bw2=(b2wb1+b1Wb2>的乘加单元。

2FFT详细计算步骤

2.1.1k点数据计算流程:

1)1K点的数据从L2cache到RAM1。

分别存入4个bank。

需要的拍数为:

256+10<延迟)

2)1024点一共分为5级基4FFT计算。

对于每级计算,先计算每次4点的数据地址和3

点的旋转因子地址。

需要的拍数为:

1拍。

载入4点数据:

1拍

3)由RAM1中输入数据A,B,C,D,进行基4的FFT计算基4的FFT计算先进行3个复数乘,再进行8个复数加需要的拍数为:

18拍

4)计算完成后,输出到RAM2中保存。

4点的地址1拍

保存4点1拍

下一级的计算由RAM2输出要计算的数据,ram1保存计算完成的数据。

每级要进行256次蝶形计算,这里的计算单元可以流水执行,

每级计算需要的拍数为:

256+22+22拍

因为第一级的旋转因子都是1,则可以在进行第一级计算时载入768点<192拍)旋转

因子。

5)当完成5级计算后,最后的结果保存在RAM2中,直接输出保存L2cache。

保存1k点需要的拍数为:

256+10拍

总:

256+10+<256+44)X5+256+10=2032拍。

22基2计算

基2计算的基本公式

A'=A+B*WbB=A-B*WbC=C+D*WdD=C-D*Wd

图5基2计算公式

图64点基2计算

每个基2计算需要1个复数乘和2个复数加,因为基4计算单元有3个复数乘单元,那么每次可以计算6点的基2FFT。

这里为了计算方便,每次计算4点。

每级基2计算的时间为计算地址1拍,输入数据1拍,复数乘6拍,复数加6拍,计

算地址和保存数据2拍。

一共16拍。

8点计算,如果按照基2计算,分为3级,

每级为4个基2计算,分成2次计算,计算时间为16+2+16=34拍。

一共3级,则计算总时间是:

L2->RAM1:

进入4个bank,2拍

三级计算:

34*3=102拍数据保存RAM2->L2:

2拍

一共106拍。

2.3.基4和基2混合基计算

以8点的计算举例:

18点分为4行,每行2点,即[0,1],[2,3],[4,5],[6,7]。

2先进行列的计算,即分别计算[0,2,4,6]和[1,3,5,7],进行基4计算。

3将基4计算的结果乘以中间旋转因子W,W的取值为

4中间结果进行基2计算,[0,1],[2,3],[4,5],[6,7]。

5计算的结果顺序为[0,2,4,6,1,3,5,7],得到最终的计算结果。

计算时间分析:

L2->RAM1:

进入4个bank,2拍

2个基4计算:

22+2+22=46拍

中间计算复乘:

每次计算3点,可以流水执行,时间为10+3+10=23拍

4个基2计算:

16+2+16=34拍

数据保存RAM2->L2:

2拍

一共107拍。

但是中间的计算地址变换和旋转因子地址计算稍微复杂。

2.4.各个点数计算时间

2.6.1.16点

L2->RAM1:

进入4个bank,4拍

2级每级4个基4计算:

2X<22+4+22)=96拍

数据保存RAM2->L2:

4拍

一共104拍。

L2->RAM1:

进入4个bank,8拍

2级8个基4计算:

2X<22+8+22)=104拍

中间计算复乘:

每次计算3点,可以流水执行,时间为

16个基2计算:

16+8+16=40拍

数据保存RAM2->L2:

8拍

一共191拍。

一维:

L2->RAM1:

进入4个bank,8拍

16个基2计算:

16+8+16=40拍

5级基2:

40X5=200拍。

数据保存RAM2->L2:

8拍

一共216拍。

2.6.3.64点

L2->RAM1:

进入4个bank,16拍

3级每级16个基4计算:

3X<22+16+22)=180拍

数据保存RAM2->L2:

16拍

一共212拍。

2.6.4.128点:

L2->RAM1:

进入4个bank,32拍

3级32个基4计算:

3X<22+32+22)=228拍

中间计算复乘:

每次计算3点,可以流水执行,时间为

64个基2计算:

32+16+16=64拍

数据保存RAM2->L2:

32拍

一共419拍。

2.6.5.256点

L2->RAM1:

进入4个bank,64+10拍

4级每级64个基4计算:

4X<22+64+22)=432拍

数据保存RAM2->L2:

64+10拍

一共580拍。

2.6.6.512点

10+11+10=31拍

10+43+10=63拍

L2->RAM1:

进入4个bank,128+10拍

4级128个基4计算:

4X<22+128+22)=688拍

中间计算复乘:

每次计算3点,可以流水执行,时间为10+170+10=190拍

256个基2计算:

128+16+16=160拍

数据保存RAM2->L2:

128+10拍

一共1314拍。

2.6.7.512点<256点ram时)

L2->RAM1:

转置:

256拍。

2个256点计算580X2-128-20<第二组数据载入输出时间)=1160-148拍

中间计算转置:

256拍

复乘:

每次计算3点,可以流水执行,时间为10+170+10=190拍

256个基2计算:

128+16+16=160拍结果进行中转置256拍

数据保存RAM2->L2:

128+10拍

一共2268拍。

2.5.大点数转置时间

2.7.1.L2矩阵转置时间

L2为1Mbyte,最多转置64K复数点,转置时间为0.032ms。

L2cache:

nK复数点的矩阵转置时间:

每次传输256bits,每点为64bits,使用寄存器转

置,传入寄存器时间为nk/4,传出时间为nk/4,—共nk/2拍。

2.7.2.L3矩阵转置时间

L3假设大于8MB,主频为L2的一半

转置nK复数点:

转置时间为nK拍,从L3到寄存器传输延迟为100拍。

总时间为:

nK+100拍。

2.6.大点数的二维计算

二维计算的计算过程即是混合基的计算。

1进行数据转置,进行列的计算。

2计算完毕进行转置,回到原来地址,以方便下一级计算。

3计算中间旋转因子,中间结果

4进行每行的计算

5进行矩阵转置,保存输出。

大点数二维计算时的旋转因子计算:

对于nk点,二维旋转因子计算数目比较大,但是有规律的,见下图所示

0123…n-1

上图中,nk点中间旋转因子数目总数为nk个,计算公式和一维一样,.一

其中k的值在这里是行号x列号。

如果先计算列的话,可以看出第m列的旋转因子是m-1

列的旋转因子,乘以第2列,这样子的话可以由只存储第2列的旋转因子,每次重新计算

第m列,减少ram使用量,增加少量的计算。

问题就是这样子计算的话,可以后面的旋转因子误差比较大,可以隔几列计算后保存第k

列的标准值,使用标准值计算,这样可以避免误差过大。

目前使用matlab计算的话,如果

是32k,只保存一列的话,假设单精度数,1列的结果误差为10的-5次方,保存32列的误

差为10的-6次方,是可以接受的。

但是还需要更加精确的计算。

这里暂定方案是保存一列。

2・8・1・1k点ram时的二维计算

即按照上述计算过程计算,

1矩阵转置:

nK/2拍。

2列的计算和中间结果相乘:

每列1k,进行计算,266+1500拍,

然后载入第1k点的旋转因子,进行1k点复数乘,同时可以并行进行3个复数

乘,时间为350+10+10<延迟)=370拍,同时载入下一个1k点旋转因子的基础值。

然后计算下一个1k的中间旋转因子<1k个复数乘),时间为370拍,保存中间数据和1k点的旋转因子,同时载入下一个1k数据。

每列的时间为266+1500+370+370=2506拍,nk点时间为

266+<1500+370+370+266)*n+266=<532+2506*n)

3矩阵转置:

nK/2拍

4每行的计算:

二维计算,256+10+300pn+256+10=532+300pn

5矩阵转置:

nK/2拍

n点的计算时间为m,需要p级,则总时间为3nk/2+532+2506*n+532+300pn=3*n*512+2506*n+1064+300*p*n2k点的计算时间9748ns=9.748us

4k点的计算时间18432ns=18.432us

8k点的计算时间40600ns=40.600us

16k点的计算时间75336ns=75.336us

32k点的计算时间159208ns=159.208us

64k点的计算时间317352ns=317.352us

2.8.2.1k点ram,使用L3cache时的计算

1矩阵转置,在L3内:

nK+100拍,

2n个1k进行FFT计算:

传输时间:

1k拍的计算时间为512+100+300X5<延迟)拍,同时载入1k点二维旋转

因子

1k个中间结果:

1k点复数乘和下一个1k点旋转因子计算时间370+370=740拍,同时载入下1k的数据,然后保存二维旋转因子到L2cache266拍,同时载入1k点基4的旋转因子。

nk的中间计算时间为612+<1500+740+266)*n+612=2506*n+1224

3将计算结果传回L3做矩阵转置:

nk+100拍。

4计算1k个n点并传回,计算n点,一共需要1k次计算,每次计算的时间为:

300*p*n+612+612,p为n点计算的级数时间为:

1224+300*p*n

5L3做矩阵转置nK+100拍。

总时间为:

3*n*1024+300+2506*n+300*p*n+1224*2

64k点:

417340ns=417.340us

128k点:

870332ns=870.332us256k点:

1737916ns=1.738ms512k点:

3626684ns=3.627ms

2.8.3.256点ram的二维计算

1矩阵转置:

nK/2拍。

2列的计算和中间结果相乘:

每列256点,进行计算,64+10+432拍,载入256点二维的旋转因子,

进行256点复数乘,同时可以并行进行3个复数乘,时间为90+10+10<延迟)=110拍。

然后计算下一个256的中间旋转因子,时间为110拍,

保存中间数据和256点的旋转因子74拍,同时载入下一个256点数据。

每列的时间为64+10+432+110+110=726拍,

nk点时间为64+10+<726)*4n+64+10=148+2904*n

3矩阵转置:

nK/2拍

4每行的计算:

二维计算,

4n点数据,4n点的计算需要p级。

256次4n点计算时间

256点同时进行4n点的计算,每级可以流水计算256点,则如果需要p级,一共要m拍,则256点的计算需要64+44拍。

256次4n点计算需要64+10+64+10+4nX<108X

p)=432*p*n+148

5矩阵转置:

nK/2拍

4n点的计算时间为m,需要p级,则总时间为

1536*n+148+2904*n+432*p*n+148

1k点的计算时间5168ns=5.168us

2k点的计算时间10904ns=10.904us

4k点的计算时间21512ns=21.512us

8k点的计算时间46184ns=46.184us

16k点的计算时间92072ns=92.072us

32k点的计算时间197672ns=197.672us

64k点的计算时间395048ns=395.048us

2.8.4.256点ram,使用L3cache计算

1矩阵转置,在L3内:

nK+100拍,

2n/4个4k进行FFT计算:

传输时间:

4k拍的计算时间为21512+100<延迟)拍

中间结果:

256点复数乘和下一个256点旋转因子计算时间为110+110,保存中间旋转因子时间为64+10=74拍

4k点的中间结果

n/4个4k的计算时间为n/4*(21612+294*16>=6579*n

3将计算结果传回L3做矩阵转置:

nk+100拍。

4计算4k个n/4点,计算n/4点,p为n/4点的计算级数。

时间为:

64+100+432*p*n+64+100=328+432*p*n

5L3做矩阵转置nK+100拍。

总时间为:

n/4点时间m,n点需要p级,都按照4k点分。

300+3*n*1024+6579*n+432*p*n+328

64k点:

673588ns=673.588us

128k点:

1401844ns=1.402ms

256k点:

2803060ns=2.803ms

512k点:

5826676ns=5.827ms

2.8.5.512点ram的二维计算

1矩阵转置:

nK/2拍。

2列的计算和中间结果相乘:

每列256点,进行两列计算,128+10+(64+64+44>*4拍,载入512点的二维旋转因子,

进行512点复数乘,同时可以并行进行3个复数乘,时间为170+10+10<延迟)=190拍。

然后计算下一个512的中间旋转因子,时间为190拍,

保存中间数据和512点的旋转

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

当前位置:首页 > 高等教育 > 工学

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

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