0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CORDIC算法的反正切函数计算模块的设计

电子设计 作者:电子设计 2018-10-07 11:30 次阅读

快速精确的反正弦函数运算在现代工程中应用广泛。为了提高反正弦函数的精度和计算能力, 研究了基于CORD IC算法的反正弦函数运算器的FPGA 实现, 并通过改进算法减小了误差, 使误差精度达到10--4 数量级。并在X ilinx 的XC5VSX50T芯片上验证, 结果表明该运算器的数据处理速度快, 精度较高, 适用于高速大数据量的数据信号处理领域。

数字信号处理领域, 高速高精度的反正弦函数发生器有着广泛的应用。目前在FPGA 上实现反正弦函数运算器采用的主要方法是查找表法和泰勒公式展开法。查找表法所需要的存储单元随着精度的增加或输入值范围的增大而成指数增加; 泰勒公式展开法将函数简化成一系列的乘法和加法运算,但是在FPGA 上实现乘法运算既耗时又占用大量资源。本文设计了基于CORDIC算法的反正切函数计算模块,并且根据IEEE-754单精度浮点数据格式对输入输出数据进行处理,实现了高精度的浮点反正切函数的计算。

1 反正切函数实现原理

CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。

CORDIC算法有旋转模式和向量模式两种计算模式。旋转模式可以用来计算一个输入角的正弦、余弦,向量模式可以计算给定向量的角度和长度。

CORDIC算法的基本迭代公式为:


从上式可以看出,CORDIC算法在向量模式可以计算出给定向量(X,Y)的长度和角度,即从平面坐标到极坐标的变换。

2 数据格式转换接口模块

本文设计的反正切函数硬件模块输入为IEEE-754单精度浮点数据,而模块内部迭代使用的是定点整型数据,因此需要进行转换。

在图1的输入数据转换接口示意图中,X、Y为输入的IEEE-754浮点数据格式,输入范围是(-∞,+∞),经过接口模块转换为整型定点数据Xn、Yn,其表示范围是[-1 +1].

矢量(X,Y)在平面坐标系中的角度为arctan(Y/X),它只与Y和X的比值有关,与Y和X的实际长度无关。用这个性质可以以X和Y中绝对值最大的值作为归一化数值,将X和Y的范围重新映射在[-1 +1]之间,实现(X,Y)到(Xn,Yn)的转换。

计算结束后输出结果Z.Z是32位定点整型数据,且232被定义为2π,将其规格化为IEEE-754格式的过程如图2所示。在对Z进行规格化之前,需要进行前导零检测,以确定规格化时尾数左移的位数和指数位的大小,前导零的检测硬件上可以用casex语句实现。

3 整体设计以及仿真综合

浮点反正切函数的硬件结构包括了三个主要部分,即浮点数据格式转换接口模块、CORDIC内核计算模块和浮点输出数据转换接口模块,如图3所示。

采用Quartus II对设计进行FPGA综合,FPGA芯片选择EP2C70F896C6,硬件环境为Altera公司的DE2-70平台,总共需要1 522个逻辑单元,占用芯片资源的2%,最高工作频率为100 MHz.

4 Nios II中反正切函数的自定义指令实现

反正切函数与Nios II CPU的接口采用multi-cycle custom instruction,dataa和datab为输入数据,result为结果输出,要从C语言中直接调用自定义指令,需要一个宏定义接口。可以在system.h文件中找到自定义指令的宏定义,如:

#define ALT_CI_CORDIC_ATAN2_N 0x00000000

#define ALT_CI_CORDIC_ATAN2(A,B) __builtin_custom_inii

(ALT_CI_CORDIC_ATAN2_N,(A),(B))

为了正确调用自定义指令,在主程序中重新做以下宏定义:

#define ATAN2(A,B) __builtin_custom_fnff(ALT_CI_CORDIC_ATAN2_N,(A),(B))

与system.h文件中系统自动生成的宏定义不同之处在于将宏定义的接口说明由"__builtin_custom_inii"改为了"__builtin_custom_fnff".系统自动生成的宏定义默认输入输出皆为整型数据,改为"__builtin_custom_fnff"就是通知系统这是一条输入输出都是单精度浮点数据类型的用户自定义指令。这样由CPU调用时就不会出现数据类型不匹配的错误。

通过在Nios II CPU中加入的JTAG_UART模块,可以从调试终端窗口中获得运行结果。硬件IP核平均计算用时73个周期,而软件计算平均用时21 000个周期,计算速度提升300倍以上。此时CPU工作频率为100 MHz,且配置为最高性能,浮点反正切函数硬件模块仅工作在50 MHz.浮点反正切函数硬件模块的计算精度完全可以满足单精度浮点数据的要求,计算误差小于10e-6,因此可以用于对精度和速度都要求很高的各种信号处理领域。

