一、概述
在上一篇文章《CORDIC旋转模式实现sin和cos运算》中,介绍了CORDIC旋转模式,并基于该算法实现了sin和cos运算。本文将在CORDIC旋转模式的基础上,介绍CORDIC向量模式的算法原理,并使用Verilog HDL实现该算法,得到arctan计算结果,角度范围为-90~90度,最终使用Modelsim进行波形仿真,与MATLAB实现结果进行比较,验证算法的正确性。
二、CORDIC向量模式设计原理
CORDIC(Coordinate Rotation Digital Computer,即坐标旋转数字计算方法)是数字信号处理中的常用算法,是FPGA平台上实现三角函数运算的一种重要且常用的方案。
CORDIC方法主要有两种操作模式,即旋转模式和向量模式。在旋转模式下,将输入向量旋转到一个期望的角度;在向量模式下,将输入向量旋转到x轴。

图1 CORDIC算法原理
对于旋转模式,初始时,令x0=1,y0=0,则n次迭代旋转的计算公式如下:

去掉cos相关的计算,即为伪旋转,如公式(2)所示。

其中,角度θi对应的正切值为2^-(i-1),旋转模式通过旋转的角度来判断该逆时针旋转还是顺时针旋转,如果旋转角度大于输入角度,则顺时针旋转;如果旋转角度小于输入角度,则逆时针旋转,经过20次旋转迭代后,旋转角度将接近于输入角度,此时的x值为角度的cos值,y值为角度的sin值。
经过公式(2)的伪旋转运算后,为了保证结果的正确性,计算结果要乘以伸缩因子,如公式(3)所示,n等于20时,伸缩因子K值为0.607252935009250。最终的计算结果x即为cos值,y即为sin值

对于向量模式,初始时设定x和y,即分别对应角度的cos值和sin值,同样经过如公式(1)所示的旋转迭代,并且先去掉cos进行伪旋转计算,再乘以伸缩因子得到最终的结果。
向量模式通过每次旋转后的y大于0还是小于0来判断该顺时针旋转还是逆时针旋转,如果y值大于0,则顺时针旋转;如果y值小于0,则逆时针旋转。经过20次旋转迭代后,向量将被旋转到接近于x轴的位置,旋转的角度即为arctan值,最终的Y值接近于0,X值为sqrt(x^2+y^2)。
如果我们仅知道对应角度的tan值,可以设定x为1,y设定为该tan值,经过CORDIC向量模式计算后,得到的角度同样为arctan角度值。
三、模块设计与仿真
CORDIC旋转模式计算模块的端口信号如图2所示,in_flag和out_flag分别为输入信号和输出信号有效标志信号,in_sin和in_cos分别为输入角度的sin和cos值(或者对应于输入角度的tan值和1),并且乘以2^24量化之后的结果;out_alpha为旋转的角度,对应于arctan值,并且结果已经乘以2^16进行了量化;out_square为sqrt(x^2+y^2),并且结果已经乘以2^24进行了量化。

图2 端口信号
本模块的迭代次数为20次,主要实现步骤如下:
(1)将量化后的20个迭代角度写入寄存器数组中。
(2)输入角度范围为-90~90度,需要进行象限判断,将角度限制在0~90度,并得到象限结果。(这里角度判断设置范围为-180~180,使得角度范围为360度)
(3)进行20次旋转迭代,定义旋转角度中间变量,如果旋转后的y大于0,则进行顺时针旋转;如果旋转后的y小于0,则进行逆时针旋转。
(4)旋转迭代后,寄存输出结果。
(5)对伸缩因子0.607252935009250乘以2^16进行量化,量化后的值为39797,所以寄存输出后的结果要再乘以39797(使用移位和加法操作实现),并将数据右移16位。
(6)根据象限结果判断数据输出,比如迭代计算结果都为整数,如果输入为第四象限的角度,则将迭代计算的结果加上负号再输出。
完成设计模块后,编写TestBench,对模块进行波形仿真。TestBench的设计思路如下:
(1)生成-89~89的索引。
(2)根据-89~89的索引,得到89~0和0~89的正数输入角度。
(3)将89~0和0~89的这些输入角度,输入到CORDIC旋转模式运算模块,得到89~0和0~89的sin和cos计算结果。
(4)根据-89~89的索引值,如果索引为负数时,则sin值取反,否则sin不变,cos值不变,则得到了-89~89的sin和cos计算结果。
(5)计算tan = sin/cos,并将其乘以2^24后输入CORSIC向量模式运算模块的in_sin,in_cos为2^24,最终计算的角度即为arctan角度值(放大了2^16倍)。
Modelsim的仿真波形界面如图3所示,将sin、cos和arctan的计算结果的数据类型设置成有符号数,并用模拟波形表示,out_sin是89~0和0~89度的计算结果,sin_temp对应的是-89~89度的sin计算结果,89~0~89和-89~89度的cos计算结果一致,之后计算tan = sin_temp/out_cos,输入CORDIC向量模式运算模块,计算结果为arctan_alpha,角度范围为-89~89,符合arctan的运算规律。

图3 仿真波形
将arctan开始的数据和MATLAB的atan函数计算结果(乘以2^16进行量化后)进行比较,如图4所示,结果基本一致。

图4 数据比较结果-数据起始部分
将arctan结尾的数据和MATLAB的atan函数计算结果(乘以2^16进行量化后)进行比较,如图5所示,结果基本一致。

图5 数据比较结果-数据结尾部分
四、工程获取方式
加入知识星球【FPGA设计入门与提高】: https://t.zsxq.com/ytILk