FFT实现——有趣的移位寄存流水线形式

FFT实现——有趣的移位寄存流水线形式 1

一.功能描述: 1

二.设计结构: 2

三.设计模块介绍 3

1.数据选择器 3

2.移位寄存器 4

3. 蝶形运算 4

一.功能描述:

对w(自定义)位(带符号位)数据进行16(易扩展为32点64点128····1024····)FFT计算

可两路w位数据输入

两路w位数据串行输出

使用此方法设计FFT的原因是 ‘FFT算法8点12位硬件实现 (verilog)’中的算法,当点数增加时,资源消耗太大,(而且扩展时,要写好多好多的代码····)

二.设计结构:

wps_clip_image-16431

图2.0 以八点FFT为例

wps_clip_image-9610

图2.1 算法结构

硬件实现概要:每8个clk进2个数据(w位)其实是两路FFT 挑一路来说:数据进来后与此数据之后的第4个数据进行蝶形运算。减法输出要先移位寄存,因为先要进行加法输出的第二级蝶形运算 而第2级的碟型运算也要用移位寄存实现‘交叉’运算wps_clip_image-3385相隔一个数进行一次运算····(表达好混乱····)

三.设计模块介绍

按数据流动方向依次介绍

1.数据选择器

wps_clip_image-29913 wps_clip_image-28704 wps_clip_image-32070

图中出现啦三个数据选择器。作用是三个模块的数据连接控制。为此专门设计了一个控制模块。

设计要求即考虑要点

1.由算法结构可见(以左倒右为第1级2,3级)第一级在4个数据后是连续进行4次碟新运算。而第二级, 如图wps_clip_image-22671 出现1次不连续的运算,对于连续数据其实是每8个点FFT出现2次不连续情况。 第三极同理,对于连续数据每8点FFT出现4次不连续情况。  凡出现不连续情况就要用数据选择器是数据进行‘跳变’。

2.要考虑数据选择器间的逻辑运算的时钟个数。(在本设计中为8*4个时钟)

从而确保数据在流水线中逻辑运算正确。(*注意数据的加减顺序,相反的数据选择,可导致相反的加减顺序(a-b成了b-a))

3.从右到左数据选择频率成倍增加。(联想到在累加运算中2进制数每一位的0,1,变化)

4.数据选择器是对蝶形运算输出的数据进行选择 故要与数据对齐 注意每级的数据延时。

KEY1 与 KEY2周期为2clk与4clk过  计算式发生的4clk延时对其无影响 ,有整数个周期。

Angle比key块4个clk   注意angle与输入的数据对齐

2.移位寄存器

wps_clip_image-32626 wps_clip_image-24002 wps_clip_image-4698

设计要求即考虑要点

1.根据算法选择每级的移位数

2.每8个CLK移位一次

3.蝶形运算

wps_clip_image-27812 wps_clip_image-383 wps_clip_image-29683

设计要求即考虑要点

1.分三个小模块:‘交叉的加减运算’‘ro_cordic’‘除法模块’。(后两个是为了实现旋转因子乘法)(详见‘FFT算法8点12位硬件实现 (verilog)’)

2.wps_clip_image-29948用补码实现减法 注意时钟 流水线实现时每级要保证时间相同

3.wps_clip_image-26214wps_clip_image-31625wps_clip_image-27436

旋转因子的乘法 采用CORDIC 算法来实现 此算法所耗的时间为全流水线的时间单位(即8个clk)。

旋转角度的变化要按一定的规律出现 防止时钟使数据的逻辑顺序错位(如数据在经过第一个W0时在第几个clk后进过第二个W0)。

4.因为使用了CORDIC算法 所以 必须有一个除法模块接在输出上。

wps_clip_image-3468

12位 16点FFT资源利用情况 基本上点数每翻一倍LE加500

wps_clip_image-5951

wps_clip_image-6555

顺序为:

1

5

3

7

2

6

4

8

9

13

11

15

10

14

12

16

MATLAB结果对比

>> x = [10:5:120];

>> y = fft(x,16)

y =

  1.0e+002 *

  Columns 1 through 3

   7.6000            -0.4000 + 2.0109i  -0.4000 + 0.9657i

  Columns 4 through 6

  -0.4000 + 0.5986i  -0.4000 + 0.4000i  -0.4000 + 0.2673i

  Columns 7 through 9

  -0.4000 + 0.1657i  -0.4000 + 0.0796i  -0.4000        

  Columns 10 through 12

  -0.4000 - 0.0796i  -0.4000 - 0.1657i  -0.4000 - 0.2673i

  Columns 13 through 15

  -0.4000 - 0.4000i  -0.4000 - 0.5986i  -0.4000 - 0.9657i

  Column 16

  -0.4000 - 2.0109i

其他修改方案记录:

1.在每级加尺度变换  防止溢出  减小量化误差

原文地址:https://www.cnblogs.com/sleepy/p/2147175.html