利用CORD IC算法将反正弦函数转换为加法和移位运算, 降低了复杂度, 容易在硬件上实现。本文探讨了基于CORDIC 算法的反正弦函数的硬件实现, 实现过程采用流水线结构, 具有速度快、实现简单、精度高等优点。仿真结果和实验结果表明该运算器的输出误差为10- 4数量级, 时钟可达到150MH z, 具有较高的精度和运行速度, 因此具有十分重要的工程研究和应用意义。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21664

    浏览量

    601693
  • 运算器
    +关注

    关注

    1

    文章

    163

    浏览量

    16562
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62415
收藏 人收藏

    评论

    相关推荐

    CORDIC理论分析

      1、CORDIC 理论   1.1、 坐标旋转数字计算CORDIC   坐标旋转数字计算CORDIC(COordinate
    发表于 07-28 17:57 1807次阅读

    基于改进的CORDIC算法的FFT复乘及其FPGA实现

    的性能。但传统CORDIC算法中每次CORDIC迭代方向需由剩余角度的计算来确定,影响了工作速度。为此,本文根据定点FFT复乘中旋转因子的旋转方向可预先确定的特点,对
    发表于 07-11 21:32

    关于在quartus中求反正切函数

    各位大神,有谁知道怎样在quartus中求反正切函数 啊,有人说用查表法,查表法又怎么做啊,谢谢各位了
    发表于 10-28 09:03

    FPGA设计中必须掌握的Cordic算法

    计算机时发明的。这是一种设计用于计算数学函数、三角函数和双曲函数的简单算法。这种
    发表于 09-19 09:07

    基于FPGA的反正切函数的优化算法

    主要描述了一种基于FPGA利用Verilog HDL实现的反正切函数计算的优化算法反正切函数
    发表于 08-06 14:50 25次下载

    浮点反正切函数的FPGA实现

    如何以合理的硬件代价来实现高精度浮点超越函数计算,成为了微处理器设计过程当中的一个非常重要的问题。反正切函数计算在数字信号处理、导航通讯等
    发表于 11-02 15:31 36次下载

    根据X、Y座标求θ角的反正切运算电路

    根据X、Y座标求θ角的反正切运算电路 电路的功能 反正切运算电路
    发表于 05-10 11:43 1774次阅读
    根据X、Y座标求θ角的<b class='flag-5'>反正切</b>运算电路

    利用Cordic算法计算三角函数的值

    减运算,就能计算常用三角函数值,如Sin,Cos,Sinh,Cosh等函数。 J. Walther在1974年在这种算法的基础上进一步改进,使其可以
    发表于 11-17 16:37 6946次阅读
    利用<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b>来<b class='flag-5'>计算</b>三角<b class='flag-5'>函数</b>的值

    简单的数学运算计算数学函数的方法CORDIC的详细资料概述

    CORDIC是在一个称为二进制搜索的循环中使用更简单的数学运算来计算数学函数的方法。最常用的CORDIC用于计算AtAN2(角度)和点的斜边
    发表于 05-31 11:18 12次下载
    简单的数学运算<b class='flag-5'>计算</b>数学<b class='flag-5'>函数</b>的方法<b class='flag-5'>CORDIC</b>的详细资料概述

    基于FPGA的Cordic算法实现的设计与验证

    本文是基于FPGA实现Cordic算法的设计与验证,使用Verilog HDL设计,初步可实现正弦、余弦、反正切函数的实现。将复杂的运算转化成FPGA擅长的加减法和乘法,而乘法运算可以
    发表于 07-03 10:18 2674次阅读
    基于FPGA的<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b>实现的设计与验证

    CORDIC算法的原理及具体应用

    CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲
    的头像 发表于 11-13 07:09 6615次阅读

    一文带你们了解什么是CORDIC算法

    CORDIC算法简介 在信号处理领域,CORDIC(Coordinate Rotation Digital Computer,坐标旋转数字计算机)
    的头像 发表于 04-11 11:16 1.5w次阅读
    一文带你们了解什么是<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>

    使用Verilog HDL设计实现Cordic算法

    任何适合产品实现的算法,都是将简易实现作为第一目标。CORDIC算法是建立在适应性滤波器、FFT、解调器等众多应用基础上计算超越函数的方法。
    的头像 发表于 08-16 11:21 2293次阅读
    使用Verilog HDL设计实现<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b>

    DSP技巧:频率解调算法

    计算瞬时相位 θ( n ) 需要反正切运算,如果没有大量的计算资源,很难准确实现。这是用于计算等式Δθ( n )的方案。(13–111) 没有中间 θ( n ) 相位
    的头像 发表于 06-06 10:59 1199次阅读
    DSP技巧:频率解调<b class='flag-5'>算法</b>

    怎样使用CORDIC算法求解角度正余弦呢?

    CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲
    的头像 发表于 08-31 14:54 2405次阅读
    怎样使用<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>求解角度正余弦呢?