FFT算法8点12位硬件实现 (verilog) 1

一.功能描述: 1

二.设计结构: 2

三.设计模块介绍 3

1.蝶形运算(第一级) 3

2.矢量角度旋转(W) 4

3.CORDIC 结果处理 除法单元模块 8

4.蝶形运算(第二,三级) 9

5.Vectoring CORDIC 模块 10

6.输出并转串模块 11

四.工程纵览 12

五.功能测试 13

六.工程结束遐想 14

一.功能描述:

对12位(带符号位)数据进行8点FFT计算

8个12位数据并行输入(懒得写前端的串转并模块,)

8个12位数据并行处理,计算

8个数据串行输出

二.设计结构:

图2.1  FFT并行计算模块

图2.2 输出并转串模块

图2.3 FFT算法结构

三.设计模块介绍

按数据流动方向依次介绍

1.蝶形运算(第一级)

图3.1 第一级蝶形运算算法结构

1.1硬件实现方式:

加法:直接运用12位加法器

减法:转换为补码形式后用加法计算

1.2 Verilog代码:

图3.1 第一级蝶形运算 verilog

2.矢量角度旋转(W)

图3.2 矢量角度旋转算法结构

2.1硬件实现方式:

0度:不加操作

-45度:使用Rotation CORDIC算法处理

-90度:使用总线交换,补码转换 方式处理

-135度:预旋转-90度后用Rotation CORDIC算法处理

(Rotation CORDIC 角度输入范围约为-99度到99度,后文有详细介绍)

2.2 Rotation CORDIC算法实现

Rotation CORDIC算法简单介绍

图3.2.1 Rotation CORDI 用于矢量角度旋转

为简化计算将cos()提出

出现两个布尔代数不太喜欢的运算cos与tan,

处理方法:

Tanθ:可见θ为最终要旋转的角。将Tanθ以一系列正或负2-n (此工程中n=7,6,5,4,3,2,1,0)的形式逼近。即每次旋转一个小角度(arctan(2-n))多次旋转后达到θ角

arctan(2-n)的值预先求出 直接由n调用

Cosθ:8个cos的乘积趋向于1/1.647=0.607  在输出端加上除法单元(移位实现1/2 + 1/8 -1/64=0.609)

算法伪代码:

For n=0 to [inf]

If (Z(n) >= 0) then

Z(n + 1) := Z(n) – atan(1/2^n);

Else

Z(n + 1) := Z(n) + atan(1/2^n);

End if;

End for;

If (Z(n) >= 0) then

X(n + 1) := X(n) – (Yn/2^n);

Y(n + 1) := Y(n) + (Xn/2^n);

Z(n + 1) := Z(n) – atan(1/2^n);

Else

X(n + 1) := X(n) + (Yn/2^n);

Y(n + 1) := Y(n) – (Xn/2^n);

Z(n + 1) := Z(n) + atan(1/2^n);

End if;

Rotation CORDI 硬件实现

参数:

角度输入范围: 约为-99~99度

实部X:任意12位数(含符号)

虚部Y:任意12位数(含符号)

图3.2.2 Rotation CORDI 硬件实现结构图

SHIFTER 模块:

将负数转为补码形式处理

分三级移位

图3.2.3 SHIFTER 模块 verilog

图3.2.4 SHIFTER 模块 RTL

TABLE 模块:

arctan(2-k)的值预先求出

用12位数表示-180~180的角度

方式如下:

1000_0000_0000 表示-180度

0100_0000_0000 表示90度

……

图3.2.5 TABLE 模块 verilog

X,Y   MUX 与SUB/ADD模块:

原始数据要进行8次迭代,data_syn用于数据同步,确定何时输入原始数据

图3.2.6 MUX 模块 verilog

通过异或来确定是否取反(进行减法)

图3.2.7 SUB/ADD 模块 verilog

Z   MUX 与SUB/ADD模块:

图3.2.8   MUX , SUB/ADD 模块 verilog

3.CORDIC 结果处理 除法单元模块

8个cos的乘积趋向于1/1.647=0.607  在输出端加上除法单元(移位实现1/2 + 1/8 -1/64=0.609)

图3.3.1 除法单元模块 verilog

4.蝶形运算(第二,三级)

图3.4.1 第二,三级蝶形运算算法结构

4.1硬件实现方式:

将减少资源使用量将第二与第三级运算在同一个硬件模块下循环进行

两级都是蝶形运算只要改变,选择适当的输入,就可在2个CLK下完成这两级运算。

图3.4.2 第二,三级蝶形运算硬件实现结构图

4.2 Verilog代码:

图3.4.3 第二,三级蝶形运算 MUX 模块 verilog

PS:对-90度的矢量旋转直接用总线交换,补码,的形式完成。

5.Vectoring CORDIC 模块

