基于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

相关推荐
黑妹天下第一乖4 小时前
第 08 讲:阿加犀 AidGenSE 端侧大模型服务化与 OpenAI 兼容接口
人工智能·嵌入式硬件·深度学习·机器人·iot
辰哥单片机设计4 小时前
漏水传感器(STM32)
stm32·单片机·嵌入式硬件
szxinmai主板定制专家5 小时前
基于Zynq的高精度多通道数据采集卡完整解决方案(工业振动/高速采集/边缘传输)
fpga开发·zynq·数据采集卡
恶魔泡泡糖5 小时前
stm32F103C8T6标准库串口接收之多串口基础应用5
stm32·单片机·嵌入式硬件
木子单片机5 小时前
基于51单片机计步器—无线蓝牙APP上传
单片机·嵌入式硬件·51单片机·keil
恒锐丰科技林技术员5 小时前
EG2123A 三相独立半桥驱动芯片解析与工程应用
经验分享·嵌入式硬件·硬件工程
硅基手札6 小时前
【Linux 内核专栏 13】快IO层
linux·服务器·嵌入式硬件
xiangw@GZ7 小时前
纽扣电池型号
嵌入式硬件
优信电子7 小时前
Raspberry Pi Pico 硬件开发 —— 第二课:MicroPython 从入门到项目实践(LED篇)
单片机·嵌入式硬件·树莓派·micropython·pico·入门教学
szxinmai主板定制专家7 小时前
基于TI AM62x+FPGA的24bit高精度数据采集卡设计(振动/风电/发动机监测)
人工智能·fpga开发·arm+fpga·rk3588+fpga