FFT硬件加速器.docx
- 文档编号:8193580
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:20
- 大小:138.81KB
FFT硬件加速器.docx
《FFT硬件加速器.docx》由会员分享,可在线阅读,更多相关《FFT硬件加速器.docx(20页珍藏版)》请在冰豆网上搜索。
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点的旋转
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FFT 硬件 加速器
![提示](https://static.bdocx.com/images/bang_tan.gif)