| |
目录
1. 工作说明
2. 系数计算
3. 数据选取
4. 变量说明
5. 仿真结果
1) 波形
2) Transcript
6. Matlab 验证
1. 采用硬件RTL代码实现串行64点FFT算法
具体实现方法不做硬性要求,可以自行定义
FFT输入I/Q数据为8bits有符号数,输出I/Q数据20bits。数据存储模块可以用verilog二维数组建模
2. FFT基本公式如下
3. 给出算法结构设计以及RTL代码
ModelSim SE10.1a
Matlab R2010a
采用基2时间抽取方式, 6级蝶形运算
P64为位序重排(由于太大,下图中仅画了上半部分)
WNk = e-j2πk/N = cos(2πk/N) + j sin(2πk/N)
第1级:N = 2, W2k = cos(kπ) + j sin(kπ) k= 0
第2级:N = 4, W4k = cos(kπ/2) + j sin(kπ/2) k= 0~1
第3级:N = 8, W8k = cos(kπ/4) + j sin(kπ/4) k= 0~3
第4级:N = 16, W16k = cos(kπ/8) + j sin(kπ/8) k= 0~7
第5级:N = 32, W32k = cos(kπ/16) + j sin(kπ/16) k= 0~15
第6级:N = 64, W64k = cos(kπ/32) + j sin(kπ/32) k= 0~31
参数的计算结果由matlab给出,因为实部、虚部都是小数,为方便,均乘以255并取整。数据写入文档Data_Parameter.txt,用于verilog读入。
每次进行复数乘法的时候,计算前对输入数据乘以256,计算完成后除以256,即右移8位,会造成一点误差。
用matlab对一个完整的sin曲线选取64个8bit有符号数作为输入数据存储在文档Data_FFT.txt内,modelsim调用此数据作为输入数据,输入数据为实数点。
进入系统后, 64个输入数据的I/Q分别扩展为20位有符号数,方便后期同址运算。
随后进行6级的同址运算。
Matlab验证结果(FFT_Matlab_Verify.m)
结果比对接近。数值的微弱差异是由于对cos和sin的近似引起的。
因为采用测试模式编写,没有波形
# Loading work.TESTBENCH(fast)
run
#
#
# 0.Load Data
# 0:( 0, 0 j)
# 1:( 12, 0 j)
# 2:( 25, 0 j)
# 3:( 37, 0 j)
# 4:( 49, 0 j)
# 5:( 60, 0 j)
# 6:( 71, 0 j)
# 7:( 81, 0 j)
# 8:( 90, 0 j)
# 9:( 99, 0 j)
# 10:( 106, 0 j)
# 11:( 113, 0 j)
# 12:( 118, 0 j)
# 13:( 122, 0 j)
# 14:( 125, 0 j)
# 15:( 126, 0 j)
# 16:( 126, 0 j)
# 17:( 126, 0 j)
# 18:( 123, 0 j)
# 19:( 120, 0 j)
# 20:( 115, 0 j)
# 21:( 109, 0 j)
# 22:( 103, 0 j)
# 23:( 95, 0 j)
# 24:( 86, 0 j)
# 25:( 76, 0 j)
# 26:( 66, 0 j)
# 27:( 55, 0 j)
# 28:( 43, 0 j)
# 29:( 31, 0 j)
# 30:( 18, 0 j)
# 31:( 6, 0 j)
# 32:( -6, 0 j)
# 33:( -18, 0 j)
# 34:( -31, 0 j)
# 35:( -43, 0 j)
# 36:( -55, 0 j)
# 37:( -66, 0 j)
# 38:( -76, 0 j)
# 39:( -86, 0 j)
# 40:( -95, 0 j)
# 41:( -103, 0 j)
# 42:( -109, 0 j)
# 43:( -115, 0 j)
# 44:( -120, 0 j)
# 45:( -123, 0 j)
# 46:( -126, 0 j)
# 47:( -126, 0 j)
# 48:( -126, 0 j)
# 49:( -125, 0 j)
# 50:( -122, 0 j)
# 51:( -118, 0 j)
# 52:( -113, 0 j)
# 53:( -106, 0 j)
# 54:( -99, 0 j)
# 55:( -90, 0 j)
# 56:( -81, 0 j)
# 57:( -71, 0 j)
# 58:( -60, 0 j)
# 59:( -49, 0 j)
# 60:( -37, 0 j)
# 61:( -25, 0 j)
# 62:( -12, 0 j)
# 63:( 0, 0 j)
#
#
# 1.Load Parameter
# 0:( 127, 0j)
# 1:( 127, 0j)
# 2:( 0,-127j)
# 3:( 127, 0j)
# 4:( 89, -89j)
# 5:( 0,-127j)
# 6:( -89, -89j)
# 7:( 127, 0j)
# 8:( 117, -48j)
# 9:( 89, -89j)
# 10:( 48,-117j)
# 11:( 0,-127j)
# 12:( -48,-117j)
# 13:( -89, -89j)
# 14:( -117, -48j)
# 15:( 127, 0j)
# 16:( 124, -24j)
# 17:( 117, -48j)
# 18:( 105, -70j)
# 19:( 89, -89j)
# 20:( 70,-105j)
# 21:( 48,-117j)
# 22:( 24,-124j)
# 23:( 0,-127j)
# 24:( -24,-124j)
# 25:( -48,-117j)
# 26:( -70,-105j)
# 27:( -89, -89j)
# 28:( -105, -70j)
# 29:( -117, -48j)
# 30:( -124, -24j)
# 31:( 127, 0j)
# 32:( 126, -12j)
# 33:( 124, -24j)
# 34:( 121, -36j)
# 35:( 117, -48j)
# 36:( 112, -59j)
# 37:( 105, -70j)
# 38:( 98, -80j)
# 39:( 89, -89j)
# 40:( 80, -98j)
# 41:( 70,-105j)
# 42:( 59,-112j)
# 43:( 48,-117j)
# 44:( 36,-121j)
# 45:( 24,-124j)
# 46:( 12,-126j)
# 47:( 0,-127j)
# 48:( -12,-126j)
# 49:( -24,-124j)
# 50:( -36,-121j)
# 51:( -48,-117j)
# 52:( -59,-112j)
# 53:( -70,-105j)
# 54:( -80, -98j)
# 55:( -89, -89j)
# 56:( -98, -80j)
# 57:( -105, -70j)
# 58:( -112, -59j)
# 59:( -117, -48j)
# 60:( -121, -36j)
# 61:( -124, -24j)
# 62:( -126, -12j)
#
#
# 2.ReConfig Input Data
# 0:( 0, 0 j)
# 1:( -6, 0 j)
# 2:( 126, 0 j)
# 3:( -126, 0 j)
# 4:( 90, 0 j)
# 5:( -95, 0 j)
# 6:( 86, 0 j)
# 7:( -81, 0 j)
# 8:( 49, 0 j)
# 9:( -55, 0 j)
# 10:( 115, 0 j)
# 11:( -113, 0 j)
# 12:( 118, 0 j)
# 13:( -120, 0 j)
# 14:( 43, 0 j)
# 15:( -37, 0 j)
# 16:( 25, 0 j)
# 17:( -31, 0 j)
# 18:( 123, 0 j)
# 19:( -122, 0 j)
# 20:( 106, 0 j)
# 21:( -109, 0 j)
# 22:( 66, 0 j)
# 23:( -60, 0 j)
# 24:( 71, 0 j)
# 25:( -76, 0 j)
# 26:( 103, 0 j)
# 27:( -99, 0 j)
# 28:( 125, 0 j)
# 29:( -126, 0 j)
# 30:( 18, 0 j)
# 31:( -12, 0 j)
# 32:( 12, 0 j)
# 33:( -18, 0 j)
# 34:( 126, 0 j)
# 35:( -125, 0 j)
# 36:( 99, 0 j)
# 37:( -103, 0 j)
# 38:( 76, 0 j)
# 39:( -71, 0 j)
# 40:( 60, 0 j)
# 41:( -66, 0 j)
# 42:( 109, 0 j)
# 43:( -106, 0 j)
# 44:( 122, 0 j)
# 45:( -123, 0 j)
# 46:( 31, 0 j)
# 47:( -25, 0 j)
# 48:( 37, 0 j)
# 49:( -43, 0 j)
# 50:( 120, 0 j)
# 51:( -118, 0 j)
# 52:( 113, 0 j)
# 53:( -115, 0 j)
# 54:( 55, 0 j)
# 55:( -49, 0 j)
# 56:( 81, 0 j)
# 57:( -86, 0 j)
# 58:( 95, 0 j)
# 59:( -90, 0 j)
# 60:( 126, 0 j)
# 61:( -126, 0 j)
# 62:( 6, 0 j)
# 63:( 0, 0 j)
#
#
# 3.Start FFT
#
#
# 3. 1 stage: 32 * 2 points. (Wn_Bias: 0)
# 1, 0, 0: CalData:( -5 0j)( 5 0j) Parameter:( 127 0j)
# 1, 1, 0: CalData:( 0 0j)( 251 0j) Parameter:( 127 0j)
# 1, 2, 0: CalData:( -4 0j)( 184 0j) Parameter:( 127 0j)
# 1, 3, 0: CalData:( 5 0j)( 166 0j) Parameter:( 127 0j)
# 1, 4, 0: CalData:( -5 0j)( 103 0j) Parameter:( 127 0j)
# 1, 5, 0: CalData:( 2 0j)( 227 0j) Parameter:( 127 0j)
# 1, 6, 0: CalData:( -1 0j)( 237 0j) Parameter:( 127 0j)
# 1, 7, 0: CalData:( 6 0j)( 79 0j) Parameter:( 127 0j)
# 1, 8, 0: CalData:( -5 0j)( 55 0j) Parameter:( 127 0j)
# 1, 9, 0: CalData:( 1 0j)( 244 0j) Parameter:( 127 0j)
# 1, 10, 0: CalData:( -2 0j)( 214 0j) Parameter:( 127 0j)
# 1, 11, 0: CalData:( 6 0j)( 125 0j) Parameter:( 127 0j)
# 1, 12, 0: CalData:( -4 0j)( 146 0j) Parameter:( 127 0j)
# 1, 13, 0: CalData:( 4 0j)( 201 0j) Parameter:( 127 0j)
# 1, 14, 0: CalData:( 0 0j)( 250 0j) Parameter:( 127 0j)
# 1, 15, 0: CalData:( 6 0j)( 29 0j) Parameter:( 127 0j)
# 1, 16, 0: CalData:( -5 0j)( 29 0j) Parameter:( 127 0j)
# 1, 17, 0: CalData:( 1 0j)( 250 0j) Parameter:( 127 0j)
# 1, 18, 0: CalData:( -3 0j)( 201 0j) Parameter:( 127 0j)
# 1, 19, 0: CalData:( 5 0j)( 146 0j) Parameter:( 127 0j)
# 1, 20, 0: CalData:( -5 0j)( 125 0j) Parameter:( 127 0j)
# 1, 21, 0: CalData:( 3 0j)( 214 0j) Parameter:( 127 0j)
# 1, 22, 0: CalData:( 0 0j)( 244 0j) Parameter:( 127 0j)
# 1, 23, 0: CalData:( 6 0j)( 55 0j) Parameter:( 127 0j)
# 1, 24, 0: CalData:( -5 0j)( 79 0j) Parameter:( 127 0j)
# 1, 25, 0: CalData:( 2 0j)( 237 0j) Parameter:( 127 0j)
# 1, 26, 0: CalData:( -1 0j)( 227 0j) Parameter:( 127 0j)
# 1, 27, 0: CalData:( 6 0j)( 103 0j) Parameter:( 127 0j)
# 1, 28, 0: CalData:( -4 0j)( 166 0j) Parameter:( 127 0j)
# 1, 29, 0: CalData:( 5 0j)( 184 0j) Parameter:( 127 0j)
# 1, 30, 0: CalData:( 0 0j)( 251 0j) Parameter:( 127 0j)
# 1, 31, 0: CalData:( 6 0j)( 6 0j) Parameter:( 127 0j)
#
#
# 3. 2 stage: 16 * 4 points. (Wn_Bias: 1)
# 2, 0, 0: CalData:( -5 0j)( -5 0j) Parameter:( 127 0j)
# 2, 0, 1: CalData:( 5 -249j)( 5 249j) Parameter:( 0 -127j)
# 2, 1, 0: CalData:( 0 0j)( -8 0j) Parameter:( 127 0j)
# 2, 1, 1: CalData:( 184 -164j)( 184 164j) Parameter:( 0 -127j)
# 2, 2, 0: CalData:( -3 0j)( -6 0j) Parameter:( 127 0j)
# 2, 2, 1: CalData:( 103 -225j)( 103 225j) Parameter:( 0 -127j)
# 2, 3, 0: CalData:( 4 0j)( -6 0j) Parameter:( 127 0j)
# 2, 3, 1: CalData:( 237 -78j)( 237 78j) Parameter:( 0 -127j)