基于verilog的FFT算法8点12位硬件实现
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位硬件实现的更多相关文章
- 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换
上篇讲述了一维FFT的GPU实现(FFT算法实现——基于GPU的基2快速傅里叶变换),后来我又由于需要做了一下二维FFT,大概思路如下. 首先看的肯定是公式: 如上面公式所描述的,2维FFT只需要拆分 ...
- FFT算法实现——基于GPU的基2快速傅里叶变换
最近做一个东西,要用到快速傅里叶变换,抱着蛋疼的心态,自己尝试写了一下,遇到一些问题. 首先看一下什么叫做快速傅里叶变换(FFT)(来自Wiki): 快速傅里叶变换(英语:Fast Fourier T ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- JavaScript基于时间的动画算法
转自:https://segmentfault.com/a/1190000002416071 前言 前段时间无聊或有聊地做了几个移动端的HTML5游戏.放在不同的移动端平台上进行测试后有了诡异的发现, ...
- FFT算法
FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's G ...
- 基于ReliefF和K-means算法的医学应用实例
基于ReliefF和K-means算法的医学应用实例 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识.数据挖掘 (DataMiriing),指的是从大型数据库或数据 ...
- 基于Verilog HDL 的数字电压表设计
本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...
- FFT算法的完整DSP实现(转)
源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...
- 基于FPGA的Cordic算法实现
CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲线.指数.对数的 ...
随机推荐
- AngularJS:过滤器
ylbtech-AngularJS:过滤器 1.返回顶部 1. AngularJS 过滤器 过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤 ...
- 类的特殊成员方法,类的起源type, metaclass
1.__doc__表示类的描述信息 2. __module__ 和 __class__ __module__ 表示当前操作的对象在那个模块 __class__ 表示当前操作的对象的类是什么 ...
- [PHP] - Laravel - CSRF token禁用方法与排除验证csrf_token的url设置
laravel5.1排除验证csrf_token的url设置 <?php namespace App\Http\Middleware; use Illuminate\Foundation\Htt ...
- ARM-Linux移植之(四)——根文件系统构建
相关工具版本: busybox-1.7.0 arm-linux-4.3.2 linux-2.6.22 1.配置busybox并安装. 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应 ...
- 动态代理AOP实现方法过滤
上一节实现了动态代理,接下来 有时候,我不需要在每一个方法都要记录日志,做权限验证 等等. 所有就有了这样的需求.AOP实现特定方法过滤,有选择性的来对方法实现AOP 拦截.就是本节标题所示. 举个例 ...
- 01CSS的引入方式
引入CSS方式(重点掌握) 行内样式 内接样式 外接样式 链接式 导入式 css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负 ...
- linux grep打印匹配的上下几行
$grep -5 'parttern' inputfile //打印匹配行的前后5行 $grep -C 5 'parttern' inputfile //打印匹配行的前后5行 $grep -A 5 ' ...
- mahout in Action2.2-给用户推荐图书(2)-分析对用户推荐书目的结果
2.2.3 Analyzing the output 在之前的程序运行结果中我们得到的结果输出是: RecommendedItem [item:104, value:4.257081] 程序要求选择一 ...
- Zookeeper 基础、工作流、ZAP协议
ZooKeeper 基础 在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念.[1] 我们将在本章中讨论以下主题:1.Architecture(架构)2.Hierarch ...
- 新浪微博logo已经去掉了“新浪”二字
如果有一天我能做出一个产品,它的命名就以我所在的行业命名该多好啊,可惜那只是一个梦.但这样的梦新浪微博却实现了,今天我登陆新浪微博的时候发 现logo已经去掉了“新浪”二字,我开始还以为我自己的电脑网 ...