#FFT硬件加速器.docx
- 文档编号:29536959
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:20
- 大小:133.03KB
#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
载入1k点的计算数据。
当正在计算1k点数据时,载入下一个需要计算的1k点数据。
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,都是1k×64bits=8KB容量。
数据在RAM中的存储方式是每行256bits,即每行存储4点数据。
5.地址计算单元
输入数据地址计算和输出数据地址计算单元得到相应的数据地址。
对于基4DIT-FFT计算,每次输入的数据是反序的,输出的数据是顺序的。
其中反序的计算是:
把1024顺序分为5位的4进制数,每一位由一个计数器实现,反序即使根据顺序,这5个计数器的反序组合决定输入地址。
地址的计算参数为:
计算级数L,每级的蝶形计算距离Dis,当前计算蝶形所在的组为第N组,一共M组,当前蝶形所在组的位置是第S个蝶形。
其中Dis=4^(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的原理,应该为反序输入,正序的计数器顺序为I5-I4-I3-I2-I1,则反序的计数器顺序为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到bank1,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,顺序输出。
图1第一级计算的地址关系
图2每级计算ram内数据保存顺序
6.基4计算单元
基4计算单元完成一个完整的4点基4蝶形计算,根据地址单元生成的地址顺序,载入数据,进行基4的蝶形计算。
以下是基4计算公式和基4计算单元的结构。
图3基4蝶形计算公式
图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)×5+256+10=2032拍。
2.2.基2计算
基2计算的基本公式
这里基4计算单元可以每次计算2个基2计算,即4点计算,如下图所示。
图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计算:
2×<22+4+22)=96拍
数据保存RAM2->L2:
4拍
一共104拍。
2.6.2.32点
L2->RAM1:
进入4个bank,8拍
2级8个基4计算:
2×<22+8+22)=104拍
中间计算复乘:
每次计算3点,可以流水执行,时间为10+11+10=31拍
16个基2计算:
16+8+16=40拍
数据保存RAM2->L2:
8拍
一共191拍。
一维:
L2->RAM1:
进入4个bank,8拍
16个基2计算:
16+8+16=40拍
5级基2:
40×5=200拍。
数据保存RAM2->L2:
8拍
一共216拍。
2.6.3.64点
L2->RAM1:
进入4个bank,16拍
3级每级16个基4计算:
3×<22+16+22)=180拍
数据保存RAM2->L2:
16拍
一共212拍。
2.6.4.128点:
L2->RAM1:
进入4个bank,32拍
3级32个基4计算:
3×<22+32+22)=228拍
中间计算复乘:
每次计算3点,可以流水执行,时间为10+43+10=63拍
64个基2计算:
32+16+16=64拍
数据保存RAM2->L2:
32拍
一共419拍。
2.6.5.256点
L2->RAM1:
进入4个bank,64+10拍
4级每级64个基4计算:
4×<22+64+22)=432拍
数据保存RAM2->L2:
64+10拍
一共580拍。
2.6.6.512点
L2->RAM1:
进入4个bank,128+10拍
4级128个基4计算:
4×<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点计算580×2-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点,二维旋转因子计算数目比较大,但是有规律的,见下图所示:
图7nk点二维旋转因子计算
上图中,nk点中间旋转因子数目总数为nk个,计算公式和一维一样,
,其中k的值在这里是行号×列号。
如果先计算列的话,可以看出第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*n
2k点的计算时间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+300×5<延迟)拍,同时载入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.332us
256k点:
1737916ns=1.738ms
512k点:
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+4n×<108×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点的旋转因子138拍,同时载入下一个512点数据
两列的时间为1206拍+138,
nk点时间为128+10+<1206)*2n+128+10=276+2412*n
3矩阵转置:
nK/2拍
4每行的计算:
5二维计算
4n点数据,4n点的计算时间为m,需要p级。
256次4n点计算时间
512点同时进行4n点的计算,每级可以流水计算512点,则如果需要p级,一共要m拍,则512点的计算需要128+44拍。
512次2n点计算需要2n×172×p=348*p*n+276
6矩阵转置:
nK/2拍
4n点的计算时间为m,需要p级,则总时间为
1536*n+276+2412*n+348*p*n+276
1k点的计算时间4848ns=4.848us
2k点的计算时间9840ns=9.840us
4k点的计算时间19128ns=19.128us
8k点的计算时间40488ns=40.488us
16k点的计算时间80424ns=80.424us
32k点的计算时间171432ns=171.432us
64k点的计算时间342312ns=342.312us
2.8.6.512点ram,使用L3cache计算
1矩阵转置,在L3内:
nK+100拍,
21个4k到L2并进行FFT计算:
传输时间:
4k拍的计算时间为19128+100<延迟)拍
中间结果:
512点复数乘和下一个512点旋转因子计算时间为190+190,
保存中间旋转因子时间为128+10=138拍
4k点的中间结果
n/4个4k的计算时间为n/4*(19128+518*8>=5818*n
3将计算结果传回L3做矩阵转置:
nk+100拍。
4计算4k个n/4点并传回,计算n/4点,一共需要8n次计算,时间为:
128+100+348*p*n+128+100
5L3做矩阵转置nK+100拍。
总时间为:
n/4点需要p级,都按照4k点分。
公式为300+3*n*1024+5818*n+348*p*n+456
64k点:
614260ns=614.260us
128k点:
1272308ns=1.272ms
256k点:
2543860ns=2.544ms
512k点:
5265140ns=5.265ms
3计算总结
<主频1GHz,假设L2cache为1MB,大点数计算时使用L3cache)
计算点数
1k点ram
512点ram
256点ram
4
一维计算
22ns
22ns
22ns
8
107ns
107ns
107ns
16
104ns
104ns
104ns
32
191ns
191ns
191ns
64
212ns
212ns
212ns
128
419ns
419ns
419ns
256
580ns
580ns
580ns
512
1314ns
1314ns
1490ns
1k
2032ns
4.848us
5.168us
2k
二维计算
9.748us
9.840us
10.904us
4k
18.432us
19.128us
21.512us
8k
40.600us
40.488us
46.184us
16k
75.336us
80.424us
92.072us
32k
159.208us
171.432us
197.672us
64k
使用L3时
317.352us
使用L3时
417.340us
342.312us
使用L3时
614.260us
395.048us
使用L3时
673.588us
128k
870.332us
1.272ms
1.402ms
256k
1.738ms
2.544ms
2.803ms
512k
3.627ms
5.265ms
5.827ms
乘法单元
面积
约5000 约5000 约5000 加法单元 约2500 约2500 约2500 ram 48508.9344 17561.772 27875.5512 总面积 133508.9344 102561.772 112875.5512
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FFT 硬件 加速器