用于对矢量取模

参数:

X:任意大于0的12位数(含符号)

Y:任意12位数(含符号)

5.1算法简述:

通过判断Y的值,使Y趋向于0.使矢量旋转到X轴正方向。此时X坐标就是模值(要经过除法模块除1.647.前面以讲)

图3.5.1 Vectoring CORDI 硬件实现结构图

5.2 Verilog代码:

与 Rotation CORDI 类似 这儿不再重复

6.输出并转串模块

图3.6.1 并转串结构图

图3.6.2 并转串 verilog 部分

四.工程纵览

图4.1 工程总RTL

图4.2 工程并行计算模块RTL

图4.3工程资源利用结果

五.功能测试

为了使硬件定点实现FFT时,输出寄存器能支持比输入信号幅值大的多的数据,在最后有加除8除法器。毕竟我们更关注的是DFT的相对幅值。

图5.1 仿真测试结果

六.工程结束遐想

1. 迭代,用二进制数逼近任何数,有点二分法的感觉,又有点向微积分

2. 乘法,除法,与移位的关系,分级运算的妙用

3. 依旧是时间与空间的折中考虑,相互转化

4. 流水下线拆分逻辑,提高速度

5. 时序与逻辑的严密考虑,使时序下的逻辑按我们的下发进行吗,无论是 串行还是并行

6. 循环节省了资源,使处理速度减慢

7. 加减法与补码的关系

8. 细分模块 封装好输入输出 可是调试更方面,,思路更清晰

9. 准确计算每个模块的耗时,便于模块间逻辑的链接

基于verilog的FFT算法8点12位硬件实现的更多相关文章

  1. 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换

    上篇讲述了一维FFT的GPU实现(FFT算法实现——基于GPU的基2快速傅里叶变换),后来我又由于需要做了一下二维FFT,大概思路如下. 首先看的肯定是公式: 如上面公式所描述的,2维FFT只需要拆分 ...

  2. FFT算法实现——基于GPU的基2快速傅里叶变换

    最近做一个东西,要用到快速傅里叶变换,抱着蛋疼的心态,自己尝试写了一下,遇到一些问题. 首先看一下什么叫做快速傅里叶变换(FFT)(来自Wiki): 快速傅里叶变换(英语:Fast Fourier T ...

  3. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  4. JavaScript基于时间的动画算法

    转自:https://segmentfault.com/a/1190000002416071 前言 前段时间无聊或有聊地做了几个移动端的HTML5游戏.放在不同的移动端平台上进行测试后有了诡异的发现, ...

  5. FFT算法

    FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's G ...

  6. 基于ReliefF和K-means算法的医学应用实例

    基于ReliefF和K-means算法的医学应用实例 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识.数据挖掘 (DataMiriing),指的是从大型数据库或数据 ...

  7. 基于Verilog HDL 的数字电压表设计

    本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...

  8. FFT算法的完整DSP实现(转)

    源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...

  9. 基于FPGA的Cordic算法实现

    CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲线.指数.对数的 ...

随机推荐

  1. 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈

    分享出去的内容,可以通过jssdk进行修改. 1.配置jssdk Wx_config.html <?php import("@.ORG.jssdk"); $jssdk = n ...

  2. C语言的第二天-比较大小的小程序

    #include <stdio.h> int main() { int a,b,c,max; printf("请输入三个数:"); scanf("%d,%d, ...

  3. hbase集群配置

    说明 安装 配置 启动 网页效果 一点废话 本文介绍hbase集群配置 说明 hbase想正确配置成功的前提是,你必须知道hadoop集群和zookeeper集群是如何配置的 安装 下载地址 http ...

  4. java成神之——HttpURLConnection访问api

    HttpURLConnection 访问get资源 访问post资源 访问Delete资源 获取状态码 结语 HttpURLConnection 访问get资源 HttpURLConnection c ...

  5. 利用 Flask+Redis 维护 IP 代理池

    代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...

  6. java多线程编程核心技术-笔记

    一.第一章 1.自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程2.当多个线程去访问一个局部变量是会产 ...

  7. Collection Types

    [Collection Types] 1.Arrays store ordered lists of values of the same type. Value必须是同一类型. 2.Array的原型 ...

  8. Log4Net 在ASP.NET WebForm 和 MVC的全局配置

    使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能改变 ...

  9. poj2104 主席树模板题

    题意 给出n个数字组成的数字序列,有m组询问.每次询问包含三个数字l,r,k.对于每个询问输出序列区间[l,r]中第k大的数字. 分析 这是主席树的模板题,套板子就可以 #include <cs ...

  10. SSH隧道技术简介

    本文的受众如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写程序,查数据,下电影). 公司为了防止我们用XX软件封锁了它的端口或者服务器地 ...