毕业论文——基于FPGA的FFT窗函数计算_第1页
毕业论文——基于FPGA的FFT窗函数计算_第2页
毕业论文——基于FPGA的FFT窗函数计算_第3页
毕业论文——基于FPGA的FFT窗函数计算_第4页
毕业论文——基于FPGA的FFT窗函数计算_第5页
免费预览已结束,剩余55页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科毕业设计(论文) 基于FPGA的FFT窗函数计算学 院 物理与光电工程学院专 业 光信息科学与技术年级班别 学 号 学生姓名 xxx 指导教师 年 月基于FPGA的FFT窗函数计算xxx物理与光电工程学院54摘 要在实际工程设计中常常需要对数字信号进行傅里叶变换,而傅里叶变换的定义是对无限长的连续时域信号所进行的频域分析。由于计算机无法对无限长的时间信号进行处理和计算,因而需要对输入系统的信号进行截短。但是,信号的截短操作会导致频谱能量的泄露,从而造成信号的不完整性分析。虽然理论上频谱能量泄露是不能完全消除的,但通过本课题提出的窗函数法可以对它们的影响进行抑制。本课题运用高性能FPGA硬件加速,结合MATLAB辅助分析,对海明窗、矩形窗、汉宁窗和布莱克曼窗的特性进行剖析以及研究它们对设计的影响。在用FPGA设计窗函数的过程中运用合理的方案来减少设计的资源以及提高设计的速度。测试结果表明,采用窗函数法可以很好地减少频谱能量的泄露。最后运用AXI4协议将设计接口封装为AXI4-Lite接口和AXI4-Stream接口,并用主控器MicroBlase进行控制。关键词:频谱能量泄露,窗函数,现场可编程门阵列,矩阵实验室,AXI4协议AbstractIn actual engineering design often need to the Fourier transform of digital signal, and the Fourier transform is defined as the infinite long continuous time domain to frequency domain signal analysis. As the computer cant infinitely long time signal processing and calculation, so it is necessary to the system input signal was truncated. However, shortened operation will lead to frequency spectrum of signal energy leak, causing the signal integrity analysis. Although spectrum energy leakage cannot be totally eliminated, but through this topic proposed window function method can affects their suppression. This topic using high-performance FPGA hardware acceleration, auxiliary analysis combined with MATLAB, the hamming window, rectangular window and hanning window and analyzes the characteristics of blackman window and study their impact on design. In the process of using FPGA to design a window function using rational scheme to reduce the design resources, and improve the speed of the design. Test results show that the window function method is a good way to reduce the frequency spectrum energy leakage. Finally using the AXI4 protocol will design interface encapsulation for AXI4 - Lite interface and AXI4 - Stream interface, and the host controller MicroBlase control.Key words:Spectrum Energy Leakage, Window Function, FPGA, MATLAB, AXI4 Protocal目 录1 绪论11.1 课题背景及目的11.2 课题研究内容12 基础知识22.1 Verilog HDL22.2 FPGA22.3 MATLAB32.4 AXI4协议33 窗函数83.1 基本概念83.2 窗函数幅频特性分析93.2.1 矩形窗函数93.2.2 汉宁窗函数103.2.3 海明窗函数113.2.4 布莱克曼窗函数113.3 窗函数选择124 CORDIC算法134.1 圆周旋转模式135 系统设计165.1 系统概述165.2 角度生成模块195.2.1 设计精度分析195.2.2 设计实现205.3 CORDIC算法模块225.3.1 设计精度分析225.3.2 设计实现235.4 余弦值输出模块275.5 窗函数系数生成模块295.6 窗函数结果计算模块305.7 数据与窗函数相乘模块315.8 系统的性能分析335.9 AXI4接口封装346 系统优化356.1 资源优化356.1.1 资源共享356.1.2 位宽选择386.1.3 迭代次数选择386.2 速度优化38总结40参考文献41致谢42附录A CORDIC算法模块的设计实现43缩略语对照表481 绪论1.1 课题背景及目的在现实生活中,我们经常需要用示波器、频谱分析仪等对信号进行频谱分析,然后根据其频谱特性设计一个系统从信号中提取我们感兴趣的信号或去除没用的信号。随着傅里叶变换算法的提出,使得我们对信号的频谱分析变得更加简单。傅里叶变换的定义是对连续信号进行的,在理论上具有无限的完美性。但在实际工程中FFT(快速傅里叶变换)只能对有限个点的离散信号进行计算,就是说,我们要从连续信号中截取一段有效的信号来进行处理。信号的截短操作会导致频谱能量的泄露,从而造成对信号的频谱分析不正确1-4。频谱能量泄露的表现形式就是测量频谱在真实频谱的两侧频带上扩展开来的现象,即有一些幅值较小的假谱出现在真实频谱的两侧。造成频谱能量泄露的一个很重要原因是截取的时域周期信号不是周期的整数倍5。理论上,频谱能量泄露是不能完全消除的,但我们通过本课题提出的窗函数法可以抑制它们对设计的影响。窗函数的类型很多,对信号加不同的窗函数处理后,信号频谱能量的泄露可以大大减少,但减少的程度是不一样的。因此本课题将针对频谱能量泄露的改善进行窗函数的分析、选择和设计。1.2 课题研究内容本课题主要利用MATLAB工具研究不同窗函数的特性以及它们对频谱能量泄露的抑制效果,然后根据输入信号的性质和特征来选择合适的窗函数。接着运用高性能FPGA硬件加速,采用Verilog HDL硬件描述语言在Xilinx ISE软件平台上对矩形窗、海明窗、汉宁窗和布莱克曼窗四个窗函数进行设计并利用modelsim仿真工具对其进行仿真验证。最后,使用AXI4协议将设计接口封装为AXI4-Lite接口和AXI4-Stream接口,并由主控器MicroBlase进行控制。2 基础知识本章将对这次课题所涉及到的一些基本概念进行介绍,其中包括Verilog HDL、FPGA、MATLAB以及AXI4协议。2.1 Verilog HDLVerilog HDL(简称Verilog)是一种以文本的方式描述数字电路结构和行为的硬件描述语言6-7。自从有了Verilog,对数字系统的设计就简单容易多了,对数字电路的描述可以从算法级、寄存器传输级、门级和开关级四个抽象层次上进行。下面是四个抽象层次的特点:(1) 算法级:只需关注设计实现的算法,而硬件实现方面可不必关心。(2) 寄存器传输级:只需关心数据在寄存器间的流动以及处理数据的方式。(3) 门级:利用逻辑门电路对功能模块进行设计。(4) 开关级:利用开关、存储节点对功能模块进行设计。Verilog还具有以下的优点:(1) Verilog的语法很像C语言,只要有C语言基础就可以容易入门。(2) 使用Verilog对数字电路进行设计与电路工艺无关。(3) 使用Verilog对设计进行功能验证,可在设计前期发现各种漏洞并进行修复,从而缩短了设计周期。(4) Verilog的使用令电路的升级更加容易。此外,Verilog还具有一个特点就是对数字电路的设计同时支持自底向上和自顶向下两种设计方法。2.2 FPGAFPGA(即现场可编程门阵列)是在PAL、GAL、CPLD等基础上发展起来的,作为ASIC领域中的一种半定制电路,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点8-9。FPGA内部有丰富的逻辑资源,包括CLB块、块RAM、DCM、乘法器硬核、可编程I/O块等。利用FPGA进行数字电路的设计具有以下优点:(1) 大多数FPGA基于SRAM工艺,理论上可以对其进行无次数擦除并重新设计。(2) 由于FPGA丰富的逻辑资源,因此可以设计非常复杂的组合或时序逻辑电路。(3) 利用FPGA进行设计可以大大缩短设计周期。随着技术的不断进步,FPGA的优势越来越突出,也越来越多的工程师对它的青睐度不断增加。同时,FPGA技术也正在快速发展着,总体来说具有以下几个趋势:(1) 随着器件工艺越来越小,FPGA正向着大容量、低功耗的方向发展。(2) FPGA向着SoC方向发展。(3) FPGA内部集成ASIC,从而克服体积大、功耗大、能力有限的缺点。(4) FPGA可动态重构。2.3 MATLABMATLAB是一款集数值计算、建模仿真、数据可视化等于一身的超强软件10。由于它的强大功能,MATLAB被运用于广泛的领域中,包括工业设计、通讯、图像处理、工程计算等等。MATLAB具有以下几个优点:(1) MATLAB友好的界面使用户更加容易掌握软件的使用方法。(2) MATLAB是一门简单易用的语言,可以很快入门MATLAB并进行程序设计。(3) MATLAB拥有强大的数据处理能力以及出色的图形处理能力。(4) MATLAB中集成了各种工具箱,使用户开发更加简单。善于运用MATLAB将对我们的设计和分析有非常大的帮助。2.4 AXI4协议AXI4协议是Xilinx公司和ARM公司共同为下一代FPGA定制IP的一种总线协议11。AXI4协议中具有五个独立的通道,并且都是单向通道结构。此外,AXI4协议还支持猝发操作,提高了数据吞吐量。图2.1和图2.2分别为读通道和写通道的结构示意图,其中包含地址、数据和写响应五个通道。地址通道用来传输地址和控制信号;数据通道用来传输数据;写响应通道用来指示写数据完成。五个通道信号的传输需要依赖于握手信号VALID和READY。通过VALID信号来指示信息发送源的数据和控制信号何时有效;通过READY信号来指示信息接收源何时可以接收数据。此外,还有LAST信号用来指示最后一个数据的传输。图2.1 读通道结构图2.2 写通道结构AXI4协议中有三种突发读写时序,下面将一一介绍。首先是突发式读,如图2.3所示。当地址通道上出现有效地址后,读数据通道上将出现准备传输的数据。当RVALID信号和RREADY信号为高电平时,每个时钟读取一次数据。另外,当RLAST信号为高电平时,表示传输最后一个数据,即代表一次突发式读即将完成。图2.3 突发式读波形图其次是重叠突发式读,如图2.4所示。当完成一次突发式读时,才能接着处理再一次的突发式读。波形图中主机为从机传输了两个地址,只有完成第一次突发式读后才能处理第二次突发式读。图2.4 重叠突发式读波形图最后是突发式写,如图2.5所示。如果地址通道上出现有效地址,那么当WVALID信号和WREADY信号同时为高电平时,每个时钟写一次数据。另外,当WLAST信号为高电平时,表示传输最后一个数据。当一次突发式写完成时,写响应信号BVALID将拉高。图2.5 突发式写波形图由图2.3图2.5可以看出,只有当信号VALID和READY同时为高电平时才进行数据的传输。但是信号VALID和READY出现高电平的情况有三种。图2.6为VALID信号先于READY信号为高电平,即主机发送有效数据并等待从机可以接收数据为止。图2.7为READY信号先于VALID信号为高电平,即从机已经准备好接收数据但等待主机发送有效的数据为止。图2.8为VALID信号和READY信号同时为高电平,即主机发送有效数据的同时从机可以接收数据。数据的传输发生在图中的箭头所指向的时钟上升沿处。图2.6 VALID信号早于READY信号图2.7 READY信号早于VALID信号图2.8 VALID信号与READY信号同时最后介绍一下读写事务握手信号的依赖关系。图2.9为读事务握手信号依赖关系,它有以下两点关系:(1) ARVALID信号可以先于或后于ARREADY信号有效。(2) 只有当ARVALID和ARREADY信号同时有效时,RVALID信号才能开始有效,才能开始传输数据。图2.9 读事务握手信号依赖关系图2.10为写事务握手信号依赖关系,它有以下三点关系:(1) AWVALID信号或WVLAID信号有效的同时或之后,AWREADY信号或WREADY信号才能有效。(2) 只要AWVALID和WVALID信号两者有一个有效后,AWREADY信号才能有效。(3) 只要AWVALID和WVALID信号两者有一个有效后,WREADY信号才能有效。图2.10 写事务握手信号依赖关系3 窗函数3.1 基本概念信号的截短操作会导致频谱能量的泄露,为了减少频谱能量的泄露,可以为信号加上窗函数。所谓窗函数就是一种除给定区间之外均为零的实函数,如图3.1所示。使用窗函数使截短的信号在其边界上收敛,或通过窗函数抑制DFT的等效滤波器振幅特性的旁瓣的方法来减少信号频谱能量的泄露。图3.2和图3.3分别为信号加窗之前和加窗之后的频谱分析。通过对比它们的频谱图,可以发现加窗之前有严重的频谱泄露,加窗之后频谱泄露改善。这就是本课题所要达到的目的。图3.1 窗函数示意图图3.2 原始信号频谱分析图3.3 加窗信号频谱分析3.2 窗函数幅频特性分析本课题需要设计的窗函数包括海明窗、矩形窗、汉宁窗和布莱克曼窗。接下来将对这四个窗函数的DFT等效滤波器的幅频特性进行分析,从而确定这四个窗函数改善频谱能量泄露的性能。3.2.1 矩形窗函数矩形窗的时域表达式为: (31)其频域特性为: (32)矩形窗的幅频特性如图3.4所示(矩形窗长度为40,其他窗函数长度一样)。加矩形窗实际上就是不加窗。矩形窗的主瓣能量相对集中,但是旁瓣幅值较高,其中最大的旁瓣幅值要比主瓣幅值低13dB。因此使用矩形窗容易带来高频干扰和频谱泄露。图3.4 矩形窗及其幅频特性3.2.2 汉宁窗函数汉宁窗的时域表达式为: (33)其频域特性为: (34)汉宁窗的幅频特性如图3.5所示:图3.5 汉宁窗及其幅频特性汉宁窗的主瓣宽度比矩形窗要宽一些,旁瓣宽度比矩形窗要小很多,其中最大的旁瓣幅值要比主瓣幅值低31dB。从频谱能量泄露减少的角度出发,汉宁窗要比矩形窗好。3.2.3 海明窗函数海明窗的时域表达式为: (35)其频域特性为: (36)海明窗的频谱特性如图3.6所示。图3.6 海明窗及其幅频特性海明窗的主瓣宽度跟汉宁窗的一样,主瓣加宽旁瓣减少,其中最大的旁瓣幅值要比主瓣幅值低42dB,比汉宁窗还要小。但海明窗旁瓣的衰减速度要比汉宁窗慢一些。3.2.4 布莱克曼窗函数布莱克曼窗的时域表达式为: (37)其频域特性为: (38)布莱克曼窗的幅频特性如图3.7所示:图3.7 布莱克曼窗及其幅频特性与其他三个窗相比较,布莱克曼窗的主瓣宽度是最大的,但其最大的旁瓣幅值是最小的,比主瓣幅值低58dB。同时布莱克曼窗的旁瓣衰减速度也很快。3.3 窗函数选择窗函数频谱的两侧旁瓣决定了频谱能量泄露的程度,于是,为了减少频谱能量的泄露,我们对窗函数的选择应遵循两个原则:(1) 选择能量主要集中在主瓣的窗函数10,12-13。(2) 选择旁瓣幅值小、衰减速度快的窗函数。但很多时候这两个条件是不能同时满足的,因此我们要根据信号的特性折中选择窗函数。例如,当对读取信号频率精度要求高而幅值精度要求不高时,可用矩形窗;当分析带有较强干扰噪声的窄带信号或未知信号时,可用汉宁窗;当对读取信号幅值精度要求高而频率精度要求不高时,可用布莱克曼窗。窗函数的适当选择对信号的正确分析有着非常大的帮助。4 CORDIC算法CORDIC(Coordinate Rotation Digital Computer)算法是坐标旋转数字计算机算法的简称14-15。它利用逼近实值的方法将一些复杂的算法(如开方、三角函数等)转换成简单的算法(移位相加减)。CORDIC算法包含圆周、线性和双曲三种系统,每种系统包括旋转和向量两种模式。也就是说,CORDIC算法总共有六种算法模式。而本课题将采用CORDIC算法中的圆周旋转模式来计算窗函数中的余弦函数。下面对该模式进行介绍。4.1 圆周旋转模式在直角坐标系中,将向量逆时针旋转角得到向量,如图4.1所示:图4.1 CORDIC算法圆周旋转模式向量旋转图由图4.1可得方程组如式(4-1)所示: (41)提取因数,可将式(4-1)转化为式(4-2): (42)去除,可得到伪旋转方程式(4-3): (43)由于,故模值会增大倍。但是,旋转的角度是正确的。假设为第次的旋转角度,则第次伪旋转方程组如式(4-4)所示: (44)现在对旋转角度进行限制,使正切函数可由代替,这样复杂的三角函数计算就变成了简单的移位运算,如式(4-5)所示: (45)表4.1显示的是CORDIC算法中每次迭代所对应的旋转角度:表4.1 CORDIC算法中每次迭代所对应的旋转角度i0110.520.2530.12540.0625旋转角度的总和为,其中。当为+1时,代表向量逆时针旋转;当为-1时,代表向量顺时针旋转。而旋转的方向会影响累积角度的大小。只要在的范围内的任意角度都可以旋转,满足所有角度的总和为。如果角度不在这个范围内,则可以通过三角恒等式变换将角度转换到这个范围。如果再增加一个追踪角度累加结果的方程式可得式(4-6): (46)其中,是一个判决算子,即,用来确定旋转的方向。令,其中为比例因子,表征每次旋转时向量模长发生的变化。若总的旋转次数为n,则总的比例因子如式(4-7)所示。 (47)当时,。在圆周旋转模式中,经过n次迭代后得到式(4-8): (48)当时,。通过设置和就可以计算三角函数和了。5 系统设计5.1 系统概述本课题“基于FPGA的FFT窗函数计算”,以MATLAB为辅助软件,以FPGA为设计平台,设计了海明窗、矩形窗、汉宁窗和布莱克曼窗四个窗函数。用FPGA实现本课题的设计,主要实现基于CORDIC算法的点数为256点到16M点动态可调、窗函数类型可选的窗函数控制器。本设计顶层模块框图如图5.1所示,图5.2所示为缩略的顶层模块内部结构,表5.1为顶层模块的端口定义。图5.1 顶层模块框图图5.2 顶层模块内部结构表5.1 顶层模块的端口信号名列表信号名信号方向位宽含义sys_clkinput1系统时钟rst_ninput1全局复位信号,低电平有效point_numinput24信号长度输入,point_num范围为28-1224-1theta_factorinput25角度因子输入,由225/point_num决定window_modelinput2窗函数类型选择变量dininput8无符号整数输入din_eninput1输入数据使能信号,高电平有效ndinput1从设备是否准备好接收数据标志位,高电平有效dout_by_windowoutput16无符号数输出,数据格式为8位整数,8位小数dout_by_window_enoutput1输出数据使能信号,高电平有效rdyoutput1主设备是否准备好接收数据标志位,高电平有效本课题“基于FPGA的FFT窗函数计算”需要实现的矩形窗、海明窗、汉宁窗和布莱克曼窗四个窗函数的通用公式为,不同的窗函数对应不同的系数A、B、C。为了计算窗函数,首先需要计算余弦函数中的相位,然后是求解相位的余弦值,再是窗函数结果的计算,最后还要计算窗函数结果与输入的8位无符号整数的乘积。一个好的设计,需要根据设计的功能进行模块间的划分,这样不仅可以做到资源利用率的提高,还可以提升设计的速度。为了使本课题的设计更加合理,将本设计进行了功能上的划分,各模块在Xilinx ISE软件中的组织架构如图5.3所示,表5.2所示为各模块的含义。图5.3 本设计在ISE中的组织架构表5.2 系统功能模块划分序号模块名含义1windows_func顶层模块,用来例化各功能模块2u_theta_generator相位生成模块,产生角度和3u_delay_tap延时模块,对相关信号进行延时4u_cordic_topCORDIC算法顶层模块,完成余弦值的计算5u_window_param窗函数系数生成模块6u_window_calc窗函数结果计算模块7u_window_mult_din数据与窗函数相乘模块8u_mult_theta乘法器模块,计算角度和9u_cordic_1计算的余弦绝对值10u_cordic_2计算的余弦绝对值11u_cos_result计算和的余弦值12u_mult_param_cos1窗函数系数与的余弦值相乘13u_mult_param_cos2窗函数系数与的余弦值相乘14u_mult_window_filter数据与窗函数相乘模块另外,在实际工程中,精度对于我们的设计来说是至关重要的。一个不符合精度要求的设计是不能拿出来用的。那么什么是精度?精度就是测量值与真实值的接近程度。在数字化的世界里,数值只能以有限位宽的二进制数表示,与真实值之间存在偏差。在数字信号处理电路中,经常需要进行算术运算,随着每一次的计算,其结果的位宽会越来越大。如果不进行合理的舍位处理,最终结果的位宽可能是非常大的,自然设计会消耗更多的资源,但是舍位处理会引入误差。为了使设计的精度满足要求又不浪费多余的资源,我们可以为设计选择合适的运算结构同时采用合适的位宽。当然位宽越大精度越高,但是设计要占用更多的资源。为了让设计更加地优化,我们要对精度和资源进行一个权衡。后面会对本课题的设计精度进行分析,以了解最终结果的误差来源。接下来将详细介绍各功能模块在设计中的地位及实现的具体功能。有一点是需要注意的,本设计所提到的相位应理解为的系数,如所对应的系数为,但为了方便理解,还是给出。5.2 角度生成模块5.2.1 设计精度分析我们要提前知道的是本设计中CORDIC算法模块的输入相位范围为,24位二进制位宽表示(详见CORDIC算法模块),其中最高位为符号位。窗函数表达式中的余弦和的最大角度分别为和,得分别用26位和27位的二进制位宽表示,其中最高位为符号位,始终为0。为了能够进行无符号运算,只要利用三角恒等变换关系把输入相位限制在之间,然后输入CORDIC算法模块,但是其输出的结果还只是余弦函数的绝对值,还要根据其相位所在的区间给予它正值或负值。这样,和只要分别用25位和26位的二进制位宽表示就可以了。确定了这种关系后,现在就可以开始对角度生成模块精度进行分析。本课题“基于FPGA的FFT窗函数计算”中需要进行余弦函数和的计算,在进行余弦函数计算之前要对相位和进行计算,其中N为256点到16M点动态可调,n为0N-1。仔细观察角度和,我们可以提取和两个参数,这两个参数分别称为相位因子和信号长度,由模块外部的AXI4_Lite接口提供。这样做的目的一方面可以节省大量由于除法器和其他一些逻辑电路所消耗的那一部分的逻辑资源,另一方面由MicroBlase主控器为设计提供所需的动态可调的参数很方便。对于角度生成器,其位宽选取理由为:(1) 由于信号长度N为256点到16M点动态可调,为了使二进制位宽能够表示最大点数16M,将位宽确定为24。(2) 当信号长度N取16M点时,可获得本设计的最小相位因子。为了能够将该最小相位用二进制数表示出来并尽可能减少误差,可将相位因子左移24位即放大倍,故相位因子位宽为25位。(3) 由于点数n与相位因子的乘积最大为,可以用25位二进制位宽表示。另外,两者乘积结果位宽为49,故只需取低25位就可以了。由于相位因子用25位二进制位宽无法完全表示,故引入了误差。但此误差小于,非常小,对设计精度的影响不大。5.2.2 设计实现本课题“基于FPGA的FFT窗函数计算”中实现的四个窗函数设计里含有两项余弦函数和,在计算余弦函数之前需要求解余弦函数的相位,因此本课题中设计了一个相位生成器,负责产生对应时刻的相位。相位生成器的模块框图如图5.4所示,表5.3所示为相位生成器的端口定义。图5.4 相位生成器表5.3 角度生成模块的端口信号名列表信号名信号方向位宽含义sys_clkinput1系统时钟rst_ninput1全局复位信号,低电平有效point_numinput24信号长度输入,point_num范围为28-1224-1theta_factorinput25相位因子输入,由225/point_num决定din_eninput1输入数据使能信号,高电平有效ndinput1从设备是否准备好接收数据标志位,高电平有效theta_out1output24角度输出,0pi/2sign1output1符号标志位1,1表示负数,0表示整数theta_out2output24角度输出,0pi/2sign2output1符号标志位2,1表示负数,0表示整数rdyoutput1主设备是否准备好接收数据标志位,高有电平效在该模块中,要做的事情就是根据信号长度point_num和相位因子theta_factor算出相应时刻的相位。为了算出这个相位,调用了乘法器IP核,其例化代码如程序清单5.1所示:程序清单5.1 产生余弦函数相位/ 调用乘法器,产生相应的相位wire DATA2_WIDTH-1:0 theta;/ 输出相位,02*piwire rst;/ 乘法器复位信号,高电平有效assign rst = rst_n;mult_theta u_mult_theta ( .clk ( sys_clk ), / 系统时钟 .sclr ( rst ),/ 复位信号,高电平有效 .a ( theta_factor ), / 相位因子,位宽25 .b ( point_cnt ), / 输入第n点,位宽24 .p ( theta ) / 输出相应相位,位宽25);有一点是需要我们注意的,在乘法器中相位因子theta_factor和点数point_cnt的位宽分别为25和24,输出相位theta的位宽应为49。这里只取其中的低25位,但这并没有造成数据的损失。原因是相位因子theta_factor和点数point_cnt的乘积最大值为,用25位二进制位宽完全可以表示输出相位。为了将送入CORDIC算法模块(详见下一小节)的相位和限制在范围之内,我们需要对乘法器输出的相位theta进行处理。这里有两件事要做,第一,判断该相位属于直角坐标系中的哪个象限,并根据三角恒等变换关系将相位转换到第一象限;第二,根据相位原在的象限,给它一个标志位,标志其余弦值的正负极性,即当为1时代表余弦值为负数,当为0时代表余弦值为正数。为了更好理解相位是如何转换到第一象限的,下面结合直角坐标系来进行解释,如图5.5所示。以相位为例,其范围为,用25位无符号二进制数据表示。当theta24:23为2b00时,表示该相位在第一象限,如(a)所示。此时的相位已在第一象限,不用转换,相当于已限制到第一象限,即输出相位theta_out1为theta23:0,其余弦值为正数,即正负标志位sign1为1b0。当theta24:23为2b01时,表示该相位在第二象限,如(b)所示。如果要将该相位转换到第一象限,则转换后的相位为即输出相位theta_out1为(24)1b1 - theta23:0 + 1b1,其余弦值为负数,即正负标志位sign1为1b1。当theta24:23为2b10时,表示该相位在第三象限,如(c)所示,如果要将该相位转换到第一象限,则转换后的相位为即输出相位theta_out1为theta23:0,其余弦值为负数,即正负标志位sign1为1b1。当theta24:23为2b11时,表示该相位在第四象限,如(d)所示,如果要将该相位转换到第一象限,则转换后的相位为即输出相位theta_out1为(24)1b1 - theta23:0 + 1b1,其余弦值为正数,即正负标志位sign1为1b0。相位在直角坐标中象限的转换类似,这里就不再赘述了。(a)相位在第一象限(b)相位在第二象限(c)相位在第三象限(d)相位在第四象限图5.5 直角坐标系相位旋转示意图5.3 CORDIC算法模块5.3.1 设计精度分析本课题“基于FPGA的FFT窗函数计算”中需要计算余弦函数,而余弦函数的计算是基于CORDIC迭代算法的。迭代次数越多,数据表示位宽越大,所获得的结果精度越高,但付出的代价是消耗更多的资源。但是并不是说精度越高对设计就越好。我们既要考虑到设计的精度,也要考虑到设计消耗的资源,即设计精度与资源的均衡。为了获得所希望的精确度,需要确定迭代的次数和数据的位宽。为了在不浪费多余的资源下确定合适的迭代次数,应该定位于CORDIC算法第n次迭代所对应的旋转相位要小于本设计的最小相位。当信号长度为16M点时,可获得本设计的最小相位。表5.4所示为CORDIC算法每一次迭代所对应的相位。表5.4 CORDIC迭代过程中的旋转相位i012122由表5.4可以看出,在23次迭代时旋转相位小于本系统的最小相位,因此CORDIC算法模块的迭代次数确定为23。此外,为了能够用二进制数比较精确地表示相位和余弦值,同时还要考虑资源的消耗,需要选择合适的二进制位宽。位宽越大,精度越高,但资源消耗越大;位宽越小,精度越小,但资源消耗越少。经过MATLAB仿真结果分析,最后决定用24位的二进制位宽表示相位和余弦值。5.3.2 设计实现本课题“基于FPGA的FFT窗函数计算”中需要计算两项余弦函数和,这里我们可以采用CORDIC迭代算法实现余弦函数的计算。于是在本设计中需要设计CORDIC算法模块,其模块框图如图5.6所示,表5.5所示为CORDIC算法模块的端口定义。其中,变量theta_in是一个范围为的相位输入,即最高位为符号位。变量cos_data是24位的余弦函数结果绝对值输出,其值相对于原值的绝对值放大了倍。为了统一,将输入相位限制在之间,其值为原值的绝对值,必须根据其正负符号标志位求出真正的余弦值(详见相位生成模块)。图5.6 CORDIC算法模块表5.5 CORDIC算法模块的端口信号名列表信号名信号方向位宽含义sys_clkinput1系统时钟rst_ninput1全局复位信号,低电平有效theta_ininput24角度输入, cos_dataoutput24余弦值绝对值输出为了将本课题“基于FPGA的FFT窗函数计算”中复杂的三角函数运算转化成简单的移位相加减运算,需要限制旋转相位,使得,即。在用FPGA对CORDIC算法模块进行设计之前,需要将这些旋转相位计算出来。为了确保设计的精确度,在对CORDIC算法模块设计时进行了23次迭代。现在利用MATLAB将这些旋转相位计算出来,其MATLAB代码如程序清单5.2所示:程序清单5.2 求解旋转角度的MATLAB实现fid = fopen(rot.txt,w);% 打开一个文件for i = 0:22 x = atan(2(-i)*224/pi;% 计算每级迭代的旋转角度 rot_angle = atan(2(-i)*180/pi;% 将角度转换成弧度 y = dec2bin(x,24);% 将十进制转换成二进制fprintf(fid,localparam Rot%-2d = 24b,i+1);% 以下三行将弧度以符合Verilog HDLfwrite(fid,y);%语法写进文件 fprintf(fid,;t/%9.6fdegrn,rot_angle); endfclose(fid) 由于每次旋转都会使向量模长增大,n次旋转后模长将增大 。为了纠正向量模长,最后得乘以因子。该因子可由程序清单5.3所示的MATLAB程序实现:程序清单5.3 求解向量模长纠正因子的MATLAB实现Init_1 = 1;fid = fopen(Init.txt,w);% 打开一个文件for i = 0:22% 计算K=1/cos(0)*1/cos(1)*.*1/cos(n-1) cos_data = cos(atan(2(-i); Init_1 = Init_1*cos_data;endInit_expand = Init_1*223;% 将K左移23位即放大223倍以用整数表示Init_data = dec2bin(Init_expand,24);% 将十进制数转换成二进制数fprintf(fid,localparam Init = 24b);% 以下三行将Init_data以符合Verilog HDL语法fwrite(fid,Init_data);% 写进文件fprintf(fid,; /%9.7f*2%d,Init_1,i);fclose(fid)% 关闭文件接着,根据第四章中的式(4-5)和式(4-6)就可以开始CORDIC算法模块的FPGA设计了,图5.7所示为CORDIC算法模块每次迭代所对应的硬件结构。经过23迭代之后就可以将得到的余弦函数结果的绝对值输出了。图5.7 CORDIC算法每次迭代所对应的硬件结构到此,CORDIC算法模块已经设计好了。接下来,验证CORDIC算法模块的功能是否正确,精度是否满足设计。以验证1M点的为例,将modelsim仿真值和MATLAB理论值进行比较,如图5.8所示。(a)理论值(b)实值(c)误差值图5.8 CORDIC算法模块实值与理论值的比较经过MATLAB仿真,CORDIC算法模块实值和理论值之间最大的误差为。该误差值很小,那么该误差值对本设计最终结果的精度有没有影响呢?首先,对本设计的数据格式要求为输入8位的无符号整数,输出16位无符号数据,其中8位整数、8位小数。如果用二进制数表示,则该误差值在小数点后第17位开始。此外,该误差来自于余弦函数。在窗函数的计算过程中,余弦函数还要和一个小于1的系数相乘,也就说窗函数的结果实值与理论值的误差小于。窗函数的结果最后还要跟输入的8位无符号整数相乘,说理论上本设计的误差值将在二进制小数点后第9位开始。但本设计只保留8位小数,也就是说最终的误差值将会被舍去。故该CORDIC算法模块的功能是正确的,而且精度非常高,满足设计要求。另外,除了满足功能和精度上的需求,还要对CORDIC算法模块所消耗的资源以及速度进行分析,该分析是在Xilinx公司的Kintex-7 XC7K160T平台下进行(本课题凡是涉及到资源和速度的分析都是在这个平台下进行的)。本课题对速度的要求是使设计跑到200MHz以上。本设计也是某系统的一个小模块,一般情况下,为了本设计所在的系统可以跑到200MHz以上,应该让本设计至少通过250MHz的时序约束。为了分析本设计的性能,应该找一个参照的对象。于是设计了一个调用IP核的CORDIC模块,它的参数跟纯逻辑设计的CORDIC算法模块一样,如器件型号、数据位宽、迭代次数和时序约束一样。通过布局布线后两个模块的资源消耗情况如表5.6和表5.7所示,时序分析情况如表5.8和表5.9所示。表5.6 纯逻辑CORDIC算法模块的资源消耗逻辑资源使用已使用寄存器1567查找表1657表5.7 IP核CORDIC模块的资源消耗逻辑资源使用已使用寄存器1957查找表2069表5.8 纯逻辑CORDIC算法模块时序分析周期占空比周期裕量时钟约束4ns50%布局布线后2.158ns1.842ns表5.9 IP核CORDIC IP模块时序分析周期占空比周期裕量时钟约束4ns50%布局布线后2.278ns1.722ns通过对数据的分析,纯逻辑设计的CORDIC算法模块相对于IP核CORDIC模块不仅资源消耗小一些,速度也快了。综上所示,本设计的CORDIC算法模块不仅精度高、资源消耗合理、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论