基于FPGA的CORDIC向量模式实现arctan运算,Verilog HDL实现

一、概述

在上一篇文章《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

相关推荐
国科安芯2 小时前
商业航天星载数据管理单元的存储容错与接口集成方案研究
嵌入式硬件·架构·ecc·商业航天·抗辐射
天空'之城2 小时前
单片机基础核心知识点汇总(三十八)
单片机·嵌入式硬件
恒锐丰科技林技术员3 小时前
EG2203:一款高性价比 600V 半桥驱动芯片
经验分享·嵌入式硬件·硬件工程
新晨单片机设计4 小时前
S018A-基于STM32单片机脉搏计(光电对管)【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·proteus
HRTOS4 小时前
HRTOS Debug:8051实时操作系统资源状态监控与分析
单片机·嵌入式硬件·51单片机
李永奉4 小时前
中科蓝讯SDK开发-耳机项目功耗问题排查教程
c语言·开发语言·嵌入式硬件·物联网·智能手机
Rocktech_ruixun5 小时前
机器人集群调度方案硬件如何选型?瑞迅科技RK3588/3576/3568分级方案解析
人工智能·嵌入式硬件·机器人·边缘计算
SilicoCode5 小时前
正点原子HAL库与江协科技标准库关于中断的对比解析
单片机·嵌入式硬件
smartpi_ai5 小时前
离线语音模块能当麦克风用吗?识别与录音的两套逻辑、“150 条“的词数语义与中英文切换固件的两条路径
嵌入式硬件·语音识别