Felix

技术源于积累,成功始于执着!

聊一聊CORDIC原理与Lattice相关IP使用说明

0
阅读(287) 评论(1)

首先,先来科普一下,什么是CORDIC:

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

各大FPGA厂商都提供了相关的CORDIC的Soft IP(详见本文最后的,主要参考资料部分),其中,Lattice和Altera提供的IP在功能和使用上都比较类似,主要提供了如下四种功能:

  • Vector Rotation:主要用于极坐标到直角坐标的转换

  • Vector Translation:主要用于直角坐标到极坐标的转换

  • Sin & Cos:主要用于计算正弦和余弦

  • Arctan:主要用用于计算反正切函数

Xilinx提供的IP在此基础上,还额外的支持了双曲函数和平方根函数的计算。不过本文将主要介绍的是Lattice公司提供的IP,顺带提及一下,Lattice的IP与Altera和Xilinx的区别,如果想了解双曲函数等相关内容的,大家可以自行阅读本文最后提供的Xilinx的官方参考文档。

在详细地介绍IP之前,首先来简单地聊一聊CORDIC算法的基本原理。

一、CORDIC算法的基本原理

CORDIC算法最初设计用于使用硬件逻辑解决向量旋转计算的问题。其基本思想是使用迭代的方法,将原本的浮点乘法和三角计算转换为简单的减法、加法、移位和查表等操作,从而大大地提高计算效率。随着FPGA技术的发展,CORDIC算法被越来越多地被应用于FPGA上,来解决一些图像处理,数值计算等领域的问题。

举一个栗子,如需要计算点(x,y)以原点为中心,旋转theta度,之后得到的(x',y')。首先需要将坐标表示为三角函数的形式:

image.png

CORDIC的思想是,将旋转theta度,拆分为多个步骤,依次迭代进行。其中,某一个步骤的计算等式如下:

image.png

这里的theta i的取值是有讲究的,需要满足如下等式:

image.png

image.png

上式中,i为正整数,i的最大值就是迭代的次数。显然i的最大值越大,计算得到的结果将越精确。但是在实际的情况下,i不可能取无穷大的,一般取16左右,就能得到较为精确的值了(取16时,大约可以精确到小数点后3-4位,Lattice的IP最高可以取值为32)。

此时,显然有:

image.png

image.png

将cos theta表示为Ki,则有:

image.png

需要注意的是,关于Ki的值,Lattice与Xilinx并未明确指出,而Altera则取的是一个定值(常量),值为1.6467602……。个人觉得应该处理方法是相似的,具体可以看:

http://blog.chinaaet.com/justlxy/p/5100052282

实际上,无论是哪一家都可以通过IP配置时的scale factor compensation选项进行自动消除K值的影响。

上面的介绍可能不太直观,下面再来看一个网友提供的更为直观的栗子,以加深理解:

132002125828653.jpg

即,如果需要计算cos45°或者sin45°,则需要进行N次迭代,每次theta的取值如图中黄色部分所示。

二、Lattice的CORDIC IP使用说明

下面来聊一聊Lattice的CORDIC的IP的四个模式的基本使用方法和注意事项。首先看一下,CORDIC的结构框图:

image.png

下面依次介绍一下各个模块的作用:

  • In Register:这个没什么好说的;

  • Pre-Processor:默认的CORDIC只能处理输入角度范围为(-π/2,π/2)之间的旋转或者三角运算。如果用户需要计算超过这个范围的角度,则需要使能这个模块(在IP配置界面有一个复选框,默认选中)。显然,如果选中该模块则意味着需要更多的资源……

  • CORDIC Arithmetic Unit:算法核心模块。有两种配置方式,分别是parallel (with single-cycle data throughput) and word-serial (with multiple-cycle throughput)。其中,并行配置模式使用了流水线结构,适合与批量处理数据;而Word-serial则使用了较少的资源。

  • Arctan ROM:这与上面所提到的K的值有关,Lattice和Xilinx都是采用了这种方式,将具体的值存放在ROM中,需要时从中读取;而Altera则采取了将K设置为定值的方式(具体见Altera的文档)。

  • Controller:控制器,用于控制迭代次数,ROM寻址,产生rfi信号(ready for input)和outvalid(输出有效信号)。

  • Post-Processor:可以通过IP的配置界面,使能或者禁止使用该模块。对于Lattice的IP,可选LUT Based或者DSP Based的Compensation方式。该模块主要用于去除迭代过程中所带来的向量(x,y)模(Magnitude)的增益,对于不需要使用向量模的场合,可以直接禁止该模块。

  • Rounding:该模块提供了四种进位取整的模式,详见下图:

image.png

其中CORDIC Arithmetic Unit的基本结构图为:

image.png

接下来接着介绍,前面说提到的四种功能:

  • 首先是Vector Rotation,该功能主要用于极坐标到直角坐标的转换。如下图所示

image.png

    信号描述如下图所示:

image.png

    xin和yin为输入,即(x,y),xout和yout为输出,即(x0,y0)。V0的模中的K可以通过前面介绍的方法来消除。


  • Vector Translation:该模式主要用于将直角坐标转换为极坐标。如下图所示:

image.png

信号描述为:

image.png

同理,可以通过前面介绍的方式消除K值,以获得真实的极坐标信息,但是如果只是需求得到极坐标的角度信息,而并不需求得到极坐标的模长信息,则可以禁止相关模块,以节省资源。

  • sin & cos

这个就简单了,信号描述图如下:

image.png

  • Arctan

表示这个就更加没什么好说的了,信号描述如下:

image.png


此外,还需要注意的是数据格式,以及数据格式与是否使能Compensation功能的关系等内容。该部分内容比较简单,这里就不详细介绍了……


主要参考资料:

1、百度百科:https://baike.baidu.com/item/CORDIC/5189325?fr=aladdin

2、网友 乐富道的博客:http://www.cnblogs.com/touchblue/p/3535968.html

3、Lattice CORDIC IP的User Guide:CORDICIPCoreUsersGuide.PDF

4、Altera CORDIC IP的User Guide:ALTERA_CORDIC IP Core User Guide.pdf

5、Xilinx CORDIC IP的User Guide:CORDIC v6.0 LogiCORE IP Product Guide.pdf

6、维基百科:https://en.wikipedia.org/wiki/CORDIC


  1. ***此内容已被管理员屏蔽***